Add configurable support of armada-operator for armada-api
Signed-off-by: Ruslan Aliev <raliev@mirantis.com> Change-Id: I76fb41062d152bf360a85d781c19ab5b204769b8
This commit is contained in:
parent
5df69442b0
commit
29aeca99d7
@ -94,6 +94,12 @@ path to the private key that includes the name of the key itself.""")),
|
|||||||
"""Time in seconds of how much time needs to pass since
|
"""Time in seconds of how much time needs to pass since
|
||||||
the last update of an existing lock before armada forcibly removes it
|
the last update of an existing lock before armada forcibly removes it
|
||||||
and tries to acquire its own lock""")),
|
and tries to acquire its own lock""")),
|
||||||
|
cfg.BoolOpt(
|
||||||
|
'enable_operator',
|
||||||
|
default=False,
|
||||||
|
help=utils.fmt(
|
||||||
|
"""Determines whether the operator has to be enabled
|
||||||
|
to apply charts instead of armada-api itself""")),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -12,10 +12,13 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import tempfile
|
||||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
import yaml
|
||||||
|
|
||||||
from armada import const
|
from armada import const
|
||||||
from armada.conf import set_current_chart
|
from armada.conf import set_current_chart
|
||||||
@ -74,6 +77,7 @@ class Armada(object):
|
|||||||
'''
|
'''
|
||||||
|
|
||||||
self.enable_chart_cleanup = enable_chart_cleanup
|
self.enable_chart_cleanup = enable_chart_cleanup
|
||||||
|
self.enable_operator = CONF.enable_operator
|
||||||
self.force_wait = force_wait
|
self.force_wait = force_wait
|
||||||
self.helm = helm
|
self.helm = helm
|
||||||
try:
|
try:
|
||||||
@ -83,6 +87,7 @@ class Armada(object):
|
|||||||
except (validate_exceptions.InvalidManifestException,
|
except (validate_exceptions.InvalidManifestException,
|
||||||
override_exceptions.InvalidOverrideValueException):
|
override_exceptions.InvalidOverrideValueException):
|
||||||
raise
|
raise
|
||||||
|
self.target_manifest = target_manifest
|
||||||
self.manifest = Manifest(
|
self.manifest = Manifest(
|
||||||
self.documents, target_manifest=target_manifest).get_manifest()
|
self.documents, target_manifest=target_manifest).get_manifest()
|
||||||
self.chart_download = ChartDownload()
|
self.chart_download = ChartDownload()
|
||||||
@ -96,7 +101,6 @@ class Armada(object):
|
|||||||
"""
|
"""
|
||||||
LOG.info("Performing pre-flight operations.")
|
LOG.info("Performing pre-flight operations.")
|
||||||
|
|
||||||
# Clone the chart sources
|
|
||||||
manifest_data = self.manifest.get(const.KEYWORD_DATA, {})
|
manifest_data = self.manifest.get(const.KEYWORD_DATA, {})
|
||||||
for group in manifest_data.get(const.KEYWORD_GROUPS, []):
|
for group in manifest_data.get(const.KEYWORD_GROUPS, []):
|
||||||
for ch in group.get(const.KEYWORD_DATA).get(const.KEYWORD_CHARTS,
|
for ch in group.get(const.KEYWORD_DATA).get(const.KEYWORD_CHARTS,
|
||||||
@ -109,7 +113,35 @@ class Armada(object):
|
|||||||
'''
|
'''
|
||||||
manifest_name = self.manifest['metadata']['name']
|
manifest_name = self.manifest['metadata']['name']
|
||||||
with metrics.APPLY.get_context(manifest_name):
|
with metrics.APPLY.get_context(manifest_name):
|
||||||
return self._sync()
|
if self.enable_operator:
|
||||||
|
return self._sync_with_operator()
|
||||||
|
else:
|
||||||
|
return self._sync()
|
||||||
|
|
||||||
|
def _sync_with_operator(self):
|
||||||
|
with tempfile.NamedTemporaryFile() as tmp:
|
||||||
|
yaml.safe_dump_all(self.documents, tmp)
|
||||||
|
command = ['armada-go', 'apply']
|
||||||
|
if self.target_manifest != "":
|
||||||
|
command.extend(['--target-manifest',
|
||||||
|
"{}".format(self.target_manifest)])
|
||||||
|
command.append("{}".format(tmp))
|
||||||
|
LOG.info('Running command=%s', command)
|
||||||
|
try:
|
||||||
|
with subprocess.Popen(command, stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.STDOUT, bufsize=1,
|
||||||
|
universal_newlines=True) as sp:
|
||||||
|
for line in sp.stdout:
|
||||||
|
LOG.info(line.rstrip())
|
||||||
|
sp.wait()
|
||||||
|
if sp.returncode != 0:
|
||||||
|
raise subprocess.CalledProcessError(
|
||||||
|
sp.returncode, command, output=sp.stdout)
|
||||||
|
return False, [], [], False
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
LOG.info("Exception occurred %s %s %s", e.output, e.stdout,
|
||||||
|
e.stderr)
|
||||||
|
raise armada_exceptions.ArmadaException(e)
|
||||||
|
|
||||||
def _sync(self):
|
def _sync(self):
|
||||||
msg = {
|
msg = {
|
||||||
|
259
armadacharts_crd.yaml
Normal file
259
armadacharts_crd.yaml
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apiextensions.k8s.io/v1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
controller-gen.kubebuilder.io/version: v0.13.0
|
||||||
|
name: armadacharts.armada.airshipit.io
|
||||||
|
spec:
|
||||||
|
group: armada.airshipit.io
|
||||||
|
names:
|
||||||
|
kind: ArmadaChart
|
||||||
|
listKind: ArmadaChartList
|
||||||
|
plural: armadacharts
|
||||||
|
singular: armadachart
|
||||||
|
scope: Namespaced
|
||||||
|
versions:
|
||||||
|
- name: v1
|
||||||
|
schema:
|
||||||
|
openAPIV3Schema:
|
||||||
|
description: ArmadaChart is the Schema for the armadacharts 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
|
||||||
|
data:
|
||||||
|
description: ArmadaChartSpec defines the desired state of ArmadaChart
|
||||||
|
properties:
|
||||||
|
chart_name:
|
||||||
|
description: ChartName is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
type: string
|
||||||
|
delete:
|
||||||
|
description: Delete holds the values for this Helm release.
|
||||||
|
items:
|
||||||
|
description: ArmadaChartDeleteResource defines the wait options
|
||||||
|
of ArmadaChart
|
||||||
|
properties:
|
||||||
|
labels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: Labels is an example field of ArmadaChart. Edit
|
||||||
|
armadachart_types.go to remove/update
|
||||||
|
type: object
|
||||||
|
type:
|
||||||
|
description: Type is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
namespace:
|
||||||
|
description: Namespace is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
type: string
|
||||||
|
release:
|
||||||
|
description: Release is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
type: string
|
||||||
|
source:
|
||||||
|
description: Source is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
properties:
|
||||||
|
location:
|
||||||
|
description: Location is an example field of ArmadaChart. Edit
|
||||||
|
armadachart_types.go to remove/update
|
||||||
|
type: string
|
||||||
|
subpath:
|
||||||
|
description: Subpath is an example field of ArmadaChart. Edit
|
||||||
|
armadachart_types.go to remove/update
|
||||||
|
type: string
|
||||||
|
type:
|
||||||
|
description: Type is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
test:
|
||||||
|
description: Test holds the values for this Helm release.
|
||||||
|
properties:
|
||||||
|
enabled:
|
||||||
|
description: Enabled is an example field of ArmadaChart. Edit
|
||||||
|
armadachart_types.go to remove/update
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
values:
|
||||||
|
description: Values holds the values for this Helm release.
|
||||||
|
x-kubernetes-preserve-unknown-fields: true
|
||||||
|
wait:
|
||||||
|
description: Wait holds the values for this Helm release.
|
||||||
|
properties:
|
||||||
|
labels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: Labels is an example field of ArmadaChart. Edit armadachart_types.go
|
||||||
|
to remove/update
|
||||||
|
type: object
|
||||||
|
native:
|
||||||
|
description: ArmadaChartWaitNative defines the wait options of
|
||||||
|
ArmadaChart
|
||||||
|
properties:
|
||||||
|
enabled:
|
||||||
|
description: Enabled is an example field of ArmadaChart. Edit
|
||||||
|
armadachart_types.go to remove/update
|
||||||
|
type: boolean
|
||||||
|
type: object
|
||||||
|
resources:
|
||||||
|
items:
|
||||||
|
description: ArmadaChartWaitResource defines the wait options
|
||||||
|
of ArmadaChart
|
||||||
|
properties:
|
||||||
|
labels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: Labels is an example field of ArmadaChart.
|
||||||
|
Edit armadachart_types.go to remove/update
|
||||||
|
type: object
|
||||||
|
min_ready:
|
||||||
|
type: string
|
||||||
|
type:
|
||||||
|
description: Type is an example field of ArmadaChart. Edit
|
||||||
|
armadachart_types.go to remove/update
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
timeout:
|
||||||
|
description: Timeout is the time to wait for full reconciliation
|
||||||
|
of Helm release.
|
||||||
|
type: integer
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
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
|
||||||
|
status:
|
||||||
|
description: ArmadaChartStatus defines the observed state of ArmadaChart
|
||||||
|
properties:
|
||||||
|
conditions:
|
||||||
|
description: Conditions holds the conditions for the ArmadaChart.
|
||||||
|
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
|
||||||
|
failures:
|
||||||
|
description: Failures is the reconciliation failure count against
|
||||||
|
the latest desired state. It is reset after a successful reconciliation.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
helmChart:
|
||||||
|
description: HelmChart is the namespaced name of the HelmChart resource
|
||||||
|
created by the controller for the ArmadaChart.
|
||||||
|
type: string
|
||||||
|
installFailures:
|
||||||
|
description: InstallFailures is the install failure count against
|
||||||
|
the latest desired state. It is reset after a successful reconciliation.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
lastAppliedRevision:
|
||||||
|
description: LastAppliedRevision is the revision of the last successfully
|
||||||
|
applied source.
|
||||||
|
type: string
|
||||||
|
lastAttemptedRevision:
|
||||||
|
description: LastAttemptedRevision is the revision of the last reconciliation
|
||||||
|
attempt.
|
||||||
|
type: string
|
||||||
|
lastAttemptedValuesChecksum:
|
||||||
|
description: LastAttemptedValuesChecksum is the SHA1 checksum of the
|
||||||
|
values of the last reconciliation attempt.
|
||||||
|
type: string
|
||||||
|
lastHandledReconcileAt:
|
||||||
|
description: LastHandledReconcileAt holds the value of the most recent
|
||||||
|
reconcile request value, so a change of the annotation value can
|
||||||
|
be detected.
|
||||||
|
type: string
|
||||||
|
lastReleaseRevision:
|
||||||
|
description: LastReleaseRevision is the revision of the last successful
|
||||||
|
Helm release.
|
||||||
|
type: integer
|
||||||
|
observedGeneration:
|
||||||
|
description: ObservedGeneration is the last observed generation.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
upgradeFailures:
|
||||||
|
description: UpgradeFailures is the upgrade failure count against
|
||||||
|
the latest desired state. It is reset after a successful reconciliation.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
subresources:
|
||||||
|
status: {}
|
@ -109,6 +109,45 @@ spec:
|
|||||||
{{ tuple $envAll "api" $mounts_armada_api_init | include "helm-toolkit.snippets.kubernetes_entrypoint_init_container" | indent 8 }}
|
{{ tuple $envAll "api" $mounts_armada_api_init | include "helm-toolkit.snippets.kubernetes_entrypoint_init_container" | indent 8 }}
|
||||||
{{ dict "envAll" $envAll "application" "armada" "container" "armada_api_init" | include "helm-toolkit.snippets.kubernetes_container_security_context" | indent 10 }}
|
{{ dict "envAll" $envAll "application" "armada" "container" "armada_api_init" | include "helm-toolkit.snippets.kubernetes_container_security_context" | indent 10 }}
|
||||||
containers:
|
containers:
|
||||||
|
{{- if .Values.conf.armada.enable_operator }}
|
||||||
|
- name: manager
|
||||||
|
{{ tuple $envAll "operator" | include "helm-toolkit.snippets.image" | indent 10 }}
|
||||||
|
{{ tuple $envAll $envAll.Values.pod.resources.api | include "helm-toolkit.snippets.kubernetes_resources" | indent 10 }}
|
||||||
|
command:
|
||||||
|
- /manager
|
||||||
|
args:
|
||||||
|
- '--health-probe-bind-address=:8081'
|
||||||
|
- '--metrics-bind-address=127.0.0.1:8080'
|
||||||
|
- '--leader-elect'
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 8081
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 15
|
||||||
|
timeoutSeconds: 1
|
||||||
|
periodSeconds: 20
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 3
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /readyz
|
||||||
|
port: 8081
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
timeoutSeconds: 1
|
||||||
|
periodSeconds: 10
|
||||||
|
successThreshold: 1
|
||||||
|
failureThreshold: 3
|
||||||
|
terminationMessagePath: /dev/termination-log
|
||||||
|
terminationMessagePolicy: File
|
||||||
|
imagePullPolicy: IfNotPresent
|
||||||
|
securityContext:
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
{{- end }}
|
||||||
- name: armada-api
|
- name: armada-api
|
||||||
{{ tuple $envAll "api" | include "helm-toolkit.snippets.image" | indent 10 }}
|
{{ tuple $envAll "api" | include "helm-toolkit.snippets.image" | indent 10 }}
|
||||||
{{ tuple $envAll $envAll.Values.pod.resources.api | include "helm-toolkit.snippets.kubernetes_resources" | indent 10 }}
|
{{ tuple $envAll $envAll.Values.pod.resources.api | include "helm-toolkit.snippets.kubernetes_resources" | indent 10 }}
|
||||||
|
@ -29,6 +29,7 @@ labels:
|
|||||||
images:
|
images:
|
||||||
tags:
|
tags:
|
||||||
api: 'quay.io/airshipit/armada:latest'
|
api: 'quay.io/airshipit/armada:latest'
|
||||||
|
operator: 'quay.io/raliev12/armada-controller:latest'
|
||||||
dep_check: 'quay.io/stackanetes/kubernetes-entrypoint:v0.3.1'
|
dep_check: 'quay.io/stackanetes/kubernetes-entrypoint:v0.3.1'
|
||||||
ks_endpoints: 'docker.io/openstackhelm/heat:newton'
|
ks_endpoints: 'docker.io/openstackhelm/heat:newton'
|
||||||
ks_service: 'docker.io/openstackhelm/heat:newton'
|
ks_service: 'docker.io/openstackhelm/heat:newton'
|
||||||
@ -180,6 +181,7 @@ conf:
|
|||||||
delay_auth_decision: true
|
delay_auth_decision: true
|
||||||
oslo_policy:
|
oslo_policy:
|
||||||
policy_file: policy.yaml
|
policy_file: policy.yaml
|
||||||
|
enable_operator: false
|
||||||
paste:
|
paste:
|
||||||
'app:armada-api':
|
'app:armada-api':
|
||||||
paste.app_factory: 'armada.api.server:paste_start_armada'
|
paste.app_factory: 'armada.api.server:paste_start_armada'
|
||||||
|
Loading…
Reference in New Issue
Block a user