in pkg/cmd/run.go [329:418]
func (o *runCmdOptions) run(cmd *cobra.Command, args []string) error {
var c client.Client
var err error
if !isOfflineCommand(cmd) {
c, err = o.GetCmdClient()
if err != nil {
return err
}
}
// We need to make this check at this point, in order to have sources filled during decoding
if (len(args) < 1 && len(o.Sources) < 1) && o.isSourceLess() {
return errors.New("run command expects either an Integration source, a container image " +
"(via --image argument) or a git repository (via --git argument)")
}
integration, err := o.createOrUpdateIntegration(cmd, c, args)
if err != nil {
return err
}
if o.Dev {
cs := make(chan os.Signal, 1)
signal.Notify(cs, os.Interrupt, syscall.SIGTERM)
go func() {
<-cs
if o.Context.Err() != nil {
// Context canceled
return
}
fmt.Fprintln(cmd.OutOrStdout(), "Run integration terminating")
err := DeleteIntegration(o.Context, c, integration.Name, integration.Namespace)
if err != nil {
fmt.Fprintln(cmd.ErrOrStderr(), err)
os.Exit(1)
}
os.Exit(0)
}()
}
if o.Sync || o.Dev {
err = o.syncIntegration(cmd, c, args)
if err != nil {
return err
}
}
if o.Logs || o.Dev || o.Wait {
//nolint:errcheck
go watch.HandleIntegrationEvents(o.Context, c, integration, func(event *corev1.Event) bool {
fmt.Fprintln(cmd.OutOrStdout(), event.Message)
return true
})
}
if o.Wait || o.Dev {
for {
integrationPhase, err := o.waitForIntegrationReady(cmd, c, integration)
if err != nil {
return err
}
if integrationPhase == nil || *integrationPhase == v1.IntegrationPhaseError {
return fmt.Errorf("integration \"%s\" deployment failed", integration.Name)
} else if *integrationPhase == v1.IntegrationPhaseRunning {
break
}
// The integration watch timed out so recreate it using the latest integration resource version
existing := v1.NewIntegration(integration.Namespace, integration.Name)
err = c.Get(o.Context, ctrl.ObjectKeyFromObject(&existing), &existing)
if err != nil {
return err
}
integration.ObjectMeta.ResourceVersion = existing.ObjectMeta.ResourceVersion
}
}
if o.Logs || o.Dev {
err = k8slog.Print(o.Context, cmd, c, integration, nil, cmd.OutOrStdout())
if err != nil {
return err
}
}
if o.Sync || o.Logs || o.Dev {
// Let's add a Wait point, otherwise the script terminates
<-o.RootContext.Done()
}
return nil
}