/usr/lib/python3/dist-packages/provisioningserver/drivers/osystem/__init__.py is in python3-maas-provisioningserver 2.4.0~beta2-6865-gec43e47e6-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | # Copyright 2014-2017 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Osystem Drivers."""
__all__ = [
"Node",
"OperatingSystem",
"OperatingSystemRegistry",
"Token",
]
from abc import (
ABCMeta,
abstractmethod,
abstractproperty,
)
from collections import namedtuple
from provisioningserver.utils.registry import Registry
class BOOT_IMAGE_PURPOSE:
"""The vocabulary of a `BootImage`'s purpose."""
#: Usable for commissioning
COMMISSIONING = 'commissioning'
#: Usable for install
INSTALL = 'install'
#: Usable for fast-path install
XINSTALL = 'xinstall'
#: Usable for diskless boot
DISKLESS = 'diskless'
#: Bootloader for enlistment, commissioning, and deployment
BOOTLOADER = 'bootloader'
#: Usable for ephemeral boots
EPHEMERAL = 'ephemeral'
# A cluster-side representation of a Node, relevant to the osystem code,
# with only minimal fields.
Node = namedtuple("Node", ("system_id", "hostname"))
# A cluster-side representation of a Token, relevant to the osystem code,
# with only minimal fields.
Token = namedtuple("Token", ("consumer_key", "token_key", "token_secret"))
def list_boot_images_for(osystem):
"""List all boot images for the given osystem."""
# Circular import
from provisioningserver.rpc.boot_images import list_boot_images
return [
image
for image in list_boot_images()
if image['osystem'] == osystem.name
]
class OperatingSystem(metaclass=ABCMeta):
"""Skeleton for an operating system."""
@abstractproperty
def name(self):
"""Name of the operating system."""
@abstractproperty
def title(self):
"""Title of the operating system."""
@abstractmethod
def get_default_release(self):
"""Return the default release to use when none is specified.
:return: default release to use
"""
@abstractmethod
def get_release_title(self, release):
"""Return the given release's title.
:type release: unicode
:return: unicode
"""
@abstractmethod
def get_boot_image_purposes(self, arch, subarch, release, label):
"""Return a boot image's supported purposes.
:param arch: Architecture of boot image.
:param subarch: Sub-architecture of boot image.
:param release: Release of boot image.
:param label: Label of boot image.
:return: list of supported purposes
"""
def is_release_supported(self, release):
"""Return True when the release is supported, False otherwise."""
# If the osystem matches assume all releases are supported.
return True
def format_release_choices(self, releases):
"""Format the release choices that are presented to the user.
:param releases: list of installed boot image releases
:return: Return Django "choices" list
"""
choices = []
releases = sorted(releases, reverse=True)
for release in releases:
title = self.get_release_title(release)
if title is not None:
choices.append((release, title))
return choices
def gen_supported_releases(self):
"""List operating system's supported releases.
This is based off the boot images that the cluster currently has
for this operating system.
"""
for image in list_boot_images_for(self):
release = image['release']
if self.is_release_supported(release):
yield release
def get_supported_releases(self):
"""Return operating system's supported releases as a set.
This is based off the boot images that the cluster currently has
for this operating system.
:return: set of supported releases
"""
return set(self.gen_supported_releases())
def get_supported_commissioning_releases(self):
"""List operating system's supported commissioning releases.
Typically this will only return something for Ubuntu, because
that is the only operating system on which we commission.
:return: list of releases.
"""
return []
def get_default_commissioning_release(self):
"""Return operating system's default commissioning release.
Typically this will only return something for Ubuntu, because
that is the only operating system on which we commission.
:return: a release name, or ``None``.
"""
return None
def requires_license_key(self, release):
"""Return whether the given release requires a license key.
:param release: Release
:return: True if requires license key, false otherwise.
"""
return False
def validate_license_key(self, release, key):
"""Validate a license key for a release.
This is only called if the release requires a license key.
:param release: Release
:param key: License key
:return: True if valid, false otherwise
"""
raise NotImplementedError()
def compose_preseed(self, preseed_type, node, token, metadata_url):
"""Compose preseed for the given node.
:param preseed_type: Preseed type to compose.
:param node: Node preseed needs generating for.
:type node: :py:class:`Node`
:param token: OAuth token for URL.
:type token: :py:class:`Token`
:param metadata_url: Metdata URL for node.
:return: Preseed data for node.
:raise:
NotImplementedError: doesn't implement a custom preseed
"""
raise NotImplementedError()
def get_xinstall_parameters(self, arch, subarch, release, label):
"""Return the xinstall image name and type for this operating system.
:param arch: Architecture of boot image.
:param subarch: Sub-architecture of boot image.
:param release: Release of boot image.
:param label: Label of boot image.
:return: tuple with name of root image and image type
"""
return "root-tgz", "tgz"
class OperatingSystemRegistry(Registry):
"""Registry for operating system classes."""
from provisioningserver.drivers.osystem.ubuntu import UbuntuOS
from provisioningserver.drivers.osystem.ubuntucore import UbuntuCoreOS
from provisioningserver.drivers.osystem.bootloader import BootLoaderOS
from provisioningserver.drivers.osystem.centos import CentOS
from provisioningserver.drivers.osystem.rhel import RHELOS
from provisioningserver.drivers.osystem.custom import CustomOS
from provisioningserver.drivers.osystem.windows import WindowsOS
from provisioningserver.drivers.osystem.suse import SUSEOS
from provisioningserver.drivers.osystem.caringo import CaringoOS
builtin_osystems = [
UbuntuOS(),
UbuntuCoreOS(),
BootLoaderOS(),
CentOS(),
RHELOS(),
CustomOS(),
WindowsOS(),
SUSEOS(),
CaringoOS(),
]
for osystem in builtin_osystems:
OperatingSystemRegistry.register_item(osystem.name, osystem)
|