func ssmCmd()

in cmd/aotutil/ssm.go [45:118]


func ssmCmd(ctx context.Context, cmdCtx *CmdContext) *cobra.Command {
	logger := cmdCtx.Logger.With(zap.String("Command", "ssm"))
	var (
		ssmWrapper     *SSMWrapper
		ssmWaitTimeout time.Duration
		ignoreError    bool
	)
	root := cobra.Command{
		Use:   "ssm",
		Short: "Wrapper for SSm (AWS Systems Manager)",
		PersistentPreRun: func(cmd *cobra.Command, args []string) {
			cfg := cmdCtx.AwsFlags.MustLoadConfig(ctx, logger)
			ssmWrapper = NewSSM(cfg, logger)
		},
	}
	root.PersistentFlags().DurationVar(&ssmWaitTimeout, "timeout", 15*time.Minute, "abort polling if timeout duration is exceeded")
	root.PersistentFlags().BoolVar(&ignoreError, "ignore-error", false, "exit 0 when patch/report failed")

	oneInstanceId := func(args []string) string {
		if len(args) == 0 {
			logger.Fatal("Instance ID is required as position arguments")
		}
		if len(args) > 1 {
			logger.Warn("Only one instance ID is supported", zap.Int("Got", len(args)))
		}
		return args[0]
	}

	logOrIgnore := func(msg string, err error) {
		if ignoreError {
			logger.Warn(msg, zap.Error(err))
		} else {
			logger.Fatal(msg, zap.Error(err))
		}
	}

	// Wait Patch
	waitPatch := cobra.Command{
		Use:   "wait-patch",
		Short: "Wait until patch association is completed or timeout",
		Example: `# Wait patch on ec2 instance i-123456 for 5 minutes
aotutil ssm wait-patch i-1234356 --timeout 5m
# Wait but ignore error
aotutil ssm wait-patch i-1234356 --ignore-error`,
		Run: func(cmd *cobra.Command, args []string) {
			instance := oneInstanceId(args)
			if err := ssmWrapper.WaitPatch(ctx, instance, ssmWaitTimeout); err != nil {
				logOrIgnore("WatPatch failed", err)
			} else {
				logger.Info("WaitPatch done")
			}
		},
	}

	// Wait Patch Report
	watchPatchReport := cobra.Command{
		Use:   "wait-patch-report",
		Short: "Wait until a patched instance is reported",
		Run: func(cmd *cobra.Command, args []string) {
			instance := oneInstanceId(args)
			if err := ssmWrapper.WaitPatchReported(ctx, instance, ssmWaitTimeout); err != nil {
				logOrIgnore("WaitPatchReport failed", err)
			} else {
				logger.Info("WaitPatch done")
			}
		},
	}

	root.AddCommand(
		&waitPatch,
		&watchPatchReport,
	)
	return &root
}