Commit 5771b243 authored by Sergio Gimenez's avatar Sergio Gimenez
Browse files

Works full oop with existing cluster

parent 82795ad2
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -57,8 +57,18 @@ federation_manager_keycloak_realm: "federation"
federation_manager_mongodb_image: "mongo"
federation_manager_mongodb_tag: "6.0"
federation_manager_mongodb_nodeport: 30017
federation_manager_mongodb_data_dir: "/tmp/db"
federation_manager_mongodb_persistence_enabled: true
federation_manager_mongodb_persistence_size: 1Gi
federation_manager_mongodb_persistence_access_mode: ReadWriteOnce
federation_manager_mongodb_persistence_storage_class: manual
federation_manager_mongodb_persistence_create_pv: true
federation_manager_mongodb_persistence_use_default_storage_class: true
federation_manager_mongodb_persistence_node_name: ""
federation_manager_mongodb_persistence_auto_configure: true
federation_manager_mongodb_preserve_data: true
federation_manager_mongodb_data_dir: "/mnt/data/federation-manager-mongodb-{{ federation_manager_variant }}"
federation_manager_mongodb_cleanup_data: true
federation_manager_mongodb_init_cleanup_lock: true

# Federation Manager MongoDB settings
federation_manager_mongodb_host: "mongodb"
+194 −0
Original line number Diff line number Diff line
@@ -40,6 +40,200 @@
    kubeconfig: "{{ federation_manager_kubeconfig }}"
  when: gitlab_token is defined

- name: Get available storage classes
  kubernetes.core.k8s_info:
    api_version: storage.k8s.io/v1
    kind: StorageClass
    kubeconfig: "{{ federation_manager_kubeconfig }}"
  register: federation_manager_storage_classes
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure

- name: Detect dynamic storage classes
  ansible.builtin.set_fact:
    federation_manager_dynamic_storage_classes: >-
      {{ (federation_manager_storage_classes.resources | default([]))
         | rejectattr('provisioner', 'equalto', 'kubernetes.io/no-provisioner')
         | map(attribute='metadata.name')
         | list }}
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure

- name: Detect local storage classes
  ansible.builtin.set_fact:
    federation_manager_local_storage_classes: >-
      {{ (federation_manager_storage_classes.resources | default([]))
         | selectattr('provisioner', 'equalto', 'kubernetes.io/no-provisioner')
         | map(attribute='metadata.name')
         | list }}
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure

- name: Detect default storage class
  ansible.builtin.shell: |
    kubectl get storageclass -o jsonpath='{range .items[?(@.metadata.annotations.storageclass\.kubernetes\.io/is-default-class=="true")]}{.metadata.name}{"\n"}{end}' | head -n 1
  args:
    executable: /bin/bash
  register: federation_manager_default_storage_class_result
  changed_when: false
  failed_when: false
  environment:
    KUBECONFIG: "{{ federation_manager_kubeconfig }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure

- name: Set default storage class fact
  ansible.builtin.set_fact:
    federation_manager_default_storage_class: "{{ federation_manager_default_storage_class_result.stdout | trim }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure

- name: Select default dynamic storage class
  ansible.builtin.set_fact:
    federation_manager_mongodb_persistence_use_default_storage_class: true
    federation_manager_mongodb_persistence_storage_class: "{{ federation_manager_default_storage_class }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure
    - federation_manager_dynamic_storage_classes | length > 0
    - federation_manager_default_storage_class | length > 0

- name: Select non-default dynamic storage class
  ansible.builtin.set_fact:
    federation_manager_mongodb_persistence_use_default_storage_class: false
    federation_manager_mongodb_persistence_storage_class: "{{ federation_manager_dynamic_storage_classes[0] }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure
    - federation_manager_dynamic_storage_classes | length > 0
    - federation_manager_default_storage_class | length == 0

