diff --git a/pkg/cmd/create/create.go b/pkg/cmd/create/create.go index cd4a787..5278254 100644 --- a/pkg/cmd/create/create.go +++ b/pkg/cmd/create/create.go @@ -94,6 +94,7 @@ func NewCommand(config *config.CLIConfig, streams io.ReadWriter, groupID string) cmd.AddCommand(newIdentitySourceCommand(config, streams)) cmd.AddCommand(newAPIClientCommand(config, streams)) cmd.AddCommand(newApplicationCommand(config, streams)) + cmd.AddCommand(newIdentityAgentCommand(config, streams)) cmd.AddCommand(newPasswordPolicyCommand(config, streams)) return cmd @@ -166,6 +167,10 @@ func (o *options) Run(cmd *cobra.Command, args []string) error { options := &applicationOptions{} err = options.createApplicationFromDataMap(cmd, resourceObject.Data.(map[string]interface{})) + case resource.ResourceTypePrefix + "IdentityAgent": + options := &identityAgentOptions{} + err = options.createIdentityAgentFromDataMap(cmd, resourceObject.Data.(map[string]interface{})) + case resource.ResourceTypePrefix + "PasswordPolicy": options := &passwordPolicyOptions{} err = options.createPasswordPolicyFromDataMap(cmd, resourceObject.Data.(map[string]interface{})) diff --git a/pkg/cmd/create/identity_agent.go b/pkg/cmd/create/identity_agent.go new file mode 100644 index 0000000..9e7225a --- /dev/null +++ b/pkg/cmd/create/identity_agent.go @@ -0,0 +1,196 @@ +package create + +import ( + "encoding/json" + "io" + "os" + + "github.com/ibm-verify/verify-sdk-go/pkg/config/integrations" + "github.com/ibm-verify/verifyctl/pkg/cmd/resource" + "github.com/ibm-verify/verifyctl/pkg/config" + cmdutil "github.com/ibm-verify/verifyctl/pkg/util/cmd" + "github.com/ibm-verify/verifyctl/pkg/util/templates" + + contextx "github.com/ibm-verify/verify-sdk-go/pkg/core/context" + errorsx "github.com/ibm-verify/verify-sdk-go/pkg/core/errors" + "github.com/spf13/cobra" +) + +const ( + identityAgentUsage = "identityagent [options]" + identityAgentMessagePrefix = "CreateIdentityAgent" + identityAgentEntitlements = "Manage Identity Agents" + identityAgentResourceName = "identityagent" +) + +var ( + identityAgentShortDesc = cmdutil.TranslateShortDesc(identityAgentMessagePrefix, "Options to create an Identity Agent.") + + identityAgentLongDesc = templates.LongDesc(cmdutil.TranslateLongDesc(identityAgentMessagePrefix, ` + Options to create an Identity Agent. + + Identity Agents on Verify require specific entitlements, so ensure that the Identity Agent used + with the 'auth' command has the required entitlements. + + An empty resource file can be generated using: + + verifyctl create identityagent --purpose=PROV --boilerplate + + You can check required entitlements by running: + + verifyctl create identityagent --entitlements`)) + + identityAgentExamples = templates.Examples(cmdutil.TranslateExamples(identityAgentMessagePrefix, ` + # Create an empty Identity agent resource. + verifyctl create identityagent --boilerplate + + # Create an Identity Agent using a JSON file. + verifyctl create identityagent -f=./identityagent.json`)) +) + +type identityAgentOptions struct { + options + purpose string + config *config.CLIConfig +} + +func newIdentityAgentCommand(config *config.CLIConfig, streams io.ReadWriter) *cobra.Command { + o := &identityAgentOptions{ + config: config, + } + + cmd := &cobra.Command{ + Use: identityAgentUsage, + Short: identityAgentShortDesc, + Long: identityAgentLongDesc, + Example: identityAgentExamples, + DisableFlagsInUseLine: true, + Run: func(cmd *cobra.Command, args []string) { + cmdutil.ExitOnError(cmd, o.Complete(cmd, args)) + cmdutil.ExitOnError(cmd, o.Validate(cmd, args)) + cmdutil.ExitOnError(cmd, o.Run(cmd, args)) + }, + } + + cmd.SetOut(streams) + cmd.SetErr(streams) + cmd.SetIn(streams) + + o.AddFlags(cmd) + + return cmd +} + +func (o *identityAgentOptions) AddFlags(cmd *cobra.Command) { + o.addCommonFlags(cmd, identityAgentResourceName) + cmd.Flags().StringVarP(&o.file, "file", "f", "", "Path to the yaml file containing Identity Agent data.") + cmd.Flags().StringVarP(&o.purpose, "purpose", "p", "", "Purpose of the Identity Agent, [PROV, LDAPAUTH, EXTAUTHN]") +} + +func (o *identityAgentOptions) Complete(cmd *cobra.Command, args []string) error { + return nil +} + +func (o *identityAgentOptions) Validate(cmd *cobra.Command, args []string) error { + if o.entitlements || o.boilerplate { + return nil + } + + if len(o.file) == 0 { + return errorsx.G11NError("The 'file' option is required if no other options are used.") + } + return nil +} + +func (o *identityAgentOptions) Run(cmd *cobra.Command, args []string) error { + if o.entitlements { + cmdutil.WriteString(cmd, entitlementsMessage+" "+identityAgentEntitlements) + return nil + } + + if o.boilerplate { + if o.purpose == "PROV" || o.purpose == "LDAPAUTH" || o.purpose == "EXTAUTHN" || o.purpose == "" { + resourceObj := &resource.ResourceObject{ + Kind: resource.ResourceTypePrefix + "IdentityAgent", + APIVersion: "1.0", + Data: integrations.IdentityAgentExample(o.purpose), + } + + cmdutil.WriteAsYAML(cmd, resourceObj, cmd.OutOrStdout()) + return nil + } else { + return errorsx.G11NError("unknown purpose") + } + } + + _, err := o.config.GetCurrentAuth() + if err != nil { + return err + } + + return o.createIdentityAgent(cmd) +} + +func (o *identityAgentOptions) createIdentityAgent(cmd *cobra.Command) error { + ctx := cmd.Context() + vc := contextx.GetVerifyContext(ctx) + + b, err := os.ReadFile(o.file) + if err != nil { + vc.Logger.Errorf("unable to read file; filename=%s, err=%v", o.file, err) + return err + } + + return o.createIdentityAgentWithData(cmd, b) +} + +func (o *identityAgentOptions) createIdentityAgentWithData(cmd *cobra.Command, data []byte) error { + ctx := cmd.Context() + vc := contextx.GetVerifyContext(ctx) + + identityAgentConfig := &integrations.IdentityAgentConfig{} + if err := json.Unmarshal(data, &identityAgentConfig); err != nil { + vc.Logger.Errorf("unable to unmarshal Identity Agent; err=%v", err) + return err + } + + client := integrations.NewIdentityAgentClient() + resourceURI, err := client.CreateIdentityAgent(ctx, identityAgentConfig) + if err != nil { + vc.Logger.Errorf("failed to create Identity Agent; err=%v", err) + return err + } + + cmdutil.WriteString(cmd, "Resource created: "+resourceURI) + return nil +} + +func (o *identityAgentOptions) createIdentityAgentFromDataMap(cmd *cobra.Command, data map[string]interface{}) error { + ctx := cmd.Context() + vc := contextx.GetVerifyContext(ctx) + + // Convert map data to JSON + identityAgentConfig := &integrations.IdentityAgentConfig{} + b, err := json.Marshal(data) + if err != nil { + vc.Logger.Errorf("failed to marshal data; err=%v", err) + return err + } + + if err := json.Unmarshal(b, identityAgentConfig); err != nil { + vc.Logger.Errorf("unable to unmarshal data to Identoty Agent; err=%v", err) + return err + } + + // Create Identity Agent + client := integrations.NewIdentityAgentClient() + resourceURI, err := client.CreateIdentityAgent(ctx, identityAgentConfig) + if err != nil { + vc.Logger.Errorf("failed to create Identity Agent; err=%v", err) + return err + } + + // Directly return the created resource URI + cmdutil.WriteString(cmd, "Resource created: "+resourceURI) + return nil +} diff --git a/pkg/cmd/delete/delete.go b/pkg/cmd/delete/delete.go index 94ce2a2..db4138a 100644 --- a/pkg/cmd/delete/delete.go +++ b/pkg/cmd/delete/delete.go @@ -75,6 +75,7 @@ func NewCommand(config *config.CLIConfig, streams io.ReadWriter, groupID string) cmd.AddCommand(NewIdentitySourceCommand(config, streams)) cmd.AddCommand(NewAPIClientCommand(config, streams)) cmd.AddCommand(NewApplicationCommand(config, streams)) + cmd.AddCommand(NewIdentityAgentCommand(config, streams)) cmd.AddCommand(NewPasswordPolicyCommand(config, streams)) return cmd diff --git a/pkg/cmd/delete/identity_agent.go b/pkg/cmd/delete/identity_agent.go new file mode 100644 index 0000000..7f77a63 --- /dev/null +++ b/pkg/cmd/delete/identity_agent.go @@ -0,0 +1,131 @@ +package delete + +import ( + "io" + + "github.com/ibm-verify/verify-sdk-go/pkg/config/integrations" + "github.com/ibm-verify/verify-sdk-go/pkg/i18n" + "github.com/ibm-verify/verifyctl/pkg/config" + cmdutil "github.com/ibm-verify/verifyctl/pkg/util/cmd" + "github.com/ibm-verify/verifyctl/pkg/util/templates" + "github.com/spf13/cobra" + + errorsx "github.com/ibm-verify/verify-sdk-go/pkg/core/errors" +) + +const ( + identityAgentUsage = `identityagent [flags]` + identityAgentMessagePrefix = "DeleteIdentityAgent" + identityAgentEntitlements = "Manage identityAgents" + identityAgentResourceName = "identityagent" +) + +var ( + identityAgentLongDesc = templates.LongDesc(cmdutil.TranslateLongDesc(identityAgentMessagePrefix, ` + Delete Identity Agent based on identityAgentID. + +Resources managed on Verify have specific entitlements, so ensure that the Identity agents used +with the 'auth' command is configured with the appropriate entitlements. + +You can identify the entitlement required by running: + + verifyctl delete identityagent --entitlements`)) + + identityAgentExamples = templates.Examples(cmdutil.TranslateExamples(messagePrefix, ` + # Delete an Identity Agent by ID + verifyctl delete identityagent --identityAgentID="12345"`, + )) +) + +type identityAgentsOptions struct { + options + identityAgentID string + config *config.CLIConfig +} + +func NewIdentityAgentCommand(config *config.CLIConfig, streams io.ReadWriter) *cobra.Command { + o := &identityAgentsOptions{ + config: config, + } + + cmd := &cobra.Command{ + Use: identityAgentUsage, + Short: cmdutil.TranslateShortDesc(identityAgentMessagePrefix, "Delete Identity Agent based on its id."), + Long: identityAgentLongDesc, + Example: identityAgentExamples, + DisableFlagsInUseLine: true, + Run: func(cmd *cobra.Command, args []string) { + cmdutil.ExitOnError(cmd, o.Complete(cmd, args)) + cmdutil.ExitOnError(cmd, o.Validate(cmd, args)) + cmdutil.ExitOnError(cmd, o.Run(cmd, args)) + }, + } + + cmd.SetOut(streams) + cmd.SetErr(streams) + cmd.SetIn(streams) + + o.AddFlags(cmd) + + return cmd +} + +func (o *identityAgentsOptions) AddFlags(cmd *cobra.Command) { + o.addCommonFlags(cmd) + cmd.Flags().StringVar(&o.identityAgentID, "identityAgentID", o.identityAgentID, i18n.Translate("identityAgentID to be deleted")) +} + +func (o *identityAgentsOptions) Complete(cmd *cobra.Command, args []string) error { + return nil +} + +func (o *identityAgentsOptions) Validate(cmd *cobra.Command, args []string) error { + if o.entitlements { + return nil + } + + calledAs := cmd.CalledAs() + if calledAs == "identityagent" && o.identityAgentID == "" { + return errorsx.G11NError("'identityAgentID' flag is required") + } + return nil +} + +func (o *identityAgentsOptions) Run(cmd *cobra.Command, args []string) error { + if o.entitlements { + cmdutil.WriteString(cmd, entitlementsMessage+" "+identityAgentEntitlements) + return nil + } + + _, err := o.config.SetAuthToContext(cmd.Context()) + if err != nil { + return err + } + + // invoke the operation + if cmd.CalledAs() == "identityagent" { + // deal with single Identity Agent + return o.handleSingleIdentityAgent(cmd, args) + } + return nil +} + +func (o *identityAgentsOptions) handleSingleIdentityAgent(cmd *cobra.Command, _ []string) error { + c := integrations.NewIdentityAgentClient() + var id string + var err error + + if o.identityAgentID != "" { + id = o.identityAgentID + err = c.DeleteIdentityAgentByID(cmd.Context(), id) + if err != nil { + return err + } + } else { + return errorsx.G11NError("either clientName or clientId must be provided") + } + + resourceIdentifier := o.identityAgentID + cmdutil.WriteString(cmd, "Resource deleted with ID: "+resourceIdentifier) + return nil +} diff --git a/pkg/cmd/get/get.go b/pkg/cmd/get/get.go index 4fd8aff..6ed08c6 100644 --- a/pkg/cmd/get/get.go +++ b/pkg/cmd/get/get.go @@ -88,6 +88,7 @@ func NewCommand(config *config.CLIConfig, streams io.ReadWriter, groupID string) cmd.AddCommand(NewIdentitySourceCommand(config, streams)) cmd.AddCommand(NewAPIClientsCommand(config, streams)) cmd.AddCommand(NewApplicationsCommand(config, streams)) + cmd.AddCommand(NewIdentityAgentsCommand(config, streams)) cmd.AddCommand(newPasswordPolicyCommand(config, streams)) return cmd diff --git a/pkg/cmd/get/identity_agents.go b/pkg/cmd/get/identity_agents.go new file mode 100644 index 0000000..e0786fe --- /dev/null +++ b/pkg/cmd/get/identity_agents.go @@ -0,0 +1,193 @@ +package get + +import ( + "io" + + "github.com/ibm-verify/verify-sdk-go/pkg/config/integrations" + errorsx "github.com/ibm-verify/verify-sdk-go/pkg/core/errors" + "github.com/ibm-verify/verify-sdk-go/pkg/i18n" + "github.com/ibm-verify/verifyctl/pkg/cmd/resource" + "github.com/ibm-verify/verifyctl/pkg/config" + cmdutil "github.com/ibm-verify/verifyctl/pkg/util/cmd" + "github.com/ibm-verify/verifyctl/pkg/util/templates" + "github.com/spf13/cobra" +) + +const ( + identityAgentsUsage = `identityagents [flags]` + identityAgentsMessagePrefix = "Getidentityagents" + identityAgentsEntitlements = "Manage identityagents" + identityAgentResourceName = "identityagent" +) + +var ( + identityAgentLongDesc = templates.LongDesc(cmdutil.TranslateLongDesc(identityAgentsMessagePrefix, ` + Get Identity Agents based on an optional filter or a specific identityagent. + +Resources managed on Verify have specific entitlements, so ensure that the application or Identity agent used +with the 'auth' command is configured with the appropriate entitlements. + +You can identify the entitlement required by running: + + verifyctl get identityagents --entitlements`)) + + identityAgentsExamples = templates.Examples(cmdutil.TranslateExamples(messagePrefix, ` + # Get an identityAgent and print the output in yaml + verifyctl get identityagent -o=yaml --identityAgentID=testIdentityAgent + + # Get 10 identityAgents based on a given search criteria and sort it in the ascending order by name. + verifyctl get identityagents --count=2 --sort=identityAgentName -o=yaml`)) +) + +type identityAgentsOptions struct { + options + identityAgentID string + config *config.CLIConfig +} + +func NewIdentityAgentsCommand(config *config.CLIConfig, streams io.ReadWriter) *cobra.Command { + o := &identityAgentsOptions{ + config: config, + } + + cmd := &cobra.Command{ + Use: identityAgentsUsage, + Short: cmdutil.TranslateShortDesc(identityAgentsMessagePrefix, "Get Identity Agents based on an optional filter or a specific Identity Agent."), + Long: identityAgentLongDesc, + Example: identityAgentsExamples, + Aliases: []string{"identityagent"}, + DisableFlagsInUseLine: true, + Run: func(cmd *cobra.Command, args []string) { + cmdutil.ExitOnError(cmd, o.Complete(cmd, args)) + cmdutil.ExitOnError(cmd, o.Validate(cmd, args)) + cmdutil.ExitOnError(cmd, o.Run(cmd, args)) + }, + } + + cmd.SetOut(streams) + cmd.SetErr(streams) + cmd.SetIn(streams) + + o.AddFlags(cmd) + + return cmd +} + +func (o *identityAgentsOptions) AddFlags(cmd *cobra.Command) { + o.addCommonFlags(cmd, identityAgentResourceName) + cmd.Flags().StringVar(&o.identityAgentID, "identityAgentID", o.identityAgentID, i18n.Translate("identityAgentID to get details")) + o.addSortFlags(cmd, identityAgentResourceName) + o.addCountFlags(cmd, identityAgentResourceName) +} + +func (o *identityAgentsOptions) Complete(cmd *cobra.Command, args []string) error { + return nil +} + +func (o *identityAgentsOptions) Validate(cmd *cobra.Command, args []string) error { + if o.entitlements { + return nil + } + + calledAs := cmd.CalledAs() + if calledAs == "identityagent" && o.identityAgentID == "" { + return errorsx.G11NError("'identityAgentID' flag is required.") + } + return nil +} + +func (o *identityAgentsOptions) Run(cmd *cobra.Command, args []string) error { + if o.entitlements { + cmdutil.WriteString(cmd, entitlementsMessage+" "+identityAgentsEntitlements) + return nil + } + + _, err := o.config.SetAuthToContext(cmd.Context()) + if err != nil { + return err + } + + if cmd.CalledAs() == "identityagent" || len(o.identityAgentID) > 0 { + return o.handleSingleIdentityAgent(cmd, args) + } + + return o.handleIdentityAgentList(cmd, args) +} + +func (o *identityAgentsOptions) handleSingleIdentityAgent(cmd *cobra.Command, _ []string) error { + + c := integrations.NewIdentityAgentClient() + identityAgent, uri, err := c.GetIdentityAgentByID(cmd.Context(), o.identityAgentID) + if err != nil { + return err + } + + if o.output == "raw" { + cmdutil.WriteAsJSON(cmd, identityAgent, cmd.OutOrStdout()) + return nil + } + + resourceObj := &resource.ResourceObject{ + Kind: resource.ResourceTypePrefix + "IdentityAgent", + APIVersion: "1.0", + Metadata: &resource.ResourceObjectMetadata{ + UID: *identityAgent.ID, + Name: identityAgent.Name, + URI: uri, + }, + Data: identityAgent, + } + + if o.output == "json" { + cmdutil.WriteAsJSON(cmd, resourceObj, cmd.OutOrStdout()) + } else { + cmdutil.WriteAsYAML(cmd, resourceObj, cmd.OutOrStdout()) + } + + return nil +} + +func (o *identityAgentsOptions) handleIdentityAgentList(cmd *cobra.Command, _ []string) error { + + c := integrations.NewIdentityAgentClient() + identityAgents, uri, err := c.GetIdentityAgents(cmd.Context(), o.search, o.page, o.limit) + if err != nil { + return err + } + + if o.output == "raw" { + cmdutil.WriteAsJSON(cmd, identityAgents, cmd.OutOrStdout()) + return nil + } + + items := []*resource.ResourceObject{} + for _, agent := range *identityAgents { + items = append(items, &resource.ResourceObject{ + Kind: resource.ResourceTypePrefix + "IdentityAgent", + APIVersion: "1.0", + Metadata: &resource.ResourceObjectMetadata{ + UID: *agent.ID, + Name: agent.Name, + }, + Data: agent, + }) + } + + resourceObj := &resource.ResourceObjectList{ + Kind: resource.ResourceTypePrefix + "List", + APIVersion: "1.0", + Metadata: &resource.ResourceObjectMetadata{ + URI: uri, + Total: 10, + }, + Items: items, + } + + if o.output == "json" { + cmdutil.WriteAsJSON(cmd, resourceObj, cmd.OutOrStdout()) + } else { + cmdutil.WriteAsYAML(cmd, resourceObj, cmd.OutOrStdout()) + } + + return nil +} diff --git a/pkg/cmd/replace/identity_agent.go b/pkg/cmd/replace/identity_agent.go new file mode 100644 index 0000000..360e9de --- /dev/null +++ b/pkg/cmd/replace/identity_agent.go @@ -0,0 +1,209 @@ +package replace + +import ( + "io" + "os" + + "github.com/ibm-verify/verify-sdk-go/pkg/config/integrations" + + contextx "github.com/ibm-verify/verify-sdk-go/pkg/core/context" + errorsx "github.com/ibm-verify/verify-sdk-go/pkg/core/errors" + "github.com/ibm-verify/verify-sdk-go/pkg/i18n" + "github.com/ibm-verify/verifyctl/pkg/cmd/resource" + "github.com/ibm-verify/verifyctl/pkg/config" + cmdutil "github.com/ibm-verify/verifyctl/pkg/util/cmd" + "github.com/ibm-verify/verifyctl/pkg/util/templates" + "github.com/spf13/cobra" + "gopkg.in/yaml.v3" +) + +const ( + identityAgentUsage = `identityagent [options]` + identityAgentMessagePrefix = "UpdateIdentityAgent" + identityAgentEntitlements = "Manage identity agent" + identityAgentResourceName = "identityagent" +) + +var ( + identityAgentShortDesc = cmdutil.TranslateShortDesc(identityAgentMessagePrefix, "Update an identity agent resource.") + + identityAgentLongDesc = templates.LongDesc(cmdutil.TranslateLongDesc(identityAgentMessagePrefix, ` + Update an identity agent resource. + +Resources managed on Verify require specific entitlements, so ensure that the application or API client used +with the 'auth' command is configured with the appropriate entitlements. + +An empty resource file can be generated using: + + verifyctl replace identityagent --boilerplate + +You can identify the entitlement required by running: + + verifyctl replace identityagent --entitlements`)) + + identityAgentExamples = templates.Examples(cmdutil.TranslateExamples(identityAgentMessagePrefix, ` + # Generate an empty identityAgent resource template + verifyctl replace identityagent --boilerplate + + # Update a identity agent from a JSON file + verifyctl replace identityagent -f=./identity_agent.json`)) +) + +type identityAgentOptions struct { + options + + config *config.CLIConfig +} + +func newIdentityAgentCommand(config *config.CLIConfig, streams io.ReadWriter) *cobra.Command { + o := &identityAgentOptions{ + config: config, + } + + cmd := &cobra.Command{ + Use: identityAgentUsage, + Short: identityAgentShortDesc, + Long: identityAgentLongDesc, + Example: identityAgentExamples, + DisableFlagsInUseLine: true, + Run: func(cmd *cobra.Command, args []string) { + cmdutil.ExitOnError(cmd, o.Complete(cmd, args)) + cmdutil.ExitOnError(cmd, o.Validate(cmd, args)) + cmdutil.ExitOnError(cmd, o.Run(cmd, args)) + }, + } + + cmd.SetOut(streams) + cmd.SetErr(streams) + cmd.SetIn(streams) + + o.AddFlags(cmd) + + return cmd +} + +func (o *identityAgentOptions) AddFlags(cmd *cobra.Command) { + o.addCommonFlags(cmd, identityAgentResourceName) + cmd.Flags().StringVarP(&o.file, "file", "f", "", i18n.Translate("Path to the file that contains the input data. The contents of the file are expected to be formatted to match the API contract.")) +} + +func (o *identityAgentOptions) Complete(cmd *cobra.Command, args []string) error { + return nil +} + +func (o *identityAgentOptions) Validate(cmd *cobra.Command, args []string) error { + if o.entitlements || o.boilerplate { + return nil + } + + if len(o.file) == 0 { + return errorsx.G11NError(i18n.Translate("'file' option is required if no other options are used.")) + } + return nil +} + +func (o *identityAgentOptions) Run(cmd *cobra.Command, args []string) error { + if o.entitlements { + cmdutil.WriteString(cmd, entitlementsMessage+" "+identityAgentEntitlements) + return nil + } + + idStr := "" + if o.boilerplate { + resourceObj := &resource.ResourceObject{ + Kind: resource.ResourceTypePrefix + "IdentityAgent", + APIVersion: "3.0", + Data: &integrations.IdentityAgentConfig{ + ID: &idStr, + }, + } + + cmdutil.WriteAsYAML(cmd, resourceObj, cmd.OutOrStdout()) + return nil + } + + _, err := o.config.SetAuthToContext(cmd.Context()) + if err != nil { + return err + } + + return o.updateIdentityAgent(cmd) +} + +func (o *identityAgentOptions) updateIdentityAgent(cmd *cobra.Command) error { + ctx := cmd.Context() + vc := contextx.GetVerifyContext(ctx) + + b, err := os.ReadFile(o.file) + + if err != nil { + vc.Logger.Errorf("unable to read file; filename=%s, err=%v", o.file, err) + return err + } + return o.updateIdentityAgentWithData(cmd, b) +} + +func (o *identityAgentOptions) updateIdentityAgentWithData(cmd *cobra.Command, data []byte) error { + + ctx := cmd.Context() + vc := contextx.GetVerifyContext(ctx) + + resourceObj := &resource.ResourceObject{} + if err := yaml.Unmarshal(data, resourceObj); err != nil { + vc.Logger.Errorf("unable to unmarshal YAML to resource object; err=%v", err) + return err + } + identityAgent, ok := resourceObj.Data.(*integrations.IdentityAgentConfig) + if !ok { + appData, err := yaml.Marshal(resourceObj.Data) + if err != nil { + vc.Logger.Errorf("unable to marshal resource data; err=%v", err) + return err + } + identityAgent = &integrations.IdentityAgentConfig{} + if err := yaml.Unmarshal(appData, identityAgent); err != nil { + vc.Logger.Errorf("unable to unmarshal data to identity agent; err=%v", err) + return err + } + } + if err := yaml.Unmarshal(data, &identityAgent); err != nil { + vc.Logger.Errorf("unable to unmarshal the identityAgent; err=%v", err) + return err + } + + client := integrations.NewIdentityAgentClient() + if err := client.UpdateIdentityAgent(ctx, identityAgent); err != nil { + vc.Logger.Errorf("unable to update the identity agent; err=%v, identityAgent=%+v", err, identityAgent) + return err + } + + cmdutil.WriteString(cmd, "Identity Agent updated successfully") + return nil +} + +func (o *identityAgentOptions) updateIdentityAgentFromDataMap(cmd *cobra.Command, data map[string]interface{}) error { + ctx := cmd.Context() + vc := contextx.GetVerifyContext(ctx) + + identityAgent := &integrations.IdentityAgentConfig{} + b, err := yaml.Marshal(data) + + if err != nil { + vc.Logger.Errorf("failed to marshal the data map; err=%v", err) + return err + } + + if err := yaml.Unmarshal(b, identityAgent); err != nil { + vc.Logger.Errorf("unable to unmarshal to a identity agent; err=%v", err) + return err + } + + client := integrations.NewIdentityAgentClient() + if err := client.UpdateIdentityAgent(ctx, identityAgent); err != nil { + vc.Logger.Errorf("unable to update identity agent; err=%v, identityAgent=%+v", err, identityAgent) + return err + } + + cmdutil.WriteString(cmd, "Identity Agent updated successfully") + return nil +} diff --git a/pkg/cmd/replace/password_policy.go b/pkg/cmd/replace/password_policy.go index b97c379..b7e08be 100644 --- a/pkg/cmd/replace/password_policy.go +++ b/pkg/cmd/replace/password_policy.go @@ -187,6 +187,6 @@ func (o *passwordPolicyOptions) updatePasswordPolicyFromDataMap(cmd *cobra.Comma return err } - cmdutil.WriteString(cmd, "Resource updated") + cmdutil.WriteString(cmd, "Password Policy updated successfully") return nil } diff --git a/pkg/cmd/replace/replace.go b/pkg/cmd/replace/replace.go index a6f6c7b..558378a 100644 --- a/pkg/cmd/replace/replace.go +++ b/pkg/cmd/replace/replace.go @@ -92,6 +92,7 @@ func NewCommand(config *config.CLIConfig, streams io.ReadWriter, groupID string) cmd.AddCommand(newAPIClientCommand(config, streams)) cmd.AddCommand(newApplicationCommand(config, streams)) cmd.AddCommand(newPasswordPolicyCommand(config, streams)) + cmd.AddCommand(newIdentityAgentCommand(config, streams)) cmd.AddCommand(newSignInOptionsCommand(config, streams)) return cmd @@ -171,6 +172,10 @@ func (o *options) Run(cmd *cobra.Command, args []string) error { case resource.ResourceTypePrefix + "SignInOptions": options := &signInOptions{} err = options.updateSignInOptionsFromDataMap(cmd, resourceObject.Data.(map[string]interface{})) + + case resource.ResourceTypePrefix + "IdentityAgent": + options := &identityAgentOptions{} + err = options.updateIdentityAgentFromDataMap(cmd, resourceObject.Data.(map[string]interface{})) } return err