Skip to content

Commit 35deeb3

Browse files
authored
FIX RDS scenario with region and storage query (#100)
FIX RDS scenario with region and storage query FIX RDS scenario with region and storage query Reviewed-by: Vladimir Hasko <[email protected]> Reviewed-by: lboka
1 parent 125ddd5 commit 35deeb3

File tree

3 files changed

+179
-117
lines changed

3 files changed

+179
-117
lines changed

playbooks/files/latest_rds_version.py

-31
This file was deleted.

playbooks/files/rds_preconditions.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#!/usr/bin/env python3
2+
import sys
3+
import openstack
4+
import json
5+
from otcextensions import sdk
6+
7+
8+
def find_latest_version(datastores):
9+
max_version = max(datastores, key=lambda x: float(x["name"]))
10+
return max_version["name"]
11+
12+
13+
def find_smallest_flavor(flavors, az):
14+
# Initialize variables to track the smallest flavor
15+
smallest_flavor = None
16+
smallest_vcpus = float('inf')
17+
18+
for flavor in flavors:
19+
vcpus = int(flavor['vcpus'])
20+
az_status = flavor.get('az_status', {})
21+
22+
# Check if the flavor has the desired az
23+
if az_status.get(az) == "normal":
24+
# Compare the vcpus to find the smallest
25+
if vcpus < smallest_vcpus:
26+
smallest_vcpus = vcpus
27+
smallest_flavor = flavor['spec_code']
28+
group_type = flavor['group_type']
29+
30+
return smallest_flavor, group_type
31+
32+
33+
if __name__ == "__main__":
34+
try:
35+
if len(sys.argv) != 5:
36+
print(json.dumps({"error": "Invalid arguments passed"}))
37+
sys.exit(1)
38+
39+
# Replace placeholders with actual values
40+
database_name = sys.argv[1]
41+
db_versions = json.loads(sys.argv[2])
42+
flavors = json.loads(sys.argv[3])
43+
az = sys.argv[4]
44+
45+
latest_version = find_latest_version(db_versions)
46+
smallest_flavor, group_type = find_smallest_flavor(flavors, az)
47+
48+
# Establish a connection using your OpenStack profile
49+
conn = openstack.connect()
50+
sdk.register_otc_extensions(conn)
51+
52+
# Retrieve region name
53+
region_name = conn.config.region_name
54+
55+
storage_types = list(conn.rdsv3.storage_types(
56+
datastore_name=database_name,
57+
version_name=latest_version
58+
))
59+
60+
# Initialize storage_type variable
61+
storage_type = None
62+
63+
# Iterate over storage types in data1
64+
for storage in storage_types:
65+
if group_type in storage["support_compute_group_type"]:
66+
storage_type = storage["name"]
67+
if storage_type == "COMMON":
68+
continue
69+
break # Exit the loop after finding the first match
70+
71+
# Output the result as JSON
72+
print(
73+
json.dumps(
74+
{
75+
"region": region_name,
76+
"storage_type": storage_type,
77+
"latest_version": latest_version,
78+
"smallest_flavor": smallest_flavor,
79+
}
80+
)
81+
)
82+
83+
except Exception as e:
84+
# Always return JSON even in case of errors
85+
print(json.dumps({"error": str(e)}))
86+
sys.exit(1)

playbooks/scenario44_rds_instance.yaml

+93-86
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,12 @@
44
hosts: localhost
55
vars:
66
prefix: rds-
7-
volume_type: "ultrahigh"
7+
test_router_name: "apimon-test-rds-router"
8+
test_network_name: "apimon-test-rds-network"
9+
test_subnet_name: "apimon-test-rds-subnet"
10+
test_security_group_name: "apimon-test-rds-sg"
811

912
tasks:
10-
# Random selection between MySQL and PostgreSQL db engine
11-
- name: Random selection of DB type
12-
set_fact:
13-
db_type: "{{ ['mysql', 'postgresql'] | random }}"
14-
15-
# Query all present versions of previously selected DB engine
16-
- name: Get datastore info
17-
opentelekomcloud.cloud.rds_datastore_info:
18-
datastore: "{{ db_type }}"
19-
register: versions
20-
21-
- name: debug datastores
22-
debug:
23-
var: versions.rds_datastores
24-
25-
- name: Run Python script to find the latest version
26-
script: "latest_rds_version.py '{{ versions.rds_datastores | to_nice_json }}'"
27-
args:
28-
executable: python3
29-
register: latest_version_output
30-
31-
- name: Get the latest version of DB
32-
set_fact:
33-
db_version: "{{ latest_version_output.stdout }}"
34-
35-
- debug:
36-
msg: "DB type is {{ db_type }} version {{ db_version }}"
37-
3813
# Set random ID of the run
3914
- name: Set random ID of the run
4015
set_fact:
@@ -48,32 +23,80 @@
4823
# Set all neccessary names combine with prefix
4924
- set_fact:
5025
test_rds_name: "{{ prefix }}"
51-
test_router_name: "{{ ('vpc_'+ prefix + '-router')}}"
52-
test_subnet_name: "{{ ('vpc_'+ prefix + '-subnet')}}"
53-
test_network_name: "{{ ('vpc_'+ prefix + '-network')}}"
54-
test_security_group_name: "{{ (prefix + '-sg') }}"
5526
password: "{{ ('Test8*' + prefix)[:20] }}" # Ensure the password is within 20 characters
5627

28+
# Query all available Availability zones
29+
- name: Get Availability zones
30+
opentelekomcloud.cloud.availability_zone_info:
31+
register: azs
32+
33+
# Random selection of AZ
34+
- name: Get a random availability zone name
35+
set_fact:
36+
random_az: "{{ azs.availability_zones | map(attribute='name') | list | random }}"
37+
38+
# Random selection between MySQL and PostgreSQL db engine
39+
- name: Random selection of DB type
40+
set_fact:
41+
db_type: "{{ ['mysql', 'postgresql'] | random }}"
42+
43+
# Query all present versions of previously selected DB engine
44+
- name: Get datastore info
45+
opentelekomcloud.cloud.rds_datastore_info:
46+
datastore: "{{ db_type }}"
47+
register: versions
5748

5849
# Query all flavoers for specific DB engine
5950
- name: Get info about choosen type of DB
6051
opentelekomcloud.cloud.rds_flavor_info:
61-
datastore: "{{ db_type }}"
62-
instance_mode: "ha"
52+
datastore: "{{ db_type }}"
53+
instance_mode: "single"
6354
register: rds_flavors
6455

65-
# Print the first flavor in the query
66-
- name: debug
67-
ansible.builtin.debug:
68-
msg: "{{ rds_flavors.rds_flavors[0].name }}"
69-
70-
- debug:
71-
msg: "Using prefix {{ prefix }}"
72-
56+
# Run python script to get Region, Storage type and Latest version of DB engine
57+
- name: Run Python script to find the latest version
58+
script: >
59+
{{ playbook_dir }}/files/rds_preconditions.py
60+
'{{ db_type }}'
61+
'{{ versions.rds_datastores | to_nice_json }}'
62+
'{{ rds_flavors.rds_flavors | to_nice_json }}'
63+
'{{ random_az }}'
64+
args:
65+
executable: python3
66+
register: script_output
67+
68+
- name: Parse JSON output from script
69+
set_fact:
70+
script_vars: "{{ script_output.stdout | from_json }}"
7371

72+
- name: Set region, storage_type, and latest_version
73+
set_fact:
74+
region: "{{ script_vars.region }}"
75+
storage_type: "{{ script_vars.storage_type }}"
76+
latest_version: "{{ script_vars.latest_version }}"
77+
smallest_flavor: "{{ script_vars.smallest_flavor }}"
78+
79+
- name: Display region and storage_type
80+
debug:
81+
msg:
82+
- "Prefix: {{ prefix }}"
83+
- "Region: {{ region }}"
84+
- "AZ": "{{ random_az }}"
85+
- "Storage Type: {{ storage_type }}"
86+
- "DB Type: {{ db_type }}"
87+
- "Latest vesion: {{ latest_version }}"
88+
- "Smallest flavor: {{ smallest_flavor }}"
89+
90+
7491
- block:
75-
# Create VPC and SUBNET
76-
- name: Create VPC (Router + Net + Subnet)
92+
# Check if the VPC (Router + Network + Subnet) exists
93+
- name: Check if Network exists
94+
openstack.cloud.networks_info:
95+
name: "{{ test_network_name }}"
96+
register: network_check
97+
98+
# Create VPC and Subnet only if the network doesn't exist
99+
- name: Create VPC (Router + Net + Subnet) if it doesn't exist
77100
include_role:
78101
name: opentelekomcloud.vpc
79102
vars:
@@ -82,37 +105,37 @@
82105
subnet_name: "{{ test_subnet_name }}"
83106
state: present
84107

85-
# Create Security Group
86-
- name: Create SecurityGroup
108+
# Check if the Security Group exists
109+
- name: Check if Security Group exists
110+
openstack.cloud.security_group_info:
111+
name: "{{ test_security_group_name }}"
112+
register: sg_check
113+
114+
# Create Security Group only if it doesn't exist
115+
- name: Create Security Group if it doesn't exist
87116
openstack.cloud.security_group:
88117
name: "{{ test_security_group_name }}"
89118
description: RDS test SG created by APImon
90119

91-
# Query all available Availability zones
92-
- name: Get Availability zones
93-
opentelekomcloud.cloud.availability_zone_info:
94-
# name: "{{ region }}"
95-
register: azs
96-
97120
# Create RDS instance MySQL
98121
- name: Create RDS instance MySQL
99122
when: db_type == "mysql"
100123
opentelekomcloud.cloud.rds_instance:
101124
name: "{{ test_rds_name }}"
102125
state: present
103-
availability_zone: "{{ azs['availability_zones'][0]['name'] }},{{ azs['availability_zones'][1]['name'] }}"
126+
availability_zone: "{{ random_az }}"
104127
datastore_type: "{{ db_type }}"
105-
datastore_version: "{{ db_version }}"
106-
flavor: "{{ rds_flavors.rds_flavors[0].name }}"
107-
ha_mode: "async"
128+
datastore_version: "{{ latest_version }}"
129+
flavor: "{{ smallest_flavor }}"
108130
router: "{{ test_router_name }}"
109131
network: "{{ test_network_name }}"
110132
security_group: "{{ test_security_group_name }}"
111133
password: "{{ password }}"
112-
volume_type: "{{ volume_type }}"
134+
volume_type: "{{ storage_type }}"
135+
region: "{{ region }}"
113136
volume_size: 40
114-
backup_keepdays: 1
115-
backup_timeframe: "02:00-03:00"
137+
backup_keepdays: 0
138+
# backup_timeframe: "02:00-03:00"
116139
wait: true
117140
timeout: 777
118141
register: rds_mysql
@@ -130,19 +153,19 @@
130153
opentelekomcloud.cloud.rds_instance:
131154
name: "{{ test_rds_name }}"
132155
state: present
133-
availability_zone: "{{ azs['availability_zones'][0]['name'] }},{{ azs['availability_zones'][1]['name'] }}"
156+
availability_zone: "{{ random_az }}"
134157
datastore_type: "{{ db_type }}"
135-
datastore_version: "{{ db_version }}"
136-
flavor: "{{ rds_flavors.rds_flavors[0].name }}"
137-
ha_mode: "async"
158+
datastore_version: "{{ latest_version }}"
159+
flavor: "{{ smallest_flavor }}"
138160
router: "{{ test_router_name }}"
139161
network: "{{ test_network_name }}"
140162
security_group: "{{ test_security_group_name }}"
141163
password: "{{ password }}"
142-
volume_type: "{{ volume_type }}"
164+
volume_type: "{{ storage_type }}"
165+
region: "{{ region }}"
143166
volume_size: 40
144-
backup_keepdays: 1
145-
backup_timeframe: "02:00-03:00"
167+
backup_keepdays: 0
168+
# backup_timeframe: "02:00-03:00"
146169
wait: true
147170
timeout: 777
148171
register: rds_pg
@@ -165,7 +188,7 @@
165188
name: "{{ rds.instance.id }}"
166189

167190

168-
# Querying RDS backup info. You can use any of specified attributes, together or separately.
191+
# Querying RDS backup info
169192
- name: Get RDS backup info
170193
opentelekomcloud.cloud.rds_backup_info:
171194
instance: "{{ rds.instance.id }}"
@@ -194,21 +217,5 @@
194217
tags:
195218
- 'service=rds'
196219
- "metric=delete_rds_mysql"
197-
198-
# Delete VPC and SUBNET
199-
- name: Delete VPC
200-
include_role:
201-
name: opentelekomcloud.vpc
202-
vars:
203-
router_name: "{{ test_router_name }}"
204-
network_name: "{{ test_network_name }}"
205-
subnet_name: "{{ test_subnet_name }}"
206-
state: absent
207-
208-
# Delete Security Group
209-
- name: Delete SecurityGroup
210-
openstack.cloud.security_group:
211-
state: "absent"
212-
name: "{{ test_security_group_name }}"
213-
214-
ignore_errors: true
220+
221+
ignore_errors: true

0 commit comments

Comments
 (0)