pkg/cmd/serviceaccount/phases/delete/roleassignment.go (50 lines of code) (raw):

package phases import ( "context" "github.com/pkg/errors" "monis.app/mlog" "github.com/Azure/azure-workload-identity/pkg/cloud" "github.com/Azure/azure-workload-identity/pkg/cmd/serviceaccount/options" "github.com/Azure/azure-workload-identity/pkg/cmd/serviceaccount/phases/workflow" ) const ( roleAssignmentPhaseName = "role-assignment" ) type roleAssignmentPhase struct { } // NewRoleAssignmentPhase creates a new phase to delete role assignment func NewRoleAssignmentPhase() workflow.Phase { p := &roleAssignmentPhase{} return workflow.Phase{ Name: roleAssignmentPhaseName, Aliases: []string{"ra"}, Description: "Delete the role assignment between the AAD application and the Azure cloud resource", PreRun: p.prerun, Run: p.run, Flags: []string{options.RoleAssignmentID.Flag}, } } func (p *roleAssignmentPhase) prerun(data workflow.RunData) error { deleteData, ok := data.(DeleteData) if !ok { return errors.Errorf("invalid data type %T", data) } if deleteData.RoleAssignmentID() == "" { return options.FlagIsRequiredError(options.RoleAssignmentID.Flag) } return nil } func (p *roleAssignmentPhase) run(ctx context.Context, data workflow.RunData) error { deleteData := data.(DeleteData) // TODO(aramase): consider supporting deletion of role assignment with scope, role and application id // delete the role assignment l := mlog.WithValues( "roleAssignmentID", deleteData.RoleAssignmentID(), ).WithName(roleAssignmentPhaseName) if _, err := deleteData.AzureClient().DeleteRoleAssignment(ctx, deleteData.RoleAssignmentID()); err != nil { if !cloud.IsRoleAssignmentAlreadyDeleted(err) { return errors.Wrap(err, "failed to delete role assignment") } l.Warning("role assignment not found") } else { l.Info("deleted role assignment") } return nil }