diff --git a/pkg/component/component_test.go b/pkg/component/component_test.go index eff06c057ab..cf69348ccc5 100644 --- a/pkg/component/component_test.go +++ b/pkg/component/component_test.go @@ -492,7 +492,7 @@ func TestGatherName(t *testing.T) { return nil, dir, err } - d, err := devfile.ParseAndValidateFromFile(dPath, false) + d, err := devfile.ParseAndValidateFromFile(dPath, "", false) if err != nil { return nil, dir, err } diff --git a/pkg/dev/kubedev/kubedev.go b/pkg/dev/kubedev/kubedev.go index 95ddf0465c3..0bd35deb593 100644 --- a/pkg/dev/kubedev/kubedev.go +++ b/pkg/dev/kubedev/kubedev.go @@ -118,7 +118,7 @@ func (o *DevClient) Start( // RegenerateAdapterAndPush get the new devfile and pushes the files to remote pod func (o *DevClient) regenerateAdapterAndPush(ctx context.Context, pushParams common.PushParameters, componentStatus *watch.ComponentStatus) error { - devObj, err := devfile.ParseAndValidateFromFileWithVariables(location.DevfileLocation(""), pushParams.StartOptions.Variables, true) + devObj, err := devfile.ParseAndValidateFromFileWithVariables(location.DevfileLocation(""), pushParams.StartOptions.Variables, o.prefClient.GetImageRegistry(), true) if err != nil { return fmt.Errorf("unable to generate component from watch parameters: %w", err) } diff --git a/pkg/dev/podmandev/podmandev.go b/pkg/dev/podmandev/podmandev.go index 4d158c69cd6..601c8cf33e6 100644 --- a/pkg/dev/podmandev/podmandev.go +++ b/pkg/dev/podmandev/podmandev.go @@ -22,6 +22,7 @@ import ( odocontext "github.com/redhat-developer/odo/pkg/odo/context" "github.com/redhat-developer/odo/pkg/podman" "github.com/redhat-developer/odo/pkg/portForward" + "github.com/redhat-developer/odo/pkg/preference" "github.com/redhat-developer/odo/pkg/state" "github.com/redhat-developer/odo/pkg/sync" "github.com/redhat-developer/odo/pkg/testingutil/filesystem" @@ -41,6 +42,7 @@ type DevClient struct { fs filesystem.Filesystem podmanClient podman.Client + prefClient preference.Client portForwardClient portForward.Client syncClient sync.Client execClient exec.Client @@ -56,6 +58,7 @@ var _ dev.Client = (*DevClient)(nil) func NewDevClient( fs filesystem.Filesystem, podmanClient podman.Client, + prefClient preference.Client, portForwardClient portForward.Client, syncClient sync.Client, execClient exec.Client, @@ -65,6 +68,7 @@ func NewDevClient( return &DevClient{ fs: fs, podmanClient: podmanClient, + prefClient: prefClient, portForwardClient: portForwardClient, syncClient: syncClient, execClient: execClient, @@ -171,14 +175,14 @@ func (o *DevClient) checkVolumesFree(pod *corev1.Pod) error { } func (o *DevClient) watchHandler(ctx context.Context, pushParams common.PushParameters, componentStatus *watch.ComponentStatus) error { - printWarningsOnDevfileChanges(ctx, pushParams.StartOptions) + o.printWarningsOnDevfileChanges(ctx, pushParams.StartOptions) return o.reconcile(ctx, pushParams.StartOptions, componentStatus) } -func printWarningsOnDevfileChanges(ctx context.Context, options dev.StartOptions) { +func (o *DevClient) printWarningsOnDevfileChanges(ctx context.Context, options dev.StartOptions) { var warning string currentDevfile := odocontext.GetEffectiveDevfileObj(ctx) - newDevfile, err := devfile.ParseAndValidateFromFileWithVariables(location.DevfileLocation(""), options.Variables, true) + newDevfile, err := devfile.ParseAndValidateFromFileWithVariables(location.DevfileLocation(""), options.Variables, o.prefClient.GetImageRegistry(), true) if err != nil { warning = fmt.Sprintf("error while reading the Devfile. Please restart 'odo dev' if you made any changes to the Devfile. Error message is: %v", err) } else { diff --git a/pkg/devfile/devfile.go b/pkg/devfile/devfile.go index 0b724512932..8bd7d0fe3f6 100644 --- a/pkg/devfile/devfile.go +++ b/pkg/devfile/devfile.go @@ -2,6 +2,8 @@ package devfile import ( "fmt" + "os" + "strconv" "strings" "github.com/devfile/api/v2/pkg/validation/variables" @@ -14,13 +16,12 @@ import ( ) func parseRawDevfile(args parser.ParserArgs) (parser.DevfileObj, error) { - rawArgs := args - rawArgs.FlattenedDevfile = pointer.Bool(false) - rawArgs.ConvertKubernetesContentInUri = pointer.Bool(false) - rawArgs.ImageNamesAsSelector = nil - rawArgs.SetBooleanDefaults = pointer.Bool(false) + args.FlattenedDevfile = pointer.Bool(false) + args.ConvertKubernetesContentInUri = pointer.Bool(false) + args.ImageNamesAsSelector = nil + args.SetBooleanDefaults = pointer.Bool(false) - devfileObj, varWarnings, err := devfile.ParseDevfileAndValidate(rawArgs) + devfileObj, varWarnings, err := devfile.ParseDevfileAndValidate(args) if err != nil { return parser.DevfileObj{}, err } @@ -33,13 +34,18 @@ func parseRawDevfile(args parser.ParserArgs) (parser.DevfileObj, error) { func parseEffectiveDevfile(args parser.ParserArgs) (parser.DevfileObj, error) { // Effective Devfile with everything resolved (e.g., parent flattened, K8s URIs inlined, ...) - effectiveArgs := args - effectiveArgs.FlattenedDevfile = pointer.Bool(true) - effectiveArgs.ConvertKubernetesContentInUri = pointer.Bool(true) - effectiveArgs.SetBooleanDefaults = pointer.Bool(false) + args.SetBooleanDefaults = pointer.Bool(false) + args.FlattenedDevfile = pointer.Bool(true) + args.ConvertKubernetesContentInUri = pointer.Bool(true) + if args.ImageNamesAsSelector != nil && args.ImageNamesAsSelector.Registry != "" { + // Tag should be a unique build identifier + args.ImageNamesAsSelector.Tag = strconv.Itoa(os.Getpid()) + } else { + args.ImageNamesAsSelector = nil + } var varWarnings variables.VariableWarning - devfileObj, varWarnings, err := devfile.ParseDevfileAndValidate(effectiveArgs) + devfileObj, varWarnings, err := devfile.ParseDevfileAndValidate(args) if err != nil { return parser.DevfileObj{}, err } @@ -58,9 +64,12 @@ func parseEffectiveDevfile(args parser.ParserArgs) (parser.DevfileObj, error) { // ParseAndValidateFromFile reads, parses and validates devfile from a file // if there are warning it logs them on stdout -func ParseAndValidateFromFile(devfilePath string, wantEffective bool) (parser.DevfileObj, error) { +func ParseAndValidateFromFile(devfilePath string, imageRegistry string, wantEffective bool) (parser.DevfileObj, error) { parserArgs := parser.ParserArgs{ Path: devfilePath, + ImageNamesAsSelector: &parser.ImageSelectorArgs{ + Registry: imageRegistry, + }, } if wantEffective { return parseEffectiveDevfile(parserArgs) @@ -73,11 +82,13 @@ func ParseAndValidateFromFile(devfilePath string, wantEffective bool) (parser.De // If wantEffective is true, it returns a complete view of the Devfile, where everything is resolved. // For example, parent will be flattened in the child, and Kubernetes manifests referenced by URI will be inlined in the related components. // If there are warnings, it logs them on stdout. -func ParseAndValidateFromFileWithVariables(devfilePath string, variables map[string]string, wantEffective bool) (parser.DevfileObj, error) { +func ParseAndValidateFromFileWithVariables(devfilePath string, variables map[string]string, imageRegistry string, wantEffective bool) (parser.DevfileObj, error) { parserArgs := parser.ParserArgs{ - Path: devfilePath, - ExternalVariables: variables, - SetBooleanDefaults: pointer.Bool(false), + Path: devfilePath, + ExternalVariables: variables, + ImageNamesAsSelector: &parser.ImageSelectorArgs{ + Registry: imageRegistry, + }, } if wantEffective { return parseEffectiveDevfile(parserArgs) diff --git a/pkg/init/init.go b/pkg/init/init.go index 893be94cd3a..5904f51b7b5 100644 --- a/pkg/init/init.go +++ b/pkg/init/init.go @@ -283,7 +283,7 @@ func (o *InitClient) SelectAndPersonalizeDevfile(ctx context.Context, flags map[ return parser.DevfileObj{}, "", nil, fmt.Errorf("unable to download devfile: %w", err) } - devfileObj, err := devfile.ParseAndValidateFromFile(devfilePath, true) + devfileObj, err := devfile.ParseAndValidateFromFile(devfilePath, "", true) if err != nil { return parser.DevfileObj{}, "", nil, fmt.Errorf("unable to parse devfile: %w", err) } diff --git a/pkg/odo/cli/add/binding/binding.go b/pkg/odo/cli/add/binding/binding.go index a4cfe6157a9..34feab4fb25 100644 --- a/pkg/odo/cli/add/binding/binding.go +++ b/pkg/odo/cli/add/binding/binding.go @@ -81,7 +81,7 @@ func (o *AddBindingOptions) Run(ctx context.Context) error { withDevfile := odoutil.CheckPathExists(location.DevfileLocation(odocontext.GetWorkingDirectory(ctx))) var devfileObj *parser.DevfileObj if withDevfile { - rawDevfileObj, err := devfile.ParseAndValidateFromFile(odocontext.GetDevfilePath(ctx), false) + rawDevfileObj, err := devfile.ParseAndValidateFromFile(odocontext.GetDevfilePath(ctx), "", false) if err != nil { return err } diff --git a/pkg/odo/cli/init/init.go b/pkg/odo/cli/init/init.go index 08f422e5e3b..47dc50047c5 100644 --- a/pkg/odo/cli/init/init.go +++ b/pkg/odo/cli/init/init.go @@ -234,7 +234,7 @@ func (o *InitOptions) run(ctx context.Context) (devfileObj parser.DevfileObj, pa // in case the starter project contains a devfile, read it again if _, err = o.clientset.FS.Stat(devfilePath); err == nil { - devfileObj, err = devfile.ParseAndValidateFromFile(devfilePath, true) + devfileObj, err = devfile.ParseAndValidateFromFile(devfilePath, "", true) if err != nil { return parser.DevfileObj{}, "", "", nil, nil, err } diff --git a/pkg/odo/cli/remove/binding/binding.go b/pkg/odo/cli/remove/binding/binding.go index cda6335854f..3c65ab74dbd 100644 --- a/pkg/odo/cli/remove/binding/binding.go +++ b/pkg/odo/cli/remove/binding/binding.go @@ -59,7 +59,7 @@ func (o *RemoveBindingOptions) Validate(ctx context.Context) (err error) { func (o *RemoveBindingOptions) Run(ctx context.Context) error { // Update the raw Devfile only, so we do not break any relationship between parent-child for example - rawDevfileObj, err := devfile.ParseAndValidateFromFile(odocontext.GetDevfilePath(ctx), false) + rawDevfileObj, err := devfile.ParseAndValidateFromFile(odocontext.GetDevfilePath(ctx), "", false) if err != nil { return err } diff --git a/pkg/odo/genericclioptions/clientset/clientset.go b/pkg/odo/genericclioptions/clientset/clientset.go index fceb428adc4..ab28455fee8 100644 --- a/pkg/odo/genericclioptions/clientset/clientset.go +++ b/pkg/odo/genericclioptions/clientset/clientset.go @@ -277,6 +277,7 @@ func Fetch(command *cobra.Command, platform string) (*Clientset, error) { dep.DevClient = podmandev.NewDevClient( dep.FS, dep.PodmanClient, + dep.PreferenceClient, dep.PortForwardClient, dep.SyncClient, dep.ExecClient, diff --git a/pkg/odo/genericclioptions/devfile.go b/pkg/odo/genericclioptions/devfile.go index 775ad04e9b5..bbbefdaaf07 100644 --- a/pkg/odo/genericclioptions/devfile.go +++ b/pkg/odo/genericclioptions/devfile.go @@ -13,7 +13,7 @@ import ( odoutil "github.com/redhat-developer/odo/pkg/util" ) -func getDevfileInfo(workingDir string, variables map[string]string) ( +func getDevfileInfo(workingDir string, variables map[string]string, imageRegistry string) ( devfilePath string, devfileObj *parser.DevfileObj, componentName string, @@ -28,7 +28,7 @@ func getDevfileInfo(workingDir string, variables map[string]string) ( } // Parse devfile and validate var devObj parser.DevfileObj - devObj, err = devfile.ParseAndValidateFromFileWithVariables(devfilePath, variables, true) + devObj, err = devfile.ParseAndValidateFromFileWithVariables(devfilePath, variables, imageRegistry, true) if err != nil { return "", nil, "", fmt.Errorf("failed to parse the devfile %s: %w", devfilePath, err) } diff --git a/pkg/odo/genericclioptions/runnable.go b/pkg/odo/genericclioptions/runnable.go index 803a6e96e62..612e771025f 100644 --- a/pkg/odo/genericclioptions/runnable.go +++ b/pkg/odo/genericclioptions/runnable.go @@ -248,7 +248,7 @@ func GenericRun(o Runnable, cmd *cobra.Command, args []string) error { var devfilePath, componentName string var devfileObj *parser.DevfileObj - devfilePath, devfileObj, componentName, err = getDevfileInfo(cwd, variables) + devfilePath, devfileObj, componentName, err = getDevfileInfo(cwd, variables, userConfig.GetImageRegistry()) if err != nil { startTelemetry(cmd, err, startTime) return err diff --git a/pkg/registry/registry.go b/pkg/registry/registry.go index 487d8e8f8cf..0b2eb869197 100644 --- a/pkg/registry/registry.go +++ b/pkg/registry/registry.go @@ -439,7 +439,7 @@ func (o RegistryClient) retrieveDevfileDataFromRegistry(ctx context.Context, reg devfileYamlFile := location.DevfileFilenamesProvider(tmpFile) // Parse and validate the file and return the devfile data - devfileObj, err := devfile.ParseAndValidateFromFile(path.Join(tmpFile, devfileYamlFile), true) + devfileObj, err := devfile.ParseAndValidateFromFile(path.Join(tmpFile, devfileYamlFile), "", true) if err != nil { return api.DevfileData{}, err } diff --git a/pkg/testingutil/devfile.go b/pkg/testingutil/devfile.go index 95f5fb18764..9e502441736 100644 --- a/pkg/testingutil/devfile.go +++ b/pkg/testingutil/devfile.go @@ -143,7 +143,7 @@ func GetTestDevfileObjFromFile(fileName string) parser.DevfileObj { // path to the devfile devfilePath := filepath.Join(filepath.Dir(filename), "..", "..", "tests", "examples", filepath.Join("source", "devfiles", "nodejs", fileName)) - devfileObj, err := devfile.ParseAndValidateFromFile(devfilePath, false) + devfileObj, err := devfile.ParseAndValidateFromFile(devfilePath, "", false) if err != nil { return parser.DevfileObj{} } diff --git a/tests/helper/odo_utils.go b/tests/helper/odo_utils.go index b87f9f07203..6edfdfc1318 100644 --- a/tests/helper/odo_utils.go +++ b/tests/helper/odo_utils.go @@ -51,13 +51,13 @@ func DeleteProject(projectName string) { // GetMetadataFromDevfile retrieves the metadata from devfile func GetMetadataFromDevfile(devfilePath string) devfilepkg.DevfileMetadata { - devObj, err := devfile.ParseAndValidateFromFile(devfilePath, true) + devObj, err := devfile.ParseAndValidateFromFile(devfilePath, "", true) Expect(err).ToNot(HaveOccurred()) return devObj.Data.GetMetadata() } func GetDevfileComponents(devfilePath, componentName string) []v1alpha2.Component { - devObj, err := devfile.ParseAndValidateFromFile(devfilePath, true) + devObj, err := devfile.ParseAndValidateFromFile(devfilePath, "", true) Expect(err).ToNot(HaveOccurred()) components, err := devObj.Data.GetComponents(common.DevfileOptions{ FilterByName: componentName,