commit
ebc499acbf
21 changed files with 799 additions and 0 deletions
@ -0,0 +1 @@ |
|||
*.retry |
|||
@ -0,0 +1,21 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2016 Nicolas MASSE |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
|||
@ -0,0 +1,8 @@ |
|||
--- |
|||
threescale_cicd_openapi_file_format: YAML |
|||
threescale_cicd_delay: 10 |
|||
threescale_cicd_retries: 50 |
|||
threescale_cicd_default_application_name: 'Ansible smoke-tests default application' |
|||
threescale_cicd_default_application_description: 'This app is used to run smoke tests during the deployment phase. It will be automatically recreated if you delete it.' |
|||
threescale_cicd_staging_environment_name: sandbox |
|||
threescale_cicd_production_environment_name: production |
|||
@ -0,0 +1,14 @@ |
|||
galaxy_info: |
|||
author: Nicolas Massé |
|||
description: Enables CI/CD with 3scale API Management Platform |
|||
company: Red Hat |
|||
license: MIT |
|||
min_ansible_version: 2.4 |
|||
galaxy_tags: |
|||
- 3scale |
|||
- threescale |
|||
- 3scale-amp |
|||
- api-management |
|||
- continuous-deployment |
|||
|
|||
dependencies: [] |
|||
@ -0,0 +1,34 @@ |
|||
--- |
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ "access_token=" ~ threescale_cicd_access_token|urlencode }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ threescale_cicd_tmp_body_update_method ~ "&" ~ (threescale_cicd_tmp_param.key|urlencode) ~ "=" ~ (threescale_cicd_tmp_param.value|urlencode) }}' |
|||
with_dict: '{{ threescale_cicd_tmp_plan }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_param |
|||
|
|||
- name: Update the application plan |
|||
uri: |
|||
url: 'https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/application_plans/{{ (threescale_cicd_existing_application_plans_details|selectattr("system_name", "equalto", threescale_cicd_tmp_plan.system_name)|first).id }}.json' |
|||
validate_certs: no |
|||
method: PUT |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 200 |
|||
register: threescale_cicd_tmpresponse |
|||
when: 'threescale_cicd_tmp_plan.system_name in threescale_cicd_existing_application_plans' |
|||
|
|||
- name: Create the application plan |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/application_plans.json |
|||
validate_certs: no |
|||
method: POST |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 201 |
|||
register: threescale_cicd_tmpresponse |
|||
when: 'threescale_cicd_tmp_plan.system_name not in threescale_cicd_existing_application_plans' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_application_plans: '{{ threescale_cicd_existing_application_plans|union([ threescale_cicd_tmp_plan.system_name ]) }}' |
|||
threescale_cicd_existing_application_plans_details: '{{ threescale_cicd_existing_application_plans_details|union([{ "system_name": threescale_cicd_tmp_plan.system_name, "id": threescale_cicd_tmpresponse.json.application_plan.id }]) }}' |
|||
when: 'threescale_cicd_tmp_plan.system_name not in threescale_cicd_existing_application_plans' |
|||
@ -0,0 +1,80 @@ |
|||
--- |
|||
|
|||
- name: Get the default (first) account |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/accounts.json?access_token={{ threescale_cicd_access_token|urlencode }}&state=approved&page=1&per_page=1 |
|||
validate_certs: no |
|||
register: threescale_cicd_tmp_allaccounts |
|||
when: 'threescale_cicd_default_account_id is not defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_default_account_id: '{{ threescale_cicd_tmp_allaccounts.json.accounts[0].account.id }}' |
|||
when: 'threescale_cicd_default_account_id is not defined' |
|||
|
|||
- name: Pick the first given application plan if no default application plan is given |
|||
set_fact: |
|||
threescale_cicd_default_application_plan: '{{ (threescale_cicd_application_plans|first).system_name }}' |
|||
when: 'threescale_cicd_default_application_plan is not defined and threescale_cicd_application_plans is defined and threescale_cicd_application_plans|length > 0' |
|||
|
|||
- name: Find the application plan id |
|||
set_fact: |
|||
threescale_cicd_default_application_plan_id: '{{ (threescale_cicd_existing_application_plans_details|selectattr("system_name", "equalto", threescale_cicd_default_application_plan)|first).id }}' |
|||
when: 'threescale_cicd_default_application_plan is defined' |
|||
|
|||
- name: Compute the appid for the default application |
|||
set_fact: |
|||
# The default appid is a SHA1 hash of the application name, api name and salted with the 3scale access token so that it cannot be guessed |
|||
threescale_cicd_default_application_appid: '{{ (threescale_cicd_default_application_name ~ threescale_cicd_api_system_name ~ threescale_cicd_access_token)|hash(''sha1'') }}' |
|||
when: 'threescale_cicd_default_application_appid is not defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_search_criteria: 'app_id' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''oauth2''' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_search_criteria: 'user_key' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''apiKey''' |
|||
|
|||
- name: Check if the default application exists |
|||
uri: |
|||
url: 'https://{{ inventory_hostname }}/admin/api/applications/find.json?access_token={{ threescale_cicd_access_token|urlencode }}&{{ threescale_cicd_tmp_search_criteria }}={{ threescale_cicd_default_application_appid|urlencode }}' |
|||
validate_certs: no |
|||
method: GET |
|||
status_code: 200,404 |
|||
register: threescale_cicd_tmpresponse |
|||
when: 'threescale_cicd_default_application_id is not defined and threescale_cicd_default_application_appid is defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_default_application_id: '{{ threescale_cicd_tmpresponse.json.application.id }}' |
|||
when: 'threescale_cicd_default_application_id is not defined and threescale_cicd_default_application_appid is defined and threescale_cicd_tmpresponse.status == 200' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ "access_token=" ~ (threescale_cicd_access_token|urlencode) ~ "&plan_id=" ~ threescale_cicd_default_application_plan_id ~ "&name=" ~ (threescale_cicd_default_application_name|urlencode) ~ "&description=" ~ (threescale_cicd_default_application_description|urlencode) ~ "&" ~ threescale_cicd_tmp_search_criteria ~ "=" ~ (threescale_cicd_default_application_appid|urlencode) }}' |
|||
|
|||
- name: Create the application |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/accounts/{{ threescale_cicd_default_account_id }}/applications.json |
|||
validate_certs: no |
|||
method: POST |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 201 |
|||
register: threescale_cicd_tmpresponse |
|||
when: 'threescale_cicd_default_application_id is not defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_default_application_details: '{{ threescale_cicd_tmpresponse.json.application }}' |
|||
when: 'threescale_cicd_default_application_id is not defined' |
|||
|
|||
- name: Update the application |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/accounts/{{ threescale_cicd_default_account_id }}/applications/{{ threescale_cicd_default_application_id }}.json |
|||
validate_certs: no |
|||
method: PUT |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 200 |
|||
register: threescale_cicd_tmpresponse |
|||
when: 'threescale_cicd_default_application_id is defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_default_application_details: '{{ threescale_cicd_tmpresponse.json.application }}' |
|||
when: 'threescale_cicd_default_application_id is defined' |
|||
@ -0,0 +1,24 @@ |
|||
--- |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ "access_token=" ~ threescale_cicd_access_token|urlencode }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ threescale_cicd_tmp_body_update_method ~ "&" ~ (threescale_cicd_tmp_param.key|urlencode) ~ "=" ~ (threescale_cicd_tmp_param.value|urlencode) }}' |
|||
with_dict: '{{ threescale_cicd_tmp_wanted_mapping_rules[threescale_cicd_tmp_mapping_rule_to_create] }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_param |
|||
|
|||
- set_fact: |
|||
# Add the metric_id to the payload |
|||
threescale_cicd_tmp_body_update_method: '{{ threescale_cicd_tmp_body_update_method ~ "&" ~ "metric_id=" ~ ((threescale_cicd_existing_metrics_details|selectattr("system_name", "equalto", threescale_cicd_tmp_mapping_rule_to_create)|first).id|urlencode) }}' |
|||
|
|||
- name: Create the mapping rule |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/mapping_rules.json |
|||
validate_certs: no |
|||
method: POST |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 201 |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 201' |
|||
@ -0,0 +1,51 @@ |
|||
--- |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_create_svc: '{{ "access_token=" ~ threescale_cicd_access_token|urlencode }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_create_svc: '{{ threescale_cicd_tmp_body_create_svc ~ "&" ~ (threescale_cicd_tmp_param.key|urlencode) ~ "=" ~ (threescale_cicd_tmp_param.value|urlencode) }}' |
|||
with_dict: '{{ threescale_cicd_api_service_definition }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_param |
|||
|
|||
- name: Create the service |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services.json |
|||
validate_certs: no |
|||
method: POST |
|||
body: '{{ threescale_cicd_tmp_body_create_svc }}' |
|||
status_code: 201,422 |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 201' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_service_id: '{{ threescale_cicd_tmpresponse.json.service.id }}' |
|||
when: 'threescale_cicd_tmpresponse.status == 201' |
|||
|
|||
- name: Retrieve existing Services from the 3scale Admin Portal |
|||
uri: |
|||
url: "https://{{ inventory_hostname }}/admin/api/services.json?access_token={{ threescale_cicd_access_token|urlencode }}" |
|||
validate_certs: no |
|||
register: threescale_cicd_tmp_allservices |
|||
when: 'threescale_cicd_tmpresponse.status == 422' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_services: '{{ threescale_cicd_tmp_allservices.json|json_query(''services[*].service.system_name'') }}' |
|||
threescale_cicd_existing_services_details: '{{ threescale_cicd_tmp_allservices.json|json_query(''services[].{"system_name": service.system_name, "id": service.id}'') }}' |
|||
when: 'threescale_cicd_tmpresponse.status == 422' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_service_id: '{{ (threescale_cicd_existing_services_details|selectattr(''system_name'', ''equalto'', threescale_cicd_api_system_name)|first)[''id''] }}' |
|||
when: 'threescale_cicd_tmpresponse.status == 422' |
|||
|
|||
- name: Update the service |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}.json |
|||
validate_certs: no |
|||
method: PUT |
|||
body: '{{ threescale_cicd_tmp_body_create_svc }}' |
|||
status_code: 200 |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 200' |
|||
when: 'threescale_cicd_tmpresponse.status == 422' |
|||
@ -0,0 +1,21 @@ |
|||
--- |
|||
- set_fact: |
|||
threescale_cicd_tmp_metrics_to_delete: [] |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_metrics_to_delete: '{{ threescale_cicd_tmp_metrics_to_delete|union([threescale_cicd_tmp_metric.id]) }}' |
|||
with_items: '{{ threescale_cicd_existing_metrics_details }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_metric |
|||
when: 'threescale_cicd_tmp_metric.system_name != "hits" and threescale_cicd_tmp_metric.system_name not in threescale_cicd_api_operations' |
|||
|
|||
- name: Delete the method |
|||
uri: |
|||
url: "https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/metrics/{{ threescale_cicd_metric_id }}/methods/{{ threescale_cicd_tmp_metric }}.json?access_token={{ threescale_cicd_access_token|urlencode }}" |
|||
validate_certs: no |
|||
method: DELETE |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 200' |
|||
with_items: '{{ threescale_cicd_tmp_metrics_to_delete }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_metric |
|||
@ -0,0 +1,126 @@ |
|||
--- |
|||
|
|||
- name: Ensure pre-requisites are met |
|||
assert: |
|||
that: |
|||
- "threescale_cicd_access_token is defined" |
|||
- "threescale_cicd_openapi_file is defined" |
|||
msg: |- |
|||
This module requires at least two variables: |
|||
- threescale_cicd_access_token that contains an Access Token with Read/Write privileges on the 3scale Account Management API. This variable is usually set in your inventory file. |
|||
- threescale_cicd_openapi_file that is the path to the OpenAPI file you want to deploy in 3scale. This variable is usually passed as an extra variable (-e threescale_cicd_openapi_file=...) |
|||
|
|||
- name: Set the threescale_cicd_sso_issuer_endpoint variable from the inventory |
|||
set_fact: |
|||
threescale_cicd_sso_issuer_endpoint: '{{ (hostvars[groups[''sso''][0]].scheme|default(''https'')) ~ ''://'' ~ hostvars[groups[''sso''][0]].client_id ~ '':'' ~ hostvars[groups[''sso''][0]].client_secret ~ ''@'' ~ groups[''sso''][0] ~ ''/auth/realms/'' ~ hostvars[groups[''sso''][0]].realm }}' |
|||
when: 'threescale_cicd_sso_issuer_endpoint is not defined and ''sso'' in groups and groups[''sso''] > 0' |
|||
|
|||
- name: Set the threescale_cicd_apicast_sandbox_endpoint variable from the inventory |
|||
set_fact: |
|||
threescale_cicd_apicast_sandbox_endpoint: '{{ (hostvars[groups[''apicast-sandbox''][0]].scheme|default(''https'')) ~ ''://'' ~ groups[''apicast-sandbox''][0] }}' |
|||
when: 'threescale_cicd_apicast_sandbox_endpoint is not defined and ''apicast-sandbox'' in groups and groups[''apicast-sandbox''] > 0' |
|||
|
|||
- name: Set the threescale_cicd_apicast_production_endpoint variable from the inventory |
|||
set_fact: |
|||
threescale_cicd_apicast_production_endpoint: '{{ (hostvars[groups[''apicast-production''][0]].scheme|default(''https'')) ~ ''://'' ~ groups[''apicast-production''][0] }}' |
|||
when: 'threescale_cicd_apicast_production_endpoint is not defined and ''apicast-production'' in groups and groups[''apicast-production''] > 0' |
|||
|
|||
# Load the API definition from the provided OpenAPI file |
|||
- import_tasks: read_openapi_file.yml |
|||
|
|||
# Retrieve existing services from the 3scale Admin Portal |
|||
- import_tasks: retrieve_existing_services.yml |
|||
|
|||
- name: Compute the service system_name |
|||
set_fact: |
|||
threescale_cicd_api_system_name: '{{ threescale_cicd_api_environment_name ~ "_" ~ threescale_cicd_api_system_name }}' |
|||
when: 'threescale_cicd_api_environment_name is defined' |
|||
|
|||
- debug: |
|||
msg: "Will work on service with system_name = {{ threescale_cicd_api_system_name }}" |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_deployment_type: 'self_managed' |
|||
when: 'threescale_cicd_api_deployment_type is not defined and (threescale_cicd_apicast_sandbox_endpoint is defined or threescale_cicd_apicast_production_endpoint is defined)' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_deployment_type: 'hosted' |
|||
when: 'threescale_cicd_api_deployment_type is not defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_service_definition: |
|||
name: '{{ threescale_cicd_api_name }}' |
|||
deployment_option: '{{ threescale_cicd_api_deployment_type }}' |
|||
system_name: '{{ threescale_cicd_api_system_name }}' |
|||
backend_version: '{{ threescale_cicd_api_backend_version }}' |
|||
|
|||
# Create the service definition |
|||
- import_tasks: create_service.yml |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_credentials_location: '{{ ''headers'' if threescale_cicd_api_security_scheme.in == ''header'' else threescale_cicd_api_security_scheme.in }}' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''apiKey''' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_credentials_location: 'headers' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''oauth2''' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_proxy_definition: |
|||
credentials_location: '{{ threescale_cicd_api_credentials_location }}' |
|||
api_backend: '{{ threescale_cicd_api_backend_scheme ~ ''://'' ~ threescale_cicd_api_backend_hostname }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_proxy_definition: '{{ threescale_cicd_api_proxy_definition|combine({ ''auth_user_key'': threescale_cicd_api_security_scheme.name }) }}' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''apiKey''' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_proxy_definition: '{{ threescale_cicd_api_proxy_definition|combine({ ''sandbox_endpoint'': threescale_cicd_apicast_sandbox_endpoint }) }}' |
|||
when: 'threescale_cicd_apicast_sandbox_endpoint is defined' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_proxy_definition: '{{ threescale_cicd_api_proxy_definition|combine({ ''endpoint'': threescale_cicd_apicast_production_endpoint }) }}' |
|||
when: 'threescale_cicd_apicast_production_endpoint is defined' |
|||
|
|||
# Update the proxy |
|||
- import_tasks: update_proxy.yml |
|||
|
|||
# Update the metrics |
|||
- import_tasks: update_metrics.yml |
|||
|
|||
# Update the mapping rules |
|||
- import_tasks: update_mapping_rules.yml |
|||
|
|||
- name: Get the list of existing application plans |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/application_plans.json?access_token={{ threescale_cicd_access_token|urlencode }} |
|||
validate_certs: no |
|||
register: threescale_cicd_tmpresponse |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_application_plans: '{{ threescale_cicd_tmpresponse.json|json_query(''plans[*].application_plan.system_name'') }}' |
|||
threescale_cicd_existing_application_plans_details: '{{ threescale_cicd_tmpresponse.json|json_query(''plans[].{"system_name": application_plan.system_name, "id": application_plan.id}'') }}' |
|||
|
|||
# Create application plans if needed |
|||
- include_tasks: create_application_plans.yml |
|||
with_items: '{{ threescale_cicd_application_plans|default([]) }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_plan |
|||
|
|||
# Run smoke tests on the staging gateway |
|||
- include_tasks: smoke_tests.yml |
|||
vars: |
|||
threescale_cicd_env: staging |
|||
when: 'threescale_cicd_openapi_smoketest_path is defined and threescale_cicd_application_plans is defined' |
|||
|
|||
# Promote to production |
|||
- import_tasks: promote.yml |
|||
|
|||
# Run smoke tests on the production gateway |
|||
- include_tasks: smoke_tests.yml |
|||
vars: |
|||
threescale_cicd_env: production |
|||
when: 'threescale_cicd_openapi_smoketest_path is defined and threescale_cicd_application_plans is defined' |
|||
|
|||
# Delete the metrics that are not needed anymore |
|||
- import_tasks: delete_unused_metrics.yml |
|||
@ -0,0 +1,32 @@ |
|||
--- |
|||
|
|||
- name: Get the version of the staging proxy definition |
|||
uri: |
|||
url: 'https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/configs/{{ threescale_cicd_staging_environment_name }}/latest.json?access_token={{ threescale_cicd_access_token|urlencode }}' |
|||
validate_certs: no |
|||
register: threescale_cicd_tmpresponse |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_staging_proxy_version: '{{ threescale_cicd_tmpresponse.json.proxy_config.version }}' |
|||
|
|||
- name: Get the version of the production proxy definition |
|||
uri: |
|||
url: 'https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/configs/{{ threescale_cicd_production_environment_name }}/latest.json?access_token={{ threescale_cicd_access_token|urlencode }}' |
|||
validate_certs: no |
|||
register: threescale_cicd_tmpresponse |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_production_proxy_version: '{{ threescale_cicd_tmpresponse.json.proxy_config.version }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_create_svc: 'access_token={{ threescale_cicd_access_token|urlencode }}&to={{ threescale_cicd_production_environment_name|urlencode }}' |
|||
|
|||
- name: Promote to production |
|||
uri: |
|||
url: 'https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/configs/{{ threescale_cicd_staging_environment_name }}/{{ threescale_cicd_tmp_staging_proxy_version }}/promote.json' |
|||
body: '{{ threescale_cicd_tmp_body_create_svc }}' |
|||
status_code: 201 |
|||
validate_certs: no |
|||
method: POST |
|||
register: threescale_cicd_tmpresponse |
|||
when: 'threescale_cicd_tmp_staging_proxy_version != threescale_cicd_tmp_production_proxy_version' |
|||
@ -0,0 +1,143 @@ |
|||
--- |
|||
- name: Parse the OpenAPI file (YAML format) |
|||
set_fact: |
|||
threescale_cicd_openapi_file_content: '{{ lookup(''file'', threescale_cicd_openapi_file) |from_yaml }}' |
|||
when: "threescale_cicd_openapi_file_format|upper == 'YAML'" |
|||
|
|||
- name: Parse the OpenAPI file (JSON format) |
|||
set_fact: |
|||
threescale_cicd_openapi_file_content: '{{ lookup(''file'', threescale_cicd_openapi_file) |from_json }}' |
|||
when: "threescale_cicd_openapi_file_format|upper == 'JSON'" |
|||
|
|||
- name: Extract the OpenAPI format version |
|||
set_fact: |
|||
threescale_cicd_openapi_file_version: '{{ threescale_cicd_openapi_file_content|json_query(''swagger'') }}' |
|||
|
|||
- name: Check the OpenAPI format version |
|||
assert: |
|||
that: |
|||
- "threescale_cicd_openapi_file_version == '2.0'" |
|||
msg: "Currently only the OpenAPI/Swagger 2.0 is handled. If needed, fill an issue or submit a pull request!" |
|||
|
|||
# TODO rewrite this in a more "Ansible compatible" way |
|||
- name: Extract API Methods |
|||
set_fact: |
|||
threescale_cicd_api_name: '{{ threescale_cicd_openapi_file_content.info.title|default("API") }}' |
|||
threescale_cicd_api_basepath: '{{ threescale_cicd_openapi_file_content.basePath|default("") }}' |
|||
threescale_cicd_api_operations: >- |
|||
{% set operations = {} -%} |
|||
{% if 'paths' in threescale_cicd_openapi_file_content -%} |
|||
{% for path, verbs in threescale_cicd_openapi_file_content['paths'].items() -%} |
|||
{% if path.startswith('/') -%} |
|||
{% for verb, method_description in verbs.items() -%} |
|||
{% if verb != '$ref' and verb != 'parameters' -%} |
|||
{% if 'operationId' in method_description -%} |
|||
{% set operation_id = method_description['operationId'] -%} |
|||
{% else -%} |
|||
{% set operation_id = verb.upper() + path -%} |
|||
{% endif -%} |
|||
{% set operation_id = operation_id|regex_replace('[^0-9a-zA-Z_]+', '_') -%} |
|||
{% set operation = { operation_id: { 'path': path, 'verb': verb } } -%} |
|||
{% if 'summary' in method_description -%} |
|||
{% if operation[operation_id].update({ 'friendly_name': method_description.summary }) -%}{% endif -%} |
|||
{% endif -%} |
|||
{% if 'description' in method_description -%} |
|||
{% if operation[operation_id].update({ 'description': method_description.description }) -%}{% endif -%} |
|||
{% endif -%} |
|||
{% if operations.update(operation) -%}{% endif -%} |
|||
{% endif -%} |
|||
{% endfor -%} |
|||
{% endif -%} |
|||
{% endfor -%} |
|||
{% endif -%} |
|||
{{ operations }} |
|||
|
|||
- name: Extract the wanted system_name from OpenAPI |
|||
set_fact: |
|||
threescale_cicd_api_system_name: '{{ threescale_cicd_openapi_file_content.info[''x-threescale-system-name''] }}' |
|||
when: 'threescale_cicd_api_system_name is not defined and ''x-threescale-system-name'' in threescale_cicd_openapi_file_content.info' |
|||
|
|||
- name: Generate a system_name from the API title |
|||
set_fact: |
|||
threescale_cicd_api_system_name: '{{ threescale_cicd_openapi_file_content.info[''title'']|default(''api'')|regex_replace(''[^a-zA-Z0-9_]+'', ''_'') }}' |
|||
when: 'threescale_cicd_api_system_name is not defined' |
|||
|
|||
- name: Extract the security definitions and requirements from OpenAPI |
|||
set_fact: |
|||
threescale_cicd_api_security_requirements: '{{ threescale_cicd_openapi_file_content.security|default({}) }}' |
|||
threescale_cicd_api_security_definitions: '{{ threescale_cicd_openapi_file_content.securityDefinitions|default({}) }}' |
|||
|
|||
- name: Make sure there is one and exactly one security requirement |
|||
assert: |
|||
that: |
|||
- 'threescale_cicd_api_security_requirements|length == 1' |
|||
msg: 'You have {{ threescale_cicd_api_security_requirements|length }} global security requirements. There must be one and only one security requirement.' |
|||
|
|||
- name: Find the security requirement to use |
|||
set_fact: |
|||
threescale_cicd_api_security_scheme: '{{ threescale_cicd_api_security_requirements.keys()[0] }}' |
|||
|
|||
- name: Make sure the requested security definition exists |
|||
assert: |
|||
that: |
|||
- 'threescale_cicd_api_security_scheme in threescale_cicd_api_security_definitions' |
|||
|
|||
- name: Find the security definition to use |
|||
set_fact: |
|||
threescale_cicd_api_security_scheme: '{{ threescale_cicd_api_security_definitions[threescale_cicd_api_security_scheme] }}' |
|||
|
|||
- name: Make sure the security scheme is consistent with 3scale |
|||
assert: |
|||
that: |
|||
- 'threescale_cicd_api_security_scheme.type == ''apiKey'' or (threescale_cicd_api_security_scheme.type == ''oauth2'' and threescale_cicd_sso_issuer_endpoint is defined)' |
|||
|
|||
- name: Find the correct backend_version to use |
|||
set_fact: |
|||
threescale_cicd_api_backend_version: '1' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''apiKey''' |
|||
|
|||
- name: Find the correct backend_version to use |
|||
set_fact: |
|||
threescale_cicd_api_backend_version: 'oauth' |
|||
when: 'threescale_cicd_api_security_scheme.type == ''oauth2''' |
|||
|
|||
- name: Extract the backend hostname from OpenAPI |
|||
set_fact: |
|||
threescale_cicd_api_backend_hostname: '{{ threescale_cicd_openapi_file_content.host }}' |
|||
when: 'threescale_cicd_api_backend_hostname is not defined and ''host'' in threescale_cicd_openapi_file_content' |
|||
|
|||
- name: Extract the backend scheme from OpenAPI |
|||
set_fact: |
|||
threescale_cicd_api_backend_scheme: '{{ threescale_cicd_openapi_file_content.schemes|default(["http"])|first }}' |
|||
when: 'threescale_cicd_api_backend_scheme is not defined' |
|||
|
|||
- assert: |
|||
that: |
|||
- 'threescale_cicd_api_backend_scheme is defined' |
|||
- 'threescale_cicd_api_backend_hostname is defined' |
|||
msg: 'The backend hostname and scheme must either be in the swagger or declared as extra variables (threescale_cicd_api_backend_scheme / threescale_cicd_api_backend_hostname)' |
|||
|
|||
|
|||
- name: Find the smoke-test flagged operation |
|||
set_fact: |
|||
threescale_cicd_openapi_smoketest_operation: '{{ threescale_cicd_openapi_file_content|json_query(''paths.*.get[? "x-threescale-smoketests-operation" ].operationId|[0]'') }}' |
|||
when: 'threescale_cicd_openapi_smoketest_operation is not defined' |
|||
|
|||
- assert: |
|||
that: |
|||
# Operation must exists |
|||
- 'threescale_cicd_openapi_smoketest_operation in threescale_cicd_api_operations' |
|||
# Must be a GET |
|||
- 'threescale_cicd_api_operations[threescale_cicd_openapi_smoketest_operation].verb == ''get''' |
|||
# Must NOT have a placeholder in the path |
|||
- 'threescale_cicd_api_operations[threescale_cicd_openapi_smoketest_operation].path.find("{") == -1' |
|||
msg: "The smoketest operation {{ threescale_cicd_openapi_smoketest_operation }} must be a GET and cannot have a placeholder in its path." |
|||
when: 'threescale_cicd_openapi_smoketest_operation is defined and threescale_cicd_openapi_smoketest_operation|length > 0' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_openapi_smoketest_operation: '{{ threescale_cicd_openapi_smoketest_operation|regex_replace(''[^0-9a-zA-Z_]+'', ''_'') }}' |
|||
when: 'threescale_cicd_openapi_smoketest_operation is defined and threescale_cicd_openapi_smoketest_operation|length > 0' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_openapi_smoketest_path: '{{ threescale_cicd_api_operations[threescale_cicd_openapi_smoketest_operation].path }}' |
|||
when: 'threescale_cicd_openapi_smoketest_operation is defined and threescale_cicd_openapi_smoketest_operation|length > 0' |
|||
@ -0,0 +1,11 @@ |
|||
--- |
|||
|
|||
- name: Retrieve existing ActiveDocs from the 3scale Admin Portal |
|||
uri: |
|||
url: "https://{{ inventory_hostname }}/admin/api/active_docs.json?access_token={{ threescale_cicd_access_token|urlencode }}" |
|||
validate_certs: no |
|||
register: threescale_cicd_tmp_allactivedocs |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_activedocs: '{{ threescale_cicd_tmp_allactivedocs.json|json_query(''api_docs[*].api_doc.system_name'') }}' |
|||
threescale_cicd_existing_activedocs_details: '{{ threescale_cicd_tmp_allactivedocs.json|json_query(''api_docs[].{"system_name": api_doc.system_name, "id": api_doc.id}'') }}' |
|||
@ -0,0 +1,57 @@ |
|||
--- |
|||
|
|||
- import_tasks: create_default_application.yml |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_gateway_endpoint: "" |
|||
|
|||
- name: Try to get the staging gateway url from extra var / inventory |
|||
set_fact: |
|||
threescale_cicd_tmp_gateway_endpoint: '{{ threescale_cicd_apicast_sandbox_endpoint }}' |
|||
when: "threescale_cicd_apicast_sandbox_endpoint is defined and threescale_cicd_env == 'staging'" |
|||
|
|||
- name: Try to get the production gateway url from extra var / inventory |
|||
set_fact: |
|||
threescale_cicd_tmp_gateway_endpoint: '{{ threescale_cicd_apicast_production_endpoint }}' |
|||
when: "threescale_cicd_apicast_production_endpoint is defined and threescale_cicd_env == 'production'" |
|||
|
|||
- name: Get the gateway endpoint from the proxy definition |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy.json?access_token={{ threescale_cicd_access_token|urlencode }} |
|||
validate_certs: no |
|||
method: GET |
|||
register: threescale_cicd_tmpresponse |
|||
when: "threescale_cicd_tmp_gateway_endpoint|length == 0" |
|||
|
|||
- name: Extract the staging gateway endpoint from the proxy definition |
|||
set_fact: |
|||
threescale_cicd_tmp_gateway_endpoint: '{{ threescale_cicd_tmpresponse.json|json_query(''proxy.sandbox_endpoint'') }}' |
|||
when: "threescale_cicd_tmp_gateway_endpoint|length == 0 and threescale_cicd_env == 'staging'" |
|||
|
|||
- name: Extract the production gateway endpoint from the proxy definition |
|||
set_fact: |
|||
threescale_cicd_tmp_gateway_endpoint: '{{ threescale_cicd_tmpresponse.json|json_query(''proxy.sandbox_endpoint'') }}' |
|||
when: "threescale_cicd_tmp_gateway_endpoint|length == 0 and threescale_cicd_env == 'production'" |
|||
|
|||
- set_fact: |
|||
threescale_cicd_openapi_smoketest_querystring: "" |
|||
threescale_cicd_openapi_smoketest_headers: {} |
|||
|
|||
- include_tasks: smoke_tests_apikey.yml |
|||
when: 'threescale_cicd_api_security_scheme.type == ''apiKey''' |
|||
|
|||
- include_tasks: smoke_tests_oauth.yml |
|||
when: 'threescale_cicd_api_security_scheme.type == ''oauth2''' |
|||
|
|||
- debug: |
|||
msg: "Starting a smoke test on '{{ threescale_cicd_tmp_gateway_endpoint }}{{ threescale_cicd_openapi_smoketest_path }}'..." |
|||
|
|||
- name: Running smoke tests ! |
|||
uri: |
|||
url: '{{ threescale_cicd_tmp_gateway_endpoint }}{{ threescale_cicd_openapi_smoketest_path }}{{ threescale_cicd_openapi_smoketest_querystring }}' |
|||
headers: '{{ threescale_cicd_openapi_smoketest_headers }}' |
|||
validate_certs: no |
|||
method: GET |
|||
register: threescale_cicd_tmpresponse |
|||
retries: '{{ threescale_cicd_retries }}' |
|||
delay: '{{ threescale_cicd_delay }}' |
|||
@ -0,0 +1,9 @@ |
|||
--- |
|||
|
|||
- set_fact: |
|||
threescale_cicd_openapi_smoketest_querystring: "?{{ threescale_cicd_api_security_scheme.name|urlencode }}={{ threescale_cicd_default_application_details.user_key }}" |
|||
when: 'threescale_cicd_api_credentials_location == "query"' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_openapi_smoketest_headers: "{{ threescale_cicd_openapi_smoketest_headers|combine({ threescale_cicd_api_security_scheme.name|urlencode: threescale_cicd_default_application_details.user_key}) }}" |
|||
when: 'threescale_cicd_api_credentials_location == "headers"' |
|||
@ -0,0 +1,4 @@ |
|||
--- |
|||
|
|||
- name: TODO |
|||
fail: |
|||
@ -0,0 +1,26 @@ |
|||
--- |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ "access_token=" ~ threescale_cicd_access_token|urlencode }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ threescale_cicd_tmp_body_update_method ~ "&" ~ (threescale_cicd_tmp_param.key|urlencode) ~ "=" ~ (threescale_cicd_tmp_param.value|urlencode) }}' |
|||
with_dict: '{{ threescale_cicd_tmp_wanted_mapping_rules[threescale_cicd_tmp_mapping_rule_to_update] }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_param |
|||
|
|||
- set_fact: |
|||
# Add the metric_id to the payload |
|||
threescale_cicd_tmp_body_update_method: '{{ threescale_cicd_tmp_body_update_method ~ "&" ~ "metric_id=" ~ ((threescale_cicd_existing_metrics_details|selectattr("system_name", "equalto", threescale_cicd_tmp_mapping_rule_to_update)|first).id|urlencode) }}' |
|||
# The ID of the mapping rule to update |
|||
threescale_cicd_tmp_mapping_rule_id: '{{ threescale_cicd_tmp_existing_mapping_rules[threescale_cicd_tmp_mapping_rule_to_update] }}' |
|||
|
|||
- name: Update the mapping rule |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/mapping_rules/{{ threescale_cicd_tmp_mapping_rule_id }}.json |
|||
validate_certs: no |
|||
method: PUT |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 200 |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 200' |
|||
@ -0,0 +1,55 @@ |
|||
--- |
|||
|
|||
- name: Retrieve existing mapping rules from the 3scale Admin Portal |
|||
uri: |
|||
url: "https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/mapping_rules.json?access_token={{ threescale_cicd_access_token|urlencode }}" |
|||
validate_certs: no |
|||
register: threescale_cicd_tmp_allmappingrules |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_mappingrules_details: '{{ threescale_cicd_tmp_allmappingrules.json|json_query(''mapping_rules[].{"metric_id": mapping_rule.metric_id, "id": mapping_rule.id}'') }}' |
|||
threescale_cicd_tmp_wanted_mapping_rules: {} |
|||
threescale_cicd_tmp_existing_mapping_rules: {} |
|||
|
|||
- name: Build a list of our expected/wanted mapping rules |
|||
set_fact: |
|||
threescale_cicd_tmp_wanted_mapping_rules: '{{ threescale_cicd_tmp_wanted_mapping_rules|combine({ threescale_cicd_tmp_operation.key: { "http_method": threescale_cicd_tmp_operation.value.verb.upper(), "pattern": threescale_cicd_tmp_operation.value.path ~ "$", "delta": 1 } }) }}' |
|||
with_dict: '{{ threescale_cicd_api_operations }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_operation |
|||
|
|||
- name: Map metric id to system_name |
|||
set_fact: |
|||
threescale_cicd_tmp_existing_mapping_rules: '{{ threescale_cicd_tmp_existing_mapping_rules|combine({ (threescale_cicd_existing_metrics_details|selectattr("id", "equalto", threescale_cicd_tmp_metric.metric_id)|first).system_name: threescale_cicd_tmp_metric.id}) }}' |
|||
with_items: '{{ threescale_cicd_existing_mappingrules_details }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_metric |
|||
|
|||
- set_fact: |
|||
# create the items that we want but don't have yet |
|||
threescale_cicd_tmp_mapping_rules_to_create: '{{ threescale_cicd_tmp_wanted_mapping_rules.keys()|difference(threescale_cicd_tmp_existing_mapping_rules.keys()) }}' |
|||
# delete the items that we don't want but we have |
|||
threescale_cicd_tmp_mapping_rules_to_delete: '{{ threescale_cicd_tmp_existing_mapping_rules.keys()|difference(threescale_cicd_tmp_wanted_mapping_rules.keys()) }}' |
|||
# update the items that we want and we have |
|||
threescale_cicd_tmp_mapping_rules_to_update: '{{ threescale_cicd_tmp_existing_mapping_rules.keys()|intersect(threescale_cicd_tmp_wanted_mapping_rules.keys()) }}' |
|||
|
|||
- include_tasks: "create_mapping_rule.yml" |
|||
with_items: '{{ threescale_cicd_tmp_mapping_rules_to_create }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_mapping_rule_to_create |
|||
|
|||
- include_tasks: "update_mapping_rule.yml" |
|||
with_items: '{{ threescale_cicd_tmp_mapping_rules_to_update }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_mapping_rule_to_update |
|||
|
|||
- name: Delete the unused mapping rules |
|||
uri: |
|||
url: "https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy/mapping_rules/{{ threescale_cicd_tmp_existing_mapping_rules[threescale_cicd_tmp_mapping_rule_to_delete] }}.json?access_token={{ threescale_cicd_access_token|urlencode }}" |
|||
validate_certs: no |
|||
method: DELETE |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 200' |
|||
with_items: '{{ threescale_cicd_tmp_mapping_rules_to_delete }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_mapping_rule_to_delete |
|||
@ -0,0 +1,43 @@ |
|||
--- |
|||
|
|||
- set_fact: |
|||
threescale_cicd_api_method_definition: |
|||
system_name: '{{ threescale_cicd_tmp_operation.key }}' |
|||
friendly_name: '{{ threescale_cicd_tmp_operation.value.friendly_name|default(threescale_cicd_tmp_operation.key) }}' |
|||
description: '{{ threescale_cicd_tmp_operation.value.description|default('''') }}' |
|||
unit: 'hits' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ "access_token=" ~ threescale_cicd_access_token|urlencode }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_method: '{{ threescale_cicd_tmp_body_update_method ~ "&" ~ (threescale_cicd_tmp_param.key|urlencode) ~ "=" ~ (threescale_cicd_tmp_param.value|urlencode) }}' |
|||
with_dict: '{{ threescale_cicd_api_method_definition }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_param |
|||
|
|||
- name: Update the method |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/metrics/{{ threescale_cicd_metric_id }}/methods/{{ (threescale_cicd_existing_metrics_details|selectattr('system_name', 'equalto', threescale_cicd_tmp_operation.key)|first).id }}.json |
|||
validate_certs: no |
|||
method: PATCH |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 200' |
|||
when: 'threescale_cicd_tmp_operation.key in threescale_cicd_existing_metrics' |
|||
|
|||
- name: Create the method |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/metrics/{{ threescale_cicd_metric_id }}/methods.json |
|||
validate_certs: no |
|||
method: POST |
|||
body: '{{ threescale_cicd_tmp_body_update_method }}' |
|||
status_code: 201 |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 201' |
|||
when: 'threescale_cicd_tmp_operation.key not in threescale_cicd_existing_metrics' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_metrics: '{{ threescale_cicd_existing_metrics|union([ threescale_cicd_tmp_operation.key ]) }}' |
|||
threescale_cicd_existing_metrics_details: '{{ threescale_cicd_existing_metrics_details|union([ { "system_name": threescale_cicd_tmp_operation.key, "id": threescale_cicd_tmpresponse.json|json_query("method.id") } ]) }}' |
|||
when: 'threescale_cicd_tmp_operation.key not in threescale_cicd_existing_metrics' |
|||
@ -0,0 +1,20 @@ |
|||
--- |
|||
|
|||
- name: Retrieve existing metrics from the 3scale Admin Portal |
|||
uri: |
|||
url: "https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/metrics.json?access_token={{ threescale_cicd_access_token|urlencode }}" |
|||
validate_certs: no |
|||
register: threescale_cicd_tmp_allmetrics |
|||
|
|||
- set_fact: |
|||
threescale_cicd_existing_metrics: '{{ threescale_cicd_tmp_allmetrics.json|json_query(''metrics[*].metric.system_name'') }}' |
|||
threescale_cicd_existing_metrics_details: '{{ threescale_cicd_tmp_allmetrics.json|json_query(''metrics[].{"system_name": metric.system_name, "id": metric.id}'') }}' |
|||
|
|||
- name: Find the "hits" metric id |
|||
set_fact: |
|||
threescale_cicd_metric_id: '{{ (threescale_cicd_existing_metrics_details|selectattr(''system_name'', ''equalto'', ''hits'')|first).id }}' |
|||
|
|||
- include_tasks: "update_method.yml" |
|||
with_dict: '{{ threescale_cicd_api_operations }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_operation |
|||
@ -0,0 +1,19 @@ |
|||
--- |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_proxy: '{{ "access_token=" ~ threescale_cicd_access_token|urlencode }}' |
|||
|
|||
- set_fact: |
|||
threescale_cicd_tmp_body_update_proxy: '{{ threescale_cicd_tmp_body_update_proxy ~ "&" ~ (threescale_cicd_tmp_param.key|urlencode) ~ "=" ~ (threescale_cicd_tmp_param.value|urlencode) }}' |
|||
with_dict: '{{ threescale_cicd_api_proxy_definition }}' |
|||
loop_control: |
|||
loop_var: threescale_cicd_tmp_param |
|||
|
|||
- name: Update the proxy |
|||
uri: |
|||
url: https://{{ inventory_hostname }}/admin/api/services/{{ threescale_cicd_api_service_id }}/proxy.json |
|||
validate_certs: no |
|||
method: PATCH |
|||
body: '{{ threescale_cicd_tmp_body_update_proxy }}' |
|||
register: threescale_cicd_tmpresponse |
|||
changed_when: 'threescale_cicd_tmpresponse.status == 200' |
|||
Loading…
Reference in new issue