egon 0.4.8 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MGNhYmJkNjMxMWQ0ZWVlOWVjMTQxNDI5Y2ZiNWI2OTZlYWZjMjZlYQ==
4
+ NjY5YTQ1NjU5ZjNkZTU0Nzg3NzExMTQ5NjI5YzRmNzNmN2Y3OTYxNA==
5
5
  data.tar.gz: !binary |-
6
- MGJjODRiZjVjYzE3ZGZhZDc4YWNkNTQzMGJlOGNjNjk1MzAwZTg3MQ==
6
+ YzM2MjEyMTI0ZmI1MDZkN2ZkZTliYmQ0Y2Q3NGQ0YjlkOGUxMjQzYQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZDE3ZjFiNjJlODMwM2ZlZmM4ZjdmMWY5ZWIxNjcyNjA0MmM0Mjc1ZDFjOTZh
10
- MGY2NDllMjQ0NDE4YTY1ZDI1NzMwMjQxZDliMjEzZjQ2NWVmYTRhMDZhYzZh
11
- ODdiZWQwNzI3NzFjYWYwOTliOTAyNTQ5NWFjYzM4MzdhYTBlNGI=
9
+ MWJmMjQyMmIwYjVlODY2MzNmMzk2ZDZlOGFhMTcxYjVkOTM0ODg1NDQwMjJl
10
+ OWRiNzBjOGZmNzdmNDVkZThiYmJhNmI3YWM2MWM3N2NiZjRmNDllOTEyMzk4
11
+ Mjc0Y2U0NGZhYmU2M2RlOTJkOWMzNGRmMzhiOTdiM2QwYWVkN2U=
12
12
  data.tar.gz: !binary |-
13
- MDQwNGQ4Yjk1ZmUyNTBmNGI0ZjRjNTk3NTUxOTQ2NTBlODMwZGNhNzY2ODdh
14
- MWE3MjM5MWUzZTVkYTc4NzdiNjVjODU0NmU0OTU1YmQzZjQyMGU1ZGJhMjRh
15
- MTQ2NjE5NWU3ZjE3NzY4ZTdlYTI0ZWUwNjY5NzUwYWE5ZjczNTA=
13
+ MmYwODFlNzA0ZGUyNTQyNWQyY2JiNzcxNTNhMWYwMjYxZDFjN2ExZDY3ZTcy
14
+ OWEyMmMwYTM3YzEwMGRiM2I2MmYxYWM1YTQxZjg2Mjc2YmI4ZmQ1ODJlZmYy
15
+ ZDYyMWQ5MDJmZTgyNjI5Yjk1ZDJlMzIxODA0ZmE0MWYyZWJiODU=
data/Gemfile.lock ADDED
@@ -0,0 +1,144 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ egon (0.4.4)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ CFPropertyList (2.3.1)
10
+ builder (3.2.2)
11
+ diff-lcs (1.2.5)
12
+ excon (0.45.3)
13
+ fission (0.5.0)
14
+ CFPropertyList (~> 2.2)
15
+ fog (1.36.0)
16
+ fog-atmos
17
+ fog-aws (~> 0.0)
18
+ fog-brightbox (~> 0.4)
19
+ fog-core (~> 1.30)
20
+ fog-ecloud
21
+ fog-google (>= 0.0.2)
22
+ fog-json
23
+ fog-local
24
+ fog-powerdns (>= 0.1.1)
25
+ fog-profitbricks
26
+ fog-radosgw (>= 0.0.2)
27
+ fog-riakcs
28
+ fog-sakuracloud (>= 0.0.4)
29
+ fog-serverlove
30
+ fog-softlayer
31
+ fog-storm_on_demand
32
+ fog-terremark
33
+ fog-vmfusion
34
+ fog-voxel
35
+ fog-xml (~> 0.1.1)
36
+ ipaddress (~> 0.5)
37
+ nokogiri (~> 1.5, >= 1.5.11)
38
+ fog-atmos (0.1.0)
39
+ fog-core
40
+ fog-xml
41
+ fog-aws (0.4.0)
42
+ fog-core (~> 1.27)
43
+ fog-json (~> 1.0)
44
+ fog-xml (~> 0.1)
45
+ ipaddress (~> 0.8)
46
+ fog-brightbox (0.7.1)
47
+ fog-core (~> 1.22)
48
+ fog-json
49
+ inflecto (~> 0.0.2)
50
+ fog-core (1.30.0)
51
+ builder
52
+ excon (~> 0.45)
53
+ formatador (~> 0.2)
54
+ mime-types
55
+ net-scp (~> 1.1)
56
+ net-ssh (>= 2.1.3)
57
+ fog-ecloud (0.1.2)
58
+ fog-core
59
+ fog-xml
60
+ fog-google (0.0.5)
61
+ fog-core
62
+ fog-json
63
+ fog-xml
64
+ fog-json (1.0.2)
65
+ fog-core (~> 1.0)
66
+ multi_json (~> 1.10)
67
+ fog-local (0.2.1)
68
+ fog-core (~> 1.27)
69
+ fog-powerdns (0.1.1)
70
+ fog-core (~> 1.27)
71
+ fog-json (~> 1.0)
72
+ fog-xml (~> 0.1)
73
+ fog-profitbricks (0.0.3)
74
+ fog-core
75
+ fog-xml
76
+ nokogiri
77
+ fog-radosgw (0.0.4)
78
+ fog-core (>= 1.21.0)
79
+ fog-json
80
+ fog-xml (>= 0.0.1)
81
+ fog-riakcs (0.1.0)
82
+ fog-core
83
+ fog-json
84
+ fog-xml
85
+ fog-sakuracloud (1.0.1)
86
+ fog-core
87
+ fog-json
88
+ fog-serverlove (0.1.2)
89
+ fog-core
90
+ fog-json
91
+ fog-softlayer (0.4.6)
92
+ fog-core
93
+ fog-json
94
+ fog-storm_on_demand (0.1.1)
95
+ fog-core
96
+ fog-json
97
+ fog-terremark (0.1.0)
98
+ fog-core
99
+ fog-xml
100
+ fog-vmfusion (0.1.0)
101
+ fission
102
+ fog-core
103
+ fog-voxel (0.1.0)
104
+ fog-core
105
+ fog-xml
106
+ fog-xml (0.1.2)
107
+ fog-core
108
+ nokogiri (~> 1.5, >= 1.5.11)
109
+ formatador (0.2.5)
110
+ inflecto (0.0.2)
111
+ ipaddress (0.8.0)
112
+ mime-types (2.6.1)
113
+ mini_portile (0.6.2)
114
+ multi_json (1.11.0)
115
+ net-scp (1.2.1)
116
+ net-ssh (>= 2.6.5)
117
+ net-ssh (2.9.2)
118
+ nokogiri (1.6.6.2)
119
+ mini_portile (~> 0.6.0)
120
+ rake (10.4.2)
121
+ rspec (3.2.0)
122
+ rspec-core (~> 3.2.0)
123
+ rspec-expectations (~> 3.2.0)
124
+ rspec-mocks (~> 3.2.0)
125
+ rspec-core (3.2.3)
126
+ rspec-support (~> 3.2.0)
127
+ rspec-expectations (3.2.1)
128
+ diff-lcs (>= 1.2.0, < 2.0)
129
+ rspec-support (~> 3.2.0)
130
+ rspec-mocks (3.2.1)
131
+ diff-lcs (>= 1.2.0, < 2.0)
132
+ rspec-support (~> 3.2.0)
133
+ rspec-support (3.2.2)
134
+
135
+ PLATFORMS
136
+ ruby
137
+
138
+ DEPENDENCIES
139
+ bundler (~> 1.7)
140
+ egon!
141
+ fog (~> 1.31.0)
142
+ net-ssh (~> 2.9.2)
143
+ rake (~> 10.0)
144
+ rspec (~> 3.2.0)
@@ -1,17 +1,56 @@
1
1
  #!/bin/bash
