forked from suse-edge/Factory
unpack obscpio files
This commit is contained in:
23
metal3-chart/charts/baremetal-operator/.helmignore
Normal file
23
metal3-chart/charts/baremetal-operator/.helmignore
Normal file
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
6
metal3-chart/charts/baremetal-operator/Chart.yaml
Normal file
6
metal3-chart/charts/baremetal-operator/Chart.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
appVersion: 0.6.1
|
||||
description: A Helm chart for baremetal-operator, used by Metal3
|
||||
name: baremetal-operator
|
||||
type: application
|
||||
version: 0.5.0
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,85 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
labels:
|
||||
clusterctl.cluster.x-k8s.io: ""
|
||||
name: bmceventsubscriptions.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: BMCEventSubscription
|
||||
listKind: BMCEventSubscriptionList
|
||||
plural: bmceventsubscriptions
|
||||
shortNames:
|
||||
- bes
|
||||
- bmcevent
|
||||
singular: bmceventsubscription
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- description: The most recent error message
|
||||
jsonPath: .status.error
|
||||
name: Error
|
||||
type: string
|
||||
- description: Time duration since creation of BMCEventSubscription
|
||||
jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: BMCEventSubscription is the Schema for the fast eventing API
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
properties:
|
||||
context:
|
||||
description: Arbitrary user-provided context for the event
|
||||
type: string
|
||||
destination:
|
||||
description: A webhook URL to send events to
|
||||
type: string
|
||||
hostName:
|
||||
description: A reference to a BareMetalHost
|
||||
type: string
|
||||
httpHeadersRef:
|
||||
description: A secret containing HTTP headers which should be passed
|
||||
along to the Destination when making a request
|
||||
properties:
|
||||
name:
|
||||
description: name is unique within a namespace to reference a
|
||||
secret resource.
|
||||
type: string
|
||||
namespace:
|
||||
description: namespace defines the space within which the secret
|
||||
name must be unique.
|
||||
type: string
|
||||
type: object
|
||||
x-kubernetes-map-type: atomic
|
||||
type: object
|
||||
status:
|
||||
properties:
|
||||
error:
|
||||
type: string
|
||||
subscriptionID:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
@@ -0,0 +1,75 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
name: dataimages.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: DataImage
|
||||
listKind: DataImageList
|
||||
plural: dataimages
|
||||
singular: dataimage
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: DataImage is the Schema for the dataimages API.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
description: DataImageSpec defines the desired state of DataImage.
|
||||
properties:
|
||||
url:
|
||||
description: Url is the address of the dataImage that we want to attach
|
||||
to a BareMetalHost
|
||||
type: string
|
||||
required:
|
||||
- url
|
||||
type: object
|
||||
status:
|
||||
description: DataImageStatus defines the observed state of DataImage.
|
||||
properties:
|
||||
attachedImage:
|
||||
description: Currently attached DataImage
|
||||
properties:
|
||||
url:
|
||||
type: string
|
||||
required:
|
||||
- url
|
||||
type: object
|
||||
error:
|
||||
description: Error count and message when attaching/detaching
|
||||
properties:
|
||||
count:
|
||||
type: integer
|
||||
message:
|
||||
type: string
|
||||
required:
|
||||
- count
|
||||
- message
|
||||
type: object
|
||||
lastReconciled:
|
||||
description: Time of last reconciliation
|
||||
format: date-time
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
@@ -0,0 +1,90 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
labels:
|
||||
clusterctl.cluster.x-k8s.io: ""
|
||||
name: firmwareschemas.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: FirmwareSchema
|
||||
listKind: FirmwareSchemaList
|
||||
plural: firmwareschemas
|
||||
singular: firmwareschema
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: FirmwareSchema is the Schema for the firmwareschemas API.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
description: FirmwareSchemaSpec defines the desired state of FirmwareSchema.
|
||||
properties:
|
||||
hardwareModel:
|
||||
description: The hardware model associated with this schema
|
||||
type: string
|
||||
hardwareVendor:
|
||||
description: The hardware vendor associated with this schema
|
||||
type: string
|
||||
schema:
|
||||
additionalProperties:
|
||||
description: Additional data describing the firmware setting.
|
||||
properties:
|
||||
allowable_values:
|
||||
description: The allowable value for an Enumeration type setting.
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
attribute_type:
|
||||
description: The type of setting.
|
||||
enum:
|
||||
- Enumeration
|
||||
- String
|
||||
- Integer
|
||||
- Boolean
|
||||
- Password
|
||||
type: string
|
||||
lower_bound:
|
||||
description: The lowest value for an Integer type setting.
|
||||
type: integer
|
||||
max_length:
|
||||
description: Maximum length for a String type setting.
|
||||
type: integer
|
||||
min_length:
|
||||
description: Minimum length for a String type setting.
|
||||
type: integer
|
||||
read_only:
|
||||
description: Whether or not this setting is read only.
|
||||
type: boolean
|
||||
unique:
|
||||
description: Whether or not this setting's value is unique to
|
||||
this node, e.g. a serial number.
|
||||
type: boolean
|
||||
upper_bound:
|
||||
description: The highest value for an Integer type setting.
|
||||
type: integer
|
||||
type: object
|
||||
description: Map of firmware name to schema
|
||||
type: object
|
||||
required:
|
||||
- schema
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
@@ -0,0 +1,211 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
labels:
|
||||
clusterctl.cluster.x-k8s.io: ""
|
||||
name: hardwaredata.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: HardwareData
|
||||
listKind: HardwareDataList
|
||||
plural: hardwaredata
|
||||
shortNames:
|
||||
- hd
|
||||
singular: hardwaredata
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- description: Time duration since creation of HardwareData
|
||||
jsonPath: .metadata.creationTimestamp
|
||||
name: Age
|
||||
type: date
|
||||
name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: HardwareData is the Schema for the hardwaredata API.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
description: HardwareDataSpec defines the desired state of HardwareData.
|
||||
properties:
|
||||
hardware:
|
||||
description: The hardware discovered on the host during its inspection.
|
||||
properties:
|
||||
cpu:
|
||||
description: CPU describes one processor on the host.
|
||||
properties:
|
||||
arch:
|
||||
type: string
|
||||
clockMegahertz:
|
||||
description: ClockSpeed is a clock speed in MHz
|
||||
format: double
|
||||
type: number
|
||||
count:
|
||||
type: integer
|
||||
flags:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
model:
|
||||
type: string
|
||||
type: object
|
||||
firmware:
|
||||
description: Firmware describes the firmware on the host.
|
||||
properties:
|
||||
bios:
|
||||
description: The BIOS for this firmware
|
||||
properties:
|
||||
date:
|
||||
description: The release/build date for this BIOS
|
||||
type: string
|
||||
vendor:
|
||||
description: The vendor name for this BIOS
|
||||
type: string
|
||||
version:
|
||||
description: The version of the BIOS
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
hostname:
|
||||
type: string
|
||||
nics:
|
||||
items:
|
||||
description: NIC describes one network interface on the host.
|
||||
properties:
|
||||
ip:
|
||||
description: The IP address of the interface. This will
|
||||
be an IPv4 or IPv6 address if one is present. If both
|
||||
IPv4 and IPv6 addresses are present in a dual-stack environment,
|
||||
two nics will be output, one with each IP.
|
||||
type: string
|
||||
mac:
|
||||
description: The device MAC address
|
||||
pattern: '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}'
|
||||
type: string
|
||||
model:
|
||||
description: The vendor and product IDs of the NIC, e.g.
|
||||
"0x8086 0x1572"
|
||||
type: string
|
||||
name:
|
||||
description: The name of the network interface, e.g. "en0"
|
||||
type: string
|
||||
pxe:
|
||||
description: Whether the NIC is PXE Bootable
|
||||
type: boolean
|
||||
speedGbps:
|
||||
description: The speed of the device in Gigabits per second
|
||||
type: integer
|
||||
vlanId:
|
||||
description: The untagged VLAN ID
|
||||
format: int32
|
||||
maximum: 4094
|
||||
minimum: 0
|
||||
type: integer
|
||||
vlans:
|
||||
description: The VLANs available
|
||||
items:
|
||||
description: VLAN represents the name and ID of a VLAN.
|
||||
properties:
|
||||
id:
|
||||
description: VLANID is a 12-bit 802.1Q VLAN identifier
|
||||
format: int32
|
||||
maximum: 4094
|
||||
minimum: 0
|
||||
type: integer
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
type: array
|
||||
ramMebibytes:
|
||||
type: integer
|
||||
storage:
|
||||
items:
|
||||
description: Storage describes one storage device (disk, SSD,
|
||||
etc.) on the host.
|
||||
properties:
|
||||
alternateNames:
|
||||
description: A list of alternate Linux device names of the
|
||||
disk, e.g. "/dev/sda". Note that this list is not exhaustive,
|
||||
and names may not be stable across reboots.
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
hctl:
|
||||
description: The SCSI location of the device
|
||||
type: string
|
||||
model:
|
||||
description: Hardware model
|
||||
type: string
|
||||
name:
|
||||
description: A Linux device name of the disk, e.g. "/dev/disk/by-path/pci-0000:01:00.0-scsi-0:2:0:0".
|
||||
This will be a name that is stable across reboots if one
|
||||
is available.
|
||||
type: string
|
||||
rotational:
|
||||
description: Whether this disk represents rotational storage.
|
||||
This field is not recommended for usage, please prefer
|
||||
using 'Type' field instead, this field will be deprecated
|
||||
eventually.
|
||||
type: boolean
|
||||
serialNumber:
|
||||
description: The serial number of the device
|
||||
type: string
|
||||
sizeBytes:
|
||||
description: The size of the disk in Bytes
|
||||
format: int64
|
||||
type: integer
|
||||
type:
|
||||
description: 'Device type, one of: HDD, SSD, NVME.'
|
||||
enum:
|
||||
- HDD
|
||||
- SSD
|
||||
- NVME
|
||||
type: string
|
||||
vendor:
|
||||
description: The name of the vendor of the device
|
||||
type: string
|
||||
wwn:
|
||||
description: The WWN of the device
|
||||
type: string
|
||||
wwnVendorExtension:
|
||||
description: The WWN Vendor extension of the device
|
||||
type: string
|
||||
wwnWithExtension:
|
||||
description: The WWN with the extension
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
systemVendor:
|
||||
description: HardwareSystemVendor stores details about the whole
|
||||
hardware system.
|
||||
properties:
|
||||
manufacturer:
|
||||
type: string
|
||||
productName:
|
||||
type: string
|
||||
serialNumber:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources: {}
|
@@ -0,0 +1,178 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
name: hostfirmwarecomponents.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: HostFirmwareComponents
|
||||
listKind: HostFirmwareComponentsList
|
||||
plural: hostfirmwarecomponents
|
||||
singular: hostfirmwarecomponents
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: HostFirmwareComponents is the Schema for the hostfirmwarecomponents
|
||||
API.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
description: HostFirmwareComponentsSpec defines the desired state of HostFirmwareComponents.
|
||||
properties:
|
||||
updates:
|
||||
items:
|
||||
description: FirmwareUpdate defines a firmware update specification.
|
||||
properties:
|
||||
component:
|
||||
type: string
|
||||
url:
|
||||
type: string
|
||||
required:
|
||||
- component
|
||||
- url
|
||||
type: object
|
||||
type: array
|
||||
required:
|
||||
- updates
|
||||
type: object
|
||||
status:
|
||||
description: HostFirmwareComponentsStatus defines the observed state of
|
||||
HostFirmwareComponents.
|
||||
properties:
|
||||
components:
|
||||
description: Components is the list of all available firmware components
|
||||
and their information.
|
||||
items:
|
||||
description: FirmwareComponentStatus defines the status of a firmware
|
||||
component.
|
||||
properties:
|
||||
component:
|
||||
type: string
|
||||
currentVersion:
|
||||
type: string
|
||||
initialVersion:
|
||||
type: string
|
||||
lastVersionFlashed:
|
||||
type: string
|
||||
updatedAt:
|
||||
format: date-time
|
||||
type: string
|
||||
required:
|
||||
- component
|
||||
- initialVersion
|
||||
type: object
|
||||
type: array
|
||||
conditions:
|
||||
description: Track whether updates stored in the spec are valid based
|
||||
on the schema
|
||||
items:
|
||||
description: "Condition contains details for one aspect of the current
|
||||
state of this API Resource. --- This struct is intended for direct
|
||||
use as an array at the field path .status.conditions. For example,
|
||||
\n type FooStatus struct{ // Represents the observations of a
|
||||
foo's current state. // Known .status.conditions.type are: \"Available\",
|
||||
\"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge
|
||||
// +listType=map // +listMapKey=type Conditions []metav1.Condition
|
||||
`json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"
|
||||
protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
|
||||
properties:
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the condition
|
||||
transitioned from one status to another. This should be when
|
||||
the underlying condition changed. If that is not known, then
|
||||
using the time when the API field changed is acceptable.
|
||||
format: date-time
|
||||
type: string
|
||||
message:
|
||||
description: message is a human readable message indicating
|
||||
details about the transition. This may be an empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
observedGeneration:
|
||||
description: observedGeneration represents the .metadata.generation
|
||||
that the condition was set based upon. For instance, if .metadata.generation
|
||||
is currently 12, but the .status.conditions[x].observedGeneration
|
||||
is 9, the condition is out of date with respect to the current
|
||||
state of the instance.
|
||||
format: int64
|
||||
minimum: 0
|
||||
type: integer
|
||||
reason:
|
||||
description: reason contains a programmatic identifier indicating
|
||||
the reason for the condition's last transition. Producers
|
||||
of specific condition types may define expected values and
|
||||
meanings for this field, and whether the values are considered
|
||||
a guaranteed API. The value should be a CamelCase string.
|
||||
This field may not be empty.
|
||||
maxLength: 1024
|
||||
minLength: 1
|
||||
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition, one of True, False, Unknown.
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of condition in CamelCase or in foo.example.com/CamelCase.
|
||||
--- Many .condition.type values are consistent across resources
|
||||
like Available, but because arbitrary conditions can be useful
|
||||
(see .node.status.conditions), the ability to deconflict is
|
||||
important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
|
||||
maxLength: 316
|
||||
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- message
|
||||
- reason
|
||||
- status
|
||||
- type
|
||||
type: object
|
||||
type: array
|
||||
x-kubernetes-list-map-keys:
|
||||
- type
|
||||
x-kubernetes-list-type: map
|
||||
lastUpdated:
|
||||
description: Time that the status was last updated
|
||||
format: date-time
|
||||
type: string
|
||||
updates:
|
||||
description: Updates is the list of all firmware components that should
|
||||
be updated they are specified via name and url fields.
|
||||
items:
|
||||
description: FirmwareUpdate defines a firmware update specification.
|
||||
properties:
|
||||
component:
|
||||
type: string
|
||||
url:
|
||||
type: string
|
||||
required:
|
||||
- component
|
||||
- url
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
@@ -0,0 +1,164 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
labels:
|
||||
clusterctl.cluster.x-k8s.io: ""
|
||||
name: hostfirmwaresettings.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: HostFirmwareSettings
|
||||
listKind: HostFirmwareSettingsList
|
||||
plural: hostfirmwaresettings
|
||||
shortNames:
|
||||
- hfs
|
||||
singular: hostfirmwaresettings
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: HostFirmwareSettings is the Schema for the hostfirmwaresettings
|
||||
API.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
description: HostFirmwareSettingsSpec defines the desired state of HostFirmwareSettings.
|
||||
properties:
|
||||
settings:
|
||||
additionalProperties:
|
||||
anyOf:
|
||||
- type: integer
|
||||
- type: string
|
||||
x-kubernetes-int-or-string: true
|
||||
description: Settings are the desired firmware settings stored as
|
||||
name/value pairs.
|
||||
type: object
|
||||
required:
|
||||
- settings
|
||||
type: object
|
||||
status:
|
||||
description: HostFirmwareSettingsStatus defines the observed state of
|
||||
HostFirmwareSettings.
|
||||
properties:
|
||||
conditions:
|
||||
description: Track whether settings stored in the spec are valid based
|
||||
on the schema
|
||||
items:
|
||||
description: "Condition contains details for one aspect of the current
|
||||
state of this API Resource. --- This struct is intended for direct
|
||||
use as an array at the field path .status.conditions. For example,
|
||||
\n type FooStatus struct{ // Represents the observations of a
|
||||
foo's current state. // Known .status.conditions.type are: \"Available\",
|
||||
\"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge
|
||||
// +listType=map // +listMapKey=type Conditions []metav1.Condition
|
||||
`json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"
|
||||
protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
|
||||
properties:
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the condition
|
||||
transitioned from one status to another. This should be when
|
||||
the underlying condition changed. If that is not known, then
|
||||
using the time when the API field changed is acceptable.
|
||||
format: date-time
|
||||
type: string
|
||||
message:
|
||||
description: message is a human readable message indicating
|
||||
details about the transition. This may be an empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
observedGeneration:
|
||||
description: observedGeneration represents the .metadata.generation
|
||||
that the condition was set based upon. For instance, if .metadata.generation
|
||||
is currently 12, but the .status.conditions[x].observedGeneration
|
||||
is 9, the condition is out of date with respect to the current
|
||||
state of the instance.
|
||||
format: int64
|
||||
minimum: 0
|
||||
type: integer
|
||||
reason:
|
||||
description: reason contains a programmatic identifier indicating
|
||||
the reason for the condition's last transition. Producers
|
||||
of specific condition types may define expected values and
|
||||
meanings for this field, and whether the values are considered
|
||||
a guaranteed API. The value should be a CamelCase string.
|
||||
This field may not be empty.
|
||||
maxLength: 1024
|
||||
minLength: 1
|
||||
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition, one of True, False, Unknown.
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of condition in CamelCase or in foo.example.com/CamelCase.
|
||||
--- Many .condition.type values are consistent across resources
|
||||
like Available, but because arbitrary conditions can be useful
|
||||
(see .node.status.conditions), the ability to deconflict is
|
||||
important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
|
||||
maxLength: 316
|
||||
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- message
|
||||
- reason
|
||||
- status
|
||||
- type
|
||||
type: object
|
||||
type: array
|
||||
x-kubernetes-list-map-keys:
|
||||
- type
|
||||
x-kubernetes-list-type: map
|
||||
lastUpdated:
|
||||
description: Time that the status was last updated
|
||||
format: date-time
|
||||
type: string
|
||||
schema:
|
||||
description: FirmwareSchema is a reference to the Schema used to describe
|
||||
each FirmwareSetting. By default, this will be a Schema in the same
|
||||
Namespace as the settings but it can be overwritten in the Spec
|
||||
properties:
|
||||
name:
|
||||
description: '`name` is the reference to the schema.'
|
||||
type: string
|
||||
namespace:
|
||||
description: '`namespace` is the namespace of the where the schema
|
||||
is stored.'
|
||||
type: string
|
||||
required:
|
||||
- name
|
||||
- namespace
|
||||
type: object
|
||||
settings:
|
||||
additionalProperties:
|
||||
type: string
|
||||
description: Settings are the firmware settings stored as name/value
|
||||
pairs
|
||||
type: object
|
||||
required:
|
||||
- settings
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
@@ -0,0 +1,183 @@
|
||||
---
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
controller-gen.kubebuilder.io/version: v0.12.1
|
||||
labels:
|
||||
clusterctl.cluster.x-k8s.io: ""
|
||||
name: preprovisioningimages.metal3.io
|
||||
spec:
|
||||
group: metal3.io
|
||||
names:
|
||||
kind: PreprovisioningImage
|
||||
listKind: PreprovisioningImageList
|
||||
plural: preprovisioningimages
|
||||
shortNames:
|
||||
- ppimg
|
||||
singular: preprovisioningimage
|
||||
scope: Namespaced
|
||||
versions:
|
||||
- additionalPrinterColumns:
|
||||
- description: Whether the image is ready
|
||||
jsonPath: .status.conditions[?(@.type=='Ready')].status
|
||||
name: Ready
|
||||
type: string
|
||||
- description: The reason for the image readiness status
|
||||
jsonPath: .status.conditions[?(@.type=='Ready')].reason
|
||||
name: Reason
|
||||
type: string
|
||||
name: v1alpha1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: PreprovisioningImage is the Schema for the preprovisioningimages
|
||||
API.
|
||||
properties:
|
||||
apiVersion:
|
||||
description: 'APIVersion defines the versioned schema of this representation
|
||||
of an object. Servers should convert recognized schemas to the latest
|
||||
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||
type: string
|
||||
kind:
|
||||
description: 'Kind is a string value representing the REST resource this
|
||||
object represents. Servers may infer this from the endpoint the client
|
||||
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||
type: string
|
||||
metadata:
|
||||
type: object
|
||||
spec:
|
||||
description: PreprovisioningImageSpec defines the desired state of PreprovisioningImage.
|
||||
properties:
|
||||
acceptFormats:
|
||||
description: acceptFormats is a list of acceptable image formats.
|
||||
items:
|
||||
description: ImageFormat enumerates the allowed image formats
|
||||
enum:
|
||||
- iso
|
||||
- initrd
|
||||
type: string
|
||||
type: array
|
||||
architecture:
|
||||
description: architecture is the processor architecture for which
|
||||
to build the image.
|
||||
type: string
|
||||
networkDataName:
|
||||
description: networkDataName is the name of a Secret in the local
|
||||
namespace that contains network data to build in to the image.
|
||||
type: string
|
||||
type: object
|
||||
status:
|
||||
description: PreprovisioningImageStatus defines the observed state of
|
||||
PreprovisioningImage.
|
||||
properties:
|
||||
architecture:
|
||||
description: architecture is the processor architecture for which
|
||||
the image is built
|
||||
type: string
|
||||
conditions:
|
||||
description: conditions describe the state of the built image
|
||||
items:
|
||||
description: "Condition contains details for one aspect of the current
|
||||
state of this API Resource. --- This struct is intended for direct
|
||||
use as an array at the field path .status.conditions. For example,
|
||||
\n type FooStatus struct{ // Represents the observations of a
|
||||
foo's current state. // Known .status.conditions.type are: \"Available\",
|
||||
\"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge
|
||||
// +listType=map // +listMapKey=type Conditions []metav1.Condition
|
||||
`json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\"
|
||||
protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
|
||||
properties:
|
||||
lastTransitionTime:
|
||||
description: lastTransitionTime is the last time the condition
|
||||
transitioned from one status to another. This should be when
|
||||
the underlying condition changed. If that is not known, then
|
||||
using the time when the API field changed is acceptable.
|
||||
format: date-time
|
||||
type: string
|
||||
message:
|
||||
description: message is a human readable message indicating
|
||||
details about the transition. This may be an empty string.
|
||||
maxLength: 32768
|
||||
type: string
|
||||
observedGeneration:
|
||||
description: observedGeneration represents the .metadata.generation
|
||||
that the condition was set based upon. For instance, if .metadata.generation
|
||||
is currently 12, but the .status.conditions[x].observedGeneration
|
||||
is 9, the condition is out of date with respect to the current
|
||||
state of the instance.
|
||||
format: int64
|
||||
minimum: 0
|
||||
type: integer
|
||||
reason:
|
||||
description: reason contains a programmatic identifier indicating
|
||||
the reason for the condition's last transition. Producers
|
||||
of specific condition types may define expected values and
|
||||
meanings for this field, and whether the values are considered
|
||||
a guaranteed API. The value should be a CamelCase string.
|
||||
This field may not be empty.
|
||||
maxLength: 1024
|
||||
minLength: 1
|
||||
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
|
||||
type: string
|
||||
status:
|
||||
description: status of the condition, one of True, False, Unknown.
|
||||
enum:
|
||||
- "True"
|
||||
- "False"
|
||||
- Unknown
|
||||
type: string
|
||||
type:
|
||||
description: type of condition in CamelCase or in foo.example.com/CamelCase.
|
||||
--- Many .condition.type values are consistent across resources
|
||||
like Available, but because arbitrary conditions can be useful
|
||||
(see .node.status.conditions), the ability to deconflict is
|
||||
important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
|
||||
maxLength: 316
|
||||
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
|
||||
type: string
|
||||
required:
|
||||
- lastTransitionTime
|
||||
- message
|
||||
- reason
|
||||
- status
|
||||
- type
|
||||
type: object
|
||||
type: array
|
||||
x-kubernetes-list-map-keys:
|
||||
- type
|
||||
x-kubernetes-list-type: map
|
||||
extraKernelParams:
|
||||
description: extraKernelParams is a string with extra parameters to
|
||||
pass to the kernel when booting the image over network. Only makes
|
||||
sense for initrd images.
|
||||
type: string
|
||||
format:
|
||||
description: 'format is the type of image that is available at the
|
||||
download url: either iso or initrd.'
|
||||
enum:
|
||||
- iso
|
||||
- initrd
|
||||
type: string
|
||||
imageUrl:
|
||||
description: imageUrl is the URL from which the built image can be
|
||||
downloaded.
|
||||
type: string
|
||||
kernelUrl:
|
||||
description: kernelUrl is the URL from which the kernel of the image
|
||||
can be downloaded. Only makes sense for initrd images.
|
||||
type: string
|
||||
networkData:
|
||||
description: networkData is a reference to the version of the Secret
|
||||
containing the network data used to build the image.
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
version:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
16
metal3-chart/charts/baremetal-operator/templates/NOTES.txt
Normal file
16
metal3-chart/charts/baremetal-operator/templates/NOTES.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "baremetal-operator.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "baremetal-operator.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "baremetal-operator.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "baremetal-operator.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||
{{- end }}
|
@@ -0,0 +1,63 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "baremetal-operator.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "baremetal-operator.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "baremetal-operator.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "baremetal-operator.labels" -}}
|
||||
helm.sh/chart: {{ include "baremetal-operator.chart" . }}
|
||||
{{ include "baremetal-operator.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "baremetal-operator.selectorLabels" -}}
|
||||
app.kubernetes.io/component: baremetal-operator
|
||||
app.kubernetes.io/name: {{ include "baremetal-operator.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "baremetal-operator.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "baremetal-operator.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@@ -0,0 +1,14 @@
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-serving-cert
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
spec:
|
||||
dnsNames:
|
||||
- baremetal-operator-webhook-service.{{ .Release.Namespace }}.svc
|
||||
- baremetal-operator-webhook-service.{{ .Release.Namespace }}.svc.cluster.local
|
||||
issuerRef:
|
||||
kind: Issuer
|
||||
name: {{ include "baremetal-operator.fullname" . }}-selfsigned-issuer
|
||||
secretName: bmo-webhook-server-cert
|
@@ -0,0 +1,186 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: {{ include "baremetal-operator.fullname" . }}-manager-role
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- secrets
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- baremetalhosts
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- baremetalhosts/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- bmceventsubscriptions
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- bmceventsubscriptions/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- firmwareschemas
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- firmwareschemas/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- hardware/finalizers
|
||||
verbs:
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- hardwaredata
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- hostfirmwaresettings
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- hostfirmwaresettings/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- preprovisioningimages
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- preprovisioningimages/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- dataimages
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- dataimages/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- hostfirmwarecomponents
|
||||
verbs:
|
||||
- create
|
||||
- delete
|
||||
- get
|
||||
- list
|
||||
- patch
|
||||
- update
|
||||
- watch
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
resources:
|
||||
- hostfirmwarecomponents/status
|
||||
verbs:
|
||||
- get
|
||||
- patch
|
||||
- update
|
@@ -0,0 +1,11 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-metrics-reader
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- nonResourceURLs:
|
||||
- /metrics
|
||||
verbs:
|
||||
- get
|
@@ -0,0 +1,19 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-proxy-role
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- authentication.k8s.io
|
||||
resources:
|
||||
- tokenreviews
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- authorization.k8s.io
|
||||
resources:
|
||||
- subjectaccessreviews
|
||||
verbs:
|
||||
- create
|
@@ -0,0 +1,14 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-manager-rolebinding
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: {{ include "baremetal-operator.fullname" . }}-manager-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "baremetal-operator.serviceAccountName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
@@ -0,0 +1,14 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-proxy-rolebinding
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: {{ include "baremetal-operator.fullname" . }}-proxy-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "baremetal-operator.serviceAccountName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
@@ -0,0 +1,30 @@
|
||||
{{- $enableTLS := .Values.global.enable_tls }}
|
||||
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
||||
{{- $protocol := ternary "https" "http" $enableTLS }}
|
||||
{{- $ironicIP := .Values.global.ironicIP | default "" }}
|
||||
{{- $ironicApiHost := print $ironicIP ":6385" }}
|
||||
{{- $ironicInspectorHost := print $ironicIP ":5050" }}
|
||||
{{- $ironicBootHost := print $ironicIP ":6180" }}
|
||||
{{- $ironicCacheHost := print $ironicIP ":6180" }}
|
||||
|
||||
apiVersion: v1
|
||||
data:
|
||||
IRONIC_ENDPOINT: "{{ $protocol }}://{{ $ironicApiHost }}/v1/"
|
||||
IRONIC_INSPECTOR_ENDPOINT: "{{ $protocol }}://{{ $ironicInspectorHost }}/v1/"
|
||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "false"
|
||||
# Switch VMedia to HTTP if enable_vmedia_tls is false
|
||||
{{- if and $enableTLS $enableVMediaTLS }}
|
||||
{{- $ironicBootHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
||||
{{- $ironicCacheHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
||||
{{- $protocol = "https" }}
|
||||
{{- else }}
|
||||
{{- $protocol = "http" }}
|
||||
{{- end }}
|
||||
CACHEURL: "{{ $protocol }}://{{ $ironicCacheHost }}/images"
|
||||
DEPLOY_KERNEL_URL: "{{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent.kernel"
|
||||
DEPLOY_RAMDISK_URL: "{{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent.initramfs"
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: baremetal-operator-ironic
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
@@ -0,0 +1,19 @@
|
||||
apiVersion: v1
|
||||
data:
|
||||
controller_manager_config.yaml: |
|
||||
apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
|
||||
kind: ControllerManagerConfig
|
||||
health:
|
||||
healthProbeBindAddress: :9440
|
||||
metrics:
|
||||
bindAddress: 127.0.0.1:8085
|
||||
webhook:
|
||||
port: 9443
|
||||
leaderElection:
|
||||
leaderElect: true
|
||||
resourceName: a9498140.metal3.io
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: baremetal-operator-manager-config
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
131
metal3-chart/charts/baremetal-operator/templates/deployment.yaml
Normal file
131
metal3-chart/charts/baremetal-operator/templates/deployment.yaml
Normal file
@@ -0,0 +1,131 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
control-plane: controller-manager
|
||||
webhook: metal3-io-v1alpha1-baremetalhost
|
||||
name: {{ include "baremetal-operator.fullname" . }}-controller-manager
|
||||
spec:
|
||||
minReadySeconds: 10
|
||||
{{- if not .Values.autoscaling.enabled }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "baremetal-operator.selectorLabels" . | nindent 6 }}
|
||||
control-plane: controller-manager
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "baremetal-operator.selectorLabels" . | nindent 8 }}
|
||||
control-plane: controller-manager
|
||||
webhook: metal3-io-v1alpha1-baremetalhost
|
||||
spec:
|
||||
containers:
|
||||
- args:
|
||||
- --metrics-addr=127.0.0.1:8085
|
||||
- --enable-leader-election
|
||||
env:
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: POD_NAMESPACE
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.namespace
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-ironic
|
||||
image: "{{ .Values.images.baremetalOperator.repository }}:{{ .Values.images.baremetalOperator.tag | default .Chart.AppVersion }}"
|
||||
imagePullPolicy: {{ .Values.images.baremetalOperator.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
livenessProbe:
|
||||
failureThreshold: 10
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 9440
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 2
|
||||
name: manager
|
||||
ports:
|
||||
- containerPort: 9443
|
||||
name: webhook-server
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
failureThreshold: 10
|
||||
httpGet:
|
||||
path: /readyz
|
||||
port: 9440
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 2
|
||||
volumeMounts:
|
||||
- mountPath: /tmp/k8s-webhook-server/serving-certs
|
||||
name: cert
|
||||
readOnly: true
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- name: ironic-basic-auth
|
||||
mountPath: "/opt/metal3/auth/ironic/username"
|
||||
subPath: username
|
||||
readOnly: true
|
||||
- name: ironic-basic-auth
|
||||
mountPath: "/opt/metal3/auth/ironic/password"
|
||||
subPath: password
|
||||
readOnly: true
|
||||
- name: ironic-inspector-basic-auth
|
||||
mountPath: "/opt/metal3/auth/ironic-inspector/username"
|
||||
subPath: username
|
||||
readOnly: true
|
||||
- name: ironic-inspector-basic-auth
|
||||
mountPath: "/opt/metal3/auth/ironic-inspector/password"
|
||||
subPath: password
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.global.enable_tls }}
|
||||
- name: cacert
|
||||
mountPath: "/opt/metal3/certs/ca"
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
- args:
|
||||
- --secure-listen-address=0.0.0.0:8443
|
||||
- --upstream=http://127.0.0.1:8085/
|
||||
- --logtostderr=true
|
||||
- --v=10
|
||||
image: "{{ .Values.images.rbacProxy.repository }}:{{ .Values.images.rbacProxy.tag }}"
|
||||
imagePullPolicy: {{ .Values.images.rbacProxy.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
name: kube-rbac-proxy
|
||||
ports:
|
||||
- containerPort: 8443
|
||||
name: https
|
||||
serviceAccountName: {{ include "baremetal-operator.serviceAccountName" . }}
|
||||
terminationGracePeriodSeconds: 10
|
||||
volumes:
|
||||
- name: cert
|
||||
secret:
|
||||
defaultMode: 420
|
||||
secretName: bmo-webhook-server-cert
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- name: ironic-basic-auth
|
||||
secret:
|
||||
secretName: ironic-basic-auth
|
||||
- name: ironic-inspector-basic-auth
|
||||
secret:
|
||||
secretName: ironic-inspector-basic-auth
|
||||
{{- end }}
|
||||
{{- if .Values.global.enable_tls }}
|
||||
- name: cacert
|
||||
secret:
|
||||
secretName: ironic-cacert
|
||||
{{- end }}
|
||||
{{- with .Values.global.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
@@ -0,0 +1,8 @@
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
name: {{ include "baremetal-operator.fullname" . }}-selfsigned-issuer
|
||||
spec:
|
||||
selfSigned: {}
|
45
metal3-chart/charts/baremetal-operator/templates/role.yaml
Normal file
45
metal3-chart/charts/baremetal-operator/templates/role.yaml
Normal file
@@ -0,0 +1,45 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-leader-election-role
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- create
|
||||
- update
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps/status
|
||||
verbs:
|
||||
- get
|
||||
- update
|
||||
- patch
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- coordination.k8s.io
|
||||
resources:
|
||||
- leases
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- create
|
||||
- update
|
||||
- patch
|
||||
- delete
|
@@ -0,0 +1,13 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-leader-election-rolebinding
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: {{ include "baremetal-operator.fullname" . }}-leader-election-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "baremetal-operator.serviceAccountName" . }}
|
@@ -0,0 +1,14 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
control-plane: controller-manager
|
||||
name: {{ include "baremetal-operator.fullname" . }}-controller-manager-metrics-service
|
||||
spec:
|
||||
ports:
|
||||
- name: https
|
||||
port: 8443
|
||||
targetPort: https
|
||||
selector:
|
||||
control-plane: controller-manager
|
@@ -0,0 +1,13 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
name: {{ include "baremetal-operator.fullname" . }}-webhook-service
|
||||
spec:
|
||||
ports:
|
||||
- port: 443
|
||||
targetPort: 9443
|
||||
selector:
|
||||
control-plane: controller-manager
|
||||
webhook: metal3-io-v1alpha1-baremetalhost
|
@@ -0,0 +1,12 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "baremetal-operator.serviceAccountName" . }}
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "baremetal-operator.fullname" . }}-test-connection"
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "baremetal-operator.fullname" . }}:{{ .Values.service.port }}']
|
||||
restartPolicy: Never
|
@@ -0,0 +1,51 @@
|
||||
apiVersion: admissionregistration.k8s.io/v1
|
||||
kind: ValidatingWebhookConfiguration
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "baremetal-operator.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ include "baremetal-operator.fullname" . }}-serving-cert
|
||||
name: {{ include "baremetal-operator.fullname" . }}-validating-webhook-configuration
|
||||
webhooks:
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
- v1beta
|
||||
clientConfig:
|
||||
service:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-webhook-service
|
||||
namespace: {{ .Release.Namespace }}
|
||||
path: /validate-metal3-io-v1alpha1-baremetalhost
|
||||
failurePolicy: Fail
|
||||
name: baremetalhost.metal3.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
apiVersions:
|
||||
- v1alpha1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- baremetalhosts
|
||||
sideEffects: None
|
||||
- admissionReviewVersions:
|
||||
- v1
|
||||
- v1beta
|
||||
clientConfig:
|
||||
service:
|
||||
name: {{ include "baremetal-operator.fullname" . }}-webhook-service
|
||||
namespace: {{ .Release.Namespace }}
|
||||
path: /validate-metal3-io-v1alpha1-bmceventsubscription
|
||||
failurePolicy: Fail
|
||||
name: bmceventsubscription.metal3.io
|
||||
rules:
|
||||
- apiGroups:
|
||||
- metal3.io
|
||||
apiVersions:
|
||||
- v1alpha1
|
||||
operations:
|
||||
- CREATE
|
||||
- UPDATE
|
||||
resources:
|
||||
- bmceventsubscriptions
|
||||
sideEffects: None
|
90
metal3-chart/charts/baremetal-operator/values.yaml
Normal file
90
metal3-chart/charts/baremetal-operator/values.yaml
Normal file
@@ -0,0 +1,90 @@
|
||||
# Default values for baremetal-operator.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
global:
|
||||
# specify comma serparate beginning and end of the range of IP
|
||||
# addresses the DHCP server will manage.
|
||||
dhcpRange: 192.168.20.20,192.168.20.80
|
||||
|
||||
# Network interface on which provisioning network can be accessed
|
||||
provisioningInterface: ens4
|
||||
|
||||
# IP Address assigned to network interface on provisioning network
|
||||
provisioningIP: 192.168.20.5
|
||||
|
||||
# If running in a multi-node kubernetes cluster, "pin" the baremtal container
|
||||
# to the same host where the ironic and media containers
|
||||
# arerunning. Uncomment the nodeSelector and update the hostname accordingly.
|
||||
#nodeSelector:
|
||||
#kubernetes.io/hostname: "my-hostname"
|
||||
|
||||
# Comment this out when pinning the baremetal-operator container to a specfic host.
|
||||
nodeSelector: {}
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
images:
|
||||
baremetalOperator:
|
||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/baremetal-operator
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "0.6.1"
|
||||
rbacProxy:
|
||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/kube-rbac-proxy
|
||||
pullPolicy: IfNotPresent
|
||||
tag: "v0.14.2"
|
||||
|
||||
imagePullSecrets: []
|
||||
nameOverride: "manger"
|
||||
fullnameOverride: "baremetal-operator"
|
||||
|
||||
serviceAccount:
|
||||
# Specifies whether a service account should be created
|
||||
create: true
|
||||
# Annotations to add to the service account
|
||||
annotations: {}
|
||||
# The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: "baremetal-operator-controller-manager"
|
||||
|
||||
podAnnotations: {}
|
||||
|
||||
securityContext:
|
||||
runAsUser: 11000
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
runAsNonRoot: true
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 80
|
||||
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
autoscaling:
|
||||
enabled: false
|
||||
minReplicas: 1
|
||||
maxReplicas: 100
|
||||
targetCPUUtilizationPercentage: 80
|
||||
# targetMemoryUtilizationPercentage: 80
|
||||
|
||||
tolerations: []
|
||||
|
||||
affinity: {}
|
||||
|
||||
baremetaloperator:
|
||||
httpPort: "6180"
|
23
metal3-chart/charts/ironic/.helmignore
Normal file
23
metal3-chart/charts/ironic/.helmignore
Normal file
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
6
metal3-chart/charts/ironic/Chart.yaml
Normal file
6
metal3-chart/charts/ironic/Chart.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
appVersion: 24.1.2
|
||||
description: A Helm chart for Ironic, used by Metal3
|
||||
name: ironic
|
||||
type: application
|
||||
version: 0.7.0
|
24
metal3-chart/charts/ironic/README.md
Normal file
24
metal3-chart/charts/ironic/README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
## How to Enable Provisioning Network
|
||||
|
||||
By default PXE boot functionality is disabled, so deployments via e.g redfish-virtualmedia may
|
||||
be performed without any dedicated provisioning network.
|
||||
|
||||
For PXE boot a dedicated network is required, in this case we run a dnsmasq instance to provide
|
||||
DHCP and require a dedicated NIC for connectivity to the provisioning network on each host.
|
||||
|
||||
To enable this mode you must provide the following additional configuration (note the values are
|
||||
examples and will depend on your environment):
|
||||
|
||||
```
|
||||
global:
|
||||
enable_dnsmasq: true
|
||||
enable_pxe_boot: true
|
||||
dnsmasqDefaultRouter: 192.168.21.254
|
||||
dnsmasqDNSServer: 192.168.20.5
|
||||
dhcpRange: 192.168.20.20,192.168.20.80
|
||||
provisioningInterface: ens4
|
||||
provisioningIP: 192.168.20.5
|
||||
```
|
||||
|
||||
Note that these values *must not* conflict with your controlplane or other networks otherwise unexpected
|
||||
behavior is likely - a dedicated physical network is required in this configuration.
|
16
metal3-chart/charts/ironic/templates/NOTES.txt
Normal file
16
metal3-chart/charts/ironic/templates/NOTES.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if eq .Values.service.type "NodePort" }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ironic.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if eq .Values.service.type "LoadBalancer" }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ironic.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ironic.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:6385
|
||||
{{- else if eq .Values.service.type "ClusterIP" }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ironic.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||
{{- end }}
|
88
metal3-chart/charts/ironic/templates/_helpers.tpl
Normal file
88
metal3-chart/charts/ironic/templates/_helpers.tpl
Normal file
@@ -0,0 +1,88 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "ironic.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "ironic.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "ironic.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "ironic.labels" -}}
|
||||
helm.sh/chart: {{ include "ironic.chart" . }}
|
||||
{{ include "ironic.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "ironic.selectorLabels" -}}
|
||||
app.kubernetes.io/component: ironic
|
||||
app.kubernetes.io/name: {{ include "ironic.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "ironic.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "ironic.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Shared directory volumeMount
|
||||
*/}}
|
||||
{{- define "ironic.sharedVolumeMount" -}}
|
||||
- mountPath: /shared
|
||||
name: ironic-data-volume
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Get ironic CA volumeMounts
|
||||
*/}}
|
||||
{{- define "ironic.CAVolumeMounts" -}}
|
||||
- name: cert-ironic-ca
|
||||
mountPath: "/certs/ca/ironic"
|
||||
readOnly: true
|
||||
- name: cert-ironic-inspector-ca
|
||||
mountPath: "/certs/ca/ironic-inspector"
|
||||
readOnly: true
|
||||
{{- if .Values.global.enable_vmedia_tls }}
|
||||
- name: cert-ironic-vmedia-ca
|
||||
mountPath: "/certs/ca/vmedia"
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- end }}
|
56
metal3-chart/charts/ironic/templates/certificates.yaml
Normal file
56
metal3-chart/charts/ironic/templates/certificates.yaml
Normal file
@@ -0,0 +1,56 @@
|
||||
{{- if .Values.global.enable_tls -}}
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: ironic-cacert
|
||||
spec:
|
||||
commonName: ironic-ca
|
||||
isCA: true
|
||||
ipAddresses:
|
||||
- {{ .Values.global.ironicIP }}
|
||||
issuerRef:
|
||||
kind: Issuer
|
||||
name: selfsigned-issuer
|
||||
secretName: ironic-cacert
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: ironic-cert
|
||||
spec:
|
||||
commonName: ironic-cert
|
||||
ipAddresses:
|
||||
- {{ .Values.global.ironicIP }}
|
||||
issuerRef:
|
||||
kind: Issuer
|
||||
name: ca-issuer
|
||||
secretName: ironic-cert
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: ironic-inspector-cert
|
||||
spec:
|
||||
commonName: ironic-inspector-cert
|
||||
ipAddresses:
|
||||
- {{ .Values.global.ironicIP }}
|
||||
issuerRef:
|
||||
kind: Issuer
|
||||
name: ca-issuer
|
||||
secretName: ironic-inspector-cert
|
||||
{{- if .Values.global.enable_vmedia_tls }}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Certificate
|
||||
metadata:
|
||||
name: ironic-vmedia-cert
|
||||
spec:
|
||||
commonName: ironic-vmedia-cert
|
||||
ipAddresses:
|
||||
- {{ .Values.global.ironicIP }}
|
||||
issuerRef:
|
||||
kind: Issuer
|
||||
name: ca-issuer
|
||||
secretName: ironic-vmedia-cert
|
||||
{{- end }}
|
||||
{{- end }}
|
@@ -0,0 +1,12 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: ironic-ipa-downloader
|
||||
labels:
|
||||
{{- include "ironic.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- with .Values.baremetaloperator }}
|
||||
{{ if .ipaBaseUri }}
|
||||
IPA_BASEURI: {{ .ipaBaseUri }}
|
||||
{{ end }}
|
||||
{{ end }}
|
86
metal3-chart/charts/ironic/templates/configmap.yaml
Normal file
86
metal3-chart/charts/ironic/templates/configmap.yaml
Normal file
@@ -0,0 +1,86 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: ironic-bmo
|
||||
labels:
|
||||
{{- include "ironic.labels" . | nindent 4 }}
|
||||
data:
|
||||
{{- $enableTLS := .Values.global.enable_tls }}
|
||||
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
||||
{{- $protocol := ternary "https" "http" $enableTLS }}
|
||||
{{- $ironicIP := .Values.global.ironicIP | default "" }}
|
||||
{{- $ironicApiHost := print $ironicIP ":6385" }}
|
||||
{{- $ironicInspectorHost := print $ironicIP ":5050" }}
|
||||
{{- $ironicBootHost := print $ironicIP ":6180" }}
|
||||
{{- $ironicCacheHost := print $ironicIP ":6180" }}
|
||||
|
||||
{{- if ( .Values.global.enable_dnsmasq ) }}
|
||||
DNSMASQ_BOOT_SERVER_ADDRESS: {{ $ironicBootHost }}
|
||||
DNSMASQ_DNS_SERVER_ADDRESS: {{ .Values.global.dnsmasqDNSServer }}
|
||||
DNSMASQ_DEFAULT_ROUTER: {{ .Values.global.dnsmasqDefaultRouter }}
|
||||
DHCP_RANGE: {{ .Values.global.dhcpRange }}
|
||||
{{- end }}
|
||||
{{- if .Values.debug.ironicRamdiskSshKey }}
|
||||
IRONIC_RAMDISK_SSH_KEY: {{ .Values.debug.ironicRamdiskSshKey }}
|
||||
{{- end }}
|
||||
HTTP_PORT: "6180"
|
||||
PREDICTABLE_NIC_NAMES: "{{ .Values.global.predictableNicNames }}"
|
||||
USE_IRONIC_INSPECTOR: "true"
|
||||
IRONIC_API_BASE_URL: {{ $protocol }}://{{ $ironicApiHost }}
|
||||
IRONIC_API_HOST: {{ $ironicApiHost }}
|
||||
IRONIC_API_HTTPD_SERVER_NAME: {{ $ironicApiHost }}
|
||||
IRONIC_ENDPOINT: {{ $protocol }}://{{ $ironicApiHost }}/v1/
|
||||
IRONIC_INSPECTOR_BASE_URL: {{ $protocol }}://{{ $ironicInspectorHost }}
|
||||
IRONIC_INSPECTOR_ENDPOINT: {{ $protocol }}://{{ $ironicInspectorHost }}/v1/
|
||||
IRONIC_INSPECTOR_HOST: {{ $ironicInspectorHost }}
|
||||
IRONIC_INSPECTOR_HTTPD_SERVER_NAME: {{ $ironicInspectorHost }}
|
||||
# Switch VMedia to HTTP if enable_vmedia_tls is false
|
||||
{{- if and $enableTLS $enableVMediaTLS }}
|
||||
{{- $ironicBootHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
||||
{{- $ironicCacheHost = print $ironicIP ":" .Values.global.vmediaTLSPort }}
|
||||
{{- $protocol = "https" }}
|
||||
{{- else }}
|
||||
{{- $protocol = "http" }}
|
||||
{{- end }}
|
||||
IRONIC_EXTERNAL_HTTP_URL: {{ $protocol }}://{{ $ironicCacheHost }}
|
||||
CACHEURL: {{ $protocol }}://{{ $ironicCacheHost }}/images
|
||||
DEPLOY_KERNEL_URL: {{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent.kernel
|
||||
DEPLOY_RAMDISK_URL: {{ $protocol }}://{{ $ironicBootHost }}/images/ironic-python-agent.initramfs
|
||||
IRONIC_BOOT_BASE_URL: {{ $protocol }}://{{ $ironicBootHost }}
|
||||
IRONIC_VMEDIA_HTTPD_SERVER_NAME: {{ $ironicBootHost }}
|
||||
ENABLE_PXE_BOOT: "{{ .Values.global.enable_pxe_boot }}"
|
||||
{{- if .Values.global.provisioningInterface }}
|
||||
PROVISIONING_INTERFACE: {{ .Values.global.provisioningInterface }}
|
||||
{{- end }}
|
||||
{{- if .Values.global.provisioningIP }}
|
||||
PROVISIONING_IP: {{ .Values.global.provisioningIP }}
|
||||
{{- end }}
|
||||
IRONIC_INSPECTOR_VLAN_INTERFACES: all
|
||||
IRONIC_ILO_USE_SWIFT: "false"
|
||||
IRONIC_ILO_USE_WEB_SERVER_FOR_IMAGES: "true"
|
||||
IRONIC_FAST_TRACK: "true"
|
||||
IRONIC_USE_MARIADB: "true"
|
||||
LISTEN_ALL_INTERFACES: "true"
|
||||
{{- if .Values.global.ironicIP }}
|
||||
IRONIC_IP: {{ .Values.global.ironicIP }}
|
||||
{{- end }}
|
||||
{{- if ( .Values.global.enable_tls ) }}
|
||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "true"
|
||||
IRONIC_KERNEL_PARAMS: {{ .Values.global.ironicKernelParams }} tls.enabled=true
|
||||
IPA_INSECURE: "0"
|
||||
IRONIC_REVERSE_PROXY_SETUP: "true"
|
||||
INSPECTOR_REVERSE_PROXY_SETUP: "true"
|
||||
{{- if ( .Values.global.enable_vmedia_tls ) }}
|
||||
VMEDIA_TLS_PORT: "{{ .Values.global.vmediaTLSPort }}"
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "false"
|
||||
IRONIC_KERNEL_PARAMS: {{ .Values.global.ironicKernelParams }}
|
||||
IPA_INSECURE: "1"
|
||||
IRONIC_REVERSE_PROXY_SETUP: "false"
|
||||
{{- end }}
|
||||
{{- if ( .Values.global.enable_basicAuth ) }}
|
||||
AUTH_STRATEGY: "http_basic"
|
||||
INSPECTOR_AUTH_STRATEGY: "http_basic"
|
||||
{{- end }}
|
||||
MARIADB_HOST: {{ .Values.global.databaseServiceName }}.{{ .Release.Namespace }}.svc.cluster.local
|
367
metal3-chart/charts/ironic/templates/deployment.yaml
Normal file
367
metal3-chart/charts/ironic/templates/deployment.yaml
Normal file
@@ -0,0 +1,367 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "ironic.fullname" . }}
|
||||
labels:
|
||||
{{- include "ironic.labels" . | nindent 4 }}
|
||||
spec:
|
||||
minReadySeconds: 10
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "ironic.selectorLabels" . | nindent 6 }}
|
||||
strategy:
|
||||
type: Recreate
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ironic.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- if .Values.podSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.baremetaloperator.ironichostNetwork }}
|
||||
hostNetwork: {{ .Values.baremetaloperator.ironichostNetwork }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: ironic-httpd
|
||||
image: {{ .Values.images.ironic.repository }}:{{ .Values.images.ironic.tag }}
|
||||
imagePullPolicy: {{ .Values.images.ironic.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
command:
|
||||
- /bin/runhttpd
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: ironic-bmo
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- curl {{ if and .Values.global.enable_tls .Values.global.enable_vmedia_tls }}-sSfk https://127.0.0.1:{{ .Values.global.vmediaTLSPort }}/boot.ipxe {{ else }}-sSf http://127.0.0.1:6180/boot.ipxe{{ end }}
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
ports:
|
||||
{{- if and .Values.global.enable_tls .Values.global.enable_vmedia_tls }}
|
||||
- containerPort: {{ .Values.global.vmediaTLSPort }}
|
||||
name: httpd-tls
|
||||
protocol: TCP
|
||||
{{- else }}
|
||||
- containerPort: 6180
|
||||
name: httpd
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- curl {{ if and .Values.global.enable_tls .Values.global.enable_vmedia_tls }}-sSfk https://127.0.0.1:{{ .Values.global.vmediaTLSPort }}/boot.ipxe {{ else }}-sSf http://127.0.0.1:6180/boot.ipxe{{ end }}
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
volumeMounts:
|
||||
{{- include "ironic.sharedVolumeMount" . | nindent 10 }}
|
||||
{{- if .Values.global.enable_tls }}
|
||||
{{- include "ironic.CAVolumeMounts" . | nindent 10 }}
|
||||
- name: cert-ironic
|
||||
mountPath: "/certs/ironic"
|
||||
readOnly: true
|
||||
- name: cert-ironic-inspector
|
||||
mountPath: "/certs/ironic-inspector"
|
||||
readOnly: true
|
||||
{{- if .Values.global.enable_vmedia_tls }}
|
||||
- name: cert-ironic-vmedia
|
||||
mountPath: "/certs/vmedia"
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
- mountPath: /shared/html/tstcerts
|
||||
name: cert-ironic-ca
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
- name: ironic-inspector
|
||||
image: {{ .Values.images.ironic.repository }}:{{ .Values.images.ironic.tag }}
|
||||
imagePullPolicy: {{ .Values.images.ironic.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
command:
|
||||
- /bin/runironic-inspector
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: ironic-bmo
|
||||
env:
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- name: INSPECTOR_HTPASSWD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: ironic-inspector-basic-auth
|
||||
key: htpasswd
|
||||
{{- end }}
|
||||
- name: MARIADB_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
key: password
|
||||
name: ironic-mariadb
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- curl -sSf http://127.0.0.1:{{ if .Values.global.enable_tls }}5049{{ else }}5050{{ end }}
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
ports:
|
||||
- containerPort: 5050
|
||||
name: inspector
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- curl -sSf http://127.0.0.1:{{ if .Values.global.enable_tls }}5049{{ else }}5050{{ end }}
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
volumeMounts:
|
||||
{{- include "ironic.sharedVolumeMount" . | nindent 10 }}
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- mountPath: "/auth/ironic/auth-config"
|
||||
name: ironic-basic-auth
|
||||
subPath: auth-config
|
||||
readOnly: true
|
||||
- mountPath: "/auth/ironic-inspector/auth-config"
|
||||
name: ironic-inspector-basic-auth
|
||||
subPath: auth-config
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.global.enable_tls }}
|
||||
{{- include "ironic.CAVolumeMounts" . | nindent 10 }}
|
||||
- name: cert-ironic-inspector
|
||||
mountPath: "/certs/ironic-inspector"
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
- name: ironic-log-watch
|
||||
image: {{ .Values.images.ironic.repository }}:{{ .Values.images.ironic.tag }}
|
||||
imagePullPolicy: {{ .Values.images.ironic.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
command:
|
||||
- /bin/runlogwatch.sh
|
||||
volumeMounts:
|
||||
{{- include "ironic.sharedVolumeMount" . | nindent 10 }}
|
||||
- name: ironic
|
||||
image: {{ .Values.images.ironic.repository }}:{{ .Values.images.ironic.tag }}
|
||||
imagePullPolicy: {{ .Values.images.ironic.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
command:
|
||||
- /bin/runironic
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: ironic-bmo
|
||||
env:
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- name: IRONIC_HTPASSWD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: ironic-basic-auth
|
||||
key: htpasswd
|
||||
{{- end }}
|
||||
- name: MARIADB_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
key: password
|
||||
name: ironic-mariadb
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- curl -sSf http://127.0.0.1:{{ if .Values.global.enable_tls }}6388{{ else }}6385{{ end }}
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
ports:
|
||||
- containerPort: 6385
|
||||
name: api
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- curl -sSf http://127.0.0.1:{{ if .Values.global.enable_tls }}6388{{ else }}6385{{ end }}
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
volumeMounts:
|
||||
{{- include "ironic.sharedVolumeMount" . | nindent 10 }}
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- mountPath: "/auth/ironic/auth-config"
|
||||
name: ironic-basic-auth
|
||||
subPath: auth-config
|
||||
readOnly: true
|
||||
- mountPath: "/auth/ironic-inspector/auth-config"
|
||||
name: ironic-inspector-basic-auth
|
||||
subPath: auth-config
|
||||
readOnly: true
|
||||
{{- end }}
|
||||
{{- if .Values.global.enable_tls }}
|
||||
{{- include "ironic.CAVolumeMounts" . | nindent 10 }}
|
||||
- name: cert-ironic
|
||||
mountPath: "/certs/ironic"
|
||||
readOnly: true
|
||||
- mountPath: /etc/pki/trust/anchors
|
||||
name: trusted-certs
|
||||
readOnly: true
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- update-ca-certificates
|
||||
{{- end }}
|
||||
{{- if .Values.global.enable_dnsmasq }}
|
||||
- name: ironic-dnsmasq
|
||||
image: {{ .Values.images.ironic.repository }}:{{ .Values.images.ironic.tag }}
|
||||
imagePullPolicy: {{ .Values.images.ironic.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
securityContext:
|
||||
capabilities:
|
||||
add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
command:
|
||||
- /bin/rundnsmasq
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: ironic-bmo
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- ss -lun | grep :67 && ss -lun | grep :69
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
ports:
|
||||
- containerPort: 67
|
||||
name: dhcp
|
||||
protocol: UDP
|
||||
- containerPort: 69
|
||||
name: tftp
|
||||
protocol: UDP
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- ss -lun | grep :67 && ss -lun | grep :69
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
volumeMounts:
|
||||
{{- include "ironic.sharedVolumeMount" . | nindent 10 }}
|
||||
{{- end }}
|
||||
initContainers:
|
||||
- name: ironic-ipa-downloader
|
||||
image: {{ .Values.images.ironicIPADownloader.repository }}:{{ .Values.images.ironicIPADownloader.tag }}
|
||||
imagePullPolicy: {{ .Values.images.ironicIPADownloader.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 10 }}
|
||||
command:
|
||||
- /usr/local/bin/get-resource.sh
|
||||
envFrom:
|
||||
- configMapRef:
|
||||
name: ironic-ipa-downloader
|
||||
volumeMounts:
|
||||
{{- include "ironic.sharedVolumeMount" . | nindent 10 }}
|
||||
{{- if .Values.global.enable_tls }}
|
||||
- mountPath: /tmp/ironic-certificates
|
||||
name: trusted-certs
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ironic-data-volume
|
||||
persistentVolumeClaim:
|
||||
claimName: ironic-shared-volume
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
- name: ironic-basic-auth
|
||||
secret:
|
||||
secretName: ironic-basic-auth
|
||||
- name: ironic-inspector-basic-auth
|
||||
secret:
|
||||
secretName: ironic-inspector-basic-auth
|
||||
{{- if .Values.global.enable_tls }}
|
||||
- name: trusted-certs
|
||||
projected:
|
||||
sources:
|
||||
- secret:
|
||||
name: ironic-cacert
|
||||
{{- if .Values.global.additionalTrustedCAs }}
|
||||
- secret:
|
||||
name: tls-ca-additional
|
||||
{{- end }}
|
||||
- name: cert-ironic-ca
|
||||
secret:
|
||||
secretName: ironic-cacert
|
||||
- name: cert-ironic
|
||||
secret:
|
||||
secretName: ironic-cert
|
||||
- name: cert-ironic-inspector-ca
|
||||
secret:
|
||||
secretName: ironic-cacert
|
||||
- name: cert-ironic-inspector
|
||||
secret:
|
||||
secretName: ironic-inspector-cert
|
||||
{{- if .Values.global.enable_vmedia_tls }}
|
||||
- name: cert-ironic-vmedia-ca
|
||||
secret:
|
||||
secretName: ironic-cacert
|
||||
- name: cert-ironic-vmedia
|
||||
secret:
|
||||
secretName: ironic-vmedia-cert
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.global.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.global.dnsPolicy }}
|
||||
dnsPolicy:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
16
metal3-chart/charts/ironic/templates/issuers.yaml
Normal file
16
metal3-chart/charts/ironic/templates/issuers.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
{{- if .Values.global.enable_tls -}}
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: selfsigned-issuer
|
||||
spec:
|
||||
selfSigned: {}
|
||||
---
|
||||
apiVersion: cert-manager.io/v1
|
||||
kind: Issuer
|
||||
metadata:
|
||||
name: ca-issuer
|
||||
spec:
|
||||
ca:
|
||||
secretName: ironic-cacert
|
||||
{{- end }}
|
24
metal3-chart/charts/ironic/templates/pvc.yaml
Normal file
24
metal3-chart/charts/ironic/templates/pvc.yaml
Normal file
@@ -0,0 +1,24 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: ironic-shared-volume
|
||||
{{- if .Values.persistence.ironic.keep }}
|
||||
annotations:
|
||||
"helm.sh/resource-policy": keep
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{- if .Values.persistence.ironic.accessMode }}
|
||||
- {{ .Values.persistence.ironic.accessMode }}
|
||||
{{- else if eq (int .Values.replicaCount) 1 }}
|
||||
- ReadWriteOnce
|
||||
{{- else }}
|
||||
- ReadWriteMany
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.ironic.size }}
|
||||
{{- if .Values.persistence.ironic.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.ironic.storageClass }}
|
||||
{{- end }}
|
||||
volumeMode: Filesystem
|
16
metal3-chart/charts/ironic/templates/secret-tls.yaml
Normal file
16
metal3-chart/charts/ironic/templates/secret-tls.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
{{- if and (.Values.global.enable_tls)
|
||||
(ne .Values.tlscerts.crt "")
|
||||
(ne .Values.tlscerts.key "")
|
||||
(ne .Values.tlscerts.cacert "") -}}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: ironic-cacert
|
||||
labels:
|
||||
{{- include "ironic.labels" . | nindent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
tls.crt: {{ .Values.tlscerts.crt | toString | b64enc }}
|
||||
tls.key: {{ .Values.tlscerts.key | toString | b64enc }}
|
||||
ca.crt: {{ .Values.tlscerts.cacert | toString | b64enc }}
|
||||
{{- end }}
|
62
metal3-chart/charts/ironic/templates/secrets-basic-auth.yaml
Normal file
62
metal3-chart/charts/ironic/templates/secrets-basic-auth.yaml
Normal file
@@ -0,0 +1,62 @@
|
||||
{{- if .Values.global.enable_basicAuth }}
|
||||
|
||||
{{- $ironicUsername := "" -}}
|
||||
{{- $ironicPassword := "" -}}
|
||||
{{- $ironicSecretName := "ironic-basic-auth" -}}
|
||||
|
||||
# Check if the secret is deployed and has a password
|
||||
{{- $oldIronicSecret := lookup "v1" "Secret" .Release.Namespace $ironicSecretName }}
|
||||
{{- if and $oldIronicSecret (index $oldIronicSecret.data "username") (index $oldIronicSecret.data "password") }}
|
||||
{{- $ironicUsername = b64dec (index $oldIronicSecret.data "username" | toString) -}}
|
||||
{{- $ironicPassword = b64dec (index $oldIronicSecret.data "password" | toString) -}}
|
||||
# If not, check if a username and password are provided in values.yaml
|
||||
{{- else if and (.Values.global.auth.ironicUsername) (.Values.global.auth.ironicPassword) }}
|
||||
{{- $ironicUsername = .Values.global.auth.ironicUsername -}}
|
||||
{{- $ironicPassword = .Values.global.auth.ironicPassword -}}
|
||||
{{- else }}
|
||||
# If no username and password are provided in values.yaml, generate new ones
|
||||
{{- $ironicUsername = "ironic" -}}
|
||||
{{- $ironicPassword = (randAlphaNum 20) -}}
|
||||
{{- end }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ $ironicSecretName }}
|
||||
type: Opaque
|
||||
data:
|
||||
username: {{ $ironicUsername | b64enc }}
|
||||
password: {{ $ironicPassword | b64enc }}
|
||||
htpasswd: {{ b64enc (htpasswd $ironicUsername $ironicPassword) }}
|
||||
auth-config: |
|
||||
{{- printf "[ironic]\nauth_type=http_basic\nusername: %s\npassword: %s" $ironicUsername $ironicPassword | b64enc | nindent 4 }}
|
||||
---
|
||||
{{- $ironicInspectorUsername := "" -}}
|
||||
{{- $ironicInspectorPassword := "" -}}
|
||||
{{- $inspectorSecretName := "ironic-inspector-basic-auth" -}}
|
||||
|
||||
# Check if the secret is deployed and has a password
|
||||
{{- $oldInspectorSecret := lookup "v1" "Secret" .Release.Namespace $inspectorSecretName }}
|
||||
{{- if and $oldInspectorSecret (index $oldInspectorSecret.data "username") (index $oldInspectorSecret.data "password") }}
|
||||
{{- $ironicInspectorUsername = b64dec (index $oldInspectorSecret.data "username" | toString) -}}
|
||||
{{- $ironicInspectorPassword = b64dec (index $oldInspectorSecret.data "password" | toString) -}}
|
||||
# If not, check if a username and password are provided in values.yaml
|
||||
{{- else if and (.Values.global.auth.ironicInspectorUsername) (.Values.global.auth.ironicInspectorPassword) }}
|
||||
{{- $ironicInspectorUsername = .Values.global.auth.ironicInspectorUsername -}}
|
||||
{{- $ironicInspectorPassword = .Values.global.auth.ironicInspectorPassword -}}
|
||||
{{- else }}
|
||||
# If no username and password are provided in values.yaml, generate new ones
|
||||
{{- $ironicInspectorUsername = "ironic" -}}
|
||||
{{- $ironicInspectorPassword = (randAlphaNum 20) -}}
|
||||
{{- end }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ $inspectorSecretName }}
|
||||
type: Opaque
|
||||
data:
|
||||
username: {{ $ironicInspectorUsername | b64enc }}
|
||||
password: {{ $ironicInspectorPassword | b64enc }}
|
||||
htpasswd: {{ b64enc (htpasswd $ironicInspectorUsername $ironicInspectorPassword) }}
|
||||
auth-config: |
|
||||
{{- printf "[inspector]\nauth_type=http_basic\nusername: %s\npassword: %s" $ironicInspectorUsername $ironicInspectorPassword | b64enc | nindent 4 }}
|
||||
{{- end }}
|
39
metal3-chart/charts/ironic/templates/service.yaml
Normal file
39
metal3-chart/charts/ironic/templates/service.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ironic.fullname" . }}
|
||||
labels:
|
||||
{{- include "ironic.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
{{- $enableTLS := .Values.global.enable_tls }}
|
||||
{{- $enableVMediaTLS := .Values.global.enable_vmedia_tls }}
|
||||
{{- range .Values.service.ports }}
|
||||
{{- if and (eq .name "httpd") (or (not $enableTLS) (not $enableVMediaTLS)) }}
|
||||
- name: {{ .name }}
|
||||
port: {{ .port }}
|
||||
protocol: {{ .protocol }}
|
||||
targetPort: {{ .targetPort }}
|
||||
{{- else if and (eq .name "httpd-tls") ($enableTLS) ($enableVMediaTLS) }}
|
||||
- name: {{ .name }}
|
||||
port: {{ .port }}
|
||||
protocol: {{ .protocol }}
|
||||
targetPort: {{ .targetPort }}
|
||||
{{- else if and (ne .name "httpd") (ne .name "httpd-tls") }}
|
||||
- name: {{ .name }}
|
||||
port: {{ .port }}
|
||||
protocol: {{ .protocol }}
|
||||
targetPort: {{ .targetPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "ironic.selectorLabels" . | nindent 4 }}
|
||||
{{- if or (eq .Values.service.type "LoadBalancer") (eq .Values.service.type "NodePort") }}
|
||||
externalIPs:
|
||||
{{- toYaml .Values.service.externalIPs | nindent 4 }}
|
||||
{{- end }}
|
12
metal3-chart/charts/ironic/templates/serviceaccount.yaml
Normal file
12
metal3-chart/charts/ironic/templates/serviceaccount.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "ironic.serviceAccountName" . }}
|
||||
labels:
|
||||
{{- include "ironic.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
153
metal3-chart/charts/ironic/values.yaml
Normal file
153
metal3-chart/charts/ironic/values.yaml
Normal file
@@ -0,0 +1,153 @@
|
||||
# Default values for ironic.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
global:
|
||||
# whether to enable dnsmasq on the provisioning network (for PXE boot)
|
||||
enable_dnsmasq: false
|
||||
|
||||
# whether to enable PXE boot capability
|
||||
# NOTE: enable_dnsmasq must set to 'true' in order for this option to be effective.
|
||||
enable_pxe_boot: false
|
||||
|
||||
# DNS Policy of the Ironic pod
|
||||
dnsPolicy: "ClusterFirstWithHostNet"
|
||||
|
||||
# IP address of the router associated with the specified DHCP
|
||||
# address range
|
||||
dnsmasqDefaultRouter: ""
|
||||
|
||||
# IP address of the dns server to be provided with DHCP
|
||||
# response
|
||||
dnsmasqDNSServer: ""
|
||||
|
||||
# specify comma-delimited xrange of IP addresses the DHCP server will manage.
|
||||
# e.g 192.168.20.20,192.168.20.80
|
||||
dhcpRange: ""
|
||||
|
||||
# Network interface on which provisioning network can be accessed
|
||||
# Note this must be a dedicated NIC separate from the controlplane network
|
||||
provisioningInterface: ""
|
||||
|
||||
# IP Address assigned to network interface on provisioning network
|
||||
provisioningIP: ""
|
||||
|
||||
# Whether the NIC names should be predictable or not
|
||||
predictableNicNames: "true"
|
||||
|
||||
# The kernel params for Ironic
|
||||
ironicKernelParams: "console=ttyS0"
|
||||
|
||||
databaseServiceName: "metal3-mariadb"
|
||||
|
||||
# In a multi-node kubernetes cluster, we need to "pin" the
|
||||
# ironic containers to the given host where the
|
||||
# provisioningIP exists. Uncomment the nodeSelector
|
||||
# here and update the hostname accordingly.
|
||||
#nodeSelector:
|
||||
#kubernetes.io/hostname: "csrancher-n1"
|
||||
|
||||
# Comment this out when pinning the pdns containers to a specfic host.
|
||||
nodeSelector: {}
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
images:
|
||||
ironic:
|
||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
|
||||
pullPolicy: IfNotPresent
|
||||
tag: 24.1.2.0
|
||||
ironicIPADownloader:
|
||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic-ipa-downloader
|
||||
pullPolicy: IfNotPresent
|
||||
tag: 2.0.0
|
||||
|
||||
nameOverride: ""
|
||||
fullnameOverride: ""
|
||||
|
||||
serviceAccount:
|
||||
# Specifies whether a service account should be created
|
||||
create: true
|
||||
# Annotations to add to the service account
|
||||
annotations: {}
|
||||
# The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
podAnnotations: {}
|
||||
|
||||
podSecurityContext:
|
||||
runAsUser: 10475
|
||||
fsGroup: 10475
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
runAsNonRoot: true
|
||||
|
||||
service:
|
||||
type: LoadBalancer
|
||||
annotations: {}
|
||||
externalIPs: []
|
||||
ports:
|
||||
- name: httpd
|
||||
port: 6180
|
||||
protocol: TCP
|
||||
targetPort: 6180
|
||||
- name: httpd-tls
|
||||
port: 6185
|
||||
protocol: TCP
|
||||
targetPort: 6185
|
||||
- name: inspector
|
||||
port: 5050
|
||||
protocol: TCP
|
||||
targetPort: 5050
|
||||
- name: api
|
||||
port: 6385
|
||||
protocol: TCP
|
||||
targetPort: 6385
|
||||
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
tolerations: []
|
||||
|
||||
affinity: {}
|
||||
|
||||
baremetaloperator:
|
||||
cloudflareApiToken: "foo"
|
||||
ironichostNetwork: true
|
||||
|
||||
debug:
|
||||
ironicRamdiskSshKey: ""
|
||||
|
||||
tlscerts:
|
||||
cacert: ""
|
||||
key: ""
|
||||
crt: ""
|
||||
|
||||
persistence:
|
||||
ironic:
|
||||
# storageClass for the ironic shared volume
|
||||
# Ensure the storageClass is defined
|
||||
storageClass: ""
|
||||
# size of the ironic shared volume
|
||||
size: "1Gi"
|
||||
# accessMode of the ironic shared volume PVC
|
||||
# If empty defaults to ReadWriteOnce when replicaCount=1 otherwise ReadWriteMany
|
||||
accessMode: ""
|
||||
# flag to indicate to keep pvc upon helm uninstall
|
||||
keep: false
|
24
metal3-chart/charts/mariadb/.helmignore
Normal file
24
metal3-chart/charts/mariadb/.helmignore
Normal file
@@ -0,0 +1,24 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
||||
|
6
metal3-chart/charts/mariadb/Chart.yaml
Normal file
6
metal3-chart/charts/mariadb/Chart.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
appVersion: 10.6.7
|
||||
description: A Helm chart for MariaDB, used by Metal3
|
||||
name: mariadb
|
||||
type: application
|
||||
version: 0.5.4
|
64
metal3-chart/charts/mariadb/templates/_helpers.tpl
Normal file
64
metal3-chart/charts/mariadb/templates/_helpers.tpl
Normal file
@@ -0,0 +1,64 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "mariadb.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "mariadb.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "mariadb.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "mariadb.labels" -}}
|
||||
helm.sh/chart: {{ include "mariadb.chart" . }}
|
||||
{{ include "mariadb.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "mariadb.selectorLabels" -}}
|
||||
app.kubernetes.io/component: mariadb
|
||||
app.kubernetes.io/name: {{ include "mariadb.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "mariadb.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "mariadb.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
8
metal3-chart/charts/mariadb/templates/configmap.yaml
Normal file
8
metal3-chart/charts/mariadb/templates/configmap.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: mariadb-cm
|
||||
labels:
|
||||
{{- include "mariadb.labels" . | nindent 4 }}
|
||||
data:
|
||||
RESTART_CONTAINER_CERTIFICATE_UPDATED: "false"
|
85
metal3-chart/charts/mariadb/templates/deployment.yaml
Normal file
85
metal3-chart/charts/mariadb/templates/deployment.yaml
Normal file
@@ -0,0 +1,85 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "mariadb.fullname" . }}
|
||||
labels:
|
||||
{{- include "mariadb.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: {{.Values.replicaCount}}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "mariadb.selectorLabels" . | nindent 6 }}
|
||||
strategy:
|
||||
type: Recreate
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "mariadb.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- $volmounts := toYaml .Values.volumeMounts | trim | nindent 12 }}
|
||||
{{- $volumes := toYaml .Values.volumes | trim | nindent 8 }}
|
||||
serviceAccountName: {{ include "mariadb.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
containers:
|
||||
- name: mariadb
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
env:
|
||||
- name: MARIADB_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
key: password
|
||||
name: ironic-mariadb
|
||||
- name: RESTART_CONTAINER_CERTIFICATE_UPDATED
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: mariadb-cm
|
||||
key: RESTART_CONTAINER_CERTIFICATE_UPDATED
|
||||
lifecycle:
|
||||
preStop:
|
||||
exec:
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- mysqladmin shutdown -uironic -p$(printenv MARIADB_PASSWORD)
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
ports:
|
||||
- containerPort: 3306
|
||||
name: mariadb
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- mysqladmin status -uironic -p$(printenv MARIADB_PASSWORD)
|
||||
failureThreshold: 10
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 30
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 10
|
||||
volumeMounts:
|
||||
{{- $volmounts }}
|
||||
{{- with .Values.global.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
{{- $volumes }}
|
24
metal3-chart/charts/mariadb/templates/pvc.yaml
Normal file
24
metal3-chart/charts/mariadb/templates/pvc.yaml
Normal file
@@ -0,0 +1,24 @@
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: mariadb-volume-claim
|
||||
{{- if .Values.persistence.keep }}
|
||||
annotations:
|
||||
"helm.sh/resource-policy": keep
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{- if .Values.persistence.accessMode }}
|
||||
- {{ .Values.persistence.accessMode }}
|
||||
{{- else if eq (int .Values.replicaCount) 1 }}
|
||||
- ReadWriteOnce
|
||||
{{- else }}
|
||||
- ReadWriteMany
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.size }}
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.storageClass }}
|
||||
{{- end }}
|
||||
volumeMode: Filesystem
|
21
metal3-chart/charts/mariadb/templates/secret.yaml
Normal file
21
metal3-chart/charts/mariadb/templates/secret.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
{{- $secret_name := "ironic-mariadb" -}}
|
||||
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ $secret_name }}
|
||||
labels:
|
||||
{{- include "mariadb.labels" . | nindent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
# Check if the secret is deployed and has a password
|
||||
{{- $old_sec := lookup "v1" "Secret" .Release.Namespace $secret_name }}
|
||||
{{- if and $old_sec (index $old_sec.data "password") }}
|
||||
password: {{ index $old_sec.data "password" }}
|
||||
{{- else if .Values.password }}
|
||||
# If not, check if a password is provided in values.yaml
|
||||
password: {{ .Values.password | toString | b64enc }}
|
||||
{{- else }}
|
||||
# If no secret and no password in values.yaml, generate a new password
|
||||
password: {{ randAlphaNum 20 | b64enc }}
|
||||
{{- end }}
|
13
metal3-chart/charts/mariadb/templates/service-account.yaml
Normal file
13
metal3-chart/charts/mariadb/templates/service-account.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "mariadb.serviceAccountName" . }}
|
||||
labels:
|
||||
{{- include "mariadb.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
14
metal3-chart/charts/mariadb/templates/service.yaml
Normal file
14
metal3-chart/charts/mariadb/templates/service.yaml
Normal file
@@ -0,0 +1,14 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Values.global.databaseServiceName }}
|
||||
labels:
|
||||
{{- include "mariadb.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
selector:
|
||||
{{- include "mariadb.selectorLabels" . | nindent 4 }}
|
||||
ports:
|
||||
{{- with .Values.service.ports }}
|
||||
{{- toYaml . | nindent 2 }}
|
||||
{{- end }}
|
67
metal3-chart/charts/mariadb/values.yaml
Normal file
67
metal3-chart/charts/mariadb/values.yaml
Normal file
@@ -0,0 +1,67 @@
|
||||
global:
|
||||
databaseServiceName: "metal3-mariadb"
|
||||
nodeSelector: {}
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 3306
|
||||
targetPort: 3306
|
||||
|
||||
image:
|
||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/suse/mariadb
|
||||
pullPolicy: IfNotPresent
|
||||
tag: 10.6.15.1
|
||||
|
||||
nameOverride: ""
|
||||
fullnameOverride: ""
|
||||
|
||||
serviceAccount:
|
||||
# Specifies whether a service account should be created
|
||||
create: true
|
||||
# Annotations to add to the service account
|
||||
annotations: {}
|
||||
# The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
podAnnotations: {}
|
||||
|
||||
podSecurityContext:
|
||||
runAsUser: 10060
|
||||
fsGroup: 10060
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
runAsNonRoot: true
|
||||
|
||||
# Password for the mariadb ironic user
|
||||
password: ""
|
||||
|
||||
persistence:
|
||||
# storageClass for the mariadb data volume
|
||||
storageClass: ""
|
||||
# size of the mariadb data volume
|
||||
size: "1Gi"
|
||||
# accessMode of the mariadb data volume PVC
|
||||
# If empty defaults to ReadWriteOnce when replicaCount=1 otherwise ReadWriteMany
|
||||
accessMode: ""
|
||||
# flag to indicate to keep pvc upon helm uninstall
|
||||
keep: false
|
||||
|
||||
volumeMounts:
|
||||
- name: mariadb-data-volume
|
||||
mountPath: /var/lib/mysql
|
||||
|
||||
volumes:
|
||||
- name: mariadb-data-volume
|
||||
persistentVolumeClaim:
|
||||
claimName: mariadb-volume-claim
|
23
metal3-chart/charts/media/.helmignore
Normal file
23
metal3-chart/charts/media/.helmignore
Normal file
@@ -0,0 +1,23 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
6
metal3-chart/charts/media/Chart.yaml
Normal file
6
metal3-chart/charts/media/Chart.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
appVersion: 1.16.0
|
||||
description: A Helm chart for Media, used by Metal3
|
||||
name: media
|
||||
type: application
|
||||
version: 0.5.0
|
22
metal3-chart/charts/media/templates/NOTES.txt
Normal file
22
metal3-chart/charts/media/templates/NOTES.txt
Normal file
@@ -0,0 +1,22 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{- range .paths }}
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "media.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "media.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "media.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "media.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||
{{- end }}
|
63
metal3-chart/charts/media/templates/_helpers.tpl
Normal file
63
metal3-chart/charts/media/templates/_helpers.tpl
Normal file
@@ -0,0 +1,63 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "media.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "media.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "media.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "media.labels" -}}
|
||||
helm.sh/chart: {{ include "media.chart" . }}
|
||||
{{ include "media.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "media.selectorLabels" -}}
|
||||
app.kubernetes.io/component: media
|
||||
app.kubernetes.io/name: {{ include "media.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "media.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "media.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
66
metal3-chart/charts/media/templates/deployment.yaml
Normal file
66
metal3-chart/charts/media/templates/deployment.yaml
Normal file
@@ -0,0 +1,66 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "media.fullname" . }}
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
spec:
|
||||
{{- if not .Values.autoscaling.enabled }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "media.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
rollme: {{ randAlphaNum 5 | quote }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "media.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "media.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- with .Values.volumes }}
|
||||
volumes:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
command:
|
||||
- /usr/sbin/httpd
|
||||
args:
|
||||
- -DFOREGROUND
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 80
|
||||
protocol: TCP
|
||||
{{- with .Values.volumeMounts }}
|
||||
volumeMounts:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
{{- with .Values.global.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
28
metal3-chart/charts/media/templates/hpa.yaml
Normal file
28
metal3-chart/charts/media/templates/hpa.yaml
Normal file
@@ -0,0 +1,28 @@
|
||||
{{- if .Values.autoscaling.enabled }}
|
||||
apiVersion: autoscaling/v2beta1
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "media.fullname" . }}
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "media.fullname" . }}
|
||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
61
metal3-chart/charts/media/templates/ingress.yaml
Normal file
61
metal3-chart/charts/media/templates/ingress.yaml
Normal file
@@ -0,0 +1,61 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "media.fullname" . -}}
|
||||
{{- $svcPort := .Values.service.port -}}
|
||||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else -}}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{- end }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
{{- with $_ := merge .Values.ingress.annotations $.Values.global.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||
ingressClassName: {{ .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ tpl .host $ }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||
pathType: {{ .pathType }}
|
||||
{{- end }}
|
||||
backend:
|
||||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
number: {{ $svcPort }}
|
||||
{{- else }}
|
||||
serviceName: {{ $fullName }}
|
||||
servicePort: {{ $svcPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
18
metal3-chart/charts/media/templates/persistentvolume.yaml
Normal file
18
metal3-chart/charts/media/templates/persistentvolume.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
{{- if eq .Values.mediaVolume.storageClassName "local" }}
|
||||
---
|
||||
kind: PersistentVolume
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: media
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
spec:
|
||||
storageClassName: {{ .Values.mediaVolume.storageClassName }}
|
||||
accessModes:
|
||||
{{ toYaml .Values.mediaVolume.accessModes }}
|
||||
capacity:
|
||||
storage: {{ .Values.mediaVolume.storage }}
|
||||
hostPath:
|
||||
path: {{ .Values.mediaVolume.hostPath }}
|
||||
type: DirectoryOrCreate
|
||||
{{- end }}
|
@@ -0,0 +1,14 @@
|
||||
---
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: media
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
spec:
|
||||
storageClassName: {{ .Values.mediaVolume.storageClassName }}
|
||||
accessModes:
|
||||
{{ toYaml .Values.mediaVolume.accessModes }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.mediaVolume.storage }}
|
15
metal3-chart/charts/media/templates/service.yaml
Normal file
15
metal3-chart/charts/media/templates/service.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "media.fullname" . }}
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "media.selectorLabels" . | nindent 4 }}
|
12
metal3-chart/charts/media/templates/serviceaccount.yaml
Normal file
12
metal3-chart/charts/media/templates/serviceaccount.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "media.serviceAccountName" . }}
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
9
metal3-chart/charts/media/templates/storageclass.yaml
Normal file
9
metal3-chart/charts/media/templates/storageclass.yaml
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
kind: StorageClass
|
||||
apiVersion: storage.k8s.io/v1
|
||||
metadata:
|
||||
name: {{ include "media.fullname" . }}
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
provisioner: kubernetes.io/no-provisioner
|
||||
volumeBindingMode: WaitForFirstConsumer
|
@@ -0,0 +1,15 @@
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "media.fullname" . }}-test-connection"
|
||||
labels:
|
||||
{{- include "media.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "media.fullname" . }}:{{ .Values.service.port }}']
|
||||
restartPolicy: Never
|
117
metal3-chart/charts/media/values.yaml
Normal file
117
metal3-chart/charts/media/values.yaml
Normal file
@@ -0,0 +1,117 @@
|
||||
# Default values for media.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
global:
|
||||
# Global ingress annotations that is shared by all the ingress services.
|
||||
# For example, use it to override extern-dns records.
|
||||
ingress:
|
||||
annotations: {}
|
||||
# The IP to register with external-dns for this service
|
||||
#external-dns.alpha.kubernetes.io/target: 192.168.20.5
|
||||
|
||||
# If running in a multi-node kubernetes cluster, "pin" the media container
|
||||
# to the given host where the /opt/media volume exists. Uncomment the
|
||||
# nodeSelector and update the hostname accordingly.
|
||||
#nodeSelector:
|
||||
#kubernetes.io/hostname: "my-hostname"
|
||||
|
||||
# Comment this out when pinning the media container to a specfic host.
|
||||
nodeSelector: {}
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
image:
|
||||
repository: registry.opensuse.org/isv/suse/edge/metal3/containers/images/ironic
|
||||
pullPolicy: IfNotPresent
|
||||
tag: 24.1.2.0
|
||||
|
||||
imagePullSecrets: []
|
||||
nameOverride: ""
|
||||
fullnameOverride: ""
|
||||
|
||||
serviceAccount:
|
||||
# Specifies whether a service account should be created
|
||||
create: true
|
||||
# Annotations to add to the service account
|
||||
annotations: {}
|
||||
# The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
podAnnotations: {}
|
||||
|
||||
podSecurityContext:
|
||||
runAsUser: 10475
|
||||
fsGroup: 10475
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
runAsNonRoot: true
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 80
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
className: ""
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# kubernetes.io/tls-acme: "true"
|
||||
hosts:
|
||||
- host: media.suse.baremetal
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
tls: []
|
||||
# - secretName: chart-example-tls
|
||||
# hosts:
|
||||
# - chart-example.local
|
||||
|
||||
resources: {}
|
||||
# We usually recommend not to specify default resources and to leave this as a conscious
|
||||
# choice for the user. This also increases chances charts run on environments with little
|
||||
# resources, such as Minikube. If you do want to specify resources, uncomment the following
|
||||
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
|
||||
# limits:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
# requests:
|
||||
# cpu: 100m
|
||||
# memory: 128Mi
|
||||
|
||||
autoscaling:
|
||||
enabled: false
|
||||
minReplicas: 1
|
||||
maxReplicas: 100
|
||||
targetCPUUtilizationPercentage: 80
|
||||
# targetMemoryUtilizationPercentage: 80
|
||||
|
||||
tolerations: []
|
||||
|
||||
affinity: {}
|
||||
|
||||
# volumes
|
||||
volumes:
|
||||
- name: assets
|
||||
persistentVolumeClaim:
|
||||
claimName: media
|
||||
|
||||
# volume mounts
|
||||
volumeMounts:
|
||||
- mountPath: /srv/www/htdocs
|
||||
name: assets
|
||||
|
||||
# media volume settings
|
||||
mediaVolume:
|
||||
storageClassName: local
|
||||
accessModes:
|
||||
- ReadOnlyMany
|
||||
hostPath: /opt/media
|
||||
storage: 5Gi
|
Reference in New Issue
Block a user