From bc963d58b52ce81367e4d0e7b56cc288b1315a4a Mon Sep 17 00:00:00 2001 From: Steven Jacobs Date: Tue, 28 Jan 2025 14:41:52 -0500 Subject: [PATCH 1/2] Add add_vpcs and add_placement_groups user grants linodego added support for the `add_vpcs` and `add_placement_group` user grants in v1.44.0 (https://github.com/linode/linodego/pull/622). This patch adds support for these fields in the `linode_user` resource. --- docs/data-sources/user.md | 4 ++++ docs/data-sources/users.md | 4 ++++ docs/resources/user.md | 4 ++++ linode/user/flatten.go | 2 ++ linode/user/framework_datasource_schema.go | 2 ++ linode/user/framework_models.go | 2 ++ linode/user/framework_models_unit_test.go | 4 ++++ linode/user/resource.go | 2 ++ linode/user/resource_test.go | 4 ++++ linode/user/schema_resource.go | 12 ++++++++++++ 10 files changed, 40 insertions(+) diff --git a/docs/data-sources/user.md b/docs/data-sources/user.md index 9056beb85..aa66cafc9 100644 --- a/docs/data-sources/user.md +++ b/docs/data-sources/user.md @@ -95,10 +95,14 @@ The Linode User resource exports the following attributes: * `add_nodebalancers` - If true, this User may add NodeBalancers. +* `add_placement_groups` - If true, this User may add Placement Groups. + * `add_stackscritps` - If true, this User may add StackScripts. * `add_volumes` - If true, this User may add Volumes. +* `add_vpcs` - If true, this User may add Virtual Private Clouds (VPCs). + * `cancel_account` - If true, this User may cancel the entire Account. * `longview_subscription` - If true, this User may manage the Account’s Longview subscription. diff --git a/docs/data-sources/users.md b/docs/data-sources/users.md index 499f3be2e..3ab49edf6 100644 --- a/docs/data-sources/users.md +++ b/docs/data-sources/users.md @@ -100,10 +100,14 @@ Each Linode user will be stored in the `users` attribute and will export the fol * `add_nodebalancers` - If true, this User may add NodeBalancers. +* `add_placement_groups` - If true, this User may add Placement Groups. + * `add_stackscritps` - If true, this User may add StackScripts. * `add_volumes` - If true, this User may add Volumes. +* `add_vpcs` - If true, this User may add Virtual Private Clouds (VPCs). + * `cancel_account` - If true, this User may cancel the entire Account. * `longview_subscription` - If true, this User may manage the Account’s Longview subscription. diff --git a/docs/resources/user.md b/docs/resources/user.md index 6277eb207..7c763c902 100644 --- a/docs/resources/user.md +++ b/docs/resources/user.md @@ -98,8 +98,12 @@ In addition to all the arguments above, the following attributes are exported. * `add_nodebalancers` - (optional) If true, this User may add NodeBalancers. +* `add_placement_groups` - (optional) If true, this User may add Placement Groups. + * `add_stackscripts` - (optional) If true, this User may add StackScripts. +* `add_vpcs` - (optional) If true, this User may add Virtual Private Clouds (VPCs). + * `cancel_account` - (optional) If true, this User may cancel the entire Account. * `longview_subscription` - (optional) If true, this User may manage the Account’s Longview subscription. diff --git a/linode/user/flatten.go b/linode/user/flatten.go index 786014ce5..e730cb1b8 100644 --- a/linode/user/flatten.go +++ b/linode/user/flatten.go @@ -42,8 +42,10 @@ func flattenGrantsGlobal(global *linodego.GlobalUserGrants) map[string]interface result["add_linodes"] = global.AddLinodes result["add_longview"] = global.AddLongview result["add_nodebalancers"] = global.AddNodeBalancers + result["add_placement_groups"] = global.AddPlacementGroups result["add_stackscripts"] = global.AddStackScripts result["add_volumes"] = global.AddVolumes + result["add_vpcs"] = global.AddVPCs result["cancel_account"] = global.CancelAccount result["longview_subscription"] = global.LongviewSubscription diff --git a/linode/user/framework_datasource_schema.go b/linode/user/framework_datasource_schema.go index 662e55794..06c3a33a0 100644 --- a/linode/user/framework_datasource_schema.go +++ b/linode/user/framework_datasource_schema.go @@ -16,8 +16,10 @@ var linodeUserGrantsGlobalObjectType = types.ObjectType{ "add_linodes": types.BoolType, "add_longview": types.BoolType, "add_nodebalancers": types.BoolType, + "add_placement_groups": types.BoolType, "add_stackscripts": types.BoolType, "add_volumes": types.BoolType, + "add_vpcs": types.BoolType, "cancel_account": types.BoolType, "longview_subscription": types.BoolType, }, diff --git a/linode/user/framework_models.go b/linode/user/framework_models.go index 593b0c5f3..81f146903 100644 --- a/linode/user/framework_models.go +++ b/linode/user/framework_models.go @@ -175,8 +175,10 @@ func flattenGlobalGrants(ctx context.Context, grants linodego.GlobalUserGrants) result["add_linodes"] = types.BoolValue(grants.AddLinodes) result["add_longview"] = types.BoolValue(grants.AddLongview) result["add_nodebalancers"] = types.BoolValue(grants.AddNodeBalancers) + result["add_placement_groups"] = types.BoolValue(grants.AddPlacementGroups) result["add_stackscripts"] = types.BoolValue(grants.AddStackScripts) result["add_volumes"] = types.BoolValue(grants.AddVolumes) + result["add_vpcs"] = types.BoolValue(grants.AddVPCs) result["cancel_account"] = types.BoolValue(grants.CancelAccount) result["longview_subscription"] = types.BoolValue(grants.LongviewSubscription) diff --git a/linode/user/framework_models_unit_test.go b/linode/user/framework_models_unit_test.go index f4e4eb54f..1a20b0dfe 100644 --- a/linode/user/framework_models_unit_test.go +++ b/linode/user/framework_models_unit_test.go @@ -76,8 +76,10 @@ func TestParseUserGrants(t *testing.T) { AddLinodes: true, AddLongview: true, AddNodeBalancers: true, + AddPlacementGroups: true, AddStackScripts: true, AddVolumes: true, + AddVPCs: true, CancelAccount: false, LongviewSubscription: true, }, @@ -147,8 +149,10 @@ func TestParseUserGrants(t *testing.T) { assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_linodes\":true") assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_longview\":true") assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_nodebalancers\":true") + assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_placement_groups\":true") assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_stackscripts\":true") assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_volumes\":true") + assert.Contains(t, dataModel.GlobalGrants.String(), "\"add_vpcs\":true") assert.Contains(t, dataModel.GlobalGrants.String(), "\"cancel_account\":false") assert.Contains(t, dataModel.GlobalGrants.String(), "\"longview_subscription\":true") } diff --git a/linode/user/resource.go b/linode/user/resource.go index 72d64da45..6a2466897 100644 --- a/linode/user/resource.go +++ b/linode/user/resource.go @@ -235,8 +235,10 @@ func expandGrantsGlobal(global map[string]interface{}) linodego.GlobalUserGrants result.AddLinodes = global["add_linodes"].(bool) result.AddLongview = global["add_longview"].(bool) result.AddNodeBalancers = global["add_nodebalancers"].(bool) + result.AddPlacementGroups = global["add_placement_groups"].(bool) result.AddStackScripts = global["add_stackscripts"].(bool) result.AddVolumes = global["add_volumes"].(bool) + result.AddVPCs = global["add_vpcs"].(bool) result.CancelAccount = global["cancel_account"].(bool) result.LongviewSubscription = global["longview_subscription"].(bool) diff --git a/linode/user/resource_test.go b/linode/user/resource_test.go index 6b6d0a768..49bf308f3 100644 --- a/linode/user/resource_test.go +++ b/linode/user/resource_test.go @@ -101,8 +101,10 @@ func TestAccResourceUser_grants(t *testing.T) { resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_linodes", "true"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_longview", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_nodebalancers", "true"), + resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_placement_groups", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_stackscripts", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_volumes", "false"), + resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_vpcs", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.cancel_account", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.longview_subscription", "false"), resource.TestCheckResourceAttr(testUserResName, "linode_grant.#", "0"), @@ -119,8 +121,10 @@ func TestAccResourceUser_grants(t *testing.T) { resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_linodes", "true"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_longview", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_nodebalancers", "false"), + resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_placement_groups", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_stackscripts", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_volumes", "false"), + resource.TestCheckResourceAttr(testUserResName, "global_grants.0.add_vpcs", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.cancel_account", "false"), resource.TestCheckResourceAttr(testUserResName, "global_grants.0.longview_subscription", "false"), resource.TestCheckResourceAttr(testUserResName, "linode_grant.#", "1"), diff --git a/linode/user/schema_resource.go b/linode/user/schema_resource.go index 822534b94..168943b35 100644 --- a/linode/user/schema_resource.go +++ b/linode/user/schema_resource.go @@ -105,6 +105,12 @@ func resourceLinodeUserGrantsGlobal() *schema.Resource { Optional: true, Default: false, }, + "add_placement_groups": { + Type: schema.TypeBool, + Description: "If true, this User may add Placement Groups.", + Optional: true, + Default: false, + }, "add_stackscripts": { Type: schema.TypeBool, Description: "If true, this User may add StackScripts.", @@ -117,6 +123,12 @@ func resourceLinodeUserGrantsGlobal() *schema.Resource { Optional: true, Default: false, }, + "add_vpcs": { + Type: schema.TypeBool, + Description: "If true, this User may add Virtual Private Clouds (VPCs).", + Optional: true, + Default: false, + }, "cancel_account": { Type: schema.TypeBool, Description: "If true, this User may cancel the entire Account.", From 673dd2dd049fa737b058c6e93193bb422a089cab Mon Sep 17 00:00:00 2001 From: Steven Jacobs Date: Fri, 31 Jan 2025 09:54:56 -0500 Subject: [PATCH 2/2] Add attributes for vpc_grant and placement_group_grant This adds the missing `vpc_grant` and `placement_group_grants` to the user resources and their data sources. --- docs/data-sources/user.md | 4 ++++ docs/data-sources/users.md | 4 ++++ docs/resources/user.md | 4 ++++ linode/user/datasource_test.go | 2 ++ linode/user/framework_datasource_schema.go | 20 +++++++++++--------- linode/user/framework_models.go | 2 ++ linode/user/resource.go | 2 ++ linode/user/schema_resource.go | 18 ++++++++++-------- linode/users/datasource_test.go | 2 ++ 9 files changed, 41 insertions(+), 17 deletions(-) diff --git a/docs/data-sources/user.md b/docs/data-sources/user.md index aa66cafc9..719c96cd9 100644 --- a/docs/data-sources/user.md +++ b/docs/data-sources/user.md @@ -65,10 +65,14 @@ The Linode User resource exports the following attributes: * [`nodebalancer_grant`](#grant) - The grants this User has pertaining to NodeBalancers on this Account. +* [`placement_group_grant`](#grant) - The grants this User has pertaining to Placement Groups on this Account. + * [`stackscript_grant`](#grant) - The grants this User has pertaining to StackScripts on this Account. * [`volume_grant`](#grant) - The grants this User has pertaining to Volumes on this Account. +* [`vpc_grant`](#grant) - The grants this User has pertaining to Virtual Private Clouds (VPCs) on this Account. + * `id` - The unique identifier for this DataSource. * `password_created` - The date and time when this User’s current password was created. User passwords are first created during the Account sign-up process, and updated using the Reset Password webpage. null if this User has not created a password yet. diff --git a/docs/data-sources/users.md b/docs/data-sources/users.md index 3ab49edf6..2c74f3dbe 100644 --- a/docs/data-sources/users.md +++ b/docs/data-sources/users.md @@ -70,10 +70,14 @@ Each Linode user will be stored in the `users` attribute and will export the fol * [`nodebalancer_grant`](#grant) - The grants this User has pertaining to NodeBalancers on this Account. +* [`placement_group_grant`](#grant) - The grants this User has pertaining to Placement Groups on this Account. + * [`stackscript_grant`](#grant) - The grants this User has pertaining to StackScripts on this Account. * [`volume_grant`](#grant) - The grants this User has pertaining to Volumes on this Account. +* [`vpc_grant`](#grant) - The grants this User has pertaining to Virtual Private Clouds (VPCs) on this Account. + * `id` - The unique identifier for this DataSource. * `password_created` - The date and time when this User’s current password was created. User passwords are first created during the Account sign-up process, and updated using the Reset Password webpage. null if this User has not created a password yet. diff --git a/docs/resources/user.md b/docs/resources/user.md index 7c763c902..b89b5cbd2 100644 --- a/docs/resources/user.md +++ b/docs/resources/user.md @@ -66,10 +66,14 @@ The following arguments are sets of [entity grants](#entity-grants): * `nodebalancer_grant` - (optional) The NodeBalancers the user has permissions access to. +* `placement_group_grant` - (optional) The Placement Groups the user has permissions access to. + * `stackscript_grant` - (optional) The StackScripts the user has permissions access to. * `volume_grant` - (optional) The volumes the user has permissions access to. +* `vpc_grant` - (optional) The Virtual Private Clouds (VPCs) the user has permissions access to. + ## Attributes Reference In addition to all the arguments above, the following attributes are exported. diff --git a/linode/user/datasource_test.go b/linode/user/datasource_test.go index decacf257..cdd39205a 100644 --- a/linode/user/datasource_test.go +++ b/linode/user/datasource_test.go @@ -60,8 +60,10 @@ func TestAccDataSourceUser_grants(t *testing.T) { resource.TestCheckResourceAttrSet(resourceName, "linode_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "longview_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "nodebalancer_grant.#"), + resource.TestCheckResourceAttrSet(resourceName, "placement_group_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "stackscript_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "volume_grant.#"), + resource.TestCheckResourceAttrSet(resourceName, "vpc_grant.#"), ), }, }, diff --git a/linode/user/framework_datasource_schema.go b/linode/user/framework_datasource_schema.go index 06c3a33a0..8f2688a43 100644 --- a/linode/user/framework_datasource_schema.go +++ b/linode/user/framework_datasource_schema.go @@ -71,15 +71,17 @@ var UserAttributes = map[string]schema.Attribute{ Computed: true, ElementType: linodeUserGrantsGlobalObjectType, }, - "database_grant": linodeUserGrantsEntitySet, - "domain_grant": linodeUserGrantsEntitySet, - "firewall_grant": linodeUserGrantsEntitySet, - "image_grant": linodeUserGrantsEntitySet, - "linode_grant": linodeUserGrantsEntitySet, - "longview_grant": linodeUserGrantsEntitySet, - "nodebalancer_grant": linodeUserGrantsEntitySet, - "stackscript_grant": linodeUserGrantsEntitySet, - "volume_grant": linodeUserGrantsEntitySet, + "database_grant": linodeUserGrantsEntitySet, + "domain_grant": linodeUserGrantsEntitySet, + "firewall_grant": linodeUserGrantsEntitySet, + "image_grant": linodeUserGrantsEntitySet, + "linode_grant": linodeUserGrantsEntitySet, + "longview_grant": linodeUserGrantsEntitySet, + "nodebalancer_grant": linodeUserGrantsEntitySet, + "placement_group_grant": linodeUserGrantsEntitySet, + "stackscript_grant": linodeUserGrantsEntitySet, + "volume_grant": linodeUserGrantsEntitySet, + "vpc_grant": linodeUserGrantsEntitySet, "id": schema.StringAttribute{ Description: "Unique identifier for this DataSource.", Computed: true, diff --git a/linode/user/framework_models.go b/linode/user/framework_models.go index 81f146903..a9655c532 100644 --- a/linode/user/framework_models.go +++ b/linode/user/framework_models.go @@ -25,8 +25,10 @@ type DataSourceModel struct { LinodeGrant types.Set `tfsdk:"linode_grant"` LongviewGrant types.Set `tfsdk:"longview_grant"` NodebalancerGrant types.Set `tfsdk:"nodebalancer_grant"` + PlacementGroupGrant types.Set `tfsdk:"placement_group_grant"` StackscriptGrant types.Set `tfsdk:"stackscript_grant"` VolumeGrant types.Set `tfsdk:"volume_grant"` + VPCGrant types.Set `tfsdk:"vpc_grant"` DatabaseGrant types.Set `tfsdk:"database_grant"` ID types.String `tfsdk:"id"` PasswordCreated types.String `tfsdk:"password_created"` diff --git a/linode/user/resource.go b/linode/user/resource.go index 6a2466897..d256f031d 100644 --- a/linode/user/resource.go +++ b/linode/user/resource.go @@ -95,8 +95,10 @@ func readResource(ctx context.Context, d *schema.ResourceData, meta interface{}) d.Set("linode_grant", flattenGrantsEntities(grants.Linode)) d.Set("longview_grant", flattenGrantsEntities(grants.Longview)) d.Set("nodebalancer_grant", flattenGrantsEntities(grants.NodeBalancer)) + d.Set("placement_group_grant", flattenGrantsEntities(grants.PlacementGroup)) d.Set("stackscript_grant", flattenGrantsEntities(grants.StackScript)) d.Set("volume_grant", flattenGrantsEntities(grants.Volume)) + d.Set("vpc_grant", flattenGrantsEntities(grants.VPC)) } d.Set("username", username) diff --git a/linode/user/schema_resource.go b/linode/user/schema_resource.go index 168943b35..192da8fb8 100644 --- a/linode/user/schema_resource.go +++ b/linode/user/schema_resource.go @@ -44,14 +44,16 @@ var resourceSchema = map[string]*schema.Schema{ MaxItems: 1, Elem: resourceLinodeUserGrantsGlobal(), }, - "domain_grant": resourceLinodeUserGrantsEntitySet(), - "firewall_grant": resourceLinodeUserGrantsEntitySet(), - "image_grant": resourceLinodeUserGrantsEntitySet(), - "linode_grant": resourceLinodeUserGrantsEntitySet(), - "longview_grant": resourceLinodeUserGrantsEntitySet(), - "nodebalancer_grant": resourceLinodeUserGrantsEntitySet(), - "stackscript_grant": resourceLinodeUserGrantsEntitySet(), - "volume_grant": resourceLinodeUserGrantsEntitySet(), + "domain_grant": resourceLinodeUserGrantsEntitySet(), + "firewall_grant": resourceLinodeUserGrantsEntitySet(), + "image_grant": resourceLinodeUserGrantsEntitySet(), + "linode_grant": resourceLinodeUserGrantsEntitySet(), + "longview_grant": resourceLinodeUserGrantsEntitySet(), + "nodebalancer_grant": resourceLinodeUserGrantsEntitySet(), + "placement_group_grant": resourceLinodeUserGrantsEntitySet(), + "stackscript_grant": resourceLinodeUserGrantsEntitySet(), + "volume_grant": resourceLinodeUserGrantsEntitySet(), + "vpc_grant": resourceLinodeUserGrantsEntitySet(), } func resourceLinodeUserGrantsGlobal() *schema.Resource { diff --git a/linode/users/datasource_test.go b/linode/users/datasource_test.go index a687d2744..729ea15ca 100644 --- a/linode/users/datasource_test.go +++ b/linode/users/datasource_test.go @@ -64,8 +64,10 @@ func TestAccDataSourceUsers_clientFilter(t *testing.T) { resource.TestCheckResourceAttrSet(resourceName, "users.0.linode_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "users.0.longview_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "users.0.nodebalancer_grant.#"), + resource.TestCheckResourceAttrSet(resourceName, "users.0.placement_group_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "users.0.stackscript_grant.#"), resource.TestCheckResourceAttrSet(resourceName, "users.0.volume_grant.#"), + resource.TestCheckResourceAttrSet(resourceName, "users.0.vpc_grant.#"), ), }, },