Skip to content

Commit 3cccab1

Browse files
committedDec 10, 2021
all the files for provisioning vm through terraform in rail environment
using files with Power.Control.Plane.Test@ibm.com as the test user We typically want to create the vm, record the specs, delete the vm. The state file will remain even when the VM the deleted. This will be used to generate the vcr from refresher_spec.rb
1 parent a0f3d7b commit 3cccab1

File tree

13 files changed

+36845
-1670
lines changed

13 files changed

+36845
-1670
lines changed
 

‎.gitignore

+7
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@
1111
.rubocop-*
1212
/bundler.d/*
1313
!/bundler.d/.keep
14+
/config/secrets.yml
1415
/config/settings.local.yml
1516
/config/settings/*.local.yml
1617
/config/environments/*.local.yml
1718
/spec/manageiq
19+
20+
/lib/tasks_private/terraform/terraform.tfstate*
21+
/lib/tasks_private/terraform/*.log
22+
/lib/tasks_private/terraform/.terraform
23+
/lib/tasks_private/terraform/.terraform*
24+

‎.yamllint

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
ignore: |
33
/vendor/**
44
/spec/manageiq/**
5+
/spec/vcr_cassettes/**
6+
/spec/models/manageiq/providers/ibm_power_vc/cloud_manager/state.yml
57

68
extends: relaxed
79

‎config/secrets.defaults.yml

+2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ test:
44
hostname: powervc.local
55
user_id: user
66
password: password
7+
image: image
8+
network: network
79
ibm_power_vc:
810
<<: *ibm_power_vc_defaults

‎lib/tasks/README.md

-20
This file was deleted.

‎lib/tasks_private/terraform/main.tf

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
terraform {
2+
required_version = ">= 0.14.0"
3+
required_providers {
4+
openstack = {
5+
source = "terraform-provider-openstack/openstack"
6+
}
7+
}
8+
}
9+
10+
data "openstack_images_image_v2" "rhel" {
11+
name = "${var.openstack_image}"
12+
}
13+
14+
data "openstack_networking_network_v2" "network" {
15+
name = "${var.openstack_network}"
16+
}
17+
18+
data "openstack_compute_flavor_v2" "flavor" {
19+
name = "${var.openstack_flavor}"
20+
}
21+
22+
23+
data "openstack_identity_project_v3" "project" {
24+
name = "${var.openstack_tenant_name}"
25+
}
26+
27+
data "openstack_compute_instance_v2" "miq-test-vm" {
28+
id = "${openstack_compute_instance_v2.miq-testvm.id}"
29+
}
30+
31+
resource "openstack_compute_instance_v2" "miq-testvm" {
32+
name = "miq-testvm"
33+
image_id = data.openstack_images_image_v2.rhel.id
34+
flavor_id = data.openstack_compute_flavor_v2.flavor.id
35+
network {
36+
uuid = data.openstack_networking_network_v2.network.id
37+
}
38+
}
39+
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
provider "openstack" {
2+
user_name = "${var.openstack_user_name}"
3+
tenant_name = "${var.openstack_tenant_name}"
4+
password = "${var.openstack_password}"
5+
auth_url = "${var.openstack_auth_url}"
6+
domain_name = "default"
7+
insecure = true
8+
}
+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
require "json"
2+
require 'yaml'
3+
require 'logger'
4+
require 'ruby-terraform'
5+
6+
namespace :provision do
7+
desc "check terraform is installed"
8+
task :check => :environment do
9+
system("command -v terraform > /dev/null") or raise("install terraform to provision powervc vm")
10+
end
11+
12+
desc "provision a vm"
13+
task :apply => :check do
14+
cdir = ENV['cwd'] || Dir.pwd
15+
tdir = __dir__
16+
config = setup(cdir, tdir)
17+
plan(config)
18+
apply(cdir, tdir)
19+
end
20+
21+
desc "delete a vm"
22+
task :destroy => :check do
23+
cdir = ENV['cwd'] || Dir.pwd
24+
tdir = __dir__
25+
config = setup(cdir, tdir)
26+
destroy(cdir, config)
27+
end
28+
29+
def setup(cdir, tdir)
30+
config = YAML.safe_load(File.read(File.join(cdir, "config/secrets.yml")))
31+
ENV['PATH'] = "#{ENV['PATH']}:#{tdir}"
32+
Dir.chdir(tdir)
33+
34+
log_file = File.open('ruby_terraform.log', 'a')
35+
RubyTerraform.configure do |tconfig|
36+
tconfig.stdout = log_file
37+
tconfig.stderr = log_file
38+
end
39+
RubyTerraform.init
40+
config
41+
end
42+
43+
def plan(config)
44+
RubyTerraform.plan(
45+
:out => 'terraform.tfplan',
46+
:var_file => 'terraform.tfvars',
47+
:auto_approve => true,
48+
:vars => {
49+
:openstack_auth_url => URI::HTTPS.build(:host => config["test"]["ibm_power_vc"]["hostname"], :port => 5000, :path => "/v3").to_s,
50+
:openstack_user_name => config["test"]["ibm_power_vc"]["user_id"],
51+
:openstack_password => config["test"]["ibm_power_vc"]["password"],
52+
:openstack_image => config["test"]["ibm_power_vc"]["image"],
53+
:openstack_network => config["test"]["ibm_power_vc"]["network"]
54+
}
55+
)
56+
end
57+
58+
def apply(cdir, tdir)
59+
RubyTerraform.apply(
60+
:plan => 'terraform.tfplan',
61+
:auto_approve => true
62+
)
63+
jfile = File.open(File.join(tdir, "terraform.tfstate"))
64+
data = JSON.parse(jfile.read)
65+
outfile = File.join(cdir, "spec/models/manageiq/providers/ibm_power_vc/cloud_manager/state.yml")
66+
File.write(outfile, data.to_yaml)
67+
end
68+
69+
def destroy(cdir, config)
70+
RubyTerraform.destroy(
71+
:var_file => 'terraform.tfvars',
72+
:auto_approve => true,
73+
:vars => {
74+
:openstack_auth_url => URI::HTTPS.build(:host => config["test"]["ibm_power_vc"]["hostname"], :port => 5000, :path => "/v3").to_s,
75+
:openstack_user_name => config["test"]["ibm_power_vc"]["user_id"],
76+
:openstack_password => config["test"]["ibm_power_vc"]["password"],
77+
:openstack_image => config["test"]["ibm_power_vc"]["image"],
78+
:openstack_network => config["test"]["ibm_power_vc"]["network"],
79+
}
80+
)
81+
end
82+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
openstack_tenant_name = "ibm-default"
2+
openstack_domain_name = "default"
3+
openstack_network = "icp-2231"
4+
openstack_image = "rhel8.4-2021-05-24-ppc64le"
5+
openstack_flavor = "small"
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
variable "openstack_user_name" {}
2+
variable "openstack_tenant_name" {}
3+
variable "openstack_password" {}
4+
variable "openstack_auth_url" {}
5+
variable "openstack_domain_name" {}
6+
variable "openstack_image" {}
7+
variable "openstack_network" {}
8+
variable "openstack_flavor" {}

‎manageiq-providers-ibm_power_vc.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ Gem::Specification.new do |spec|
1919
spec.require_paths = ["lib"]
2020

2121
spec.add_development_dependency "manageiq-style"
22+
spec.add_development_dependency "ruby-terraform"
2223
spec.add_development_dependency "simplecov"
2324
end

‎spec/models/manageiq/providers/ibm_power_vc/cloud_manager/refresher_spec.rb

+53-35
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,23 @@
22
let(:zone) { EvmSpecHelper.create_guid_miq_server_zone.last }
33
let(:ems) { FactoryBot.create(:ems_ibm_power_vc_with_vcr_authentication, :zone => zone) }
44

5+
specs = YAML.load_file(File.join(__dir__, 'state.yml'))
6+
specs['resources'].each do |key, _value|
7+
case key['type']
8+
when 'openstack_compute_flavor_v2'
9+
let(:flavorid) { key['instances'][0]['attributes']['id'] }
10+
when 'openstack_identity_project_v3'
11+
let(:tenantid) { key['instances'][0]['attributes']['id'] }
12+
when 'openstack_compute_instance_v2'
13+
let(:instid) { key['instances'][0]['attributes']['id'] }
14+
let(:azone) { key['instances'][0]['attributes']['availability_zone'] }
15+
when 'openstack_images_image_v2'
16+
let(:imageid) { key['instances'][0]['attributes']['id'] }
17+
when 'openstack_networking_network_v2'
18+
let(:networkid) { key['instances'][0]['attributes']['id'] }
19+
end
20+
end
21+
522
describe "#refresh" do
623
context "full refresh" do
724
it "Performs a full refresh" do
@@ -21,66 +38,67 @@ def assert_ems
2138
expect(ems.last_refresh_error).to be_nil
2239
expect(ems.last_refresh_date).not_to be_nil
2340

24-
expect(ems.availability_zones.count).to eq(3)
25-
expect(ems.cloud_tenants.count).to eq(1)
26-
expect(ems.flavors.count).to eq(12)
27-
expect(ems.vms.count).to eq(4)
41+
expect(ems.cloud_tenants.count).to be > 1
42+
expect(ems.availability_zones.count).to be > 2
43+
expect(ems.flavors.count).to be > 2
44+
expect(ems.vms.count).to be > 1
2845
end
2946

3047
def assert_specific_availability_zone
31-
az = ems.availability_zones.find_by(:ems_ref => "Default Group")
48+
az = ems.availability_zones.find_by(:ems_ref => azone)
3249
expect(az).to have_attributes(
33-
:name => "Default Group",
34-
:ems_ref => "Default Group",
50+
:name => azone,
51+
:ems_ref => azone,
3552
:type => "ManageIQ::Providers::IbmPowerVc::CloudManager::AvailabilityZone",
3653
:provider_services_supported => ["compute"]
3754
)
3855
end
3956

4057
def assert_specific_cloud_tenant
41-
cloud_tenant = ems.cloud_tenants.find_by(:ems_ref => "676b8977322946c0ab4700d7b908db5b")
58+
cloud_tenant = ems.cloud_tenants.find_by(:ems_ref => tenantid)
4259
expect(cloud_tenant).to have_attributes(
4360
:name => "ibm-default",
4461
:description => "IBM Default Tenant",
4562
:enabled => true,
46-
:ems_ref => "676b8977322946c0ab4700d7b908db5b",
63+
:ems_ref => tenantid
4764
# TODO: :type => "ManageIQ::Providers::IbmPowerVc::CloudManager::CloudTenant"
4865
)
4966
end
5067

5168
def assert_specific_flavor
52-
flavor = ems.flavors.find_by(:ems_ref => "4c7b250adb349d84f638aec9c76f6eba")
69+
flavor = ems.flavors.find_by(:ems_ref => flavorid)
5370
expect(flavor).to have_attributes(
54-
:name => "4c7b250adb349d84f638aec9c76f6eba",
55-
:description => "1 CPUs, 4 GB RAM, 100 GB Root Disk",
56-
:cpus => 1,
57-
:cpu_cores => nil,
58-
:memory => 4.gigabytes,
59-
:ems_ref => "4c7b250adb349d84f638aec9c76f6eba",
60-
:type => "ManageIQ::Providers::IbmPowerVc::CloudManager::Flavor",
61-
:root_disk_size => 100.gigabytes,
62-
:swap_disk_size => 0,
63-
:publicly_available => false
71+
:name => "small",
72+
:cpu_total_cores => 2,
73+
:cpu_cores_per_socket => nil,
74+
:memory => 8_589_934_592,
75+
:ems_ref => flavorid,
76+
:type => "ManageIQ::Providers::IbmPowerVc::CloudManager::Flavor",
77+
:ephemeral_disk_size => 0,
78+
:ephemeral_disk_count => 0,
79+
:root_disk_size => 0,
80+
:swap_disk_size => 0,
81+
:publicly_available => true,
82+
:cpu_sockets => 1
6483
)
6584
end
6685

6786
def assert_specific_vm
68-
vm = ems.vms.find_by(:ems_ref => "42420bf6-e08e-4360-85b0-4dea6e80344f")
87+
vm = ems.vms.find_by(:ems_ref => instid)
6988
expect(vm).to have_attributes(
70-
:vendor => "ibm_power_vc",
71-
:name => "RHEL82_100GB-test",
72-
:description => nil,
73-
:location => "unknown",
74-
:uid_ems => "42420bf6-e08e-4360-85b0-4dea6e80344f",
75-
:connection_state => "connected",
76-
:type => "ManageIQ::Providers::IbmPowerVc::CloudManager::Vm",
77-
:ems_ref => "42420bf6-e08e-4360-85b0-4dea6e80344f",
78-
:flavor => ems.flavors.find_by(:ems_ref => "4c7b250adb349d84f638aec9c76f6eba"),
79-
:availability_zone => ems.availability_zones.find_by(:ems_ref => "Default Group"),
80-
:cloud => true,
81-
:cloud_tenant => ems.cloud_tenants.find_by(:ems_ref => "676b8977322946c0ab4700d7b908db5b"),
82-
:raw_power_state => "ACTIVE",
83-
:power_state => "on"
89+
:vendor => "ibm_power_vc",
90+
:name => "miq-testvm",
91+
:description => nil,
92+
:location => "unknown",
93+
:uid_ems => instid,
94+
:connection_state => "connected",
95+
:type => "ManageIQ::Providers::IbmPowerVc::CloudManager::Vm",
96+
:ems_ref => instid,
97+
:flavor => ems.flavors.find_by(:ems_ref => flavorid),
98+
:cloud => true,
99+
:cloud_tenant => ems.cloud_tenants.find_by(:ems_ref => tenantid),
100+
:raw_power_state => "ACTIVE",
101+
:power_state => "on"
84102
)
85103
end
86104

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
---
2+
version: 4
3+
terraform_version: 1.0.11
4+
serial: 15
5+
lineage: cc482302-e12e-e3b9-074b-13f8e88ae75b
6+
outputs: {}
7+
resources:
8+
- mode: data
9+
type: openstack_compute_flavor_v2
10+
name: flavor
11+
provider: provider["registry.terraform.io/terraform-provider-openstack/openstack"]
12+
instances:
13+
- schema_version: 0
14+
attributes:
15+
disk: 0
16+
extra_specs:
17+
powervm:availability_priority: '127'
18+
powervm:dedicated_proc: 'false'
19+
powervm:max_mem: '10240'
20+
powervm:max_proc_units: '2'
21+
powervm:max_vcpu: '2'
22+
powervm:min_mem: '4096'
23+
powervm:min_proc_units: '0.1'
24+
powervm:min_vcpu: '1'
25+
powervm:proc_units: '1'
26+
powervm:shared_weight: '128'
27+
powervm:uncapped: 'true'
28+
flavor_id: 5a356c6f-88d7-4c15-9407-af55c5196ceb
29+
id: 5a356c6f-88d7-4c15-9407-af55c5196ceb
30+
is_public: true
31+
min_disk:
32+
min_ram:
33+
name: small
34+
ram: 8192
35+
region:
36+
rx_tx_factor: 1
37+
swap: 0
38+
vcpus: 2
39+
sensitive_attributes: []
40+
- mode: data
41+
type: openstack_compute_instance_v2
42+
name: miq-test-vm
43+
provider: provider["registry.terraform.io/terraform-provider-openstack/openstack"]
44+
instances:
45+
- schema_version: 0
46+
attributes:
47+
access_ip_v4: 9.47.87.64
48+
access_ip_v6: ''
49+
availability_zone: dual-vscsi
50+
flavor_id: 5a356c6f-88d7-4c15-9407-af55c5196ceb
51+
flavor_name: small
52+
id: 9423752b-cd1f-485b-b620-bcbe9cb4a430
53+
image_id: 6d9e7fc7-ae10-463c-b3bf-14ee6ff3647a
54+
image_name: rhel8.4-2021-05-24-ppc64le
55+
key_pair: ''
56+
metadata:
57+
move_pin_vm: 'false'
58+
original_host: 900922G_ZZ40007
59+
name: miq-testvm
60+
network:
61+
- fixed_ip_v4: 9.47.87.64
62+
fixed_ip_v6: ''
63+
mac: fa:7c:43:f9:a7:20
64+
name: ICP-2231
65+
port: ''
66+
uuid: ''
67+
power_state: active
68+
region: ''
69+
security_groups: []
70+
tags: []
71+
user_data:
72+
sensitive_attributes: []
73+
- mode: data
74+
type: openstack_identity_project_v3
75+
name: project
76+
provider: provider["registry.terraform.io/terraform-provider-openstack/openstack"]
77+
instances:
78+
- schema_version: 0
79+
attributes:
80+
description: IBM Default Tenant
81+
domain_id: default
82+
enabled: true
83+
id: 5e3ab887763e4015b5d6c68a194f971b
84+
is_domain: false
85+
name: ibm-default
86+
parent_id: default
87+
region:
88+
tags: []
89+
sensitive_attributes: []
90+
- mode: data
91+
type: openstack_images_image_v2
92+
name: rhel
93+
provider: provider["registry.terraform.io/terraform-provider-openstack/openstack"]
94+
instances:
95+
- schema_version: 0
96+
attributes:
97+
checksum: d41d8cd98f00b204e9800998ecf8427e
98+
container_format: bare
99+
created_at: '2021-05-24T11:11:49Z'
100+
disk_format: raw
101+
file: "/v2/images/6d9e7fc7-ae10-463c-b3bf-14ee6ff3647a/file"
102+
hidden: false
103+
id: 6d9e7fc7-ae10-463c-b3bf-14ee6ff3647a
104+
member_status:
105+
metadata: {}
106+
min_disk_gb: 1
107+
min_ram_mb: 0
108+
most_recent: false
109+
name: rhel8.4-2021-05-24-ppc64le
110+
owner: 5e3ab887763e4015b5d6c68a194f971b
111+
properties:
112+
protected: false
113+
region: ''
114+
schema: "/v2/schemas/image"
115+
size_bytes: 0
116+
size_max:
117+
size_min:
118+
sort_direction: asc
119+
sort_key: name
120+
tag:
121+
tags: []
122+
updated_at: '2021-05-25T05:57:25Z'
123+
visibility: public
124+
sensitive_attributes: []
125+
- mode: data
126+
type: openstack_networking_network_v2
127+
name: network
128+
provider: provider["registry.terraform.io/terraform-provider-openstack/openstack"]
129+
instances:
130+
- schema_version: 0
131+
attributes:
132+
admin_state_up: 'true'
133+
all_tags: []
134+
availability_zone_hints: []
135+
description: ''
136+
dns_domain: ''
137+
external: false
138+
id: f07a85c1-7997-49af-9103-29954a3160dd
139+
matching_subnet_cidr:
140+
mtu: 1500
141+
name: ICP-2231
142+
network_id:
143+
region: ''
144+
shared: 'false'
145+
status:
146+
subnets:
147+
- 9afdf9f4-8ee7-43e6-98b3-398a13fec13a
148+
tags:
149+
tenant_id: 0cb66eac4dbb42fba3a4455eb30e73fc
150+
transparent_vlan: false
151+
sensitive_attributes: []
152+
- mode: managed
153+
type: openstack_compute_instance_v2
154+
name: miq-testvm
155+
provider: provider["registry.terraform.io/terraform-provider-openstack/openstack"]
156+
instances:
157+
- schema_version: 0
158+
attributes:
159+
access_ip_v4: 9.47.87.64
160+
access_ip_v6: ''
161+
admin_pass:
162+
all_metadata:
163+
move_pin_vm: 'false'
164+
original_host: 900922G_ZZ40007
165+
all_tags: []
166+
availability_zone: dual-vscsi
167+
availability_zone_hints:
168+
block_device: []
169+
config_drive:
170+
flavor_id: 5a356c6f-88d7-4c15-9407-af55c5196ceb
171+
flavor_name: small
172+
floating_ip:
173+
force_delete: false
174+
id: 9423752b-cd1f-485b-b620-bcbe9cb4a430
175+
image_id: 6d9e7fc7-ae10-463c-b3bf-14ee6ff3647a
176+
image_name: rhel8.4-2021-05-24-ppc64le
177+
key_pair: ''
178+
metadata:
179+
name: miq-testvm
180+
network:
181+
- access_network: false
182+
fixed_ip_v4: 9.47.87.64
183+
fixed_ip_v6: ''
184+
floating_ip: ''
185+
mac: fa:7c:43:f9:a7:20
186+
name: ICP-2231
187+
port: ''
188+
uuid: f07a85c1-7997-49af-9103-29954a3160dd
189+
network_mode:
190+
personality: []
191+
power_state: active
192+
region: ''
193+
scheduler_hints: []
194+
security_groups: []
195+
stop_before_destroy: false
196+
tags:
197+
timeouts:
198+
user_data:
199+
vendor_options: []
200+
volume: []
201+
sensitive_attributes: []
202+
private: eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInVwZGF0ZSI6MTgwMDAwMDAwMDAwMH19
203+
dependencies:
204+
- data.openstack_compute_flavor_v2.flavor
205+
- data.openstack_images_image_v2.rhel
206+
- data.openstack_networking_network_v2.network

‎spec/vcr_cassettes/manageiq/providers/ibm_power_vc/cloud_manager/refresher.yml

+36,432-1,615
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.