pkg/deploy/lattice/iamauthpolicy_manager.go (142 lines of code) (raw):

package lattice import ( "context" pkg_aws "github.com/aws/aws-application-networking-k8s/pkg/aws" model "github.com/aws/aws-application-networking-k8s/pkg/model/lattice" "github.com/aws/aws-sdk-go/service/vpclattice" ) type IAMAuthPolicyManager struct { cloud pkg_aws.Cloud } func NewIAMAuthPolicyManager(cloud pkg_aws.Cloud) *IAMAuthPolicyManager { return &IAMAuthPolicyManager{cloud: cloud} } func (m *IAMAuthPolicyManager) Put(ctx context.Context, policy model.IAMAuthPolicy) (model.IAMAuthPolicyStatus, error) { switch policy.Type { case model.ServiceNetworkType: return m.putSn(ctx, policy) case model.ServiceType: return m.putSvc(ctx, policy) default: panic("unknown policy resource type: " + policy.Type) } } func (m *IAMAuthPolicyManager) putSn(ctx context.Context, policy model.IAMAuthPolicy) (model.IAMAuthPolicyStatus, error) { sn, err := m.cloud.Lattice().FindServiceNetwork(ctx, policy.Name) if err != nil { return model.IAMAuthPolicyStatus{}, err } resourceId := *sn.SvcNetwork.Id err = m.putPolicy(ctx, resourceId, policy.Policy) if err != nil { return model.IAMAuthPolicyStatus{}, err } err = m.enableSnIAMAuth(ctx, resourceId) if err != nil { return model.IAMAuthPolicyStatus{}, err } return model.IAMAuthPolicyStatus{ResourceId: resourceId}, nil } func (m *IAMAuthPolicyManager) putSvc(ctx context.Context, policy model.IAMAuthPolicy) (model.IAMAuthPolicyStatus, error) { svc, err := m.cloud.Lattice().FindService(ctx, policy.Name) if err != nil { return model.IAMAuthPolicyStatus{}, err } resourceId := *svc.Id err = m.putPolicy(ctx, resourceId, policy.Policy) if err != nil { return model.IAMAuthPolicyStatus{}, err } err = m.enableSvcIAMAuth(ctx, resourceId) if err != nil { return model.IAMAuthPolicyStatus{}, err } return model.IAMAuthPolicyStatus{ResourceId: resourceId}, nil } func (m *IAMAuthPolicyManager) putPolicy(ctx context.Context, id, policy string) error { req := &vpclattice.PutAuthPolicyInput{ Policy: &policy, ResourceIdentifier: &id, } _, err := m.cloud.Lattice().PutAuthPolicyWithContext(ctx, req) return err } func (m *IAMAuthPolicyManager) Delete(ctx context.Context, policy model.IAMAuthPolicy) (model.IAMAuthPolicyStatus, error) { switch policy.Type { case model.ServiceNetworkType: return m.deleteSn(ctx, policy) case model.ServiceType: return m.deleteSvc(ctx, policy) default: panic("unknown policy resource type: " + policy.Type) } } func (m *IAMAuthPolicyManager) deleteSn(ctx context.Context, policy model.IAMAuthPolicy) (model.IAMAuthPolicyStatus, error) { if policy.ResourceId == "" { sn, err := m.cloud.Lattice().FindServiceNetwork(ctx, policy.Name) if err != nil { return model.IAMAuthPolicyStatus{}, err } policy.ResourceId = *sn.SvcNetwork.Id } err := m.disableSnIAMAuth(ctx, policy.ResourceId) if err != nil { return model.IAMAuthPolicyStatus{}, err } err = m.deletePolicy(ctx, policy.ResourceId) if err != nil { return model.IAMAuthPolicyStatus{}, err } return model.IAMAuthPolicyStatus{ResourceId: policy.ResourceId}, nil } func (m *IAMAuthPolicyManager) deleteSvc(ctx context.Context, policy model.IAMAuthPolicy) (model.IAMAuthPolicyStatus, error) { if policy.ResourceId == "" { svc, err := m.cloud.Lattice().FindService(ctx, policy.Name) if err != nil { return model.IAMAuthPolicyStatus{}, err } policy.ResourceId = *svc.Id } err := m.disableSvcIAMAuth(ctx, policy.ResourceId) if err != nil { return model.IAMAuthPolicyStatus{}, err } err = m.deletePolicy(ctx, policy.ResourceId) if err != nil { return model.IAMAuthPolicyStatus{}, err } return model.IAMAuthPolicyStatus{ResourceId: policy.ResourceId}, nil } func (m *IAMAuthPolicyManager) deletePolicy(ctx context.Context, resId string) error { req := &vpclattice.DeleteAuthPolicyInput{ResourceIdentifier: &resId} _, err := m.cloud.Lattice().DeleteAuthPolicy(req) return err } func (m *IAMAuthPolicyManager) enableSnIAMAuth(ctx context.Context, snId string) error { return m.setSnAuthType(ctx, snId, vpclattice.AuthTypeAwsIam) } func (m *IAMAuthPolicyManager) disableSnIAMAuth(ctx context.Context, snId string) error { return m.setSnAuthType(ctx, snId, vpclattice.AuthTypeNone) } func (m *IAMAuthPolicyManager) setSnAuthType(ctx context.Context, snId, authType string) error { req := &vpclattice.UpdateServiceNetworkInput{ AuthType: &authType, ServiceNetworkIdentifier: &snId, } _, err := m.cloud.Lattice().UpdateServiceNetworkWithContext(ctx, req) return err } func (m *IAMAuthPolicyManager) enableSvcIAMAuth(ctx context.Context, svcId string) error { return m.setSvcAuthType(ctx, svcId, vpclattice.AuthTypeAwsIam) } func (m *IAMAuthPolicyManager) disableSvcIAMAuth(ctx context.Context, svcId string) error { return m.setSvcAuthType(ctx, svcId, vpclattice.AuthTypeNone) } func (m *IAMAuthPolicyManager) setSvcAuthType(ctx context.Context, svcId, authType string) error { req := &vpclattice.UpdateServiceInput{ AuthType: &authType, ServiceIdentifier: &svcId, } _, err := m.cloud.Lattice().UpdateServiceWithContext(ctx, req) return err }