diff --git a/build_library/oem/outscale/grub.cfg b/build_library/oem/outscale/grub.cfg new file mode 100644 index 00000000000..151bf08f019 --- /dev/null +++ b/build_library/oem/outscale/grub.cfg @@ -0,0 +1,3 @@ +# Flatcar GRUB settings + +set oem_id="outscale" diff --git a/build_library/vm_image_util.sh b/build_library/vm_image_util.sh index 7f9f1764a4e..612c715c5c5 100644 --- a/build_library/vm_image_util.sh +++ b/build_library/vm_image_util.sh @@ -24,6 +24,7 @@ VALID_IMG_TYPES=( openstack openstack_mini oraclecloud + outscale parallels proxmoxve pxe @@ -161,6 +162,11 @@ IMG_oraclecloud_DISK_FORMAT=qcow2 IMG_oraclecloud_DISK_LAYOUT=vm IMG_oraclecloud_OEM_SYSEXT=oraclecloud +## Outscale +IMG_outscale_DISK_FORMAT=qcow2 +IMG_outscale_DISK_LAYOUT=vm +IMG_outscale_OEM_SYSEXT=outscale + ## pxe, which is an cpio image IMG_pxe_DISK_FORMAT=cpio IMG_pxe_PARTITIONED_IMG=0 diff --git a/ci-automation/vms.sh b/ci-automation/vms.sh index 98167099f99..f01f9cf6889 100644 --- a/ci-automation/vms.sh +++ b/ci-automation/vms.sh @@ -139,7 +139,7 @@ function _vm_build_impl() { COMPRESSION_FORMAT="zip" elif [[ "${format}" =~ ^(scaleway|kubevirt|proxmoxve|stackit|exoscale|oraclecloud)$ ]];then COMPRESSION_FORMAT="none" - elif [[ "${format}" =~ ^(akamai)$ ]];then + elif [[ "${format}" =~ ^(akamai|outscale)$ ]];then COMPRESSION_FORMAT="gz" fi ./run_sdk_container -n "${vms_container}" -C "${packages_image}" \ diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/afterburn-5.10.0-r2.ebuild b/sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/afterburn-5.10.0-r4.ebuild similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/afterburn-5.10.0-r2.ebuild rename to sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/afterburn-5.10.0-r4.ebuild diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/files/coreos-metadata.service b/sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/files/coreos-metadata.service index 8278d4ab43f..b34b4b7c53b 100644 --- a/sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/files/coreos-metadata.service +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/afterburn/files/coreos-metadata.service @@ -16,6 +16,8 @@ ConditionKernelCommandLine=|coreos.oem.id=openstack ConditionKernelCommandLine=|flatcar.oem.id=oraclecloud +ConditionKernelCommandLine=|flatcar.oem.id=outscale + ConditionKernelCommandLine=|flatcar.oem.id=scaleway ConditionKernelCommandLine=|flatcar.oem.id=hetzner diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/coreos-init/coreos-init-0.0.1-r208.ebuild b/sdk_container/src/third_party/coreos-overlay/coreos-base/coreos-init/coreos-init-0.0.1-r209.ebuild similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/coreos-base/coreos-init/coreos-init-0.0.1-r208.ebuild rename to sdk_container/src/third_party/coreos-overlay/coreos-base/coreos-init/coreos-init-0.0.1-r209.ebuild diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-outscale/oem-outscale-0.ebuild b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-outscale/oem-outscale-0.ebuild new file mode 100644 index 00000000000..ff566909a73 --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-outscale/oem-outscale-0.ebuild @@ -0,0 +1,13 @@ +# Copyright (c) 2026 Flatcar Maintainers. All rights reserved. +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DESCRIPTION="OEM suite for Outscale" +HOMEPAGE="https://en.outscale.com/cloud-experience/cloud-services/" + +LICENSE="metapackage" +SLOT="0" +KEYWORDS="amd64 arm64" + +SYSEXT_NAME="Outscale" diff --git a/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/coreos-base/afterburn/1297.patch b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/coreos-base/afterburn/1297.patch new file mode 100644 index 00000000000..5eb037525c6 --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/coreos-base/afterburn/1297.patch @@ -0,0 +1,334 @@ +From 716b1359dbfb40334c631681d53dbf18be78979f Mon Sep 17 00:00:00 2001 +From: Mohammad AMLA +Date: Wed, 12 Aug 2026 17:11:31 +0200 +Subject: [PATCH] providers: Add Outscale support + +--- + dracut/30afterburn/afterburn-hostname.service | 1 + + src/metadata.rs | 2 + + src/providers/mod.rs | 1 + + src/providers/outscale/mock_tests.rs | 118 ++++++++++++++++ + src/providers/outscale/mod.rs | 132 ++++++++++++++++++ + systemd/afterburn-sshkeys@.service.in | 1 + + 9 files changed, 268 insertions(+) + create mode 100644 src/providers/outscale/mock_tests.rs + create mode 100644 src/providers/outscale/mod.rs + +diff --git a/dracut/30afterburn/afterburn-hostname.service b/dracut/30afterburn/afterburn-hostname.service +index 9b0c6eae9..45356b7e5 100644 +--- a/dracut/30afterburn/afterburn-hostname.service ++++ b/dracut/30afterburn/afterburn-hostname.service +@@ -13,6 +13,7 @@ ConditionKernelCommandLine=|ignition.platform.id=hetzner + ConditionKernelCommandLine=|ignition.platform.id=ibmcloud + ConditionKernelCommandLine=|ignition.platform.id=kubevirt + ConditionKernelCommandLine=|ignition.platform.id=oraclecloud ++ConditionKernelCommandLine=|ignition.platform.id=outscale + ConditionKernelCommandLine=|ignition.platform.id=proxmoxve + ConditionKernelCommandLine=|ignition.platform.id=scaleway + ConditionKernelCommandLine=|ignition.platform.id=upcloud +diff --git a/src/metadata.rs b/src/metadata.rs +index f43f94210..34fca8216 100644 +--- a/src/metadata.rs ++++ b/src/metadata.rs +@@ -32,6 +32,7 @@ use crate::providers::microsoft::azurestack::AzureStack; + use crate::providers::openstack; + use crate::providers::openstack::network::OpenstackProviderNetwork; + use crate::providers::oraclecloud::OracleCloudProvider; ++use crate::providers::outscale::OutscaleProvider; + use crate::providers::packet::PacketProvider; + use crate::providers::powervs::PowerVSProvider; + use crate::providers::proxmoxve; +@@ -71,6 +72,7 @@ pub fn fetch_metadata(provider: &str) -> Result kubevirt::try_new_provider_else_noop(), + "openstack" => openstack::try_config_drive_else_network(), + "openstack-metadata" => box_result!(OpenstackProviderNetwork::try_new()?), ++ "outscale" => box_result!(OutscaleProvider::try_new()?), + "oraclecloud" => box_result!(OracleCloudProvider::try_new()?), + "packet" => box_result!(PacketProvider::try_new()?), + "powervs" => box_result!(PowerVSProvider::try_new()?), +diff --git a/src/providers/mod.rs b/src/providers/mod.rs +index 0fdacd657..5511d0168 100644 +--- a/src/providers/mod.rs ++++ b/src/providers/mod.rs +@@ -38,6 +38,7 @@ pub mod microsoft; + pub mod noop; + pub mod openstack; + pub mod oraclecloud; ++pub mod outscale; + pub mod packet; + pub mod powervs; + pub mod proxmoxve; +diff --git a/src/providers/outscale/mock_tests.rs b/src/providers/outscale/mock_tests.rs +new file mode 100644 +index 000000000..1f69263b9 +--- /dev/null ++++ b/src/providers/outscale/mock_tests.rs +@@ -0,0 +1,118 @@ ++use crate::providers::outscale::OutscaleProvider; ++use crate::providers::MetadataProvider; ++use mockito; ++ ++#[test] ++fn test_hostname() { ++ let ep = "/latest/meta-data/hostname"; ++ let hostname = "test-hostname"; ++ ++ let mut server = mockito::Server::new(); ++ let mut provider = OutscaleProvider::try_new().unwrap(); ++ provider.client = provider.client.max_retries(0).mock_base_url(server.url()); ++ ++ server.mock("GET", ep).with_status(503).create(); ++ provider.hostname().unwrap_err(); ++ ++ server ++ .mock("GET", ep) ++ .with_status(200) ++ .with_body(hostname) ++ .create(); ++ let v = provider.hostname().unwrap(); ++ assert_eq!(v, Some(hostname.to_string())); ++ ++ server.mock("GET", ep).with_status(404).create(); ++ let v = provider.hostname().unwrap(); ++ assert_eq!(v, None); ++ ++ server ++ .mock("GET", ep) ++ .with_status(200) ++ .with_body("") ++ .create(); ++ let v = provider.hostname().unwrap(); ++ assert_eq!(v, None); ++ ++ server.reset(); ++ provider.hostname().unwrap_err(); ++} ++ ++#[test] ++fn test_pubkeys() { ++ let mut server = mockito::Server::new(); ++ let mut provider = OutscaleProvider::try_new().unwrap(); ++ provider.client = provider.client.max_retries(0).mock_base_url(server.url()); ++ ++ server.mock("GET", "/latest/meta-data/public-keys/0/openssh-key") ++ .with_status(200) ++ .with_body("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCsXe6CfHl45kCIzMF92VhDf2NpBWUyS1+IiTtxm5a83mT9730Hb8xim7GYeJu47kiESw2DAN8vNJ/Irg0apZ217ah2rXXjPQuWYSXuEuap8yLBSjqw8exgqVj/kzW+YqmnHASxI13eoFDxTQQGzyqbqowvxu/5gQmDwBmNAa9bT809ziB/qmpS1mD6qyyFDpR23kUwu3TkgAbwMXBDoqK+pdwfaF9uo9XaLHNEH8lD5BZuG2BeDafm2o76DhNSo83MvcCPNXKLxu3BbX/FCMFO6O8RRqony4i91fEV1b8TbXrbJz1bwEYEnJRvmjnqI/389tQFeYvplXR2WdT9PCKyEAG+j8y6XgecIcdTqV/7gFfak1mp2S7mYHZDnXixsn3MjCP/cIxxJVDitKusnj1TdFqtSXl4tqGccbg/5Sqnt/EVSK4bGwwBxv/YmE0P9cbXLxuEVI0JYzgrQvC8TtUgd8kUu2jqi1/Yj9IWm3aFsl/hhh8YwYrv/gm8PV0TxkM= root@example1\n ++ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDj6FBVgkTt7/DB93VVLk6304Nx7WUjLBJDSCh38zjCimHUpeo9uYDxflfu2N1CLtrSImIKBVP/JRy9g7K4zmRAH/wXw2UxYziX+hZoFIpbW3GmYQqhjx2lDvIRXJI7blhHhTUNWX5f10lFAYOLqA9J859AB1w7ND09+MS3jQgSazCx17h+QZ0qQ6kLSfnXw9PMUOE1Xba9hD1nYj14ryTVj9jrFPMFuUfXdb/G9lsDJ+cGvdE2/RMuPfDmEdo04zvZ5fQJJKvS7OyAuYev4Y+JC8MhEr756ITDZ17yq4BEMo/8rNPxZ5Von/8xnvry+8/2C3ep9rZyHtCwpRb6WT6TndV2ddXKhEIneyd1XiOcWPJguHj5vSoMN3mo8k2PvznGauvxBstvpjUSFLQu869/ZQwyMnbQi3wnkJk5CpLXePXn1J9njocJjt8+SKGijmmIAsmYosx8gmmu3H1mvq9Wi0qqWDITMm+J24AZBEPBhwVrjhLZb5MKxylF6JFJJBs= root@example2") ++ .create(); ++ ++ let keys = provider.ssh_keys().unwrap(); ++ assert_ne!(keys, vec![]); ++ assert_eq!(keys.len(), 2); ++ ++ assert_eq!(keys[0].options, None); ++ assert_eq!(keys[0].comment, Some("root@example1".to_string())); ++ ++ assert_eq!(keys[1].options, None); ++ assert_eq!(keys[1].comment, Some("root@example2".to_string())); ++ ++ server.reset(); ++ provider.ssh_keys().unwrap_err(); ++} ++ ++#[test] ++fn test_attributes() { ++ let instance_id = "i-be1dcf1a"; ++ let ami_id = "ami-12345678"; ++ let instance_type = "c4.large"; ++ let availability_zone = "eu-west-2a"; ++ let local_ipv4 = "10.0.0.1"; ++ let reservation_id = "r-12345678"; ++ let hostname = "ip-10-0-0-1.eu-west-2.compute.outscale.com"; ++ ++ let endpoints = maplit::btreemap! { ++ "/latest/meta-data/instance-id" => instance_id, ++ "/latest/meta-data/ami-id" => ami_id, ++ "/latest/meta-data/instance-type" => instance_type, ++ "/latest/meta-data/placement/availability-zone" => availability_zone, ++ "/latest/meta-data/local-ipv4" => local_ipv4, ++ "/latest/meta-data/reservation-id" => reservation_id, ++ "/latest/meta-data/hostname" => hostname, ++ }; ++ ++ let mut server = mockito::Server::new(); ++ for (endpoint, body) in endpoints { ++ server ++ .mock("GET", endpoint) ++ .with_status(200) ++ .with_body(body) ++ .create(); ++ } ++ ++ let attributes = maplit::hashmap! { ++ "OUTSCALE_INSTANCE_ID".to_string() => instance_id.to_string(), ++ "OUTSCALE_AMI_ID".to_string() => ami_id.to_string(), ++ "OUTSCALE_INSTANCE_TYPE".to_string() => instance_type.to_string(), ++ "OUTSCALE_AVAILABILITY_ZONE".to_string() => availability_zone.to_string(), ++ "OUTSCALE_LOCAL_IPV4".to_string() => local_ipv4.to_string(), ++ "OUTSCALE_RESERVATION_ID".to_string() => reservation_id.to_string(), ++ "OUTSCALE_HOSTNAME".to_string() => hostname.to_string(), ++ }; ++ ++ let client = crate::retry::Client::try_new() ++ .unwrap() ++ .max_retries(0) ++ .return_on_404(true) ++ .mock_base_url(server.url()); ++ let provider = OutscaleProvider { client }; ++ ++ let v = provider.attributes().unwrap(); ++ assert_eq!(v, attributes); ++ ++ server.reset(); ++ provider.attributes().unwrap_err(); ++} +diff --git a/src/providers/outscale/mod.rs b/src/providers/outscale/mod.rs +new file mode 100644 +index 000000000..8e925df1a +--- /dev/null ++++ b/src/providers/outscale/mod.rs +@@ -0,0 +1,132 @@ ++// Copyright 2025 CoreOS, Inc. ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++//! Outscale provider metadata fetcher ++//! This provider is selected via the platform ID `outscale`. ++//! The metadata endpoint is documented at https://docs.outscale.com/en/userguide/Accessing-the-Metadata-and-User-Data-of-a-VM.html. ++ ++use anyhow::Result; ++use openssh_keys::PublicKey; ++use slog_scope::error; ++use std::collections::HashMap; ++ ++use crate::providers::MetadataProvider; ++use crate::retry; ++ ++#[cfg(test)] ++mod mock_tests; ++ ++#[derive(Clone, Debug)] ++pub struct OutscaleProvider { ++ client: retry::Client, ++} ++ ++impl OutscaleProvider { ++ pub fn try_new() -> Result { ++ let client = retry::Client::try_new()?.return_on_404(true); ++ ++ Ok(OutscaleProvider { client }) ++ } ++ ++ fn endpoint_for(name: &str) -> String { ++ format!("http://169.254.169.254/latest/meta-data/{name}") ++ } ++ ++ fn fetch_attribute( ++ &self, ++ map: &mut HashMap, ++ key: &str, ++ endpoint: &str, ++ ) -> Result<()> { ++ let content: Option = self ++ .client ++ .get(retry::Raw, Self::endpoint_for(endpoint)) ++ .send()?; ++ ++ if let Some(value) = content { ++ if !value.is_empty() { ++ map.insert(key.to_string(), value); ++ } ++ } ++ ++ Ok(()) ++ } ++ ++ fn fetch_ssh_keys(&self) -> Result> { ++ let entries: Option = self ++ .client ++ .get(retry::Raw, Self::endpoint_for("public-keys/0/openssh-key")) ++ .send()?; ++ let keys_list = entries.unwrap_or_default(); ++ ++ let mut keys = Vec::new(); ++ for key in keys_list.lines() { ++ let key = key.to_string(); ++ keys.push(key) ++ } ++ ++ Ok(keys) ++ } ++ ++ fn fetch_hostname(&self) -> Result> { ++ let value: Option = self ++ .client ++ .get(retry::Raw, Self::endpoint_for("hostname")) ++ .send()?; ++ ++ let hostname = value.unwrap_or_default(); ++ if hostname.is_empty() { ++ return Ok(None); ++ } ++ ++ Ok(Some(hostname)) ++ } ++} ++ ++impl MetadataProvider for OutscaleProvider { ++ fn attributes(&self) -> Result> { ++ let mut out = HashMap::with_capacity(7); ++ ++ self.fetch_attribute(&mut out, "OUTSCALE_INSTANCE_ID", "instance-id")?; ++ self.fetch_attribute(&mut out, "OUTSCALE_AMI_ID", "ami-id")?; ++ self.fetch_attribute(&mut out, "OUTSCALE_INSTANCE_TYPE", "instance-type")?; ++ self.fetch_attribute( ++ &mut out, ++ "OUTSCALE_AVAILABILITY_ZONE", ++ "placement/availability-zone", ++ )?; ++ self.fetch_attribute(&mut out, "OUTSCALE_LOCAL_IPV4", "local-ipv4")?; ++ self.fetch_attribute(&mut out, "OUTSCALE_RESERVATION_ID", "reservation-id")?; ++ self.fetch_attribute(&mut out, "OUTSCALE_HOSTNAME", "hostname")?; ++ ++ Ok(out) ++ } ++ ++ fn hostname(&self) -> Result> { ++ self.fetch_hostname() ++ } ++ ++ fn ssh_keys(&self) -> Result> { ++ let keys = self.fetch_ssh_keys()?; ++ let mut out = Vec::with_capacity(keys.len()); ++ for key in keys { ++ match PublicKey::parse(&key) { ++ Ok(pk) => out.push(pk), ++ Err(e) => error!("failed to parse SSH Public Key: {}", e), ++ }; ++ } ++ ++ Ok(out) ++ } ++} +diff --git a/systemd/afterburn-sshkeys@.service.in b/systemd/afterburn-sshkeys@.service.in +index eec5d3410..e96c43bc3 100644 +--- a/systemd/afterburn-sshkeys@.service.in ++++ b/systemd/afterburn-sshkeys@.service.in +@@ -16,6 +16,7 @@ ConditionKernelCommandLine=|ignition.platform.id=gcp + ConditionKernelCommandLine=|ignition.platform.id=hetzner + ConditionKernelCommandLine=|ignition.platform.id=ibmcloud + ConditionKernelCommandLine=|ignition.platform.id=openstack ++ConditionKernelCommandLine=|ignition.platform.id=outscale + ConditionKernelCommandLine=|ignition.platform.id=oraclecloud + ConditionKernelCommandLine=|ignition.platform.id=proxmoxve + ConditionKernelCommandLine=|ignition.platform.id=scaleway diff --git a/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/coreos-base/coreos-init/0001-sshkeys-add-Outscale-support.patch b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/coreos-base/coreos-init/0001-sshkeys-add-Outscale-support.patch new file mode 100644 index 00000000000..01f11b5ff3b --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/coreos-base/coreos-init/0001-sshkeys-add-Outscale-support.patch @@ -0,0 +1,29 @@ +From b3c41377579d8303ac9373d646e8abea6b19ccce Mon Sep 17 00:00:00 2001 +From: Mathieu Tortuyaux +Date: Mon, 21 Sep 2026 16:04:58 +0200 +Subject: [PATCH] sshkeys: add Outscale support + +Afterburn SSH keys fetching is implemented. + +Signed-off-by: Mathieu Tortuyaux +--- + systemd/system/sshkeys.service | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/systemd/system/sshkeys.service b/systemd/system/sshkeys.service +index 7fda698..2b8ca14 100644 +--- a/systemd/system/sshkeys.service ++++ b/systemd/system/sshkeys.service +@@ -35,6 +35,9 @@ ConditionKernelCommandLine=|flatcar.oem.id=scaleway + ConditionKernelCommandLine=|ignition.platform.id=oraclecloud + ConditionKernelCommandLine=|flatcar.oem.id=oraclecloud + ++ConditionKernelCommandLine=|ignition.platform.id=outscale ++ConditionKernelCommandLine=|flatcar.oem.id=outscale ++ + [Service] + Type=oneshot + RemainAfterExit=yes +-- +2.55.0 + diff --git a/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/sys-apps/ignition/2296.patch b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/sys-apps/ignition/2296.patch new file mode 100644 index 00000000000..edaf8f6c620 --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/sys-apps/ignition/2296.patch @@ -0,0 +1,97 @@ +From 15704d0fe341605f97d978c5e8ca9fee8edf5aa0 Mon Sep 17 00:00:00 2001 +From: Mohammad AMLA +Date: Wed, 19 Aug 2026 13:49:15 +0200 +Subject: [PATCH] providers/outscale: add Outscale support + +--- + internal/providers/outscale/outscale.go | 59 +++++++++++++++++++++++++ + internal/register/providers.go | 3 ++ + 4 files changed, 65 insertions(+) + create mode 100644 internal/providers/outscale/outscale.go + +diff --git a/internal/providers/outscale/outscale.go b/internal/providers/outscale/outscale.go +new file mode 100644 +index 0000000000..c2973058cf +--- /dev/null ++++ b/internal/providers/outscale/outscale.go +@@ -0,0 +1,59 @@ ++// Copyright 2026 CoreOS, Inc. ++// ++// Licensed under the Apache License, Version 2.0 (the "License"); ++// you may not use this file except in compliance with the License. ++// You may obtain a copy of the License at ++// ++// http://www.apache.org/licenses/LICENSE-2.0 ++// ++// Unless required by applicable law or agreed to in writing, software ++// distributed under the License is distributed on an "AS IS" BASIS, ++// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++// See the License for the specific language governing permissions and ++// limitations under the License. ++ ++// The outscale provider fetches a remote configuration from the Outscale ++// user-data metadata service URL. ++ ++package outscale ++ ++import ( ++ "net/url" ++ ++ "github.com/coreos/ignition/v2/config/v3_7_experimental/types" ++ "github.com/coreos/ignition/v2/internal/platform" ++ "github.com/coreos/ignition/v2/internal/providers/util" ++ "github.com/coreos/ignition/v2/internal/resource" ++ ++ "github.com/coreos/vcontext/report" ++) ++ ++// userdataURL is the Outscale metadata service endpoint for user-data. ++var ( ++ userdataURL = url.URL{ ++ Scheme: "http", ++ Host: "169.254.169.254", ++ Path: "/latest/user-data", ++ } ++) ++ ++// init registers the Outscale provider with the platform registry. ++func init() { ++ platform.Register(platform.Provider{ ++ Name: "outscale", ++ Fetch: fetchConfig, ++ }) ++} ++ ++// fetchConfig fetches the Ignition config from the Outscale metadata service. ++func fetchConfig(f *resource.Fetcher) (types.Config, report.Report, error) { ++ data, err := f.FetchToBuffer(userdataURL, resource.FetchOptions{}) ++ if err != nil { ++ if err == resource.ErrNotFound { ++ return types.Config{}, report.Report{}, nil ++ } ++ return types.Config{}, report.Report{}, err ++ } ++ ++ return util.ParseConfig(f.Logger, data) ++} +diff --git a/internal/register/providers.go b/internal/register/providers.go +index 7cde7f741c..71c2e06eec 100644 +--- a/internal/register/providers.go ++++ b/internal/register/providers.go +@@ -12,6 +12,8 @@ + // See the License for the specific language governing permissions and + // limitations under the License. + ++// Package register imports all platform providers so their init functions ++// register themselves with the platform registry. + package register + + import ( +@@ -35,6 +37,7 @@ import ( + _ "github.com/coreos/ignition/v2/internal/providers/nvidiabluefield" + _ "github.com/coreos/ignition/v2/internal/providers/openstack" + _ "github.com/coreos/ignition/v2/internal/providers/oraclecloud" ++ _ "github.com/coreos/ignition/v2/internal/providers/outscale" + _ "github.com/coreos/ignition/v2/internal/providers/packet" + _ "github.com/coreos/ignition/v2/internal/providers/powervs" + _ "github.com/coreos/ignition/v2/internal/providers/proxmoxve" diff --git a/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/sys-kernel/bootengine/0001-hostname-set-hostname-from-Outscale-metadata.patch b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/sys-kernel/bootengine/0001-hostname-set-hostname-from-Outscale-metadata.patch new file mode 100644 index 00000000000..9553c79364e --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos/user-patches/sys-kernel/bootengine/0001-hostname-set-hostname-from-Outscale-metadata.patch @@ -0,0 +1,25 @@ +From 4426d20c1dc67ce363e1482bd384f74b2cdb9d15 Mon Sep 17 00:00:00 2001 +From: Mathieu Tortuyaux +Date: Mon, 21 Sep 2026 16:08:14 +0200 +Subject: [PATCH] hostname: set hostname from Outscale metadata + +Signed-off-by: Mathieu Tortuyaux +--- + dracut/53ignition/flatcar-metadata-hostname.service | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dracut/53ignition/flatcar-metadata-hostname.service b/dracut/53ignition/flatcar-metadata-hostname.service +index 68e7c50..d087b2c 100644 +--- a/dracut/53ignition/flatcar-metadata-hostname.service ++++ b/dracut/53ignition/flatcar-metadata-hostname.service +@@ -33,6 +33,7 @@ ConditionKernelCommandLine=|flatcar.oem.id=kubevirt + ConditionKernelCommandLine=|flatcar.oem.id=proxmoxve + ConditionKernelCommandLine=|flatcar.oem.id=scaleway + ConditionKernelCommandLine=|flatcar.oem.id=oraclecloud ++ConditionKernelCommandLine=|flatcar.oem.id=outscale + + OnFailure=emergency.target + OnFailureJobMode=replace-irreversibly +-- +2.55.0 + diff --git a/sdk_container/src/third_party/coreos-overlay/sys-apps/ignition/ignition-2.27.0.ebuild b/sdk_container/src/third_party/coreos-overlay/sys-apps/ignition/ignition-2.27.0-r1.ebuild similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-apps/ignition/ignition-2.27.0.ebuild rename to sdk_container/src/third_party/coreos-overlay/sys-apps/ignition/ignition-2.27.0-r1.ebuild diff --git a/sdk_container/src/third_party/coreos-overlay/sys-kernel/bootengine/bootengine-0.0.38-r49.ebuild b/sdk_container/src/third_party/coreos-overlay/sys-kernel/bootengine/bootengine-0.0.38-r50.ebuild similarity index 100% rename from sdk_container/src/third_party/coreos-overlay/sys-kernel/bootengine/bootengine-0.0.38-r49.ebuild rename to sdk_container/src/third_party/coreos-overlay/sys-kernel/bootengine/bootengine-0.0.38-r50.ebuild