From 7ce0e807d0fc3f8ad5424fb42561a3948f050c1a Mon Sep 17 00:00:00 2001 From: yasun Date: Tue, 11 Jun 2024 19:54:53 +0800 Subject: [PATCH] OCM-8721 | ci: Tunning the framework for the OCMResource service to use the action methods --- tests/e2e/dummy_test.go | 2 +- tests/e2e/hcp_external_auth_test.go | 71 ++-- tests/e2e/test_rosacli_region.go | 10 +- tests/e2e/test_rosacli_user_role.go | 72 ++-- .../rosacli/break_glass_credential_service.go | 322 +++++++++++------- tests/utils/exec/rosacli/cmd_parser.go | 2 +- tests/utils/exec/rosacli/cmd_runner.go | 5 + .../exec/rosacli/ocm_resource_service.go | 283 +++++++++++---- 8 files changed, 505 insertions(+), 262 deletions(-) diff --git a/tests/e2e/dummy_test.go b/tests/e2e/dummy_test.go index 4a734a914..941bcfd68 100644 --- a/tests/e2e/dummy_test.go +++ b/tests/e2e/dummy_test.go @@ -85,7 +85,7 @@ var _ = Describe("ROSA CLI Test", func() { Describe("logstreamtest", func() { It("", func() { funcA := func(causeError bool) error { - rosacli.NewClient().OCMResource.ListRegion() + rosacli.NewClient().OCMResource.List().Regions().Run() Logger.Debugf("I am debug message with caseuError %v", causeError) if causeError { return fmt.Errorf("test") diff --git a/tests/e2e/hcp_external_auth_test.go b/tests/e2e/hcp_external_auth_test.go index c8dc27a56..ec59deee2 100644 --- a/tests/e2e/hcp_external_auth_test.go +++ b/tests/e2e/hcp_external_auth_test.go @@ -59,6 +59,7 @@ var _ = Describe("External auth provider", labels.Feature.ExternalAuthProvider, var err error var userName string var breakGlassCredID string + breakGlassCredentialService := rosaClient.BreakGlassCredential userNameList := []string{} @@ -70,18 +71,18 @@ var _ = Describe("External auth provider", labels.Feature.ExternalAuthProvider, } By("Retrieve help for create/list/describe/delete break-glass-credential") - _, err = rosaClient.BreakGlassCredential.RetrieveHelpForCreate() + _, err = breakGlassCredentialService.Create().Help().Run() Expect(err).ToNot(HaveOccurred()) - _, err = rosaClient.BreakGlassCredential.RetrieveHelpForDescribe() + _, err = breakGlassCredentialService.Describe().Help().Run() Expect(err).ToNot(HaveOccurred()) - _, err = rosaClient.BreakGlassCredential.RetrieveHelpForList() + _, err = breakGlassCredentialService.List().Help().Run() Expect(err).ToNot(HaveOccurred()) - _, err = rosaClient.BreakGlassCredential.RetrieveHelpForDelete() + _, err = breakGlassCredentialService.Revoke().Help().Run() Expect(err).ToNot(HaveOccurred()) for key, value := range reqBody { By("Create a break-glass-credential to the cluster") - resp, err = rosaClient.BreakGlassCredential.CreateBreakGlassCredential(clusterID, value...) + resp, err = breakGlassCredentialService.Create().Parameters(clusterID, value...).Run() createTime := time.Now().UTC() expiredTime := createTime.Add(15 * time.Minute).Format("Jan _2 2006 15:04 MST") if key == "emptyExpiration" || key == "empty" { @@ -92,42 +93,47 @@ var _ = Describe("External auth provider", labels.Feature.ExternalAuthProvider, Expect(textData).To(ContainSubstring("INFO: Successfully created a break glass credential for cluster '%s'", clusterID)) By("List the break-glass-credentials of the cluster") - breakGlassCredList, err := rosaClient.BreakGlassCredential.ListBreakGlassCredentialsAndReflect(clusterID) + breakGlassCredList, err := breakGlassCredentialService.List().Parameters(clusterID).ToStruct() Expect(err).ToNot(HaveOccurred()) - for _, breabreakGlassCred := range breakGlassCredList.BreakGlassCredentials { + for _, breabreakGlassCred := range breakGlassCredList.(rosacli.BreakGlassCredentialList) { if !slices.Contains(userNameList, breabreakGlassCred.Username) && breabreakGlassCred.Status != "revoked" && breabreakGlassCred.Status != "awaiting_revocation" { userName = breabreakGlassCred.Username breakGlassCredID = breabreakGlassCred.ID userNameList = append(userNameList, userName) - Eventually(rosaClient.BreakGlassCredential.WaitForBreakGlassCredentialToStatus(clusterID, "issued", userName), time.Minute*2, time.Second*10).Should(BeTrue()) + Eventually(breakGlassCredentialService.WaitForStatus(clusterID, "issued", userName), time.Minute*2, time.Second*10).Should(BeTrue()) } } By("Describe the break-glass-credential") - output, err := rosaClient.BreakGlassCredential.DescribeBreakGlassCredentialsAndReflect(clusterID, breakGlassCredID) + output, err := breakGlassCredentialService.Describe(breakGlassCredID).Parameters(clusterID).ToStruct() Expect(err).ToNot(HaveOccurred()) + bgcDescription := output.(*rosacli.BreakGlassCredentialDescription) // expiration timestamp changes from 4 to 5 seconds ahead, so have to remove second from time stamp - expirationTime, err := time.Parse("Jan _2 2006 15:04:05 MST", output.ExpireAt) + expirationTime, err := time.Parse("Jan _2 2006 15:04:05 MST", bgcDescription.ExpireAt) Expect(err).ToNot(HaveOccurred()) - Expect(output.ID).To(Equal(breakGlassCredID)) + Expect(bgcDescription.ID).To(Equal(breakGlassCredID)) Expect(expirationTime.Format("Jan _2 2006 15:04 MST")).To(Equal(expiredTime)) - Expect(output.Username).To(Equal(userName)) - Expect(output.Status).To(Equal("issued")) + Expect(bgcDescription.Username).To(Equal(userName)) + Expect(bgcDescription.Status).To(Equal("issued")) By("Get the issued credential") - _, err = rosaClient.BreakGlassCredential.GetIssuedCredential(clusterID, breakGlassCredID) + _, err = breakGlassCredentialService.Describe(breakGlassCredID).Parameters( + clusterID, + "--id", breakGlassCredID, + "--kubeconfig", + ).Run() Expect(err).ToNot(HaveOccurred()) } By("Delete the break-glass-credential") - resp, err = rosaClient.BreakGlassCredential.DeleteBreakGlassCredential(clusterID) + resp, err = breakGlassCredentialService.Revoke().Parameters(clusterID).Run() Expect(err).ToNot(HaveOccurred()) textData := rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("INFO: Successfully requested revocation for all break glass credentials from cluster '%s'", clusterID)) By("Check the break-glass-credential status is revoked") for _, userName = range userNameList { - Eventually(rosaClient.BreakGlassCredential.WaitForBreakGlassCredentialToStatus(clusterID, "revoked", userName), time.Minute*4, time.Second*10).Should(BeTrue()) + Eventually(breakGlassCredentialService.WaitForStatus(clusterID, "revoked", userName), time.Minute*4, time.Second*10).Should(BeTrue()) } }) @@ -229,23 +235,26 @@ var _ = Describe("External auth provider", labels.Feature.ExternalAuthProvider, hosted, err := clusterService.IsHostedCPCluster(clusterID) Expect(err).ToNot(HaveOccurred()) + breakGlassCredentialService := rosaClient.BreakGlassCredential if !hosted { By("Create a break-glass-credential to the cluster") userName := common.GenerateRandomName("bgc-user-classic", 2) - resp, err := rosaClient.BreakGlassCredential.CreateBreakGlassCredential(clusterID, "--username", userName, "--expiration", "2h") + resp, err := breakGlassCredentialService.Create().Parameters( + clusterID, "--username", userName, "--expiration", "2h", + ).Run() Expect(err).To(HaveOccurred()) textData := rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: external authentication provider is only supported for Hosted Control Planes")) By("List the break-glass-credentials of the cluster") - resp, err = rosaClient.BreakGlassCredential.ListBreakGlassCredentials(clusterID) + resp, err = breakGlassCredentialService.List().Parameters(clusterID).Run() Expect(err).To(HaveOccurred()) textData = rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: external authentication provider is only supported for Hosted Control Planes")) By("Revoke the break-glass-credentials of the cluster") - resp, err = rosaClient.BreakGlassCredential.DeleteBreakGlassCredential(clusterID) + resp, err = breakGlassCredentialService.Revoke().Parameters(clusterID).Run() Expect(err).To(HaveOccurred()) textData = rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: external authentication provider is only supported for Hosted Control Planes")) @@ -259,29 +268,31 @@ var _ = Describe("External auth provider", labels.Feature.ExternalAuthProvider, By("Create a break-glass-credential to the cluster") userName := common.GenerateRandomName("bgc-user-non-external", 2) - resp, err := rosaClient.BreakGlassCredential.CreateBreakGlassCredential(clusterID, "--username", userName, "--expiration", "2h") + resp, err := breakGlassCredentialService.Create().Parameters( + clusterID, "--username", userName, "--expiration", "2h", + ).Run() Expect(err).To(HaveOccurred()) textData := rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: External authentication configuration is not enabled for cluster '%s'", clusterID)) By("List the break-glass-credentials of the cluster") - resp, err = rosaClient.BreakGlassCredential.ListBreakGlassCredentials(clusterID) + resp, err = rosaClient.BreakGlassCredential.List().Parameters(clusterID).Run() Expect(err).To(HaveOccurred()) textData = rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: External authentication configuration is not enabled for cluster '%s'", clusterID)) By("Revoke the break-glass-credentials of the cluster") - resp, err = rosaClient.BreakGlassCredential.DeleteBreakGlassCredential(clusterID) + resp, err = rosaClient.BreakGlassCredential.Revoke().Parameters(clusterID).Run() Expect(err).To(HaveOccurred()) textData = rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: External authentication configuration is not enabled for cluster '%s'", clusterID)) } else if externalAuthProvider { - By("Create break-glass-credential with invalid --username") userName := common.GenerateRandomName("bgc-user_", 2) - - resp, err := rosaClient.BreakGlassCredential.CreateBreakGlassCredential(clusterID, "--username", userName, "--expiration", "2h") + resp, err := breakGlassCredentialService.Create().Parameters( + clusterID, "--username", userName, "--expiration", "2h", + ).Run() Expect(err).To(HaveOccurred()) textData := rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: failed to create a break glass credential for cluster '%s': The username '%s' must respect the regexp '^[a-zA-Z0-9-.]*$'", clusterID, userName)) @@ -289,16 +300,18 @@ var _ = Describe("External auth provider", labels.Feature.ExternalAuthProvider, By("Create break-glass-credential with invalid --expiration") userName = common.GenerateRandomName("bgc-user-invalid-exp", 2) expirationTime := "2may" - - resp, err = rosaClient.BreakGlassCredential.CreateBreakGlassCredential(clusterID, "--username", userName, "--expiration", expirationTime) + resp, err = breakGlassCredentialService.Create().Parameters( + clusterID, "--username", userName, "--expiration", expirationTime, + ).Run() Expect(err).To(HaveOccurred()) textData = rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring(`invalid argument "%s" for "--expiration" flag`, expirationTime)) By("Create break-glass-credential with invalid expiration") userName = common.GenerateRandomName("bgc-user-exp-1s", 2) - - resp, err = rosaClient.BreakGlassCredential.CreateBreakGlassCredential(clusterID, "--username", userName, "--expiration", "1s") + resp, err = breakGlassCredentialService.Create().Parameters( + clusterID, "--username", userName, "--expiration", "1s", + ).Run() Expect(err).To(HaveOccurred()) textData = rosaClient.Parser.TextData.Input(resp).Parse().Tip() Expect(textData).To(ContainSubstring("ERR: failed to create a break glass credential for cluster '%s': Expiration needs to be at least 10 minutes from now", clusterID)) diff --git a/tests/e2e/test_rosacli_region.go b/tests/e2e/test_rosacli_region.go index 6977e5600..3a1c16049 100644 --- a/tests/e2e/test_rosacli_region.go +++ b/tests/e2e/test_rosacli_region.go @@ -29,17 +29,17 @@ var _ = Describe("Region", func() { By("List region") - usersTabNonH, _, err := ocmResourceService.ListRegion() + regionList, err := ocmResourceService.List().Regions().ToStruct() Expect(err).To(BeNil()) - Expect(len(usersTabNonH)).NotTo(Equal(0)) + Expect(len(regionList.([]*rosacli.CloudRegion))).NotTo(Equal(0)) By("List region --hosted-cp") - usersTabH, _, err := ocmResourceService.ListRegion("--hosted-cp") + hcpRegionList, err := ocmResourceService.List().Regions().Parameters("--hosted-cp").ToStruct() Expect(err).To(BeNil()) - Expect(len(usersTabH)).NotTo(Equal(0)) + Expect(len(hcpRegionList.([]*rosacli.CloudRegion))).NotTo(Equal(0)) By("Check out of 'rosa list region --hosted-cp' are supported for hosted-cp clusters") - for _, r := range usersTabH { + for _, r := range hcpRegionList.([]*rosacli.CloudRegion) { Expect(r.MultiAZSupported).To(Equal("true")) } }) diff --git a/tests/e2e/test_rosacli_user_role.go b/tests/e2e/test_rosacli_user_role.go index cff2e7e89..b38e420e4 100644 --- a/tests/e2e/test_rosacli_user_role.go +++ b/tests/e2e/test_rosacli_user_role.go @@ -37,7 +37,7 @@ var _ = Describe("Edit user role", labels.Feature.UserRole, func() { ocmAccountUsername string notExistedUserRoleArn string userRoleArnInWrongFormat string - foundUserRole rosacli.UserRole + foundUserRole *rosacli.UserRole ) rosaClient.Runner.JsonFormat() whoamiOutput, err := ocmResourceService.Whoami() @@ -49,54 +49,61 @@ var _ = Describe("Edit user role", labels.Feature.UserRole, func() { userRolePrefix = fmt.Sprintf("QEAuto-user-%s-OCP-52580", time.Now().UTC().Format("20060102")) By("Create an user-role with invalid mode") - output, err := ocmResourceService.CreateUserRole("--mode", "invalidamode", + // output, err := ocmResourceService.CreateUserRole("--mode", "invalidamode", + // "--prefix", userRolePrefix, + // "-y") + output, err := ocmResourceService.Create().UserRole().Parameters( + "--mode", "invalidamode", "--prefix", userRolePrefix, - "-y") + "-y").Run() Expect(err).NotTo(BeNil()) textData := rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Invalid mode. Allowed values are [auto manual]")) By("Create an user-role with invalid permision boundady") invalidPermisionBoundary = "arn-permission-boundary" - output, err = ocmResourceService.CreateUserRole("--mode", "auto", + output, err = ocmResourceService.Create().UserRole().Parameters( + "--mode", "auto", "--permissions-boundary", invalidPermisionBoundary, "--prefix", userRolePrefix, - "-y") + "-y").Run() Expect(err).NotTo(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Expected a valid policy ARN for permissions boundary")) By("Create an user-role with the permision boundady under another aws account") notExistedPermissionBoundaryUnderDifferentAWS = "arn:aws:iam::aws:policy/notexisted" - output, err = ocmResourceService.CreateUserRole("--mode", "auto", + output, err = ocmResourceService.Create().UserRole().Parameters( + "--mode", "auto", "--permissions-boundary", notExistedPermissionBoundaryUnderDifferentAWS, "--prefix", userRolePrefix, - "-y") + "-y").Run() Expect(err).NotTo(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("There was an error creating the ocm user role: operation error IAM: CreateRole")) Expect(textData).Should(ContainSubstring("api error NoSuchEntity")) By("Create an user-role") - output, err = ocmResourceService.CreateUserRole("--mode", "auto", + output, err = ocmResourceService.Create().UserRole().Parameters( + "--mode", "auto", "--prefix", userRolePrefix, - "-y") + "-y").Run() Expect(err).To(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Created role")) Expect(textData).Should(ContainSubstring("Successfully linked role")) By("Get the user-role info") - userRoleList, output, err := ocmResourceService.ListUserRole() + userRoleList, err := ocmResourceService.List().UserRole().ToStruct() Expect(err).To(BeNil()) - foundUserRole = userRoleList.UserRole(userRolePrefix, ocmAccountUsername) + foundUserRole = userRoleList.(*rosacli.UserRoleList).UserRole(userRolePrefix, ocmAccountUsername) Expect(foundUserRole).ToNot(BeNil()) defer func() { By("Delete user-role") - output, err = ocmResourceService.DeleteUserRole("--mode", "auto", + output, err = ocmResourceService.Delete().UserRole().Parameters("--mode", "auto", "--role-arn", foundUserRole.RoleArn, - "-y") + "-y").Run() Expect(err).To(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() @@ -105,32 +112,32 @@ var _ = Describe("Edit user role", labels.Feature.UserRole, func() { By("Unlink user-role with not-exist role") notExistedUserRoleArn = "arn:aws:iam::301721915996:role/notexistuserrolearn" - output, err = ocmResourceService.UnlinkUserRole("--role-arn", notExistedUserRoleArn, "-y") + output, err = ocmResourceService.Unlink().UserRole().Parameters("--role-arn", notExistedUserRoleArn, "-y").Run() Expect(err).NotTo(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("is not linked with the current account")) By("Unlink user-role with the role arn in incorrect format") userRoleArnInWrongFormat = "arn301721915996:rolenotexistuserrolearn" - output, err = ocmResourceService.UnlinkUserRole("--role-arn", userRoleArnInWrongFormat, "-y") + output, err = ocmResourceService.Unlink().UserRole().Parameters("--role-arn", userRoleArnInWrongFormat, "-y").Run() Expect(err).NotTo(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Expected a valid user role ARN to unlink from the current account")) By("Unlink user-role") - output, err = ocmResourceService.UnlinkUserRole("--role-arn", foundUserRole.RoleArn, "-y") + output, err = ocmResourceService.Unlink().UserRole().Parameters("--role-arn", foundUserRole.RoleArn, "-y").Run() Expect(err).To(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Successfully unlinked role")) By("Get the user-role info") - userRoleList, output, err = ocmResourceService.ListUserRole() + userRoleList, err = ocmResourceService.List().UserRole().ToStruct() Expect(err).To(BeNil()) - foundUserRole = userRoleList.UserRole(userRolePrefix, ocmAccountUsername) + foundUserRole = userRoleList.(*rosacli.UserRoleList).UserRole(userRolePrefix, ocmAccountUsername) Expect(foundUserRole.Linded).To(Equal("No")) By("Link user-role with the role arn in incorrect format") - output, err = ocmResourceService.LinkUserRole("--role-arn", userRoleArnInWrongFormat, "-y") + output, err = ocmResourceService.Link().UserRole().Parameters("--role-arn", userRoleArnInWrongFormat, "-y").Run() Expect(err).NotTo(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Expected a valid user role ARN to link to a current account")) @@ -142,7 +149,7 @@ var _ = Describe("Edit user role", labels.Feature.UserRole, func() { var ( userrolePrefix string ocmAccountUsername string - foundUserRole rosacli.UserRole + foundUserRole *rosacli.UserRole path = "/aa/bb/" ) @@ -156,49 +163,44 @@ var _ = Describe("Edit user role", labels.Feature.UserRole, func() { userrolePrefix = fmt.Sprintf("QEAuto-userr-%s-52419", time.Now().UTC().Format("20060102")) By("Create an user-role") - output, err := ocmResourceService.CreateUserRole( + output, err := ocmResourceService.Create().UserRole().Parameters( "--mode", "auto", "--prefix", userrolePrefix, "--path", path, "--permissions-boundary", permissionsBoundaryArn, - "-y") + "-y").Run() Expect(err).To(BeNil()) textData := rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Created role")) Expect(textData).Should(ContainSubstring("Successfully linked role")) defer func() { By("Delete user-role") - output, err = ocmResourceService.DeleteUserRole("--mode", "auto", + output, err = ocmResourceService.Delete().UserRole().Parameters("--mode", "auto", "--role-arn", foundUserRole.RoleArn, - "-y") + "-y").Run() Expect(err).To(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Successfully deleted the user role")) }() - By("Get the ocm-role info") - userRoleList, output, err := ocmResourceService.ListUserRole() - Expect(err).To(BeNil()) - foundUserRole = userRoleList.UserRole(userrolePrefix, ocmAccountUsername) - Expect(foundUserRole).ToNot(BeNil()) - By("Get the user-role info") - userRoleList, output, err = ocmResourceService.ListUserRole() + userRoleList, err := ocmResourceService.List().UserRole().ToStruct() Expect(err).To(BeNil()) - foundUserRole = userRoleList.UserRole(userrolePrefix, ocmAccountUsername) + foundUserRole = userRoleList.(*rosacli.UserRoleList).UserRole(userrolePrefix, ocmAccountUsername) + Expect(foundUserRole).ToNot(BeNil()) Expect(foundUserRole.Linded).To(Equal("Yes")) By("Unlink user-role") - output, err = ocmResourceService.UnlinkUserRole("--role-arn", foundUserRole.RoleArn, "-y") + output, err = ocmResourceService.Unlink().UserRole().Parameters("--role-arn", foundUserRole.RoleArn, "-y").Run() Expect(err).To(BeNil()) textData = rosaClient.Parser.TextData.Input(output).Parse().Tip() Expect(textData).Should(ContainSubstring("Successfully unlinked role")) By("Get the user-role info") - userRoleList, output, err = ocmResourceService.ListUserRole() + userRoleList, err = ocmResourceService.List().UserRole().ToStruct() Expect(err).To(BeNil()) - foundUserRole = userRoleList.UserRole(userrolePrefix, ocmAccountUsername) + foundUserRole = userRoleList.(*rosacli.UserRoleList).UserRole(userrolePrefix, ocmAccountUsername) Expect(foundUserRole.Linded).To(Equal("No")) }) }) diff --git a/tests/utils/exec/rosacli/break_glass_credential_service.go b/tests/utils/exec/rosacli/break_glass_credential_service.go index e6e0bc008..fea8e5b7f 100644 --- a/tests/utils/exec/rosacli/break_glass_credential_service.go +++ b/tests/utils/exec/rosacli/break_glass_credential_service.go @@ -3,8 +3,6 @@ package rosacli import ( "bytes" - "gopkg.in/yaml.v3" - "k8s.io/apimachinery/pkg/util/wait" . "github.com/openshift/rosa/tests/utils/log" @@ -13,27 +11,35 @@ import ( type BreakGlassCredentialService interface { ResourcesCleaner - CreateBreakGlassCredential(clusterID string, flags ...string) (bytes.Buffer, error) - DeleteBreakGlassCredential(clusterID string) (bytes.Buffer, error) - ListBreakGlassCredentials(clusterID string) (bytes.Buffer, error) - ReflectBreakGlassCredentialLists(result bytes.Buffer) (bgcl *BreakGlassCredentialList, err error) - DescribeBreakGlassCredential(clusterID string, bgcID string) (bytes.Buffer, error) - ReflectBreakGlassCredentialDescription(result bytes.Buffer) (bgcd *BreakGlassCredentialDescription, err error) - GetIssuedCredential(clusterID string, bgcID string) (bytes.Buffer, error) - WaitForBreakGlassCredentialToStatus(clusterID string, status string, userName string) wait.ConditionFunc + Create() *breakglasscredentialService + List() *breakglasscredentialService + Describe(bgcID ...string) *breakglasscredentialService + Revoke() *breakglasscredentialService + Help() *breakglasscredentialService + + // CreateBreakGlassCredential(clusterID string, flags ...string) (bytes.Buffer, error) + // DeleteBreakGlassCredential(clusterID string) (bytes.Buffer, error) + // ListBreakGlassCredentials(clusterID string) (bytes.Buffer, error) + // ReflectBreakGlassCredentialLists(result bytes.Buffer) (bgcl *BreakGlassCredentialList, err error) + // DescribeBreakGlassCredential(clusterID string, bgcID string) (bytes.Buffer, error) + // ReflectBreakGlassCredentialDescription(result bytes.Buffer) (bgcd *BreakGlassCredentialDescription, err error) + // GetIssuedCredential(clusterID string, bgcID string) (bytes.Buffer, error) + WaitForStatus(clusterID string, status string, userName string) wait.ConditionFunc - ListBreakGlassCredentialsAndReflect(clusterID string) (*BreakGlassCredentialList, error) - DescribeBreakGlassCredentialsAndReflect(clusterID string, bgcID string) (*BreakGlassCredentialDescription, error) + // ListBreakGlassCredentialsAndReflect(clusterID string) (*BreakGlassCredentialList, error) + // DescribeBreakGlassCredentialsAndReflect(clusterID string, bgcID string) (*BreakGlassCredentialDescription, error) - RetrieveHelpForCreate() (bytes.Buffer, error) - RetrieveHelpForList() (bytes.Buffer, error) - RetrieveHelpForDescribe() (bytes.Buffer, error) - RetrieveHelpForDelete() (bytes.Buffer, error) + // RetrieveHelpForCreate() (bytes.Buffer, error) + // RetrieveHelpForList() (bytes.Buffer, error) + // RetrieveHelpForDescribe() (bytes.Buffer, error) + // RetrieveHelpForDelete() (bytes.Buffer, error) } type breakglasscredentialService struct { ResourcesService - created map[string]bool + created map[string]bool + Action string + ClusterID string } type BreakGlassCredential struct { @@ -42,9 +48,11 @@ type BreakGlassCredential struct { Status string `json:"Status,omitempty"` } -type BreakGlassCredentialList struct { - BreakGlassCredentials []BreakGlassCredential `json:"BreakGlassCredentials,omitempty"` -} +type BreakGlassCredentialList []*BreakGlassCredential + +// type BreakGlassCredentialList struct { +// BreakGlassCredentials []BreakGlassCredential `json:"BreakGlassCredentials,omitempty"` +// } type BreakGlassCredentialDescription struct { ID string `yaml:"ID,omitempty"` @@ -62,148 +70,222 @@ func NewBreakGlassCredentialService(client *Client) BreakGlassCredentialService } } -// Create BreakGlassCredential -func (b *breakglasscredentialService) CreateBreakGlassCredential(clusterID string, flags ...string) (output bytes.Buffer, err error) { - output, err = b.client.Runner. - Cmd("create", "break-glass-credential"). - CmdFlags(append(flags, "-c", clusterID)...). - Run() - if err == nil { - b.created[clusterID] = true +func (b *breakglasscredentialService) Create() *breakglasscredentialService { + b.Action = "create" + b.client.Runner.Cmd("create", "break-glass-credential") + return b +} + +func (b *breakglasscredentialService) List() *breakglasscredentialService { + b.Action = "list" + b.client.Runner.Cmd("list", "break-glass-credential") + return b +} + +func (b *breakglasscredentialService) Revoke() *breakglasscredentialService { + b.Action = "revoke" + b.client.Runner.Cmd("revoke", "break-glass-credential") + return b +} + +func (b *breakglasscredentialService) Describe(bgcID ...string) *breakglasscredentialService { + b.Action = "describe" + if len(bgcID) > 0 { + b.client.Runner.Cmd("describe", "break-glass-credential", bgcID[0]) + } else { + b.client.Runner.Cmd("describe", "break-glass-credential") } - return + return b } -// List BreakGlassCredentials -func (b *breakglasscredentialService) ListBreakGlassCredentials(clusterID string) (output bytes.Buffer, err error) { - output, err = b.client.Runner. - Cmd("list", "break-glass-credential"). - CmdFlags("-c", clusterID). - Run() - return +func (b *breakglasscredentialService) Parameters(clusterID string, flags ...string) *breakglasscredentialService { + b.client.Runner.CmdFlags(append(flags, "-c", clusterID)...) + return b +} + +func (b *breakglasscredentialService) Help() *breakglasscredentialService { + b.client.Runner.CmdFlags("-h") + return b } +func (b *breakglasscredentialService) Run() (output bytes.Buffer, err error) { + return b.client.Runner.Run() +} + +func (b *breakglasscredentialService) ToStruct() (interface{}, error) { + output, err := b.client.Runner.Run() + if err != nil { + return nil, err + } + + switch b.Action { + case "describe": + theMap, err := b.client.Parser.TextData.Input(output).Parse().YamlToMap() + if err != nil { + return nil, err + } + s := &BreakGlassCredentialDescription{} + err = MapStructure(theMap, s) + return s, err + case "list": + var bgcl BreakGlassCredentialList + theMap := b.client.Parser.TableData.Input(output).Parse().Output() + for _, bgcItem := range theMap { + s := &BreakGlassCredential{} + err = MapStructure(bgcItem, s) + if err != nil { + return nil, err + } + bgcl = append(bgcl, s) + } + return bgcl, err + } + + return nil, err +} + +// // Create BreakGlassCredential +// func (b *breakglasscredentialService) CreateBreakGlassCredential(clusterID string, flags ...string) (output bytes.Buffer, err error) { +// output, err = b.client.Runner. +// Cmd("create", "break-glass-credential"). +// CmdFlags(append(flags, "-c", clusterID)...). +// Run() +// if err == nil { +// b.created[clusterID] = true +// } +// return +// } + +// // List BreakGlassCredentials +// func (b *breakglasscredentialService) ListBreakGlassCredentials(clusterID string) (output bytes.Buffer, err error) { +// output, err = b.client.Runner. +// Cmd("list", "break-glass-credential"). +// CmdFlags("-c", clusterID). +// Run() +// return +// } + // Check the breakGlassCredential with the userName exists in the breakGlassCredentialsList -func (breakglassCredList BreakGlassCredentialList) IsPresent(userName string) (existed bool, breakGlassCredential *BreakGlassCredential) { +func (bgcl BreakGlassCredentialList) IsPresent(userName string) (existed bool, breakGlassCredential *BreakGlassCredential) { existed = false breakGlassCredential = &BreakGlassCredential{} - for _, breakGlassCred := range breakglassCredList.BreakGlassCredentials { + for _, breakGlassCred := range bgcl { if breakGlassCred.Username == userName { existed = true - breakGlassCredential = &breakGlassCred + breakGlassCredential = breakGlassCred break } } return } -func (b *breakglasscredentialService) ReflectBreakGlassCredentialLists(result bytes.Buffer) (bgcl *BreakGlassCredentialList, err error) { - bgcl = &BreakGlassCredentialList{} - theMap := b.client.Parser.TableData.Input(result).Parse().Output() - for _, bgcItem := range theMap { - breakGlassCredential := &BreakGlassCredential{} - err = MapStructure(bgcItem, breakGlassCredential) - if err != nil { - return - } - bgcl.BreakGlassCredentials = append(bgcl.BreakGlassCredentials, *breakGlassCredential) - } - return -} +// func (b *breakglasscredentialService) ReflectBreakGlassCredentialLists(result bytes.Buffer) (bgcl *BreakGlassCredentialList, err error) { +// bgcl = &BreakGlassCredentialList{} +// theMap := b.client.Parser.TableData.Input(result).Parse().Output() +// for _, bgcItem := range theMap { +// breakGlassCredential := &BreakGlassCredential{} +// err = MapStructure(bgcItem, breakGlassCredential) +// if err != nil { +// return +// } +// bgcl.BreakGlassCredentials = append(bgcl.BreakGlassCredentials, *breakGlassCredential) +// } +// return +// } -func (b *breakglasscredentialService) ListBreakGlassCredentialsAndReflect(clusterID string) (*BreakGlassCredentialList, error) { - output, err := b.ListBreakGlassCredentials(clusterID) - if err != nil { - return nil, err - } - return b.ReflectBreakGlassCredentialLists(output) -} +// func (b *breakglasscredentialService) ListBreakGlassCredentialsAndReflect(clusterID string) (*BreakGlassCredentialList, error) { +// output, err := b.ListBreakGlassCredentials(clusterID) +// if err != nil { +// return nil, err +// } +// return b.ReflectBreakGlassCredentialLists(output) +// } // Describe BreakGlassCredential -func (b *breakglasscredentialService) DescribeBreakGlassCredential(clusterID string, bgcID string) (bytes.Buffer, error) { - describe := b.client.Runner. - Cmd("describe", "break-glass-credential", bgcID). - CmdFlags("-c", clusterID) +// func (b *breakglasscredentialService) DescribeBreakGlassCredential(clusterID string, bgcID string) (bytes.Buffer, error) { +// describe := b.client.Runner. +// Cmd("describe", "break-glass-credential", bgcID). +// CmdFlags("-c", clusterID) - return describe.Run() -} +// return describe.Run() +// } -func (b *breakglasscredentialService) DescribeBreakGlassCredentialsAndReflect(clusterID string, bgcID string) (*BreakGlassCredentialDescription, error) { - output, err := b.DescribeBreakGlassCredential(clusterID, bgcID) - if err != nil { - return nil, err - } - return b.ReflectBreakGlassCredentialDescription(output) -} +// func (b *breakglasscredentialService) DescribeBreakGlassCredentialsAndReflect(clusterID string, bgcID string) (*BreakGlassCredentialDescription, error) { +// output, err := b.DescribeBreakGlassCredential(clusterID, bgcID) +// if err != nil { +// return nil, err +// } +// return b.ReflectBreakGlassCredentialDescription(output) +// } -func (b *breakglasscredentialService) ReflectBreakGlassCredentialDescription(result bytes.Buffer) (bgcd *BreakGlassCredentialDescription, err error) { - var data []byte - res := &BreakGlassCredentialDescription{} - theMap, err := b.client.Parser.TextData.Input(result).Parse().YamlToMap() - if err != nil { - return - } - data, err = yaml.Marshal(&theMap) - if err != nil { - return - } - err = yaml.Unmarshal(data, res) - return res, err -} +// func (b *breakglasscredentialService) ReflectBreakGlassCredentialDescription(result bytes.Buffer) (bgcd *BreakGlassCredentialDescription, err error) { +// var data []byte +// res := &BreakGlassCredentialDescription{} +// theMap, err := b.client.Parser.TextData.Input(result).Parse().YamlToMap() +// if err != nil { +// return +// } +// data, err = yaml.Marshal(&theMap) +// if err != nil { +// return +// } +// err = yaml.Unmarshal(data, res) +// return res, err +// } // Delete BreakGlassCredential -func (b *breakglasscredentialService) DeleteBreakGlassCredential(clusterID string) (output bytes.Buffer, err error) { - output, err = b.client.Runner. - Cmd("revoke", "break-glass-credential"). - CmdFlags("-c", clusterID, "-y"). - Run() - return -} +// func (b *breakglasscredentialService) DeleteBreakGlassCredential(clusterID string) (output bytes.Buffer, err error) { +// output, err = b.client.Runner. +// Cmd("revoke", "break-glass-credential"). +// CmdFlags("-c", clusterID, "-y"). +// Run() +// return +// } -func (b *breakglasscredentialService) GetIssuedCredential(clusterID string, bgcID string) (bytes.Buffer, error) { - output, err := b.client.Runner. - Cmd("describe", "break-glass-credential"). - CmdFlags("-c", clusterID, "--id", bgcID, "--kubeconfig"). - Run() - return output, err -} +// func (b *breakglasscredentialService) GetIssuedCredential(clusterID string, bgcID string) (bytes.Buffer, error) { +// output, err := b.client.Runner. +// Cmd("describe", "break-glass-credential"). +// CmdFlags("-c", clusterID, "--id", bgcID, "--kubeconfig"). +// Run() +// return output, err +// } -func (b *breakglasscredentialService) WaitForBreakGlassCredentialToStatus(clusterID string, status string, userName string) wait.ConditionFunc { +func (b *breakglasscredentialService) WaitForStatus(clusterID string, status string, userName string) wait.ConditionFunc { return func() (bool, error) { - breakGlassCredList, err := b.ListBreakGlassCredentialsAndReflect(clusterID) + breakGlassCredList, err := b.List().Parameters(clusterID).ToStruct() if err != nil { return false, err } - _, breakGlassCredential := breakGlassCredList.IsPresent(userName) + _, breakGlassCredential := breakGlassCredList.(BreakGlassCredentialList).IsPresent(userName) Logger.Infof("The status for break-glass-credential %s is %s\n", breakGlassCredential.ID, breakGlassCredential.Status) return breakGlassCredential.Status == status, err } } -// Help for Create BreakGlassCredential -func (b *breakglasscredentialService) RetrieveHelpForCreate() (output bytes.Buffer, err error) { - return b.client.Runner.Cmd("create", "break-glass-credential").CmdFlags("-h").Run() -} +// // Help for Create BreakGlassCredential +// func (b *breakglasscredentialService) RetrieveHelpForCreate() (output bytes.Buffer, err error) { +// return b.client.Runner.Cmd("create", "break-glass-credential").CmdFlags("-h").Run() +// } -// Help for List BreakGlassCredential -func (b *breakglasscredentialService) RetrieveHelpForList() (output bytes.Buffer, err error) { - return b.client.Runner.Cmd("list", "break-glass-credential").CmdFlags("-h").Run() -} +// // Help for List BreakGlassCredential +// func (b *breakglasscredentialService) RetrieveHelpForList() (output bytes.Buffer, err error) { +// return b.client.Runner.Cmd("list", "break-glass-credential").CmdFlags("-h").Run() +// } -// Help for Describe BreakGlassCredential -func (b *breakglasscredentialService) RetrieveHelpForDescribe() (output bytes.Buffer, err error) { - return b.client.Runner.Cmd("describe", "break-glass-credential").CmdFlags("-h").Run() -} +// // Help for Describe BreakGlassCredential +// func (b *breakglasscredentialService) RetrieveHelpForDescribe() (output bytes.Buffer, err error) { +// return b.client.Runner.Cmd("describe", "break-glass-credential").CmdFlags("-h").Run() +// } -// Help for Delete BreakGlassCredential -func (b *breakglasscredentialService) RetrieveHelpForDelete() (output bytes.Buffer, err error) { - return b.client.Runner.Cmd("revoke", "break-glass-credential").CmdFlags("-h").Run() -} +// // Help for Delete BreakGlassCredential +// func (b *breakglasscredentialService) RetrieveHelpForDelete() (output bytes.Buffer, err error) { +// return b.client.Runner.Cmd("revoke", "break-glass-credential").CmdFlags("-h").Run() +// } func (b *breakglasscredentialService) CleanResources(clusterID string) (errors []error) { if b.created[clusterID] { Logger.Infof("Remove remaining break-glass-credentials") - _, err := b.DeleteBreakGlassCredential(clusterID) + _, err := b.Revoke().Help().Run() if err != nil { errors = append(errors, err) } diff --git a/tests/utils/exec/rosacli/cmd_parser.go b/tests/utils/exec/rosacli/cmd_parser.go index 4a09b035b..8f1dd4cfa 100644 --- a/tests/utils/exec/rosacli/cmd_parser.go +++ b/tests/utils/exec/rosacli/cmd_parser.go @@ -274,7 +274,7 @@ func (jd *jsonData) Parse() *jsonData { return jd } -func (jd *jsonData) ParseList(jsonStr string) *jsonData { +func (jd *jsonData) ParseList() *jsonData { var object []map[string]interface{} err := json.Unmarshal(jd.input.Bytes(), &object) if err != nil { diff --git a/tests/utils/exec/rosacli/cmd_runner.go b/tests/utils/exec/rosacli/cmd_runner.go index 782602bfe..4dfbf70b3 100644 --- a/tests/utils/exec/rosacli/cmd_runner.go +++ b/tests/utils/exec/rosacli/cmd_runner.go @@ -88,6 +88,11 @@ func (r *runner) Cmd(commands ...string) *runner { return r } +func (r *runner) AppendCmd(command string) *runner { + r.cmds = append(r.cmds, command) + return r +} + func (r *runner) CmdFlags(cmdFlags ...string) *runner { var cmdArgs []string cmdArgs = append(cmdArgs, cmdFlags...) diff --git a/tests/utils/exec/rosacli/ocm_resource_service.go b/tests/utils/exec/rosacli/ocm_resource_service.go index 41b34bf1f..cc319785b 100644 --- a/tests/utils/exec/rosacli/ocm_resource_service.go +++ b/tests/utils/exec/rosacli/ocm_resource_service.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "github.com/openshift/rosa/tests/utils/common" . "github.com/openshift/rosa/tests/utils/log" ) @@ -26,15 +27,11 @@ type AccountRolesUnit struct { type OCMResourceService interface { ResourcesCleaner - ListRegion(flags ...string) ([]*CloudRegion, bytes.Buffer, error) - ReflectRegionList(result bytes.Buffer) (regions []*CloudRegion, err error) - - ListUserRole() (UserRoleList, bytes.Buffer, error) - DeleteUserRole(flags ...string) (bytes.Buffer, error) - LinkUserRole(flags ...string) (bytes.Buffer, error) - UnlinkUserRole(flags ...string) (bytes.Buffer, error) - CreateUserRole(flags ...string) (bytes.Buffer, error) - ReflectUserRoleList(result bytes.Buffer) (url UserRoleList, err error) + List() *ocmResourceService + Create() *ocmResourceService + Delete() *ocmResourceService + Link() *ocmResourceService + Unlink() *ocmResourceService Whoami() (bytes.Buffer, error) ReflectAccountsInfo(result bytes.Buffer) *AccountsInfo @@ -73,6 +70,7 @@ type OCMResourceService interface { type ocmResourceService struct { ResourcesService + ResourceName string } func NewOCMResourceService(client *Client) OCMResourceService { @@ -109,9 +107,7 @@ type UserRole struct { Linded string `json:"LINKED,omitempty"` } -type UserRoleList struct { - UserRoleList []UserRole `json:"UserRoleList,omitempty"` -} +type UserRoleList []*UserRole // Struct for the 'rosa list ocm-role' output type OCMRole struct { @@ -174,6 +170,208 @@ type OIDCConfigList struct { OIDCConfigList []OIDCConfig `json:"OIDCConfigList,omitempty"` } +var textResources = []string{ + "whoami", +} + +func (ors *ocmResourceService) List() *ocmResourceService { + ors.client.Runner.Cmd("list") + return ors +} + +func (ors *ocmResourceService) Create() *ocmResourceService { + ors.client.Runner.Cmd("create") + return ors +} + +func (ors *ocmResourceService) Delete() *ocmResourceService { + ors.client.Runner.Cmd("delete") + return ors +} + +func (ors *ocmResourceService) Link() *ocmResourceService { + ors.client.Runner.Cmd("link") + return ors +} + +func (ors *ocmResourceService) Unlink() *ocmResourceService { + ors.client.Runner.Cmd("unlink") + return ors +} + +func (ors *ocmResourceService) Upgrade() *ocmResourceService { + ors.client.Runner.Cmd("upgrade") + return ors +} + +func (ors *ocmResourceService) Parameters(flags ...string) *ocmResourceService { + ors.client.Runner.CmdFlags(flags...) + return ors +} + +func (ors *ocmResourceService) Help() (output bytes.Buffer, err error) { + return ors.client.Runner.CmdFlags("-h").Run() +} + +func (ors *ocmResourceService) Run() (output bytes.Buffer, err error) { + return ors.client.Runner.Run() +} + +func (ors *ocmResourceService) Regions() *ocmResourceService { + ors.ResourceName = "regions" + ors.client.Runner.AppendCmd("regions") + return ors +} + +func (ors *ocmResourceService) InstanceTypes() *ocmResourceService { + ors.ResourceName = "instance-types" + ors.client.Runner.AppendCmd("instance-types") + return ors +} + +func (ors *ocmResourceService) UserRole() *ocmResourceService { + ors.ResourceName = "user-role" + ors.client.Runner.AppendCmd("user-role") + return ors +} + +func (ors *ocmResourceService) OCMRole() *ocmResourceService { + ors.ResourceName = "ocm-role" + ors.client.Runner.AppendCmd("ocm-role") + return ors +} + +func (ors *ocmResourceService) AccountRoles() *ocmResourceService { + ors.ResourceName = "account-roles" + ors.client.Runner.AppendCmd("account-roles") + return ors +} + +func (ors *ocmResourceService) OIDCConfig() *ocmResourceService { + ors.ResourceName = "oidc-config" + ors.client.Runner.AppendCmd("oidc-config") + return ors +} + +func (ors *ocmResourceService) OperatorRole() *ocmResourceService { + ors.ResourceName = "operator-roles" + ors.client.Runner.AppendCmd("operator-roles") + return ors +} + +func (ors *ocmResourceService) OIDCProvider() *ocmResourceService { + ors.ResourceName = "oidc-provider" + ors.client.Runner.AppendCmd("oidc-provider") + return ors +} + +func (ors *ocmResourceService) ToStruct() (interface{}, error) { + resourceName := ors.ResourceName + if common.SliceContains(textResources, resourceName) { + ors.client.Runner.JsonFormat() + defer ors.client.Runner.UnsetFormat() + } + + result, err := ors.client.Runner.Run() + if err != nil { + return nil, err + } + + if common.SliceContains(textResources, resourceName) { + jsonData := ors.client.Parser.JsonData.Input(result).Parse() + switch resourceName { + case "whoami": + s := new(AccountsInfo) + data, _ := json.Marshal(jsonData.Output()) + err = json.Unmarshal(data, s) + return s, err + } + } else { + theMap := ors.client.Parser.TableData.Input(result).Parse().Output() + switch resourceName { + case "regions": + var regionList []*CloudRegion + for _, regionItem := range theMap { + s := &CloudRegion{} + err = MapStructure(regionItem, s) + if err != nil { + return nil, err + } + regionList = append(regionList, s) + } + return regionList, nil + case "instance-types": + var instanceTypeList []*InstanceTypes + for _, instanceTypeItem := range theMap { + s := &InstanceTypes{} + err = MapStructure(instanceTypeItem, s) + if err != nil { + return nil, err + } + instanceTypeList = append(instanceTypeList, s) + } + return instanceTypeList, nil + case "ocm-role": + var ocmRoleList []*OCMRole + for _, ocmRoleItem := range theMap { + s := &OCMRole{} + err = MapStructure(ocmRoleItem, s) + if err != nil { + return nil, err + } + ocmRoleList = append(ocmRoleList, s) + } + return ocmRoleList, nil + case "user-role": + var userRoleList UserRoleList + for _, userroleItem := range theMap { + s := &UserRole{} + err = MapStructure(userroleItem, s) + if err != nil { + return nil, err + } + userRoleList = append(userRoleList, s) + } + return userRoleList, nil + case "account-roles": + var accountRoleList []*AccountRole + for _, accountRoleItem := range theMap { + s := &AccountRole{} + err = MapStructure(accountRoleItem, s) + if err != nil { + return nil, err + } + accountRoleList = append(accountRoleList, s) + } + return accountRoleList, nil + case "oidc-config": + var oidcConfigList []*OIDCConfig + for _, oidcConfigItem := range theMap { + s := &OIDCConfig{} + err = MapStructure(oidcConfigItem, s) + if err != nil { + return nil, err + } + oidcConfigList = append(oidcConfigList, s) + } + return oidcConfigList, nil + case "operator-roles": + var operatorRoleList []*OperatorRole + for _, operatorRoleItem := range theMap { + s := &OperatorRole{} + err = MapStructure(operatorRoleItem, s) + if err != nil { + return nil, err + } + operatorRoleList = append(operatorRoleList, s) + } + return operatorRoleList, nil + } + } + + return nil, err +} + // Pasrse the result of 'rosa list instance-types' to InstanceTypes struct func (ors *ocmResourceService) ReflectInstanceTypesList(result bytes.Buffer) (url InstanceTypesList, err error) { url = InstanceTypesList{} @@ -245,63 +443,6 @@ func (ors *ocmResourceService) UserInfo() (res *AccountsInfo, err error) { return ors.ReflectAccountsInfo(output), err } -// Pasrse the result of 'rosa list user-roles' to NodePoolList struct -func (ors *ocmResourceService) ReflectUserRoleList(result bytes.Buffer) (url UserRoleList, err error) { - url = UserRoleList{} - theMap := ors.client.Parser.TableData.Input(result).Parse().Output() - for _, userroleItem := range theMap { - ur := &UserRole{} - err = MapStructure(userroleItem, ur) - if err != nil { - return - } - url.UserRoleList = append(url.UserRoleList, *ur) - } - return -} - -// run `rosa list user-role` command -func (ors *ocmResourceService) ListUserRole() (UserRoleList, bytes.Buffer, error) { - ors.client.Runner.cmdArgs = []string{} - listUserRole := ors.client.Runner. - Cmd("list", "user-role") - output, err := listUserRole.Run() - if err != nil { - return UserRoleList{}, output, err - } - uList, err := ors.ReflectUserRoleList(output) - return uList, output, err - -} - -// run `rosa delete user-role` command -func (ors *ocmResourceService) DeleteUserRole(flags ...string) (bytes.Buffer, error) { - deleteUserRole := ors.client.Runner - deleteUserRole = deleteUserRole.Cmd("delete", "user-role").CmdFlags(flags...) - return deleteUserRole.Run() -} - -// run `rosa link user-role` command -func (ors *ocmResourceService) LinkUserRole(flags ...string) (bytes.Buffer, error) { - linkUserRole := ors.client.Runner - linkUserRole = linkUserRole.Cmd("link", "user-role").CmdFlags(flags...) - return linkUserRole.Run() -} - -// run `rosa unlink user-role` command -func (ors *ocmResourceService) UnlinkUserRole(flags ...string) (bytes.Buffer, error) { - unlinkUserRole := ors.client.Runner - unlinkUserRole = unlinkUserRole.Cmd("unlink", "user-role").CmdFlags(flags...) - return unlinkUserRole.Run() -} - -// run `rosa create user-role` command -func (ors *ocmResourceService) CreateUserRole(flags ...string) (bytes.Buffer, error) { - createUserRole := ors.client.Runner - createUserRole = createUserRole.Cmd("create", "user-role").CmdFlags(flags...) - return createUserRole.Run() -} - // run `rosa whoami` command func (ors *ocmResourceService) Whoami() (bytes.Buffer, error) { ors.client.Runner.cmdArgs = []string{} @@ -310,9 +451,9 @@ func (ors *ocmResourceService) Whoami() (bytes.Buffer, error) { } // Get specified user-role by user-role prefix and ocmAccountUsername -func (url UserRoleList) UserRole(prefix string, ocmAccountUsername string) (userRoles UserRole) { +func (url UserRoleList) UserRole(prefix string, ocmAccountUsername string) (userRoles *UserRole) { userRoleName := fmt.Sprintf("%s-User-%s-Role", prefix, ocmAccountUsername) - for _, roleItme := range url.UserRoleList { + for _, roleItme := range url { if roleItme.RoleName == userRoleName { Logger.Infof("Find the userRole %s ~", userRoleName) return roleItme