From 0ae01b5ffb6171653a4aaae493bd8c45d48308ee Mon Sep 17 00:00:00 2001 From: Edward Hope-Morley Date: Thu, 5 Dec 2024 15:33:15 +0000 Subject: [PATCH] Add COS module --- cos/common | 1 + cos/configure | 25 ++++++++++++++ cos/cos.yaml.template | 23 +++++++++++++ cos/generate-bundle.sh | 1 + cos/module_defaults | 12 +++++++ cos/overlays | 1 + cos/pipeline/00setup | 21 ++++++++++++ cos/pipeline/01import-config-defaults | 2 ++ cos/pipeline/02configure | 49 +++++++++++++++++++++++++++ cos/pipeline/03build | 5 +++ cos/resources/README_resources.md | 5 +++ overlays/cos/charmed-ceph-lxd.yaml | 32 +++++++++++++++++ overlays/cos/charmed-ceph.yaml | 32 +++++++++++++++++ overlays/cos/microceph.yaml | 32 +++++++++++++++++ 14 files changed, 241 insertions(+) create mode 120000 cos/common create mode 100755 cos/configure create mode 100644 cos/cos.yaml.template create mode 120000 cos/generate-bundle.sh create mode 100644 cos/module_defaults create mode 120000 cos/overlays create mode 100644 cos/pipeline/00setup create mode 100644 cos/pipeline/01import-config-defaults create mode 100644 cos/pipeline/02configure create mode 100644 cos/pipeline/03build create mode 100644 cos/resources/README_resources.md create mode 100644 overlays/cos/charmed-ceph-lxd.yaml create mode 100644 overlays/cos/charmed-ceph.yaml create mode 100644 overlays/cos/microceph.yaml diff --git a/cos/common b/cos/common new file mode 120000 index 00000000..60d3b0a6 --- /dev/null +++ b/cos/common @@ -0,0 +1 @@ +../common \ No newline at end of file diff --git a/cos/configure b/cos/configure new file mode 100755 index 00000000..306e6e58 --- /dev/null +++ b/cos/configure @@ -0,0 +1,25 @@ +#!/bin/bash -x +juju_run_cmd="juju run" +if (( $(juju --version | awk -F. {'print $1'}) > 2 )); then + juju_run_cmd="juju exec" +fi + +mk8s_unit=$(juju status| sed -nr 's,(^microk8s/[[:digit:]]+)\*.*,\1,p') +which kubectl || sudo snap install kubectl --classic +mkdir -p ~/.kube + +$juju_run_cmd --unit $mk8s_unit microk8s.config > ~/.kube/config +kubectl get pods -A + +$juju_run_cmd --unit $mk8s_unit -- 'IPADDR=$( ip r get 2.2.2.2| sed -rn "s/.+src ([0-9\.]+) .+/\1/p"); microk8s enable metallb:$IPADDR-$IPADDR' + +KUBECONFIG=~/.kube/config juju add-k8s microk8s-cos --cluster-name=microk8s-cluster --client --controller stg-reproducer-hopem-project --storage=ceph-xfs + +juju add-model cos microk8s-cos +juju deploy cos-lite --trust + +juju wait-for application grafana + +echo "INFO: COS should now be reachable at the following endpoints:" +juju run traefik/0 show-proxied-endpoints --format=yaml| yq '."traefik/0".results."proxied-endpoints"' | jq + diff --git a/cos/cos.yaml.template b/cos/cos.yaml.template new file mode 100644 index 00000000..46d36396 --- /dev/null +++ b/cos/cos.yaml.template @@ -0,0 +1,23 @@ +series: __SERIES__ +machines: + '0': + series: __SERIES__ + '1': + series: __SERIES__ + '2': + series: __SERIES__ +applications: + microk8s: + charm: __CHARM_STORE____CHARM_CS_NS____CHARM_CH_PREFIX__microk8s + num_units: __NUM_MICROK8S_UNITS__ + constraints: mem=8G + expose: true + options: + containerd_http_proxy: __CONTAINERD_PROXY__ + containerd_https_proxy: __CONTAINERD_PROXY__ + containerd_no_proxy: __CONTAINERD_NO_PROXY__ + num_units: 3 + to: + - 0 + - 1 + - 2 diff --git a/cos/generate-bundle.sh b/cos/generate-bundle.sh new file mode 120000 index 00000000..394558ee --- /dev/null +++ b/cos/generate-bundle.sh @@ -0,0 +1 @@ +common/generate-bundle.sh \ No newline at end of file diff --git a/cos/module_defaults b/cos/module_defaults new file mode 100644 index 00000000..db77bf51 --- /dev/null +++ b/cos/module_defaults @@ -0,0 +1,12 @@ +# This file must contain defaults for all variables used in bundles/overlays. +# They are used to render to final product in the event they are not provided +# elsewhere. It is inserted into the global context at the start of the +# pipeline. +# +# You can check that none are missing by running lint/check_var_defaults.sh +# + +MOD_PARAMS[__MICROK8S_CHANNEL__]="latest/edge" +MOD_PARAMS[__NUM_MICROK8S_UNITS__]=1 +MOD_PARAMS[__CONTAINERD_PROXY__]='' +MOD_PARAMS[__CONTAINERD_NO_PROXY__]='127.0.0.1,localhost,::1,10.149.0.0/16,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16' diff --git a/cos/overlays b/cos/overlays new file mode 120000 index 00000000..0d44a21c --- /dev/null +++ b/cos/overlays @@ -0,0 +1 @@ +../overlays \ No newline at end of file diff --git a/cos/pipeline/00setup b/cos/pipeline/00setup new file mode 100644 index 00000000..fecb3e76 --- /dev/null +++ b/cos/pipeline/00setup @@ -0,0 +1,21 @@ +#!/bin/bash + +# Globals +export MOD_NAME=cos +export MOD_BASE_TEMPLATE=cos.yaml.template +export MOD_SSL_STATE_DIR=${MOD_NAME} +[ -n "${MASTER_OPTS[BUNDLE_NAME]}" ] && \ + MOD_SSL_STATE_DIR="${MOD_SSL_STATE_DIR}-${MASTER_OPTS[BUNDLE_NAME]}" + +# opts that 02configure does not recognise that get passed to the generator +export -a MOD_PASSTHROUGH_OPTS=() + +# Collection of messages to display at the end +export -A MOD_MSGS=() +# Use order 0 to ensure this is first displayed +MOD_MSGS[0_common.0]="run ./configure to initialise your deployment" + +# Array list of overlays to use with this deployment. +export -a MOD_OVERLAYS=() + +export -A MOD_PARAMS=() diff --git a/cos/pipeline/01import-config-defaults b/cos/pipeline/01import-config-defaults new file mode 100644 index 00000000..8848bc10 --- /dev/null +++ b/cos/pipeline/01import-config-defaults @@ -0,0 +1,2 @@ +# Current module imports +. $MOD_DIR/module_defaults diff --git a/cos/pipeline/02configure b/cos/pipeline/02configure new file mode 100644 index 00000000..ae87cdd2 --- /dev/null +++ b/cos/pipeline/02configure @@ -0,0 +1,49 @@ +#!/bin/bash +# Global variables are first defined in 00setup and module +# dependencies are defined in 01import-config-defaults +# +# All overlay/bundle variables (MOD_PARAMS) defaults must go into +# the /module_defaults file. + +target=$series +[ -z "$pocket" ] || target=${target}-$pocket +target=${target}:${MOD_PARAMS[__MICROK8S_CHANNEL__]} +MOD_PASSTHROUGH_OPTS+=( --release-name $target ) + +# Automatically use proxy if in prodstack only +if $(timeout 1s getent hosts squid.internal &> /dev/null) && [ -z "${MOD_PARAMS[__CONTAINERD_PROXY__]}" ]; then + MOD_MSGS[1_proxy.0]='PROXY: squid.internal exists, setting containerd proxy to http://squid.internal:3128' + MOD_PARAMS[__CONTAINERD_PROXY__]=http://squid.internal:3128 +fi + +if ! has_opt --charmed-ceph-lxd && ! has_opt --microceph; then + MOD_OVERLAYS+=( "cos/charmed-ceph.yaml" ) +fi + +# Skip processing input if it includes exclusive passthrough options +! has_excl_passthrough_opt && \ +while (($# > 0)) +do + case "$1" in + --containerd-proxy) #__OPT__type: (default="" unless the hostname squid.internal resolves, then it's http://squid.internal:3128) + MOD_PARAMS[__CONTAINERD_PROXY__]=$2 + shift + ;; + --containerd-no-proxy) #__OPT__type: (default=127.0.0.1,localhost,::1,10.149.0.0/16,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) + MOD_PARAMS[__CONTAINERD_NO_PROXY__]=$2 + shift + ;; + --microceph) + MOD_OVERLAYS+=( "cos/microceph.yaml" ) + ;; + --charmed-ceph-lxd) + MOD_OVERLAYS+=( "cos/charmed-ceph-lxd.yaml" ) + ;; + *) + echo "ERROR: invalid input '$1'" + _usage + exit 1 + ;; + esac + shift +done diff --git a/cos/pipeline/03build b/cos/pipeline/03build new file mode 100644 index 00000000..62dd78f9 --- /dev/null +++ b/cos/pipeline/03build @@ -0,0 +1,5 @@ +#!/bin/bash +. $MOD_DIR/common/generate_bundle_base + +print_msgs + diff --git a/cos/resources/README_resources.md b/cos/resources/README_resources.md new file mode 100644 index 00000000..4261e46e --- /dev/null +++ b/cos/resources/README_resources.md @@ -0,0 +1,5 @@ +If you want to configure charm resources [1] in a bundle, put a directory in +this path with the name of the bundle/overlay they correspond to. Any files +within will then be copied into the generated bundles' path. + +[1] https://docs.jujucharms.com/using-resources-developer-guide diff --git a/overlays/cos/charmed-ceph-lxd.yaml b/overlays/cos/charmed-ceph-lxd.yaml new file mode 100644 index 00000000..b7351312 --- /dev/null +++ b/overlays/cos/charmed-ceph-lxd.yaml @@ -0,0 +1,32 @@ +applications: + ceph-mon: + charm: ceph-mon + channel: quincy/stable + num_units: 3 + to: + - 0 + - 1 + - 2 + ceph-osd: + charm: ceph-osd + channel: quincy/stable + num_units: 3 + to: + - 0 + - 1 + - 2 + options: + osd-devices: '' # must be empty string when using juju storage + config-flags: '{"osd": {"osd memory target": 1073741824}}' # matching 2G constraint + storage: + osd-devices: cinder,10G,1 + ceph-csi: + charm: ceph-csi + channel: 1.28/stable + options: + provisioner-replicas: 1 + namespace: kube-system +relations: + - [ ceph-osd:mon, ceph-mon:osd ] + - [ ceph-csi:ceph-client, ceph-mon:client ] + - [ ceph-csi:kubernetes-info, microk8s ] diff --git a/overlays/cos/charmed-ceph.yaml b/overlays/cos/charmed-ceph.yaml new file mode 100644 index 00000000..b7351312 --- /dev/null +++ b/overlays/cos/charmed-ceph.yaml @@ -0,0 +1,32 @@ +applications: + ceph-mon: + charm: ceph-mon + channel: quincy/stable + num_units: 3 + to: + - 0 + - 1 + - 2 + ceph-osd: + charm: ceph-osd + channel: quincy/stable + num_units: 3 + to: + - 0 + - 1 + - 2 + options: + osd-devices: '' # must be empty string when using juju storage + config-flags: '{"osd": {"osd memory target": 1073741824}}' # matching 2G constraint + storage: + osd-devices: cinder,10G,1 + ceph-csi: + charm: ceph-csi + channel: 1.28/stable + options: + provisioner-replicas: 1 + namespace: kube-system +relations: + - [ ceph-osd:mon, ceph-mon:osd ] + - [ ceph-csi:ceph-client, ceph-mon:client ] + - [ ceph-csi:kubernetes-info, microk8s ] diff --git a/overlays/cos/microceph.yaml b/overlays/cos/microceph.yaml new file mode 100644 index 00000000..b7351312 --- /dev/null +++ b/overlays/cos/microceph.yaml @@ -0,0 +1,32 @@ +applications: + ceph-mon: + charm: ceph-mon + channel: quincy/stable + num_units: 3 + to: + - 0 + - 1 + - 2 + ceph-osd: + charm: ceph-osd + channel: quincy/stable + num_units: 3 + to: + - 0 + - 1 + - 2 + options: + osd-devices: '' # must be empty string when using juju storage + config-flags: '{"osd": {"osd memory target": 1073741824}}' # matching 2G constraint + storage: + osd-devices: cinder,10G,1 + ceph-csi: + charm: ceph-csi + channel: 1.28/stable + options: + provisioner-replicas: 1 + namespace: kube-system +relations: + - [ ceph-osd:mon, ceph-mon:osd ] + - [ ceph-csi:ceph-client, ceph-mon:client ] + - [ ceph-csi:kubernetes-info, microk8s ]