- name: Get schedulable worker node name
  ansible.builtin.command: >
    kubectl get nodes
    -l '!node-role.kubernetes.io/control-plane'
    --field-selector spec.unschedulable!=true
    -o jsonpath='{.items[0].metadata.name}'
  register: federation_manager_worker_node_name_result
  changed_when: false
  failed_when: false
  environment:
    KUBECONFIG: "{{ federation_manager_kubeconfig }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure
    - federation_manager_dynamic_storage_classes | length == 0

- name: Get schedulable node name fallback
  ansible.builtin.command: >
    kubectl get nodes
    --field-selector spec.unschedulable!=true
    -o jsonpath='{.items[0].metadata.name}'
  register: federation_manager_node_name_result
  changed_when: false
  failed_when: false
  environment:
    KUBECONFIG: "{{ federation_manager_kubeconfig }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure
    - federation_manager_dynamic_storage_classes | length == 0
    - federation_manager_worker_node_name_result.stdout | default('') | length == 0

- name: Select node for local storage
  ansible.builtin.set_fact:
    federation_manager_mongodb_persistence_node_name: >-
      {{ (federation_manager_worker_node_name_result.stdout | default('') | length > 0)
         | ternary(federation_manager_worker_node_name_result.stdout, federation_manager_node_name_result.stdout | default('')) }}
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure
    - federation_manager_dynamic_storage_classes | length == 0

- name: Select local storage class
  ansible.builtin.set_fact:
    federation_manager_mongodb_persistence_use_default_storage_class: false
    federation_manager_mongodb_persistence_create_pv: true
    federation_manager_mongodb_persistence_storage_class: >-
      {{ (federation_manager_local_storage_classes | length > 0) | ternary(federation_manager_local_storage_classes[0], 'local-storage') }}
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_auto_configure
    - federation_manager_dynamic_storage_classes | length == 0
    - federation_manager_mongodb_persistence_node_name | length > 0

- name: Get existing MongoDB deployment availability
  ansible.builtin.command: >
    kubectl get deployment mongodb
    --namespace {{ federation_manager_namespace }}
    -o jsonpath='{.status.availableReplicas}'
  register: federation_manager_mongodb_available_result
  changed_when: false
  failed_when: false
  environment:
    KUBECONFIG: "{{ federation_manager_kubeconfig }}"

- name: Get existing MongoDB PV details
  ansible.builtin.command: >
    kubectl get pv mongodb-{{ federation_manager_variant }}
    -o jsonpath='{.spec.hostPath.path}|{.spec.storageClassName}|{range .spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values[*]}{.}{end}|{.status.phase}'
  register: federation_manager_mongodb_pv_details_result
  changed_when: false
  failed_when: false
  environment:
    KUBECONFIG: "{{ federation_manager_kubeconfig }}"
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_create_pv
    - not federation_manager_mongodb_persistence_use_default_storage_class

- name: Determine if MongoDB storage reset is required
  ansible.builtin.set_fact:
    federation_manager_mongodb_reset_required: >-
      {{
        federation_manager_mongodb_pv_details_result.rc == 0 and (
          (federation_manager_mongodb_pv_details_result.stdout.split('|') | last) in ['Released', 'Failed'] or
          (federation_manager_mongodb_pv_details_result.stdout.split('|') | first) != federation_manager_mongodb_data_dir or
          (federation_manager_mongodb_pv_details_result.stdout.split('|'))[1] != federation_manager_mongodb_persistence_storage_class or
          (
            federation_manager_mongodb_persistence_node_name | length > 0 and
            (federation_manager_mongodb_pv_details_result.stdout.split('|'))[2] != federation_manager_mongodb_persistence_node_name
          )
        ) and (federation_manager_mongodb_available_result.stdout | default('0') | trim) != '1'
      }}
  when:
    - federation_manager_mongodb_persistence_enabled
    - federation_manager_mongodb_persistence_create_pv
    - not federation_manager_mongodb_persistence_use_default_storage_class

