Skip to content

Commit 4441e7a

Browse files
committed
adding shared vpc arn
1 parent 6870db0 commit 4441e7a

File tree

4 files changed

+64
-20
lines changed

4 files changed

+64
-20
lines changed

castai/data_source_eks_settings.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ import (
1313
)
1414

1515
const (
16-
EKSSettingsFieldAccountId = "account_id"
17-
EKSSettingsFieldRegion = "region"
18-
EKSSettingsFieldVpc = "vpc"
19-
EKSSettingsFieldCluster = "cluster"
20-
EKSSettingsFieldIamPolicyJson = "iam_policy_json"
21-
EKSSettingsFieldIamUserPolicyJson = "iam_user_policy_json"
22-
EKSSettingsFieldIamManagedPolicies = "iam_managed_policies"
16+
EKSSettingsFieldAccountId = "account_id"
17+
EKSSettingsFieldRegion = "region"
18+
EKSSettingsFieldVpc = "vpc"
19+
EKSSettingsFieldCluster = "cluster"
20+
EKSSettingsFieldIamPolicyJson = "iam_policy_json"
21+
EKSSettingsFieldIamUserPolicyJson = "iam_user_policy_json"
22+
EKSSettingsFieldIamManagedPolicies = "iam_managed_policies"
23+
EKSSettingsFieldAWSSharedVPCAccountId = "aws_shared_vpc_account_id"
2324

2425
GovCloudPrefix = "us-gov"
2526
)
@@ -66,6 +67,13 @@ func dataSourceEKSSettings() *schema.Resource {
6667
Elem: &schema.Schema{Type: schema.TypeString},
6768
Computed: true,
6869
},
70+
EKSSettingsFieldAWSSharedVPCAccountId: {
71+
Type: schema.TypeString,
72+
Optional: true,
73+
ForceNew: true,
74+
Description: "AWS account ID where the VPC and subnets are located, for shared VPC setups. If not provided, defaults to the account_id.",
75+
ValidateDiagFunc: validation.ToDiagFunc(validation.StringIsNotWhiteSpace),
76+
},
6977
},
7078
}
7179
}
@@ -75,11 +83,17 @@ func dataSourceCastaiEKSSettingsRead(ctx context.Context, data *schema.ResourceD
7583
vpc := data.Get(EKSSettingsFieldVpc).(string)
7684
region := data.Get(EKSSettingsFieldRegion).(string)
7785
cluster := data.Get(EKSSettingsFieldCluster).(string)
86+
sharedVPCAccountID := data.Get(EKSSettingsFieldAWSSharedVPCAccountId).(string)
7887

7988
arn := fmt.Sprintf("%s:%s", region, accountID)
8089
partition := getPartition(region)
8190

82-
userPolicy, _ := policies.GetUserInlinePolicy(cluster, arn, vpc, partition)
91+
var sharedVPCArn string
92+
if sharedVPCAccountID != "" {
93+
sharedVPCArn = fmt.Sprintf("%s:%s", region, sharedVPCAccountID)
94+
}
95+
96+
userPolicy, _ := policies.GetUserInlinePolicy(cluster, arn, vpc, partition, sharedVPCArn)
8397
iamPolicy, _ := policies.GetIAMPolicy(accountID, partition)
8498
managedPolicies := policies.GetManagedPolicies(partition)
8599

castai/policies/policy.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,33 @@ func GetIAMPolicy(accountNumber, partition string) (string, error) {
3737
return buf.String(), nil
3838
}
3939

40-
func GetUserInlinePolicy(clusterName, arn, vpc, partition string) (string, error) {
40+
func GetUserInlinePolicy(clusterName, arn, vpc, partition, sharedVPCArn string) (string, error) {
4141
tmpl, err := template.New("json").Parse(UserPolicy)
4242
if err != nil {
4343
return "", fmt.Errorf("parsing template: %w", err)
4444
}
4545

46+
// If sharedVPCArn is not provided, use the main ARN for VPC/subnet resources
47+
if sharedVPCArn == "" {
48+
sharedVPCArn = arn
49+
}
50+
4651
type tmplValues struct {
47-
ClusterName string
48-
ARN string
49-
VPC string
50-
Partition string
52+
ClusterName string
53+
ARN string
54+
VPC string
55+
Partition string
56+
SharedVPCArn string
5157
}
5258

5359
var buf bytes.Buffer
5460

5561
if err := tmpl.Execute(&buf, tmplValues{
56-
ClusterName: clusterName,
57-
ARN: arn,
58-
VPC: vpc,
59-
Partition: partition,
62+
ClusterName: clusterName,
63+
ARN: arn,
64+
VPC: vpc,
65+
Partition: partition,
66+
SharedVPCArn: sharedVPCArn,
6067
}); err != nil {
6168
return "", fmt.Errorf("interpolating template: %w", err)
6269
}

castai/policies/policy_test.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestPolicies(t *testing.T) {
2424
})
2525

2626
t.Run("User policy", func(t *testing.T) {
27-
userpolicy, err := GetUserInlinePolicy("clustername", "testarn", "testvpc", "testpartition")
27+
userpolicy, err := GetUserInlinePolicy("clustername", "testarn", "testvpc", "testpartition", "")
2828
if err != nil || userpolicy == "" {
2929
t.Fatalf("couldn't generate user policy")
3030
}
@@ -40,6 +40,29 @@ func TestPolicies(t *testing.T) {
4040
}
4141
})
4242

43+
t.Run("User policy with shared VPC account", func(t *testing.T) {
44+
userpolicy, err := GetUserInlinePolicy("clustername", "testarn", "testvpc", "testpartition", "sharedvpcarn")
45+
if err != nil || userpolicy == "" {
46+
t.Fatalf("couldn't generate user policy")
47+
}
48+
49+
vpcResource := "arn:testpartition:ec2:sharedvpcarn:vpc/testvpc"
50+
subnetResource := "arn:testpartition:ec2:sharedvpcarn:subnet/*"
51+
instanceResource := "arn:testpartition:ec2:testarn:instance/*"
52+
53+
if !strings.Contains(userpolicy, vpcResource) {
54+
t.Fatalf("generated User policy does not contain shared VPC resource")
55+
}
56+
57+
if !strings.Contains(userpolicy, subnetResource) {
58+
t.Fatalf("generated User policy does not contain shared subnet resource")
59+
}
60+
61+
if !strings.Contains(userpolicy, instanceResource) {
62+
t.Fatalf("generated User policy should still use main ARN for instance resources")
63+
}
64+
})
65+
4366
t.Run("Managed policies", func(t *testing.T) {
4467
managedPolicies := GetManagedPolicies("testpartition")
4568

castai/policies/user-policy.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
"Sid": "RunInstancesVpcRestriction",
1717
"Effect": "Allow",
1818
"Action": "ec2:RunInstances",
19-
"Resource": "arn:{{ .Partition }}:ec2:{{ .ARN }}:subnet/*",
19+
"Resource": "arn:{{ .Partition }}:ec2:{{ .SharedVPCArn }}:subnet/*",
2020
"Condition": {
2121
"StringEquals": {
22-
"ec2:Vpc": "arn:{{ .Partition }}:ec2:{{ .ARN }}:vpc/{{ .VPC }}"
22+
"ec2:Vpc": "arn:{{ .Partition }}:ec2:{{ .SharedVPCArn }}:vpc/{{ .VPC }}"
2323
}
2424
}
2525
},

0 commit comments

Comments
 (0)