func()

in cmd/aotutil/ssm.go [127:158]


func (s *SSMWrapper) WaitPatch(ctx context.Context, instanceId string, timeout time.Duration) error {
	logger := s.logger.With(zap.String("InstanceId", instanceId), zap.String("Action", "WaitPatch"))
	logger.Info("Start waiting patch")
	start := time.Now()
	return Wait(waitInterval, timeout, func() (WaitAction, error) {
		infos, err := describeInstanceAssocStatus(ctx, s.client, instanceId)
		if err != nil {
			return WaitDone, err
		}
		for _, assoc := range infos {
			if aws.ToString(assoc.Name) != SSMPatchDocument {
				continue
			}
			status := aws.ToString(assoc.Status)
			switch status {
			case "Success":
				logger.Info("patch on instance succeeded",
					zap.Time("PatchTime", aws.ToTime(assoc.ExecutionDate)),
					zap.Duration("Waited", time.Now().Sub(start)))
				return WaitDone, nil
			case "Failed":
				return WaitDone, fmt.Errorf("patch on instance failed instanceId %s waited %s", instanceId, time.Now().Sub(start))
			default:
				logger.Info("waiting patching", zap.String("Status", status))
				return WaitContinue, nil
			}
		}
		//return WaitDone, fmt.Errorf("patch document is not associated on the instance, requires %s", SSMPatchDocument)
		// NOTE: it seems it takes a while for SSM to associate the documents to instance ...
		return WaitContinue, nil
	})
}