- name: Reset broken MongoDB storage objects before redeploy
  kubernetes.core.k8s:
    state: absent
    api_version: "{{ item.api_version }}"
    kind: "{{ item.kind }}"
    namespace: "{{ item.namespace | default(omit) }}"
    name: "{{ item.name }}"
    kubeconfig: "{{ federation_manager_kubeconfig }}"
  loop:
    - api_version: apps/v1
      kind: Deployment
      namespace: "{{ federation_manager_namespace }}"
      name: mongodb
    - api_version: v1
      kind: PersistentVolumeClaim
      namespace: "{{ federation_manager_namespace }}"
      name: mongodb
    - api_version: v1
      kind: PersistentVolume
      name: "mongodb-{{ federation_manager_variant }}"
  when:
    - federation_manager_mongodb_reset_required | default(false)

# ==========================================
# MongoDB Deployment
# ==========================================
+33 −6
Original line number Diff line number Diff line
---
{% if federation_manager_mongodb_persistence_enabled and federation_manager_mongodb_persistence_create_pv and not federation_manager_mongodb_persistence_use_default_storage_class %}
kind: PersistentVolume
apiVersion: v1
metadata:
  name: mongodb-{{ federation_manager_variant }}
spec:
  capacity:
    storage: 1Gi
    storage: {{ federation_manager_mongodb_persistence_size }}
  hostPath:
    path: {{ federation_manager_mongodb_data_dir }}
    type: DirectoryOrCreate
  accessModes:
    - ReadWriteOnce
    - {{ federation_manager_mongodb_persistence_access_mode }}
  persistentVolumeReclaimPolicy: Retain
  storageClassName: manual
  storageClassName: {{ federation_manager_mongodb_persistence_storage_class }}
{% if federation_manager_mongodb_persistence_node_name | length > 0 %}
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - {{ federation_manager_mongodb_persistence_node_name }}
{% endif %}
---
{% endif %}
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
@@ -20,12 +33,14 @@ metadata:
  namespace: {{ federation_manager_namespace }}
spec:
  accessModes:
    - ReadWriteOnce
    - {{ federation_manager_mongodb_persistence_access_mode }}
  resources:
    requests:
      storage: 1Gi
      storage: {{ federation_manager_mongodb_persistence_size }}
{% if not federation_manager_mongodb_persistence_use_default_storage_class %}
  volumeName: mongodb-{{ federation_manager_variant }}
  storageClassName: manual
  storageClassName: {{ federation_manager_mongodb_persistence_storage_class }}
{% endif %}
---
kind: Deployment
apiVersion: apps/v1
@@ -46,6 +61,18 @@ spec:
        - name: storage
          persistentVolumeClaim:
            claimName: mongodb
{% if federation_manager_mongodb_init_cleanup_lock %}
      initContainers:
        - name: mongo-clean-lock
          image: '{{ federation_manager_mongodb_image }}:{{ federation_manager_mongodb_tag }}'
          command:
            - /bin/sh
            - -c
            - rm -f /data/db/mongod.lock /data/db/WiredTiger.lock
          volumeMounts:
            - name: storage
              mountPath: /data/db
{% endif %}
      containers:
        - name: mongodb
          image: '{{ federation_manager_mongodb_image }}:{{ federation_manager_mongodb_tag }}'
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ lite2edge_image_pull_secret: gitlab-registry-secret
lite2edge_registry_email: ""

# Image Configuration
lite2edge_image: "gitlab.i2cat.net:5050/areas/software-networks/operator-platform/lite2edge:fix-deploy-path-appid-cdab2ef"
lite2edge_image: "gitlab.i2cat.net:5050/areas/software-networks/operator-platform/lite2edge:latest"
lite2edge_image_pull_policy: IfNotPresent

# State (present/absent)
+1 −1
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@ srm_controller_name: srmcontroller
srm_controller_replicas: 1
# srm_controller_image_repository: "labs.etsi.org:5050/oop/code/service-resource-manager"
srm_controller_image_repository: "gitlab.i2cat.net:5050/areas/software-networks/operator-platform/oop/service-resource-manager"
srm_controller_image_tag: "feature-srm-fm-integration-and-spec-compliance-d1f8bbd-tfsrc"
srm_controller_image_tag: "1.1"
srm_controller_image_pull_policy: Always
srm_image_pull_secret_enabled: true 
srm_image_pull_secret_name: "gitlab-registry-secret"
Loading