Skip to content

Commit

Permalink
MGMT-10209: Pass in icsp file to be used for 'oc adm release extract'
Browse files Browse the repository at this point in the history
Pass in an ICSP file via an environment variable to be used when
running the oc command to extract the installer.

Note that the ImageContentSources are also in the generated install-config
https://github.com/openshift/assisted-service/blob/master/internal/installcfg/installcfg.go#L113.
This PR allows the ICSP to be passed in, in the API format that the oc command expects.
  • Loading branch information
bfournie committed Jul 11, 2022
1 parent 960e50e commit 81a7c75
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 15 deletions.
6 changes: 4 additions & 2 deletions internal/ignition/ignition.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ type installerGenerator struct {
providerRegistry registry.ProviderRegistry
installerReleaseImageOverride string
clusterTLSCertOverrideDir string
icspFile string
}

// IgnitionConfig contains the attributes required to build the discovery ignition file
Expand Down Expand Up @@ -261,7 +262,7 @@ func NewBuilder(log logrus.FieldLogger, staticNetworkConfig staticnetworkconfig.
// NewGenerator returns a generator that can generate ignition files
func NewGenerator(workDir string, installerDir string, cluster *common.Cluster, releaseImage string, releaseImageMirror string,
serviceCACert, installInvoker string, s3Client s3wrapper.API, log logrus.FieldLogger, operatorsApi operators.API,
providerRegistry registry.ProviderRegistry, installerReleaseImageOverride, clusterTLSCertOverrideDir string) Generator {
providerRegistry registry.ProviderRegistry, installerReleaseImageOverride, clusterTLSCertOverrideDir string, icspFile string) Generator {
return &installerGenerator{
cluster: cluster,
log: log,
Expand All @@ -277,6 +278,7 @@ func NewGenerator(workDir string, installerDir string, cluster *common.Cluster,
providerRegistry: providerRegistry,
installerReleaseImageOverride: installerReleaseImageOverride,
clusterTLSCertOverrideDir: clusterTLSCertOverrideDir,
icspFile: icspFile,
}
}

Expand All @@ -296,7 +298,7 @@ func (g *installerGenerator) Generate(ctx context.Context, installConfig []byte,
}

installerPath, err := installercache.Get(g.installerReleaseImageOverride, g.releaseImageMirror, g.installerDir,
g.cluster.PullSecret, platformType, log)
g.cluster.PullSecret, platformType, g.icspFile, log)
if err != nil {
return errors.Wrap(err, "failed to get installer path")
}
Expand Down
4 changes: 2 additions & 2 deletions internal/installercache/installercache.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (i *installers) Get(releaseID string) *release {
// Get returns the path to an openshift-baremetal-install binary extracted from
// the referenced release image. Tries the mirror release image first if it's set. It is safe for concurrent use. A cache of
// binaries is maintained to reduce re-downloading of the same release.
func Get(releaseID, releaseIDMirror, cacheDir, pullSecret string, platformType models.PlatformType, log logrus.FieldLogger) (string, error) {
func Get(releaseID, releaseIDMirror, cacheDir, pullSecret string, platformType models.PlatformType, icspFile string, log logrus.FieldLogger) (string, error) {
r := cache.Get(releaseID)
r.Lock()
defer r.Unlock()
Expand All @@ -49,7 +49,7 @@ func Get(releaseID, releaseIDMirror, cacheDir, pullSecret string, platformType m
//cache miss
if r.path == "" {
path, err = oc.NewRelease(&executer.CommonExecuter{}, oc.Config{
MaxTries: oc.DefaultTries, RetryDelay: oc.DefaltRetryDelay}).Extract(log, releaseID, releaseIDMirror, cacheDir, pullSecret, platformType)
MaxTries: oc.DefaultTries, RetryDelay: oc.DefaltRetryDelay}).Extract(log, releaseID, releaseIDMirror, cacheDir, pullSecret, platformType, icspFile)
if err != nil {
return "", err
}
Expand Down
27 changes: 17 additions & 10 deletions internal/oc/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ type Release interface {
GetOpenshiftVersion(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error)
GetMajorMinorVersion(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error)
GetReleaseArchitecture(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, pullSecret string) (string, error)
Extract(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, cacheDir string, pullSecret string, platformType models.PlatformType) (string, error)
Extract(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, cacheDir string, pullSecret string, platformType models.PlatformType, icspFile string) (string, error)
}

type imageValue struct {
Expand All @@ -61,10 +61,11 @@ func NewRelease(executer executer.Executer, config Config) Release {
}

const (
templateGetImage = "oc adm release info --image-for=%s --insecure=%t %s"
templateGetVersion = "oc adm release info -o template --template '{{.metadata.version}}' --insecure=%t %s"
templateExtract = "oc adm release extract --command=%s --to=%s --insecure=%t %s"
templateImageInfo = "oc image info --output json %s"
templateGetImage = "oc adm release info --image-for=%s --insecure=%t %s"
templateGetVersion = "oc adm release info -o template --template '{{.metadata.version}}' --insecure=%t %s"
templateExtract = "oc adm release extract --command=%s --to=%s --insecure=%t %s"
templateExtractWithIcsp = "oc adm release extract --command=%s --to=%s --insecure=%t --icsp-file=%s %s"
templateImageInfo = "oc image info --output json %s"
)

// GetMCOImage gets mcoImage url from the releaseImageMirror if provided.
Expand Down Expand Up @@ -228,21 +229,21 @@ func (r *release) getOpenshiftVersionFromRelease(log logrus.FieldLogger, release

// Extract openshift-baremetal-install binary from releaseImageMirror if provided.
// Else extract from the source releaseImage
func (r *release) Extract(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, cacheDir string, pullSecret string, platformType models.PlatformType) (string, error) {
func (r *release) Extract(log logrus.FieldLogger, releaseImage string, releaseImageMirror string, cacheDir string, pullSecret string, platformType models.PlatformType, icspFile string) (string, error) {
var path string
var err error
if releaseImage == "" && releaseImageMirror == "" {
return "", errors.New("no releaseImage or releaseImageMirror provided")
}
if releaseImageMirror != "" {
//TODO: Get mirror registry certificate from install-config
path, err = r.extractFromRelease(log, releaseImageMirror, cacheDir, pullSecret, true, platformType)
path, err = r.extractFromRelease(log, releaseImageMirror, cacheDir, pullSecret, true, platformType, icspFile)
if err != nil {
log.WithError(err).Errorf("failed to extract openshift-baremetal-install from mirror release image %s", releaseImageMirror)
return "", err
}
} else {
path, err = r.extractFromRelease(log, releaseImage, cacheDir, pullSecret, false, platformType)
path, err = r.extractFromRelease(log, releaseImage, cacheDir, pullSecret, false, platformType, icspFile)
if err != nil {
log.WithError(err).Errorf("failed to extract openshift-baremetal-install from release image %s", releaseImage)
return "", err
Expand All @@ -253,7 +254,7 @@ func (r *release) Extract(log logrus.FieldLogger, releaseImage string, releaseIm

// extractFromRelease returns the path to an openshift-baremetal-install binary extracted from
// the referenced release image.
func (r *release) extractFromRelease(log logrus.FieldLogger, releaseImage, cacheDir, pullSecret string, insecure bool, platformType models.PlatformType) (string, error) {
func (r *release) extractFromRelease(log logrus.FieldLogger, releaseImage, cacheDir, pullSecret string, insecure bool, platformType models.PlatformType, icspFile string) (string, error) {
// Using platform type as an indication for which openshift install binary to use
// (e.g. as non-x86_64 clusters should use the openshift-install binary).
var binary string
Expand All @@ -270,7 +271,13 @@ func (r *release) extractFromRelease(log logrus.FieldLogger, releaseImage, cache
return "", err
}

cmd := fmt.Sprintf(templateExtract, binary, workdir, insecure, releaseImage)
var cmd string
if icspFile == "" {
cmd = fmt.Sprintf(templateExtract, binary, workdir, insecure, releaseImage)
} else {
cmd = fmt.Sprintf(templateExtractWithIcsp, binary, workdir, insecure, icspFile, releaseImage)
}

_, err = retry.Do(r.config.MaxTries, r.config.RetryDelay, execute, log, r.executer, pullSecret, cmd)
if err != nil {
return "", err
Expand Down
3 changes: 2 additions & 1 deletion pkg/generator/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ type Config struct {
ReleaseImageMirror string
DummyIgnition bool `envconfig:"DUMMY_IGNITION"`
InstallInvoker string `envconfig:"INSTALL_INVOKER" default:"assisted-installer"`
IcspFile string `envconfig:"ICSP_FILE" default:""`
}

type installGenerator struct {
Expand Down Expand Up @@ -98,7 +99,7 @@ func (k *installGenerator) GenerateInstallConfig(ctx context.Context, cluster co
generator = ignition.NewDummyGenerator(clusterWorkDir, &cluster, k.s3Client, log)
} else {
generator = ignition.NewGenerator(clusterWorkDir, installerCacheDir, &cluster, releaseImage, k.Config.ReleaseImageMirror,
k.Config.ServiceCACertPath, k.Config.InstallInvoker, k.s3Client, log, k.operatorsApi, k.providerRegistry, installerReleaseImageOverride, k.clusterTLSCertOverrideDir)
k.Config.ServiceCACertPath, k.Config.InstallInvoker, k.s3Client, log, k.operatorsApi, k.providerRegistry, installerReleaseImageOverride, k.clusterTLSCertOverrideDir, k.Config.IcspFile)
}
err = generator.Generate(ctx, cfg, k.getClusterPlatformType(cluster))
if err != nil {
Expand Down

0 comments on commit 81a7c75

Please sign in to comment.