Feature/dev 302
parent
37d94b5166
commit
d1b41daa87
@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: "harbor BASE settings"
|
||||||
|
block:
|
||||||
|
- name: "BLOCK: Login with keycloak-admin"
|
||||||
|
include_role:
|
||||||
|
name: keycloak
|
||||||
|
tasks_from: _authenticate
|
||||||
|
|
||||||
|
- name: "GET available clients from <<{{ harbor_base_configuration.oidc_name }}>>-realm"
|
||||||
|
delegate_to: localhost
|
||||||
|
become: False
|
||||||
|
uri:
|
||||||
|
url: "{{ keycloak_server_url }}/auth/admin/realms/{{ harbor_base_configuration.oidc_name }}/clients"
|
||||||
|
method: GET
|
||||||
|
headers:
|
||||||
|
Content-Type: "application/json"
|
||||||
|
Authorization: "Bearer {{ access_token }}"
|
||||||
|
status_code: [200]
|
||||||
|
register: realm_clients
|
||||||
|
|
||||||
|
# available clients: get needed ID
|
||||||
|
- set_fact:
|
||||||
|
id_of_client: '{{ ( realm_clients.json | selectattr("clientId","equalto", harbor_base_configuration.oidc_client_id ) | first ).id }}'
|
||||||
|
|
||||||
|
- name: "BLOCK: GET client-secret for client <<{{ harbor_base_configuration.oidc_client_id }}>> in realm <<{{ harbor_base_configuration.oidc_name }}>>"
|
||||||
|
delegate_to: localhost
|
||||||
|
become: False
|
||||||
|
uri:
|
||||||
|
url: "{{ keycloak_server_url }}/auth/admin/realms/{{ harbor_base_configuration.oidc_name }}/clients/{{ id_of_client }}/client-secret"
|
||||||
|
method: GET
|
||||||
|
headers:
|
||||||
|
Content-Type: "application/json"
|
||||||
|
Authorization: "Bearer {{ access_token }}"
|
||||||
|
status_code: [200]
|
||||||
|
register: client_secret
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
dict:
|
||||||
|
oidc_client_secret: '{{ client_secret.json.value }}'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
harbor_base_configuration_merged: '{{ harbor_base_configuration | combine( dict ,recursive=True ) }}'
|
||||||
|
|
||||||
|
- name: "BLOCK: Configure harbor BASE settings"
|
||||||
|
include_tasks: configure_base_config.yml
|
||||||
|
vars:
|
||||||
|
base_configuration: '{{ harbor_base_configuration_merged }}'
|
||||||
|
args:
|
||||||
|
apply:
|
||||||
|
tags:
|
||||||
|
- harbor-configure-base
|
||||||
|
# end of block for base settings
|
||||||
|
|
||||||
|
- name: "Create object of templated harbor projects"
|
||||||
|
set_fact:
|
||||||
|
projects_templated: "{{ ( projects_templated | default([]) ) + [ project_object_template ] }}"
|
||||||
|
loop: '{{ harbor_projects_smardigo_default }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: elem
|
||||||
|
when:
|
||||||
|
- harbor_projects_smardigo_default is defined
|
||||||
|
|
||||||
|
- name: "CRUD - projects"
|
||||||
|
include_tasks: configure_projects.yml
|
||||||
|
loop: '{{ harbor_projects + projects_templated }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: project
|
||||||
|
|
||||||
|
- name: "CRUD - robot tokens"
|
||||||
|
include_tasks: configure_robot_tokens.yml
|
||||||
|
loop: '{{ harbor_robot_tokens }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: robot_token
|
||||||
|
|
||||||
|
- name: "CRUD - scanall schedule"
|
||||||
|
include_tasks: configure_scanall_schedule.yml
|
||||||
|
loop: '{{ harbor_scanall }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: scanschedule
|
||||||
@ -0,0 +1,85 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: "Check if project <<{{ project.project_attributes.project_name }}>> exists"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project.project_attributes.project_name }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: GET
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,403]
|
||||||
|
register: project_exists
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: 'found projects: {{ project_exists.json }}'
|
||||||
|
when: debug
|
||||||
|
|
||||||
|
- name: "Create project: <<{{ project.project_attributes.project_name }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: POST
|
||||||
|
body_format: json
|
||||||
|
body: '{{ project.project_attributes | to_json }}'
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: create_project
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: create_project.status in [200,201]
|
||||||
|
when:
|
||||||
|
- project_exists.status in [403]
|
||||||
|
|
||||||
|
- name: "Update project: <<{{ project.project_attributes.project_name }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project.project_attributes.project_name }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: PUT
|
||||||
|
body_format: json
|
||||||
|
body: '{{ project.project_attributes | to_json }}'
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: update_project
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: update_project.status in [200,201]
|
||||||
|
when:
|
||||||
|
- project_exists.status in [200]
|
||||||
|
|
||||||
|
- name: "Delete project: <<{{ project.project_attributes.project_name }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project.project_attributes.project_name }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: DELETE
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: create_project
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: create_project.status in [200]
|
||||||
|
when:
|
||||||
|
- project_exists.status in [200]
|
||||||
|
- project.project_state == 'absent'
|
||||||
@ -0,0 +1,137 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
member_state: '{{ member.member_state | default("present") }}'
|
||||||
|
harbor_member_roles:
|
||||||
|
-
|
||||||
|
name: projectadmin
|
||||||
|
role_id: 1
|
||||||
|
-
|
||||||
|
name: developer
|
||||||
|
role_id: 2
|
||||||
|
-
|
||||||
|
name: guest
|
||||||
|
role_id: 3
|
||||||
|
-
|
||||||
|
name: maintainer
|
||||||
|
role_id: 4
|
||||||
|
harbor_member_grouptypes:
|
||||||
|
-
|
||||||
|
name: ldap
|
||||||
|
group_type: 1
|
||||||
|
-
|
||||||
|
name: http
|
||||||
|
group_type: 2
|
||||||
|
-
|
||||||
|
name: oidc
|
||||||
|
group_type: 3
|
||||||
|
|
||||||
|
- name: "Get all project members"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/members"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: GET
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: all_project_members
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
group_type: "{{ ( harbor_member_grouptypes | selectattr('name','==',( member.group_type | lower )) | list | first ).group_type }}"
|
||||||
|
role_id: "{{ ( harbor_member_roles | selectattr('name','==',( member.role| lower ) ) | list | first ).role_id | int }}"
|
||||||
|
|
||||||
|
# creating body manual due to problems with IDs as integer - they will be converted to string in json
|
||||||
|
# => every API request will fail
|
||||||
|
# see also:
|
||||||
|
# https://stackoverflow.com/questions/69677986/converting-string-to-integer-in-ansible
|
||||||
|
- name: "Create membership"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/members"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: POST
|
||||||
|
body_format: json
|
||||||
|
body: >-
|
||||||
|
{{
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"role_id": role_id | int,
|
||||||
|
"member_group": {
|
||||||
|
"group_name": member.group_name,
|
||||||
|
"group_type": group_type | int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) | to_json }}
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: create_project_member
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: create_project_member.status in [200,201]
|
||||||
|
when:
|
||||||
|
- all_project_members.json | selectattr('entity_name','equalto',member.group_name) | list | length == 0
|
||||||
|
- member_state == 'present'
|
||||||
|
|
||||||
|
- name: "Update member: <<{{ member.group_name }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/members/{{ ( all_project_members.json | selectattr('entity_name','equalto',member.group_name) | list | first ).id }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: PUT
|
||||||
|
body_format: json
|
||||||
|
body: >-
|
||||||
|
{{
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"role_id": role_id | int,
|
||||||
|
"member_group": {
|
||||||
|
"group_name": member.group_name,
|
||||||
|
"group_type": group_type | int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) | to_json }}
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: update_project_member
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: update_project_member.status in [200,201]
|
||||||
|
when:
|
||||||
|
- all_project_members.json | selectattr('entity_name','equalto',member.group_name) | list | length == 1
|
||||||
|
- member_state == 'present'
|
||||||
|
|
||||||
|
- name: "Delete member: <<{{ member.group_name }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/members/{{ ( all_project_members.json | selectattr('entity_name','equalto',member.group_name) | list | first ).id }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: DELETE
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: delete_project_member
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: delete_project_member.status in [200,201]
|
||||||
|
when:
|
||||||
|
- all_project_members.json | selectattr('entity_name','equalto',member.group_name) | list | length == 1
|
||||||
|
- member_state == 'absent'
|
||||||
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: "Get all meta_data"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/metadatas/{{ meta_data_elem.key }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: GET
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: all_metadata
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
body_content: "{ \"{{ meta_data_elem.key }}\":\"{{ meta_data_elem.value }}\" }"
|
||||||
|
|
||||||
|
- name: "Add meta_data: <<{{ meta_data_elem.key }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/metadatas"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: POST
|
||||||
|
body_format: json
|
||||||
|
body: '{{ body_content }}'
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: create_metadata
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: create_metadata.status in [200,201]
|
||||||
|
when:
|
||||||
|
- meta_data_elem.key not in all_metadata.json
|
||||||
|
|
||||||
|
- name: "Update meta_data: <<{{ meta_data_elem.key }}>>"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/projects/{{ project_name }}/metadatas/{{ meta_data_elem.key }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: PUT
|
||||||
|
body_format: json
|
||||||
|
body: '{{ body_content }}'
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: update_metadata
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: update_metadata.status in [200,201]
|
||||||
|
when:
|
||||||
|
- meta_data_elem.key in all_metadata.json
|
||||||
|
|
||||||
|
# DELETION currently out-of-scope
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: "include CRUD for projects"
|
||||||
|
include_tasks: configure_project_crud.yml
|
||||||
|
|
||||||
|
- name: "include CRUD for project meta-data"
|
||||||
|
include_tasks: configure_project_metadata_crud.yml
|
||||||
|
vars:
|
||||||
|
project_name: '{{ project.project_attributes.project_name }}'
|
||||||
|
loop: '{{ project.meta_data | dict2items }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: meta_data_elem
|
||||||
|
when:
|
||||||
|
- project.meta_data is defined
|
||||||
|
|
||||||
|
- name: "include CRUD for project members"
|
||||||
|
include_tasks: configure_project_members_crud.yml
|
||||||
|
vars:
|
||||||
|
project_name: '{{ project.project_attributes.project_name }}'
|
||||||
|
loop: '{{ project.members }}'
|
||||||
|
loop_control:
|
||||||
|
loop_var: member
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
tok_obj: {}
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: "DEBUGGING - robot_token: {{ robot_token }}"
|
||||||
|
when:
|
||||||
|
- debug
|
||||||
|
|
||||||
|
- name: "Drop token_state from dict to avoid rejecting object by harbor API due to unknown field"
|
||||||
|
set_fact:
|
||||||
|
tok_obj: "{{ tok_obj |combine({item.key: item.value})}}"
|
||||||
|
when: item.key not in ['token_state']
|
||||||
|
with_dict: "{{ robot_token }}"
|
||||||
|
|
||||||
|
- name:
|
||||||
|
include_tasks: configure_robot_tokens_crud.yml
|
||||||
|
vars:
|
||||||
|
token_state: "{{ robot_token.token_state | default('present') }}"
|
||||||
|
token_object: "{{ tok_obj }}"
|
||||||
@ -0,0 +1,174 @@
|
|||||||
|
---
|
||||||
|
- set_fact:
|
||||||
|
token_object_combined: {}
|
||||||
|
|
||||||
|
- name: "Get all robot tokens"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/robots"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: GET
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: all_robot_tokens
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
- name: "Create robot token"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/robots"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: POST
|
||||||
|
body_format: json
|
||||||
|
body: '{{ token_object | to_json }}'
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200,201]
|
||||||
|
register: create
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: create.status in [200,201]
|
||||||
|
when:
|
||||||
|
- all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | length == 0
|
||||||
|
- token_state == 'present'
|
||||||
|
|
||||||
|
- set_fact:
|
||||||
|
robots_id: "{{ ( all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | first ).id }}"
|
||||||
|
remote_robot_token_object: "{{ all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | first }}"
|
||||||
|
token_object_combined: "{{ all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | first | combine(token_object, recursive=True) }}"
|
||||||
|
token_object_dropped: {}
|
||||||
|
when:
|
||||||
|
- all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | length == 1
|
||||||
|
|
||||||
|
- name: "Refresh the robot secret"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/robots/{{ robots_id }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: PATCH
|
||||||
|
body_format: json
|
||||||
|
body: >-
|
||||||
|
{{
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"secret": token_object.secret
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}}
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: update
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: update.status in [200]
|
||||||
|
when:
|
||||||
|
- all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | length == 1
|
||||||
|
- token_state == 'present'
|
||||||
|
- token_object.secret_refresh is defined
|
||||||
|
- token_object.secret_refresh
|
||||||
|
|
||||||
|
- name: "Block to Update robot token data"
|
||||||
|
block:
|
||||||
|
- debug:
|
||||||
|
msg: "DEBUGGING before dropping - combined token_object_combined: {{ token_object_combined }}"
|
||||||
|
when:
|
||||||
|
- debug
|
||||||
|
|
||||||
|
# unknown param/key in object robot-token will result in errors with harbor API
|
||||||
|
# therefore we drop $keys from dict
|
||||||
|
- name: "Drop some keys from updated robot token object"
|
||||||
|
set_fact:
|
||||||
|
token_object_dropped: "{{ token_object_dropped | combine({item.key: item.value})}}"
|
||||||
|
with_dict: "{{ token_object_combined }}"
|
||||||
|
when: "{{ item.key not in ['secret','secret_refresh'] }}"
|
||||||
|
|
||||||
|
# harbor API behaviour:
|
||||||
|
# in case of initial creation for robot token objects, harbor creates a name for this
|
||||||
|
# in form of << robot$OBJECT_NAME >> - plz be aware of the dollar sign!
|
||||||
|
# but only the OBJECT_NAME was defined in object declaration.
|
||||||
|
# In case of updating we have to make sure that the << robot$OBJECT_NAME >> is used in the
|
||||||
|
# updated object thrown against harbor API.
|
||||||
|
#
|
||||||
|
# so harbor API forces me to create this workaround to avoid such errors
|
||||||
|
#
|
||||||
|
# part 1: define name of object
|
||||||
|
- set_fact:
|
||||||
|
robot_token_name_cleaned:
|
||||||
|
name: 'robot${{ token_object_dropped.name }}'
|
||||||
|
# part 2: override name with new defined name of object
|
||||||
|
- set_fact:
|
||||||
|
token_object_finished: '{{ token_object_dropped | combine(robot_token_name_cleaned, recursive=True) }}'
|
||||||
|
|
||||||
|
- debug:
|
||||||
|
msg: "DEBUGGING after dropping - combined token_object_finished: {{ token_object_finished }}"
|
||||||
|
when:
|
||||||
|
- debug
|
||||||
|
|
||||||
|
# to update a robot token, the following conditions must be satisfied
|
||||||
|
# 1. ALL params of robot token object must be set
|
||||||
|
# 1.1. except the secret param - it must be removed/rejected from object - it will be updated with PATCH-method instead of PUT-method
|
||||||
|
# 2. the update (of parameter) itself
|
||||||
|
#
|
||||||
|
# there is no possibility to update if one of mentioned conditions is not statisfied.
|
||||||
|
# the API call will fail with one of the following errors:
|
||||||
|
# - HTTP 400 - "cannot update the level or name of robot"
|
||||||
|
# - HTTP 400 - "bad request error level input:"
|
||||||
|
#
|
||||||
|
- name: "Update robot token object"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/robots/{{ robots_id }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: PUT
|
||||||
|
body_format: json
|
||||||
|
body: '{{ token_object_finished | to_json }}'
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: update
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: update.status in [200]
|
||||||
|
# when - part of BLOCK-statement
|
||||||
|
when:
|
||||||
|
- all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | length == 1
|
||||||
|
- token_state == 'present'
|
||||||
|
|
||||||
|
# end of BLOCK to Update robot token data
|
||||||
|
|
||||||
|
- name: "Delete robot token"
|
||||||
|
delegate_to: 127.0.0.1
|
||||||
|
become: false
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/robots/{{ robots_id }}"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: DELETE
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
register: delete_project_member
|
||||||
|
delay: 10
|
||||||
|
retries: 3
|
||||||
|
until: delete_project_member.status in [200]
|
||||||
|
when:
|
||||||
|
- all_robot_tokens.json | selectattr('name','contains',token_object.name) | list | length == 1
|
||||||
|
- token_state == 'absent'
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
---
|
||||||
|
- name: "configure | configure scanall schedule | CREATE scanschedule"
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/system/scanAll/schedule"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: POST
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
status_code: [200]
|
||||||
|
body: '{{ scanschedule |to_json }}'
|
||||||
|
status_code: [201,412]
|
||||||
|
register: create_scanschedule
|
||||||
|
|
||||||
|
- name: "configure | configure scanall schedule | UPDATE scanschedule"
|
||||||
|
uri:
|
||||||
|
url: "{{ harbor_external_url }}/api/v2.0/system/scanAll/schedule"
|
||||||
|
user: '{{ harbor_admin_username }}'
|
||||||
|
password: '{{ harbor_admin_password }}'
|
||||||
|
method: PUT
|
||||||
|
body_format: json
|
||||||
|
force_basic_auth: yes
|
||||||
|
headers:
|
||||||
|
Content-Type: application/json
|
||||||
|
body: '{{ scanschedule |to_json }}'
|
||||||
|
status_code: [200]
|
||||||
|
when:
|
||||||
|
- create_scanschedule.status in [412]
|
||||||
Loading…
Reference in New Issue