2
2
 
3
+ OVERCLOUD_NAME=${1:-overcloud}
4
+ TEMPLATE_DIR=`mktemp -d`
5
+ DEFAULT_PARAMETERS=overcloud-resource-registry-puppet.yaml
6
+ USER_PARAMETERS=environments/deployment_parameters.yaml
7
+
3
8
  source /home/stack/stackrc
4
- source /home/stack/tripleo-overcloud-passwords
5
9
 
6
- KEYSTONE_IP=`heat output-show overcloud KeystoneAdminVip | tr -d '"'`
7
- PUBLIC_IP=`heat output-show overcloud PublicVip | tr -d '"'`
8
- OVERCLOUD_ENDPOINT=`heat output-show overcloud KeystoneURL`
9
- OVERCLOUD_IP=`python -c "from six.moves.urllib.parse import urlparse; print urlparse($OVERCLOUD_ENDPOINT).hostname"`
10
- OVERCLOUD_ENDPOINT=`echo $OVERCLOUD_ENDPOINT | tr -d '"'`
10
+ cd $TEMPLATE_DIR
11
+ swift download overcloud $DEFAULT_PARAMETERS
12
+ swift download overcloud $USER_PARAMETERS
13
+
14
+ function parameter_value_from_file {
15
+ PARAM=$1
16
+ FILE=$2
17
+ PARAM_GREP="^ ${PARAM}: "
18
+ PARAM_VALUE_UNPARSED=`grep "$PARAM_GREP" $FILE`
19
+ PARAM_VALUE=${PARAM_VALUE_UNPARSED#*:}
20
+ echo $PARAM_VALUE
21
+ }
22
+
23
+ function parameter_value {
24
+ PARAM=$1
25
+ PARAM_VALUE=`parameter_value_from_file $PARAM $TEMPLATE_DIR/$USER_PARAMETERS`
26
+
27
+ if [ -z "$PARAM_VALUE" ]; then
28
+ PARAM_VALUE=`parameter_value_from_file $PARAM $TEMPLATE_DIR/$DEFAULT_PARAMETERS`
29
+ fi
30
+
31
+ echo $PARAM_VALUE
32
+ }
33
+
34
+ KEYSTONE_IP=`heat output-show $OVERCLOUD_NAME KeystoneAdminVip | tr -d '"'`
35
+ PUBLIC_IP=`heat output-show $OVERCLOUD_NAME PublicVip | tr -d '"'`
36
+ KEYSTONE_URL=`heat output-show $OVERCLOUD_NAME KeystoneURL`
37
+ OVERCLOUD_IP=`python -c "from six.moves.urllib.parse import urlparse; print urlparse($KEYSTONE_URL).hostname"`
38
+ OVERCLOUD_ENDPOINT=`echo $KEYSTONE_URL | tr -d '"'`
11
39
 
12
40
  # set it to the same as overcloud_ip if empty
13
41
  [ -z "$KEYSTONE_IP" ] && KEYSTONE_IP=$OVERCLOUD_IP
14
42
 
43
+ # get service passwords
44
+ OVERCLOUD_ADMIN_PASSWORD=`parameter_value AdminPassword`
45
+ OVERCLOUD_ADMIN_TOKEN=`parameter_value AdminToken`
46
+ OVERCLOUD_CEILOMETER_PASSWORD=`parameter_value CeilometerPassword`
47
+ OVERCLOUD_CINDER_PASSWORD=`parameter_value CinderPassword`
48
+ OVERCLOUD_GLANCE_PASSWORD=`parameter_value GlancePassword`
49
+ OVERCLOUD_HEAT_PASSWORD=`parameter_value HeatPassword`
50
+ OVERCLOUD_NEUTRON_PASSWORD=`parameter_value NeutronPassword`
51
+ OVERCLOUD_NOVA_PASSWORD=`parameter_value NovaPassword`
52
+ OVERCLOUD_SWIFT_PASSWORD=`parameter_value SwiftPassword`
53
+
15
54
  # Write overcloudrc
16
55
  su - stack -c cat > /home/stack/overcloudrc << EOF
17
56
  export NOVA_VERSION=1.1
@@ -50,7 +89,6 @@ cat > $ENDPOINTS_FILE << EOF
50
89
  "heat": {"password": "$OVERCLOUD_HEAT_PASSWORD"},
51
90
  "neutron": {"password": "$OVERCLOUD_NEUTRON_PASSWORD"},
52
91
  "nova": {"password": "$OVERCLOUD_NOVA_PASSWORD"},
53
- "novav3": {"password": "$OVERCLOUD_NOVA_PASSWORD"},
54
92
  "swift": {"password": "$OVERCLOUD_SWIFT_PASSWORD"},
55
93
  "horizon": {
56
94
  "port": "80",
@@ -62,4 +100,7 @@ EOF
62
100
 
63
101
  # set up the endpoints
64
102
  setup-endpoints -s $ENDPOINTS_FILE -r regionOne
103
+
104
+ # cleanup
65
105
  rm -f $ENDPOINTS_FILE
106
+ rm -rf $TEMPLATE_DIR
@@ -3,5 +3,5 @@ require 'egon/undercloud/commands'
3
3
  require 'egon/undercloud/installer'
4
4
 
5
5
  installer = Egon::Undercloud::Installer.new
6
- installer.install(Egon::Undercloud::Commands.OSP7_no_registration)
6
+ installer.install(Egon::Undercloud::Commands.OSP8_no_registration)
7
7
  installer.check_ports
@@ -15,7 +15,7 @@ SATELLITE_ACTIVATION_KEY = ARGV[5]
15
15
 
16
16
  connection = Egon::Undercloud::SSHConnection.new(SSH_HOST, SSH_USER, SSH_PASSWORD)
17
17
  installer = Egon::Undercloud::Installer.new(connection)
18
- installer.install(Egon::Undercloud::Commands.OSP7_satellite(SATELLITE_URL, SATELLITE_ORG, SATELLITE_ACTIVATION_KEY))
18
+ installer.install(Egon::Undercloud::Commands.OSP8_satellite(SATELLITE_URL, SATELLITE_ORG, SATELLITE_ACTIVATION_KEY))
19
19
  while !installer.completed?
20
20
  sleep 1
21
21
  end
@@ -13,7 +13,7 @@ RHSM_POOL_ID = ARGV[5]
13
13
 
14
14
  connection = Egon::Undercloud::SSHConnection.new(SSH_HOST, SSH_USER, SSH_PASSWORD)
15
15
  installer = Egon::Undercloud::Installer.new(connection)
16
- installer.install(Egon::Undercloud::Commands.OSP7_vanilla_rhel(RHSM_USER, RHSM_PASSWORD, RHSM_POOL_ID))
16
+ installer.install(Egon::Undercloud::Commands.OSP8_vanilla_rhel(RHSM_USER, RHSM_PASSWORD, RHSM_POOL_ID))
17
17
  while !installer.completed?
18
18
  sleep 1
19
19
  end
data/egon.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.add_development_dependency "bundler", "~> 1.7"
26
26
  s.add_development_dependency "rake", "~> 10.0"
27
- s.add_development_dependency "fog", "~> 1.31.0"
27
+ s.add_development_dependency "fog", "~> 1.36.0"
28
28
  s.add_development_dependency "net-ssh", "~> 2.9.2"
29
29
  s.add_development_dependency "rspec", "~> 3.2.0"
30
30
  end
@@ -1,81 +1,157 @@
1
1
  module Overcloud
2
2
  module Deployment
3
+
4
+ # BASE PLAN ACTIONS
5
+
6
+ def list_plans
7
+ uri = "#{base_tripleo_api_url}/plans"
8
+ response = Fog::Core::Connection.new(uri, false).request({
9
+ :expects => 200,
10
+ :headers => {'Content-Type' => 'application/json',
11
+ 'Accept' => 'application/json',
12
+ 'X-Auth-Token' => auth_token},
13
+ :method => 'GET'
14
+ })
15
+ body = Fog::JSON.decode(response.body)
16
+ body['plans']
17
+ end
3
18
 
4
19
  def get_plan(plan_name)
5
- service('Planning').plans.find_by_name(plan_name)
20
+ uri = "#{base_tripleo_api_url}/plans/#{plan_name}"
21
+ response = Fog::Core::Connection.new(uri, false).request({
22
+ :expects => 200,
23
+ :headers => {'Content-Type' => 'application/json',
24
+ 'Accept' => 'application/json',
25
+ 'X-Auth-Token' => auth_token},
26
+ :method => 'GET'
27
+ })
28
+ body = Fog::JSON.decode(response.body)
29
+ body['plan']
30
+ end
31
+
32
+ def deploy_plan(plan_name)
33
+ plan = get_plan(plan_name)
34
+
35
+ # ensure that nodes are in correct state
36
+ for node in list_nodes
37
+ node.set_provision_state('provide') if node.provision_state == 'manageable'
38
+ end
39
+
40
+ uri = "#{base_tripleo_api_url}/plans/#{plan_name}/deploy"
41
+ response = Fog::Core::Connection.new(uri, false).request({
42
+ :expects => 202,
43
+ :headers => {'Content-Type' => 'application/json',
44
+ 'Accept' => 'application/json',
45
+ 'X-Auth-Token' => auth_token},
46
+ :method => 'PUT'
47
+ })
48
+ end
49
+
50
+ ## PLAN PARAMETER METHODS
51
+
52
+ def get_plan_parameters(plan_name)
53
+ uri = "#{base_tripleo_api_url}/plans/#{plan_name}/parameters"
54
+ response = Fog::Core::Connection.new(uri, false).request({
55
+ :expects => 200,
56
+ :headers => {'Content-Type' => 'application/json',
57
+ 'Accept' => 'application/json',
58
+ 'X-Auth-Token' => auth_token},
59
+ :method => 'GET',
60
+ :read_timeout => 360,
61
+ })
62
+ body = Fog::JSON.decode(response.body)
63
+ body['parameters']['Parameters']
6
64
  end
7
65
 
8
66
  def get_plan_parameter_value(plan_name, parameter_name)
9
- params = get_plan(plan_name).parameters
10
- param = params.find{|param| param["name"] == parameter_name }
11
- if param
12
- param["value"]
67
+ parameters = get_plan_parameters(plan_name)
68
+ if parameters.key?(parameter_name)
69
+ parameters[parameter_name]["Default"]
13
70
  else
14
71
  nil
15
72
  end
16
73
  end
17
74
 
18
75
  def edit_plan_parameters(plan_name, parameters)
19
- get_plan(plan_name).patch(:parameters => parameters)
76
+ uri = "#{base_tripleo_api_url}/plans/#{plan_name}/parameters"
77
+ response = Fog::Core::Connection.new(uri, false).request({
78
+ :expects => 200,
79
+ :headers => {'Content-Type' => 'application/json',
80
+ 'Accept' => 'application/json',
81
+ 'X-Auth-Token' => auth_token},
82
+ :method => 'PATCH',
83
+ :body => Fog::JSON.encode(parameters),
84
+ :read_timeout => 360,
85
+ :write_timeout => 360,
86
+ })
20
87
  end
21
88
 
22
89
  def edit_plan_deployment_role_count(plan_name, role_name, count)
23
- parameter = {"name" => role_name + "-1::count", "value" => count.to_s}
24
- edit_plan_parameters(plan_name, [parameter])
90
+ parameters = {role_name + "Count" => count.to_s}
91
+ edit_plan_parameters(plan_name, parameters)
25
92
  end
26
93
 
27
- def edit_plan_deployment_role_image(plan_name, role_name, image_uuid)
28
- parameter = {"name" => role_name + "-1::Image", "value" => image_uuid}
29
- edit_plan_parameters([parameter])
94
+ def edit_plan_deployment_role_flavor(plan_name, role_name, flavor_name)
95
+ if role_name == 'Controller'
96
+ flavor_parameter = 'OvercloudControlFlavor'
97
+ else
98
+ flavor_parameter = 'Overcloud' + role_name + 'Flavor'
99
+ end
100
+ parameters = {flavor_parameter => flavor_name}
101
+ edit_plan_parameters(plan_name, parameters)
30
102
  end
31
103
 
32
- def edit_plan_deployment_role_flavor(plan_name, role_name, flavor_name)
33
- parameter = {"name" => role_name + "-1::Flavor", "value" => flavor_name}
34
- edit_plan_parameters(plan_name, [parameter])
104
+ ## PLAN ENVIRONMENT ACTIONS
105
+
106
+ def get_plan_environments(plan_name)
107
+ uri = "#{base_tripleo_api_url}/plans/#{plan_name}/environments"
108
+ response = Fog::Core::Connection.new(uri, false).request({
109
+ :expects => 200,
110
+ :headers => {'Content-Type' => 'application/json',
111
+ 'Accept' => 'application/json',
112
+ 'X-Auth-Token' => auth_token},
113
+ :method => 'GET',
114
+ :read_timeout => 360,
115
+ })
116
+ body = Fog::JSON.decode(response.body)
117
+ body['environments']
35
118
  end
36
119
 
37
- def deploy_plan(plan_name)
38
- plan = get_plan(plan_name)
120
+ def edit_plan_environments(plan_name, environments)
121
+ uri = "#{base_tripleo_api_url}/plans/#{plan_name}/environments"
122
+ response = Fog::Core::Connection.new(uri, false).request({
123
+ :expects => 200,
124
+ :headers => {'Content-Type' => 'application/json',
125
+ 'Accept' => 'application/json',
126
+ 'X-Auth-Token' => auth_token},
127
+ :method => 'PATCH',
128
+ :body => Fog::JSON.encode(environments),
129
+ :read_timeout => 360,
130
+ :write_timeout => 360,
131
+ })
132
+ end
39
133
 
40
- # ensure that nodes are in correct state
41
- for node in list_nodes
42
- node.set_provision_state('provide') if node.provision_state == 'manageable'
43
- end
134
+ ## MISCELLANEOUS PLAN ACTIONS
44
135
 
45
- # assign all unassigned roles; make sure their count is 0
46
- default_flavor = list_flavors[0]
47
- for role in list_deployment_roles
48
- flavor_parameter_name = role.name + "-1::Flavor"
49
- flavor_parameter_value = get_plan_parameter_value(plan_name, flavor_parameter_name)
50
- if flavor_parameter_value.to_s == 'baremetal'
51
- edit_plan_deployment_role_count(plan_name, role.name, 0)
52
- edit_plan_deployment_role_flavor(plan_name, role.name, default_flavor.name)
53
- end
54
- end
136
+ def get_plan_deployment_roles(plan_name)
137
+ # temporarily hard-coded until API adds role function
138
+ return ['Controller', 'Compute', 'BlockStorage', 'ObjectStorage',
139
+ 'CephStorage']
55
140
 
56
- # temporary workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1212740
57
- templates = Hash[plan.provider_resource_templates]
58
- templates.keys.each do |template_path|
59
- if template_path.index('puppet/') == 0
60
- new_template_path = template_path.sub('puppet/','')
61
- templates[new_template_path] = templates[template_path]
62
- end
63
- end
64
- templates["hieradata/RedHat.yaml"] = templates["puppet/hieradata/RedHat.yaml"]
65
- templates["yum_update.sh"] = templates["extraconfig/tasks/yum_update.sh"]
66
-
67
- stack_parameters = {
68
- :stack_name => plan.name,
69
- :template => plan.master_template,
70
- :environment => plan.environment,
71
- :files => templates,
72
- :password => @password,
73
- :timeout_mins => 60,
74
- :disable_rollback => true
75
- }
76
- service('Orchestration').stacks.new.save(stack_parameters)
141
+ #uri = "#{base_tripleo_api_url}/plans/#{plan_name}/roles"
142
+ #response = Fog::Core::Connection.new(uri, false).request({
143
+ # :expects => 200,
144
+ # :headers => {'Content-Type' => 'application/json',
145
+ # 'Accept' => 'application/json',
146
+ # 'X-Auth-Token' => auth_token},
147
+ # :method => 'GET'
148
+ # })
149
+ #body = Fog::JSON.decode(response.body)
150
+ #body['roles']
77
151
  end
78
152
 
153
+ ## HEAT ACTIONS
154
+
79
155
  def list_stacks
80
156
  service('Orchestration').stacks.all
81
157
  end
@@ -83,6 +159,16 @@ module Overcloud
83
159
  def get_stack_by_name(stack_name)
84
160
  list_stacks.find{|s| s.stack_name == stack_name}
85
161
  end
86
-
162
+
163
+ def delete_stack(overcloud)
164
+ service('Orchestration').delete_stack(overcloud)
165
+ end
166
+
167
+ private
168
+
169
+ def base_tripleo_api_url
170
+ return "http://#{@auth_url}:8585/v1"
171
+ end
172
+
87
173
  end
88
174
  end
@@ -9,6 +9,14 @@ module Overcloud
9
9
  service('Baremetal').nodes.details
10
10
  end
11
11
 
12
+ def list_ports
13
+ service('Baremetal').ports.all
14
+ end
15
+
16
+ def list_ports_detailed
17
+ service('Baremetal').ports.details
18
+ end
19
+
12
20
  def get_node(node_id)
13
21
  service('Baremetal').nodes.find_by_uuid(node_id)
14
22
  end
@@ -77,7 +85,22 @@ module Overcloud
77
85
  end
78
86
 
79
87
  def delete_node(node_id)
80
- service('Baremetal').nodes.destroy(node_id)
88
+ begin
89
+ node = get_node(node_id)
90
+ if node.power_state == 'power on' && node.provision_state != 'active'
91
+ node.set_power_state('power off')
92
+ retries = 15
93
+ while retries > 0 && node.power_state != 'power off' do
94
+ sleep(2)
95
+ retries -= 1
96
+ end
97
+ end
98
+ service('Baremetal').nodes.destroy(node_id)
99
+ rescue Fog::Compute::OpenStack::NotFound => e
100
+ "Node Not Found"
101
+ rescue Excon::Errors::Conflict, Excon::Errors::BadRequest => e
102
+ JSON.parse(JSON.parse(e.response.body)["error_message"])["faultstring"].split("\n").first
103
+ end
81
104
  end
82
105
 
83
106
  ## THESE METHODS ARE TEMPORARY UNTIL IRONIC-DISCOVERD IS ADDED TO
@@ -85,7 +108,6 @@ module Overcloud
85
108
 
86
109
  def introspect_node(node_uuid)
87
110
  uri = "http://#{@auth_url}:5050/v1/introspection/#{node_uuid}"
88
- auth_token = service('Baremetal').instance_variable_get(:@auth_token)
89
111
  response = Fog::Core::Connection.new(uri, false).request({
90
112
  :expects => 202,
91
113
  :headers => {'Content-Type' => 'application/json',
@@ -97,7 +119,6 @@ module Overcloud
97
119
 
98
120
  def introspect_node_status(node_uuid)
99
121
  uri = "http://#{@auth_url}:5050/v1/introspection/#{node_uuid}"
100
- auth_token = service('Baremetal').instance_variable_get(:@auth_token)
101
122
  response = Fog::Core::Connection.new(uri, false).request({
102
123
  :expects => 200,
103
124
  :headers => {'Content-Type' => 'application/json',
@@ -1,6 +1,5 @@
1
1
  require 'fog'
2
2
  require_relative 'undercloud_handle/deployment'
3
- require_relative 'undercloud_handle/deployment_role'
4
3
  require_relative 'undercloud_handle/flavor'
5
4
  require_relative 'undercloud_handle/image'
6
5
  require_relative 'undercloud_handle/node'
@@ -9,7 +8,6 @@ module Overcloud
9
8
  class UndercloudHandle
10
9
 
11
10
  include Overcloud::Deployment
12
- include Overcloud::DeploymentRole
13
11
  include Overcloud::Flavor
14
12
  include Overcloud::Image
15
13
  include Overcloud::Node
@@ -37,6 +35,10 @@ module Overcloud
37
35
  end
38
36
  return Fog.const_get(service_name).new(fog_parameters)
39
37
  end
40
-
38
+
39
+ def auth_token
40
+ service('Baremetal').instance_variable_get(:@auth_token)
41
+ end
42
+
41
43
  end
42
44
  end
@@ -3,12 +3,14 @@ module Egon
3
3
  module Undercloud
4
4
  class Commands
5
5
 
6
+ ## OSP7
7
+
6
8
  def self.OSP7_satellite(satellite_url, org, activation_key)
7
9
  return "
8
10
  curl -k -O #{satellite_url}/pub/katello-ca-consumer-latest.noarch.rpm
9
11
  sudo yum install -y katello-ca-consumer-latest.noarch.rpm
10
12
  sudo subscription-manager register --org=\"#{org}\" --activationkey=\"#{activation_key}\"
11
- #{self.OSP7_COMMON_no_registration}"
13
+ #{self.OSP7_no_registration}"
12
14
  end
13
15
 
14
16
  def self.OSP7_vanilla_rhel(rhsm_user, rhsm_password, rhsm_pool_id)
@@ -34,7 +36,7 @@ module Egon
34
36
  return OSP7_COMMON
35
37
  end
36
38
 
37
- POST_INSTALL = "
39
+ POST_INSTALL_7 = "
38
40
  source ~/stackrc
39
41
  source ~/tripleo-undercloud-passwords
40
42
 
@@ -235,7 +237,109 @@ module Egon
235
237
  sudo chown $USER: ~/tripleo-undercloud-passwords
236
238
  sudo cp /root/stackrc ~
237
239
  sudo chown $USER: ~/stackrc
238
- #{POST_INSTALL}"
240
+ #{POST_INSTALL_7}"
241
+
242
+ ## OSP8
243
+
244
+ def self.OSP8_satellite(satellite_url, org, activation_key)
245
+ return "
246
+ curl -k -O #{satellite_url}/pub/katello-ca-consumer-latest.noarch.rpm
247
+ sudo yum install -y katello-ca-consumer-latest.noarch.rpm
248
+ sudo subscription-manager register --org=\"#{org}\" --activationkey=\"#{activation_key}\"
249
+ #{self.OSP8_no_registration}"
250
+ end
251
+
252
+ def self.OSP8_vanilla_rhel(rhsm_user, rhsm_password, rhsm_pool_id)
253
+ return "
254
+ sudo subscription-manager register --force --username=\"#{rhsm_user}\" --password=\"#{rhsm_password}\"
255
+ sudo subscription-manager attach --pool=\"#{rhsm_pool_id}\"
256
+ sudo subscription-manager repos --enable=rhel-7-server-rpms \
257
+ --enable=rhel-7-server-optional-rpms --enable=rhel-7-server-extras-rpms \
258
+ --enable=rhel-7-server-openstack-6.0-rpms
259
+ #{self.OSP8_no_registration}"
260
+ end
261
+
262
+ def self.OSP8_no_registration
263
+ return "
264
+ sudo yum install -y python-rdomanager-oscplugin
265
+ if [ ! -f ~/undercloud.conf ]; then
266
+ cp -f /usr/share/instack-undercloud/undercloud.conf.sample ~/undercloud.conf;
267
+ sed -i -- 's/#store_events = false/store_events = true/g' ~/undercloud.conf
268
+ fi
269
+ #{self.OSP8_no_registration_no_packages}"
270
+ end
271
+
272
+ def self.OSP8_no_registration_no_packages
273
+ return OSP8_COMMON
274
+ end
275
+
276
+ POST_INSTALL_8 = "
277
+ sudo setenforce permissive
278
+ source ~/stackrc
279
+
280
+ sudo yum install -y rhosp-director-images
281
+ cd /usr/share/rhosp-director-images
282
+ sudo tar xf ironic-python-agent.tar
283
+ sudo tar xf overcloud-full.tar
284
+ openstack overcloud image upload
285
+ cd ~
286
+
287
+ SUBNET_ID=$(neutron subnet-show '' | awk '$2==\"id\" {print $4}')
288
+ neutron subnet-update $SUBNET_ID --dns-nameserver 192.168.122.1
289
+
290
+ OS_AUTH_URL_ESC=$(sed 's/\\\//\\\\\\//g' <<<\"$OS_AUTH_URL\")
291
+ sudo yum install -y openstack-tripleo-api
292
+ sudo sed -i -- \"s/#auth_strategy = keystone/auth_strategy = noauth/g\" /etc/tripleo/tripleo.conf
293
+ sudo sed -i -- \"s/#password = <None>/password = $OS_PASSWORD/g\" /etc/tripleo/tripleo.conf
294
+ sudo sed -i -- \"s/#auth_url = http:\\/\\/localhost:35357\\/v2.0/auth_url = $OS_AUTH_URL_ESC/g\" /etc/tripleo/tripleo.conf
295
+ sudo sed -i -- \"s/#identity_uri = <None>/identity_uri = $OS_AUTH_URL_ESC/g\" /etc/tripleo/tripleo.conf
296
+ sudo sed -i -- \"s/#admin_user = <None>/admin_user = admin/g\" /etc/tripleo/tripleo.conf
297
+ sudo sed -i -- \"s/#admin_password = <None>/admin_password = $OS_PASSWORD/g\" /etc/tripleo/tripleo.conf
298
+ sudo service openstack-tripleo-api restart
299
+ sudo systemctl enable openstack-tripleo-api
300
+ sudo sed -i -- \"s/max_json_body_size = 1048576/max_json_body_size = 2000000/g\" /etc/heat/heat.conf
301
+ sudo service openstack-heat-api restart
302
+ sudo service openstack-heat-api-cfn restart
303
+ sudo service openstack-heat-engine restart
304
+
305
+ if ! [ $(swift list | grep overcloud) ]; then
306
+
307
+ cp -r /usr/share/openstack-tripleo-heat-templates .
308
+ cp /usr/share/tripleo-api/templates/capabilities-map.yaml openstack-tripleo-heat-templates/.
309
+
310
+ echo ' BlockStorageImage: overcloud-full' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
311
+ echo ' CephStorageImage: overcloud-full' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
312
+ echo ' SwiftStorageImage: overcloud-full' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
313
+ echo ' controllerImage: overcloud-full' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
314
+ echo ' NovaImage: overcloud-full' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
315
+ echo ' CinderPassword: Ma3kfBHqB8FDb2hgJa3sPUAzh' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
316
+ echo ' GlancePassword: EBNnAsWxuzAHfqG8trjjMDsCu' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
317
+ echo ' SwiftPassword: KfqyTxGtQ9y7P6yCK2m7n2xMz' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
318
+ echo ' NeutronMetadataProxySharedSecret: A2kEkckqfAzxcdVEJtnWj4hGP' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
319
+ echo ' HeatPassword: BEhHu9UhKd4ZnQwmtCUFsZrh4' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
320
+ echo ' HeatStackDomainAdminPassword: fpRbkRneNJVutk4QqK8xYR3Qm' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
321
+ echo ' NeutronPassword: 9n3AfD2b9zfBrmmBHwHyc7TgV' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
322
+ echo ' AdminToken: CuVyGZqfwZdbTwUaX9euaPGaA' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
323
+ echo ' SwiftHashSuffix: JN273288Xt3JTBqnE8RBsrYze' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
324
+ echo ' CeilometerMeteringSecret: Hvkf9Rzz6tHF6UVsErPjCE3uM' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
325
+ echo ' SnmpdReadonlyUserPassword: password' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
326
+ echo ' CeilometerPassword: 2zgV6yAE2d3JTskTnBUsvzDf4' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
327
+ echo ' NovaPassword: QCn7EHTkMMrJHH7Upp6txzUYX' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
328
+ echo ' RedisPassword: Rhq8Fd7eEIoPP821Ui' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
329
+ echo ' HAProxyStatsPassword: veLYjyhxgs7GtQuKXF' >> openstack-tripleo-heat-templates/overcloud-resource-registry-puppet.yaml
330
+
331
+ echo 'parameter_defaults:' >> openstack-tripleo-heat-templates/environments/deployment_parameters.yaml
332
+ echo ' AdminPassword: changeme' >> openstack-tripleo-heat-templates/environments/deployment_parameters.yaml
333
+
334
+ sudo tripleo-plan-create --config-file /etc/tripleo/tripleo.conf
335
+ fi
336
+ "
337
+
338
+ OSP8_COMMON = "
339
+ sudo sed -i '$ a\net.ipv4.ip_forward = 1' /etc/sysctl.conf
340
+ sudo sysctl -p /etc/sysctl.conf
341
+ openstack undercloud install
342
+ #{POST_INSTALL_8}"
239
343
 
240
344
  end
241
345
  end
@@ -54,6 +54,9 @@ module Egon
54
54
 
55
55
  def check_ports(stringio=nil)
56
56
  # closed ports 5385, 36357
57
+ address = File.foreach('/home/stack/undercloud.conf')
58
+ .grep(/^local_ip/).first
59
+ .match(/(?:[0-9]{1,3}\.){3}[0-9]{1,3}/).to_s
57
60
  ports = [8774, 9292, 8777, 9696, 8004, 5000, 8585, 15672]
58
61
  ports.each do |p|
59
62
  if !@connection.nil?
@@ -63,7 +66,7 @@ module Egon
63
66
  end
64
67
  else
65
68
  # local check
66
- set_failure(true) unless !port_open?("192.0.2.1", p, stringio)
69
+ set_failure(true) unless !port_open?(address, p, stringio)
67
70
  end
68
71
  end
69
72
  end
data/lib/egon/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Egon
2
- VERSION = "0.4.8"
2
+ VERSION = "1.0.0"
3
3
  end
Binary file
Binary file
data/pkg/egon-0.1.0.gem CHANGED
Binary file
Binary file
data/rubygem-egon.spec CHANGED
@@ -4,8 +4,8 @@
4
4
  %global gem_name egon
5
5
 
6
6
  Name: %{?scl_prefix}rubygem-%{gem_name}
7
- Version: 0.4.2
8
- Release: 7%{?dist}
7
+ Version: 1.0.0
8
+ Release: 0%{?dist}
9
9
  Summary: A library on top of Fog that encapsulates TripleO deployment operations
10
10
  Group: Development/Languages
11
11
  License: GPL-3.0+
@@ -13,7 +13,7 @@ URL: https://github.com/fusor/egon
13
13
  Source0: https://rubygems.org/gems/%{gem_name}-%{version}.gem
14
14
  BuildRequires: %{?scl_prefix}rubygems-devel
15
15
  Requires: %{?scl_prefix}ruby
16
- Requires: %{?scl_prefix}rubygem(fog) => 1.31.0
16
+ Requires: %{?scl_prefix}rubygem(fog) => 1.36.0
17
17
  Requires: %{?scl_prefix}rubygem(net-ssh) => 2.9.2
18
18
  Requires: %{?scl_prefix}rubygem(net-ssh) < 2.10
19
19
  BuildArch: noarch
@@ -93,6 +93,9 @@ popd
93
93
  %{gem_instdir}/test
94
94
 
95
95
  %changelog
96
+ * Thu Oct 29 2015 Jason Rist <jrist@redhat.com> 0.4.8
97
+ - bump fog requirement to 1.36.0 to fix uuid bug (jrist@redhat.com)
98
+
96
99
  * Thu Sep 10 2015 Jason Montleon <jmontleo@redhat.com> 0.4.2-7
97
100
  - gempsec and rpm spec cleanup (jmontleo@redhat.com)
98
101
 
@@ -1,10 +1,8 @@
1
1
  require 'fog'
2
2
  require 'fog/openstack/models/baremetal/nodes'
3
3
  require 'fog/openstack/models/compute/flavors'
4
- require 'fog/openstack/models/image/image'
4
+ require 'fog/openstack/models/image_v1/image'
5
5
  require 'fog/openstack/models/orchestration/stacks'
6
- require 'fog/openstack/models/planning/plans'
7
- require 'fog/openstack/models/planning/role'
8
6
  require './lib/egon/overcloud/undercloud_handle'
9
7
 
10
8
  describe "overcloud installation mocked" do
@@ -18,12 +16,12 @@ describe "overcloud installation mocked" do
18
16
  @undercloud_handle = Overcloud::UndercloudHandle.new(options[:openstack_username], 'xxxxxxx', options[:openstack_auth_url])
19
17
 
20
18
  # setup for mock image service
21
- image_service = Fog::Image::OpenStack::Mock.new(options)
22
- bm_deploy_kernel_image = Fog::Image::OpenStack::Image.new({
19
+ image_service = Fog::Image::OpenStack::V1::Mock.new(options)
20
+ bm_deploy_kernel_image = Fog::Image::OpenStack::V1::Image.new({
23
21
  :id => '1',
24
22
  :name => 'bm-deploy-kernel'
25
23
  })
26
- bm_deploy_ramdisk_image = Fog::Image::OpenStack::Image.new({
24
+ bm_deploy_ramdisk_image = Fog::Image::OpenStack::V1::Image.new({
27
25
  :id => '2',
28
26
  :name => 'bm-deploy-ramdisk'
29
27
  })
@@ -71,34 +69,14 @@ describe "overcloud installation mocked" do
71
69
  allow(compute_service).to receive(:flavors).and_return(flavors)
72
70
  allow(@undercloud_handle).to receive(:service).with('Compute').and_return(compute_service)
73
71
 
74
- # setup for mock planning service
75
- planning_service = Fog::Openstack::Planning::Mock.new(options)
76
- plans = Fog::Openstack::Planning::Plans.new
77
- overcloud_plan = Fog::Openstack::Planning::Plan.new({
78
- :uuid => '1',
79
- :name => 'overcloud'
80
- })
81
- compute_role = Fog::Openstack::Planning::Role.new({
82
- :uuid => '1',
83
- :name => 'Compute'
84
- })
85
- controller_role = Fog::Openstack::Planning::Role.new({
86
- :uuid => '1',
87
- :name => 'Controller'
88
- })
89
- allow(planning_service).to receive(:roles).and_return([compute_role, controller_role])
90
- allow(planning_service).to receive(:plans).and_return(plans)
91
- allow(plans).to receive(:find_by_name).and_return(overcloud_plan)
92
- allow(@undercloud_handle).to receive(:service).with('Planning').and_return(planning_service)
93
-
94
72
  # setup for mock orchestration service
95
73
  orchestration_service = Fog::Orchestration::OpenStack::Mock.new(options)
96
74
  stacks = Fog::Orchestration::OpenStack::Stacks.new
97
75
  overcloud_stack = Fog::Orchestration::OpenStack::Stack.new({
98
76
  'id' => '1',
99
- 'name' => 'overcloud',
77
+ 'stack_name' => 'overcloud',
100
78
  })
101
- allow(stacks).to receive(:get).and_return(overcloud_stack)
79
+ allow(stacks).to receive(:all).and_return([overcloud_stack])
102
80
  allow(orchestration_service).to receive(:stacks).and_return(stacks)
103
81
  allow(@undercloud_handle).to receive(:service).with('Orchestration').and_return(orchestration_service)
104
82
  end
@@ -164,16 +142,8 @@ describe "overcloud installation mocked" do
164
142
  expect(@undercloud_handle.list_nodes.length).to eq 2
165
143
  end
166
144
 
167
- it "should be able to list_deployment_roles" do
168
- expect(@undercloud_handle.list_deployment_roles.length).to eq 2
169
- end
170
-
171
- it "should be able to get_plan" do
172
- expect(@undercloud_handle.get_plan('overcloud').uuid).to eq '1'
173
- end
174
-
175
145
  it "should be able to get_stack" do
176
- expect(@undercloud_handle.get_stack('overcloud').id).to eq '1'
146
+ expect(@undercloud_handle.get_stack_by_name('overcloud').id).to eq '1'
177
147
  end
178
148
  end
179
149
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: egon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.8
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Egon and Fusor team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2016-05-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: 1.31.0
47
+ version: 1.36.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 1.31.0
54
+ version: 1.36.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: net-ssh
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -92,6 +92,7 @@ extensions: []
92
92
  extra_rdoc_files: []
93
93
  files:
94
94
  - Gemfile
95
+ - Gemfile.lock
95
96
  - LICENSE
96
97
  - README.md
97
98
  - Rakefile
@@ -103,7 +104,6 @@ files:
103
104
  - lib/egon.rb
104
105
  - lib/egon/overcloud/undercloud_handle.rb
105
106
  - lib/egon/overcloud/undercloud_handle/deployment.rb
106
- - lib/egon/overcloud/undercloud_handle/deployment_role.rb
107
107
  - lib/egon/overcloud/undercloud_handle/flavor.rb
108
108
  - lib/egon/overcloud/undercloud_handle/image.rb
109
109
  - lib/egon/overcloud/undercloud_handle/node.rb
@@ -112,21 +112,10 @@ files:
112
112
  - lib/egon/undercloud/port-check-mixin.rb
113
113
  - lib/egon/undercloud/ssh-connection.rb
114
114
  - lib/egon/version.rb
115
+ - pkg/egon-0.0.1.gem
116
+ - pkg/egon-0.0.2.gem
115
117
  - pkg/egon-0.1.0.gem
116
- - pkg/egon-0.2.0.gem
117
- - pkg/egon-0.3.1.gem
118
- - pkg/egon-0.3.2.gem
119
- - pkg/egon-0.3.3.gem
120
- - pkg/egon-0.3.4.gem
121
- - pkg/egon-0.3.5.gem
122
- - pkg/egon-0.3.6.gem
123
- - pkg/egon-0.4.0.gem
124
- - pkg/egon-0.4.1.gem
125
- - pkg/egon-0.4.2.gem
126
- - pkg/egon-0.4.4.gem
127
- - pkg/egon-0.4.5.gem
128
- - pkg/egon-0.4.6.gem
129
- - pkg/egon-0.4.7.gem
118
+ - pkg/egon-0.4.3.gem
130
119
  - rubygem-egon.spec
131
120
  - test/test_ssh_connection.rb
132
121
  - test/test_undercloud.rb
@@ -1,9 +0,0 @@
1
- module Overcloud
2
- module DeploymentRole
3
-
4
- def list_deployment_roles
5
- service('Planning').roles
6
- end
7
-
8
- end
9
- end
data/pkg/egon-0.2.0.gem DELETED
Binary file
data/pkg/egon-0.3.1.gem DELETED
Binary file
data/pkg/egon-0.3.2.gem DELETED
Binary file
data/pkg/egon-0.3.3.gem DELETED
Binary file
data/pkg/egon-0.3.4.gem DELETED
Binary file
data/pkg/egon-0.3.5.gem DELETED
Binary file
data/pkg/egon-0.3.6.gem DELETED
Binary file
data/pkg/egon-0.4.0.gem DELETED
Binary file
data/pkg/egon-0.4.1.gem DELETED
Binary file
data/pkg/egon-0.4.2.gem DELETED
Binary file
data/pkg/egon-0.4.4.gem DELETED
Binary file
data/pkg/egon-0.4.5.gem DELETED
Binary file
data/pkg/egon-0.4.6.gem DELETED
Binary file
data/pkg/egon-0.4.7.gem DELETED
Binary file