Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build_library/oem/outscale/grub.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Flatcar GRUB settings

set oem_id="outscale"
7 changes: 7 additions & 0 deletions build_library/vm_image_util.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ VALID_IMG_TYPES=(
openstack
openstack_mini
oraclecloud
outscale
parallels
proxmoxve
pxe
Expand Down Expand Up @@ -161,6 +162,12 @@ 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
Comment thread
chewi marked this conversation as resolved.
Resolved
Comment thread
Copilot marked this conversation as resolved.
Resolved
IMG_outscale_DISK_EXTENSION=qcow2

## pxe, which is an cpio image
IMG_pxe_DISK_FORMAT=cpio
IMG_pxe_PARTITIONED_IMG=0
Expand Down
1 change: 1 addition & 0 deletions changelog/changes/2026-11-09-outscale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Added Outscale images ([Flatcar#2334](https://github.com/flatcar/Flatcar/issues/2334))
1 change: 1 addition & 0 deletions changelog/updates/2026-11-06-ignition.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Ignition ([2.28.0](https://github.com/coreos/ignition/releases/tag/v2.28.0))
2 changes: 1 addition & 1 deletion ci-automation/vms.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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}" \
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
DIST coreos-init-0765e955aca24034d66b9389e0d538e4c3ee543c.tar.gz 60363 BLAKE2B b6f9ab0d79a381883b73fc899eb6085a722bd3d3cde1cf1485c3d314bc9688a055ebcbe81170408c946eba0334b6b5e3a83e0e4078df951f964d0991b9cfa916 SHA512 209ad4392cccfa356c9980baa7b458e2f13d3a782539a207c9f6d3e5dc8ae2019c9dac15039175bf5269ac30498d0e512541fd4120e587fad2536b82860765e4
DIST coreos-init-2097ffe088eafed281484abdcc88b24f4c31acf5.tar.gz 60395 BLAKE2B 32805b6f3bb53f610bddec8cd707b9b34bc46e67cb4a0f3030f41f53d67b53c78b934ce6698ecd838120952e721f86f0ad49c3004a702b66eaf54c02717f20e3 SHA512 9faf56dbf51fb6e2eb9905f2039311b7fc1a52f5383c80758fb8ee0e8a9fa05860f17b1f6aac95ef29c4deb925db3056a70e55ae1fdd3bf6922c8fda444abbbf
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ if [[ ${PV} == 9999 ]]; then
EGIT_REPO_URI="https://github.com/flatcar/init.git"
inherit git-r3
else
EGIT_VERSION="0765e955aca24034d66b9389e0d538e4c3ee543c" # flatcar-master
EGIT_VERSION="2097ffe088eafed281484abdcc88b24f4c31acf5" # flatcar-master
SRC_URI="https://github.com/flatcar/init/archive/${EGIT_VERSION}.tar.gz -> ${PN}-${EGIT_VERSION}.tar.gz"
S="${WORKDIR}/init-${EGIT_VERSION}"
KEYWORDS="amd64 arm arm64 x86"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Copyright (c) 2026 Flatcar Maintainers. All rights reserved.
Comment thread
Copilot marked this conversation as resolved.
Resolved
# 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"

SYSEXT_NAME="Outscale"
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
From 399b405322dc35ab709c6d9478fb594336b92b93 Mon Sep 17 00:00:00 2001
From: Mohammad AMLA <mohammad.amla@numspot.com>
Date: Wed, 12 Aug 2026 17:11:31 +0200
Subject: [PATCH] providers: Add Outscale support

Signed-off-by: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
---
docs/platforms.md | 4 +
docs/release-notes.md | 2 +
docs/usage/attributes.md | 8 ++
dracut/30afterburn/afterburn-hostname.service | 1 +
src/metadata.rs | 2 +
src/providers/mod.rs | 1 +
src/providers/outscale/mock_tests.rs | 132 ++++++++++++++++++
src/providers/outscale/mod.rs | 97 +++++++++++++
systemd/afterburn-sshkeys@.service.in | 1 +
9 files changed, 248 insertions(+)
create mode 100644 src/providers/outscale/mock_tests.rs
create mode 100644 src/providers/outscale/mod.rs

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<Box<dyn providers::MetadataProvi
"kubevirt" => 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 e7757ba63..dedfe8206 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..827e6622e
--- /dev/null
+++ b/src/providers/outscale/mock_tests.rs
@@ -0,0 +1,132 @@
+use std::collections::HashMap;
+
+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 = HashMap::from([
+ ("/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 = HashMap::from([
+ ("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..64f299bdb
--- /dev/null
+++ b/src/providers/outscale/mod.rs
@@ -0,0 +1,97 @@
+// 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.
+
+//! 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 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<OutscaleProvider> {
+ 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, endpoint: &str) -> Result<Option<String>> {
+ let content: Option<String> = self
+ .client
+ .get(retry::Raw, Self::endpoint_for(endpoint))
+ .send()?;
+
+ Ok(content)
+ }
+}
+
+impl MetadataProvider for OutscaleProvider {
+ fn attributes(&self) -> Result<HashMap<String, String>> {
+ let attributes = [
+ ("OUTSCALE_INSTANCE_ID", "instance-id"),
+ ("OUTSCALE_AMI_ID", "ami-id"),
+ ("OUTSCALE_INSTANCE_TYPE", "instance-type"),
+ ("OUTSCALE_AVAILABILITY_ZONE", "placement/availability-zone"),
+ ("OUTSCALE_LOCAL_IPV4", "local-ipv4"),
+ ("OUTSCALE_RESERVATION_ID", "reservation-id"),
+ ("OUTSCALE_HOSTNAME", "hostname"),
+ ];
+ let mut out = HashMap::with_capacity(attributes.len());
+
+ for (key, endpoint) in attributes {
+ if let Some(value) = self.fetch_attribute(endpoint)? {
+ out.insert(key.to_string(), value);
+ }
+ }
+
+ Ok(out)
+ }
+
+ fn hostname(&self) -> Result<Option<String>> {
+ Ok(self
+ .fetch_attribute("hostname")?
+ .filter(|value| !value.is_empty()))
+ }
+
+ fn ssh_keys(&self) -> Result<Vec<PublicKey>> {
+ let Some(keys) = self.fetch_attribute("public-keys/0/openssh-key")? else {
+ return Ok(Vec::new());
+ };
+
+ let keys = keys
+ .lines()
+ .map(str::trim)
+ .filter(|line| !line.is_empty())
+ .map(PublicKey::parse)
+ .collect::<Result<Vec<_>, _>>()?;
+
+ Ok(keys)
+ }
+}
Original file line number Diff line number Diff line change
@@ -1 +1 @@
DIST ignition-2.27.0.tar.gz 4333458 BLAKE2B d8c76132621fce6053972ba45a3a70acfdfd9a212ca305a971e93741e9c37c09d67d07e9cbe6361a4c3cda1debe88587b47af4dc1557f65b3dc905b913c6245a SHA512 7f1ad2da57a196ba0d01b7f2f886f1484edb1f48b8f295f1ad9a4ef9ba2801f0d9d3e9701ec266b4a2446bbf182c50c6733b5ca069ac0c749d77ed342d6a6a9e
DIST ignition-2.28.0.tar.gz 4363366 BLAKE2B 76bdf13ff61bc58e2e128c0527cc1fe6bead2919747e691c31a3a5b61ab1997dfa34ef440c571c077a4d259b1523cdc3048ff1e1fe44bdb078611791794bdf49 SHA512 8d54ba69ef5ded2b49ff386c778a87bc64e813924a94540f1b3acf8fb835e22c345c369ce68affe710ae1bc951857cb39798d3b55d321a085dfb4d4fcfdf7a07
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From 70dd79997dd9766d49a9e847d6b293b10e90198c Mon Sep 17 00:00:00 2001
From dc83e464546696a123f952db7ee330f6627136d0 Mon Sep 17 00:00:00 2001
From: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
Date: Mon, 26 Sep 2022 12:12:04 +0200
Subject: [PATCH 01/15] config: add ignition translation
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From 0680a8bf7e00fcd64b0e75de31978d322e3a27ee Mon Sep 17 00:00:00 2001
From 247c19c3aeb9c5bdacab51399c150d3ad31eec6e Mon Sep 17 00:00:00 2001
From: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
Date: Thu, 20 Aug 2026 14:22:56 +0200
Subject: [PATCH 02/15] mod: add flatcar/ignition@0.36.2
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From 051aad96d87cbbce464990584663cc5a0a867ec1 Mon Sep 17 00:00:00 2001
From 3b1fae641e4a34523fadca700242bb25dc107246 Mon Sep 17 00:00:00 2001
From: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
Date: Thu, 20 Aug 2026 14:23:22 +0200
Subject: [PATCH 03/15] config/v3_7: convert ignition 2.x to 3.x
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From b243d181ee03c845db23b41eadcc9955aff44212 Mon Sep 17 00:00:00 2001
From 4425f57c20657b980b2b6feebb8952596fdfa5a7 Mon Sep 17 00:00:00 2001
From: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
Date: Mon, 19 Feb 2024 18:12:22 +0100
Subject: [PATCH 04/15] internal/prv/cmdline: backport flatcar patch
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
From 7678ef605609f94b5e6e41aca95efbae8424d2d5 Mon Sep 17 00:00:00 2001
From 13fdf59a4e564aed696bf4781d813fd99667c40f Mon Sep 17 00:00:00 2001
From: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
Date: Thu, 20 Aug 2026 15:11:57 +0200
Subject: [PATCH 05/15] provider/qemu: apply fw_cfg patch
Expand Down
Loading
Loading