diff --git a/api/v1beta1/infraenv_types.go b/api/v1beta1/infraenv_types.go index 4854f2d001a..1e71499aeb4 100644 --- a/api/v1beta1/infraenv_types.go +++ b/api/v1beta1/infraenv_types.go @@ -202,6 +202,9 @@ type BootArtifacts struct { // IpxeScriptURL specifies an HTTP/S URL that contains the iPXE script // +optional IpxeScriptURL string `json:"ipxeScript"` + // DiscoveryIgnitionURL specifies and HTTP/S URL that contains the discovery ignition + // +optional + DiscoveryIgnitionURL string `json:"discoveryIgnitionURL"` } // +kubebuilder:object:root=true diff --git a/config/crd/bases/agent-install.openshift.io_infraenvs.yaml b/config/crd/bases/agent-install.openshift.io_infraenvs.yaml index d6e8da283a2..e107f91c515 100644 --- a/config/crd/bases/agent-install.openshift.io_infraenvs.yaml +++ b/config/crd/bases/agent-install.openshift.io_infraenvs.yaml @@ -294,6 +294,10 @@ spec: bootArtifacts: description: BootArtifacts specifies the URLs for each boot artifact properties: + discoveryIgnitionURL: + description: DiscoveryIgnitionURL specifies and HTTP/S URL that + contains the discovery ignition + type: string initrd: description: InitrdURL specifies an HTTP/S URL that contains the initrd diff --git a/config/crd/resources.yaml b/config/crd/resources.yaml index 8fbdf05b047..ce74b7b8d02 100644 --- a/config/crd/resources.yaml +++ b/config/crd/resources.yaml @@ -3213,6 +3213,10 @@ spec: bootArtifacts: description: BootArtifacts specifies the URLs for each boot artifact properties: + discoveryIgnitionURL: + description: DiscoveryIgnitionURL specifies and HTTP/S URL that + contains the discovery ignition + type: string initrd: description: InitrdURL specifies an HTTP/S URL that contains the initrd diff --git a/deploy/olm-catalog/manifests/agent-install.openshift.io_infraenvs.yaml b/deploy/olm-catalog/manifests/agent-install.openshift.io_infraenvs.yaml index ceac729fc11..e8c423d4a39 100644 --- a/deploy/olm-catalog/manifests/agent-install.openshift.io_infraenvs.yaml +++ b/deploy/olm-catalog/manifests/agent-install.openshift.io_infraenvs.yaml @@ -304,6 +304,10 @@ spec: bootArtifacts: description: BootArtifacts specifies the URLs for each boot artifact properties: + discoveryIgnitionURL: + description: DiscoveryIgnitionURL specifies and HTTP/S URL that + contains the discovery ignition + type: string initrd: description: InitrdURL specifies an HTTP/S URL that contains the initrd diff --git a/internal/controller/controllers/infraenv_controller.go b/internal/controller/controllers/infraenv_controller.go index e91195521e5..46cc56b3a2f 100644 --- a/internal/controller/controllers/infraenv_controller.go +++ b/internal/controller/controllers/infraenv_controller.go @@ -658,6 +658,27 @@ func (r *InfraEnvReconciler) setSignedBootArtifactURLs(infraEnv *aiv1beta1.Infra return err } + builder = &installer.V2DownloadInfraEnvFilesURL{ + InfraEnvID: strfmt.UUID(infraEnvID), + FileName: "discovery.ign", + } + + ignitionURL, err := builder.Build() + if err != nil { + return err + } + baseURL, err = url.Parse(r.ServiceBaseURL) + if err != nil { + return err + } + baseURL.Path = path.Join(baseURL.Path, ignitionURL.Path) + baseURL.RawQuery = ignitionURL.RawQuery + + infraEnv.Status.BootArtifacts.DiscoveryIgnitionURL, err = signURL(baseURL.String(), r.AuthType, infraEnvID, gencrypto.InfraEnvKey) + if err != nil { + return err + } + return nil } diff --git a/internal/controller/controllers/infraenv_controller_test.go b/internal/controller/controllers/infraenv_controller_test.go index 1a219868fee..6ee5209c875 100644 --- a/internal/controller/controllers/infraenv_controller_test.go +++ b/internal/controller/controllers/infraenv_controller_test.go @@ -383,6 +383,40 @@ var _ = Describe("infraEnv reconcile", func() { Expect(scriptURL.Query().Has("ipxe_script_type")).To(BeFalse()) }) + It("sets the discovery ignition boot artifact url", func() { + dbInfraEnv := &common.InfraEnv{ + GeneratedAt: strfmt.DateTime(time.Now()), + InfraEnv: models.InfraEnv{ + ID: &sId, + CPUArchitecture: infraEnvArch, + DownloadURL: "https://images.example.com/images/best-image", + }, + } + mockInstallerInternal.EXPECT().GetInfraEnvByKubeKey(gomock.Any()).Return(backendInfraEnv, nil) + mockInstallerInternal.EXPECT().ValidatePullSecret(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) + mockInstallerInternal.EXPECT().UpdateInfraEnvInternal(gomock.Any(), gomock.Any(), nil, nil).Return(dbInfraEnv, nil).Times(1) + kubeInfraEnv := newInfraEnvImage("myInfraEnv", testNamespace, aiv1beta1.InfraEnvSpec{ + PullSecretRef: &corev1.LocalObjectReference{Name: "pull-secret"}, + }) + Expect(c.Create(ctx, kubeInfraEnv)).To(Succeed()) + + _, err := ir.Reconcile(ctx, newInfraEnvRequest(kubeInfraEnv)) + Expect(err).ToNot(HaveOccurred()) + + key := types.NamespacedName{ + Namespace: testNamespace, + Name: "myInfraEnv", + } + Expect(c.Get(ctx, key, kubeInfraEnv)).To(BeNil()) + + ignitionURL, err := url.Parse(kubeInfraEnv.Status.BootArtifacts.DiscoveryIgnitionURL) + Expect(err).ToNot(HaveOccurred()) + Expect(ignitionURL.Scheme).To(Equal("https")) + Expect(ignitionURL.Host).To(Equal("www.acme.com")) + Expect(ignitionURL.Path).To(Equal(fmt.Sprintf("/api/assisted-install/v2/infra-envs/%s/downloads/files", sId))) + Expect(ignitionURL.Query().Get("file_name")).To(Equal("discovery.ign")) + }) + Context("discovery kernel arguments", func() { encodeKernelArguments := func(kargs []aiv1beta1.KernelArgument) *string { internalKargs := internalKernelArgs(kargs) diff --git a/vendor/github.com/openshift/assisted-service/api/v1beta1/infraenv_types.go b/vendor/github.com/openshift/assisted-service/api/v1beta1/infraenv_types.go index 4854f2d001a..1e71499aeb4 100644 --- a/vendor/github.com/openshift/assisted-service/api/v1beta1/infraenv_types.go +++ b/vendor/github.com/openshift/assisted-service/api/v1beta1/infraenv_types.go @@ -202,6 +202,9 @@ type BootArtifacts struct { // IpxeScriptURL specifies an HTTP/S URL that contains the iPXE script // +optional IpxeScriptURL string `json:"ipxeScript"` + // DiscoveryIgnitionURL specifies and HTTP/S URL that contains the discovery ignition + // +optional + DiscoveryIgnitionURL string `json:"discoveryIgnitionURL"` } // +kubebuilder:object:root=true