diff --git a/README.md b/README.md index e1f463ad..ce027630 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ the Ignition: - `IRONIC_BASE_URL` - `IRONIC_INSPECTOR_BASE_URL` - `IRONIC_AGENT_PULL_SECRET` +- `IRONIC_AGENT_VLAN_INTERFACES` - `IRONIC_RAMDISK_SSH_KEY` - `REGISTRIES_CONF_PATH` - `IP_OPTIONS` diff --git a/cmd/static-server/main.go b/cmd/static-server/main.go index cd3aeef5..3757ae80 100644 --- a/cmd/static-server/main.go +++ b/cmd/static-server/main.go @@ -82,6 +82,7 @@ func loadStaticNMState(fsys fs.FS, env *env.EnvInputs, nmstateDir string, imageS env.HttpsProxy, env.NoProxy, hostname, + env.IronicAgentVlanInterfaces, ) if err != nil { return errors.WithMessage(err, "failed to configure ignition") diff --git a/pkg/env/env.go b/pkg/env/env.go index 92597a89..5da272f1 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -8,18 +8,19 @@ import ( ) type EnvInputs struct { - DeployISO string `envconfig:"DEPLOY_ISO" required:"true"` - DeployInitrd string `envconfig:"DEPLOY_INITRD" required:"true"` - IronicBaseURL string `envconfig:"IRONIC_BASE_URL"` - IronicInspectorBaseURL string `envconfig:"IRONIC_INSPECTOR_BASE_URL"` - IronicAgentImage string `envconfig:"IRONIC_AGENT_IMAGE" required:"true"` - IronicAgentPullSecret string `envconfig:"IRONIC_AGENT_PULL_SECRET"` - IronicRAMDiskSSHKey string `envconfig:"IRONIC_RAMDISK_SSH_KEY"` - RegistriesConfPath string `envconfig:"REGISTRIES_CONF_PATH"` - IpOptions string `envconfig:"IP_OPTIONS"` - HttpProxy string `envconfig:"HTTP_PROXY"` - HttpsProxy string `envconfig:"HTTPS_PROXY"` - NoProxy string `envconfig:"NO_PROXY"` + DeployISO string `envconfig:"DEPLOY_ISO" required:"true"` + DeployInitrd string `envconfig:"DEPLOY_INITRD" required:"true"` + IronicBaseURL string `envconfig:"IRONIC_BASE_URL"` + IronicInspectorBaseURL string `envconfig:"IRONIC_INSPECTOR_BASE_URL"` + IronicAgentImage string `envconfig:"IRONIC_AGENT_IMAGE" required:"true"` + IronicAgentPullSecret string `envconfig:"IRONIC_AGENT_PULL_SECRET"` + IronicAgentVlanInterfaces string `envconfig:"IRONIC_AGENT_VLAN_INTERFACES"` + IronicRAMDiskSSHKey string `envconfig:"IRONIC_RAMDISK_SSH_KEY"` + RegistriesConfPath string `envconfig:"REGISTRIES_CONF_PATH"` + IpOptions string `envconfig:"IP_OPTIONS"` + HttpProxy string `envconfig:"HTTP_PROXY"` + HttpsProxy string `envconfig:"HTTPS_PROXY"` + NoProxy string `envconfig:"NO_PROXY"` } func New() (*EnvInputs, error) { diff --git a/pkg/ignition/builder.go b/pkg/ignition/builder.go index f4bcf100..8d69471b 100644 --- a/pkg/ignition/builder.go +++ b/pkg/ignition/builder.go @@ -14,28 +14,26 @@ import ( const ( // https://github.com/openshift/ironic-image/blob/master/scripts/configure-coreos-ipa#L14 ironicAgentPodmanFlags = "--tls-verify=false" - - // https://github.com/openshift/ironic-image/blob/master/scripts/configure-coreos-ipa#L11 - ironicInspectorVlanInterfaces = "all" ) type ignitionBuilder struct { - nmStateData []byte - registriesConf []byte - ironicBaseURL string - ironicInspectorBaseURL string - ironicAgentImage string - ironicAgentPullSecret string - ironicRAMDiskSSHKey string - networkKeyFiles []byte - ipOptions string - httpProxy string - httpsProxy string - noProxy string - hostname string + nmStateData []byte + registriesConf []byte + ironicBaseURL string + ironicInspectorBaseURL string + ironicAgentImage string + ironicAgentPullSecret string + ironicRAMDiskSSHKey string + networkKeyFiles []byte + ipOptions string + httpProxy string + httpsProxy string + noProxy string + hostname string + ironicAgentVlanInterfaces string } -func New(nmStateData, registriesConf []byte, ironicBaseURL, ironicInspectorBaseURL, ironicAgentImage, ironicAgentPullSecret, ironicRAMDiskSSHKey, ipOptions string, httpProxy, httpsProxy, noProxy string, hostname string) (*ignitionBuilder, error) { +func New(nmStateData, registriesConf []byte, ironicBaseURL, ironicInspectorBaseURL, ironicAgentImage, ironicAgentPullSecret, ironicRAMDiskSSHKey, ipOptions string, httpProxy, httpsProxy, noProxy string, hostname string, ironicAgentVlanInterfaces string) (*ignitionBuilder, error) { if ironicBaseURL == "" { return nil, errors.New("ironicBaseURL is required") } @@ -47,18 +45,19 @@ func New(nmStateData, registriesConf []byte, ironicBaseURL, ironicInspectorBaseU } return &ignitionBuilder{ - nmStateData: nmStateData, - registriesConf: registriesConf, - ironicBaseURL: ironicBaseURL, - ironicInspectorBaseURL: ironicInspectorBaseURL, - ironicAgentImage: ironicAgentImage, - ironicAgentPullSecret: ironicAgentPullSecret, - ironicRAMDiskSSHKey: ironicRAMDiskSSHKey, - ipOptions: ipOptions, - httpProxy: httpProxy, - httpsProxy: httpsProxy, - noProxy: noProxy, - hostname: hostname, + nmStateData: nmStateData, + registriesConf: registriesConf, + ironicBaseURL: ironicBaseURL, + ironicInspectorBaseURL: ironicInspectorBaseURL, + ironicAgentImage: ironicAgentImage, + ironicAgentPullSecret: ironicAgentPullSecret, + ironicRAMDiskSSHKey: ironicRAMDiskSSHKey, + ipOptions: ipOptions, + httpProxy: httpProxy, + httpsProxy: httpsProxy, + noProxy: noProxy, + hostname: hostname, + ironicAgentVlanInterfaces: ironicAgentVlanInterfaces, }, nil } @@ -97,8 +96,21 @@ func (b *ignitionBuilder) GenerateConfig() (config ignition_config_types_32.Conf } } + var ironicInspectorVlanInterfaces string + if strings.ToLower(b.ironicAgentVlanInterfaces) == "always" { + ironicInspectorVlanInterfaces = "all" + } else if strings.ToLower(b.ironicAgentVlanInterfaces) == "never" { + ironicInspectorVlanInterfaces = "" + } else { + if len(b.nmStateData) > 0 { + ironicInspectorVlanInterfaces = "" + } else { + ironicInspectorVlanInterfaces = "all" + } + } + config.Ignition.Version = "3.2.0" - config.Storage.Files = []ignition_config_types_32.File{b.IronicAgentConf()} + config.Storage.Files = []ignition_config_types_32.File{b.IronicAgentConf(ironicInspectorVlanInterfaces)} config.Storage.Files = append(config.Storage.Files, netFiles...) config.Systemd.Units = []ignition_config_types_32.Unit{b.IronicAgentService(len(netFiles) > 0)} diff --git a/pkg/ignition/builder_test.go b/pkg/ignition/builder_test.go index 2ead4eaf..82531ff5 100644 --- a/pkg/ignition/builder_test.go +++ b/pkg/ignition/builder_test.go @@ -11,7 +11,7 @@ func TestGenerateStructure(t *testing.T) { builder, err := New(nil, nil, "http://ironic.example.com", "", "quay.io/openshift-release-dev/ironic-ipa-image", - "", "", "", "", "", "", "") + "", "", "", "", "", "", "", "") assert.NoError(t, err) ignition, err := builder.GenerateConfig() @@ -34,7 +34,7 @@ func TestGenerateWithMoreFields(t *testing.T) { "http://ironic.example.com", "http://inspector.example.com", "quay.io/openshift-release-dev/ironic-ipa-image", "pull secret", "SSH key", "ip=dhcp42", - "proxy me", "", "don't proxy me", "my-host") + "proxy me", "", "don't proxy me", "my-host", "") assert.NoError(t, err) ignition, err := builder.GenerateConfig() @@ -70,7 +70,7 @@ func TestGenerateRegistries(t *testing.T) { builder, err := New([]byte{}, []byte(registries), "http://ironic.example.com", "", "quay.io/openshift-release-dev/ironic-ipa-image", - "", "", "", "", "", "", "virthost") + "", "", "", "", "", "", "virthost", "") if err != nil { t.Fatalf("Unexpected error %v", err) } diff --git a/pkg/ignition/service_config.go b/pkg/ignition/service_config.go index 4cdb738d..1529856c 100644 --- a/pkg/ignition/service_config.go +++ b/pkg/ignition/service_config.go @@ -8,7 +8,7 @@ import ( "k8s.io/utils/pointer" ) -func (b *ignitionBuilder) IronicAgentConf() ignition_config_types_32.File { +func (b *ignitionBuilder) IronicAgentConf(ironicInspectorVlanInterfaces string) ignition_config_types_32.File { template := ` [DEFAULT] api_url = %s:6385 diff --git a/pkg/ignition/service_config_test.go b/pkg/ignition/service_config_test.go index ef7c592c..9cd3c4d1 100644 --- a/pkg/ignition/service_config_test.go +++ b/pkg/ignition/service_config_test.go @@ -20,9 +20,10 @@ func TestIronicPythonAgentConf(t *testing.T) { want ignition_config_types_32.File }{ { - name: "basic", - ironicBaseURL: "http://example.com/foo", - ironicInspectorBaseURL: "http://example.com/bar", + name: "basic", + ironicBaseURL: "http://example.com/foo", + ironicInspectorBaseURL: "http://example.com/bar", + ironicInspectorVlanInterfaces: "all", want: ignition_config_types_32.File{ Node: ignition_config_types_32.Node{Path: "/etc/ironic-python-agent.conf", Overwrite: &expectedOverwrite}, FileEmbedded1: ignition_config_types_32.FileEmbedded1{ @@ -31,6 +32,19 @@ func TestIronicPythonAgentConf(t *testing.T) { Mode: &expectedMode}, }, }, + { + name: "basic_no_vlans", + ironicBaseURL: "http://example.com/foo", + ironicInspectorBaseURL: "http://example.com/bar", + ironicInspectorVlanInterfaces: "", + want: ignition_config_types_32.File{ + Node: ignition_config_types_32.Node{Path: "/etc/ironic-python-agent.conf", Overwrite: &expectedOverwrite}, + FileEmbedded1: ignition_config_types_32.FileEmbedded1{ + Contents: ignition_config_types_32.Resource{ + Source: pointer.String("data:text/plain,%0A%5BDEFAULT%5D%0Aapi_url%20%3D%20http%3A%2F%2Fexample.com%2Ffoo%3A6385%0Ainspection_callback_url%20%3D%20http%3A%2F%2Fexample.com%2Fbar%3A5050%2Fv1%2Fcontinue%0Ainsecure%20%3D%20True%0Aenable_vlan_interfaces%20%3D%20%0A")}, + Mode: &expectedMode}, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -38,7 +52,7 @@ func TestIronicPythonAgentConf(t *testing.T) { ironicBaseURL: tt.ironicBaseURL, ironicInspectorBaseURL: tt.ironicInspectorBaseURL, } - if got := b.IronicAgentConf(); !reflect.DeepEqual(got, tt.want) { + if got := b.IronicAgentConf(tt.ironicInspectorVlanInterfaces); !reflect.DeepEqual(got, tt.want) { t.Error(cmp.Diff(tt.want, got)) } }) diff --git a/pkg/imageprovider/rhcos.go b/pkg/imageprovider/rhcos.go index 624bf7e6..0ad2f39e 100644 --- a/pkg/imageprovider/rhcos.go +++ b/pkg/imageprovider/rhcos.go @@ -59,6 +59,7 @@ func (ip *rhcosImageProvider) buildIgnitionConfig(networkData imageprovider.Netw ip.EnvInputs.HttpsProxy, ip.EnvInputs.NoProxy, hostname, + ip.EnvInputs.IronicAgentVlanInterfaces, ) if err != nil { return nil, imageprovider.BuildInvalidError(err)