lorj 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.gitreview +4 -0
- data/Gemfile +25 -0
- data/Gemfile.lock +34 -0
- data/LICENSE.txt +14 -0
- data/README.md +652 -0
- data/Rakefile +24 -0
- data/bin/cloud_test.rb +81 -0
- data/example/students_1/process/Students.rb +20 -0
- data/example/students_1/students.rb +16 -0
- data/example/students_2/process/Students.rb +27 -0
- data/example/students_2/students.rb +36 -0
- data/example/students_3/controller/yaml_students.rb +94 -0
- data/example/students_3/controller/yaml_students_controller.rb +123 -0
- data/example/students_3/process/students.rb +118 -0
- data/example/students_3/students.rb +93 -0
- data/example/students_4/controller/yaml_students.rb +82 -0
- data/example/students_4/controller/yaml_students_controller.rb +141 -0
- data/example/students_4/process/students.rb +112 -0
- data/example/students_4/students.rb +103 -0
- data/example/yaml_students/students.rb +78 -0
- data/example/yaml_students/yaml_students.rb +115 -0
- data/lib/concept.md +111 -0
- data/lib/core/core.rb +723 -0
- data/lib/core/definition.rb +505 -0
- data/lib/core/definition_internal.rb +338 -0
- data/lib/core/lorj-basecontroller.rb +90 -0
- data/lib/core/lorj-basedefinition.rb +1079 -0
- data/lib/core/lorj-baseprocess.rb +231 -0
- data/lib/core/lorj-data.rb +567 -0
- data/lib/core/lorj-keypath.rb +115 -0
- data/lib/core_process/CloudProcess.rb +334 -0
- data/lib/core_process/global_process.rb +406 -0
- data/lib/core_process/network_process.rb +603 -0
- data/lib/img/.directory +4 -0
- data/lib/img/account_data_access.png +0 -0
- data/lib/img/config_data_access.png +0 -0
- data/lib/img/forj-lib-concept.png +0 -0
- data/lib/lorj/version.rb +3 -0
- data/lib/lorj.rb +51 -0
- data/lib/prc-account.rb +339 -0
- data/lib/prc-config.rb +1023 -0
- data/lib/prc-logging.rb +183 -0
- data/lib/prc.rb +108 -0
- data/lib/providers/hpcloud/Hpcloud.rb +419 -0
- data/lib/providers/hpcloud/compute.rb +108 -0
- data/lib/providers/hpcloud/network.rb +117 -0
- data/lib/providers/hpcloud/security_groups.rb +67 -0
- data/lib/providers/mock/Mock.rb +141 -0
- data/lib/providers/openstack/Openstack.rb +47 -0
- data/lib/providers/templates/compute.rb +42 -0
- data/lib/providers/templates/core.rb +61 -0
- data/lib/providers/templates/network.rb +33 -0
- data/lorj-spec/defaults.yaml +26 -0
- data/lorj.gemspec +39 -0
- data/spec/forj-account_spec.rb +75 -0
- data/spec/forj-config_spec.rb +196 -0
- metadata +164 -0
data/lib/prc-logging.rb
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
|
18
|
+
|
19
|
+
# create a forj.log file in ~/.hpcloud/forj.log
|
20
|
+
|
21
|
+
require 'rubygems'
|
22
|
+
require 'logger'
|
23
|
+
require 'ansi'
|
24
|
+
require 'ansi/logger'
|
25
|
+
|
26
|
+
#
|
27
|
+
# PrcLib module
|
28
|
+
#
|
29
|
+
module PrcLib
|
30
|
+
|
31
|
+
class Logging
|
32
|
+
# Class used to create 2 log object, in order to keep track of error in a log file and change log output to OUTPUT on needs (option flags).
|
33
|
+
|
34
|
+
attr_reader :level
|
35
|
+
|
36
|
+
def initialize()
|
37
|
+
|
38
|
+
if not PrcLib.app_name
|
39
|
+
PrcLib.app_name = "Lorj"
|
40
|
+
end
|
41
|
+
|
42
|
+
if not PrcLib.data_path
|
43
|
+
PrcLib.data_path = File.expand_path(File.join("~", ".%s" % PrcLib.app_name))
|
44
|
+
end
|
45
|
+
|
46
|
+
sLogFile = PrcLib.log_file
|
47
|
+
sLogFile = File.join(PrcLib.data_path, "%s.log" % PrcLib.app_name) if PrcLib.log_file.nil?
|
48
|
+
|
49
|
+
@oFileLogger = Logger.new(sLogFile, 'weekly')
|
50
|
+
@oFileLogger.level = Logger::DEBUG
|
51
|
+
@oFileLogger.formatter = proc do |severity, datetime, progname, msg|
|
52
|
+
"#{progname} : #{datetime}: #{severity}: #{msg} \n"
|
53
|
+
end
|
54
|
+
|
55
|
+
@oOutLogger = Logger.new(STDOUT)
|
56
|
+
@level = (PrcLib.level.nil? ? Logger::WARN : PrcLib.level)
|
57
|
+
@oOutLogger.level = @level
|
58
|
+
@oOutLogger.formatter = proc do |severity, datetime, progname, msg|
|
59
|
+
case severity
|
60
|
+
when 'ANY'
|
61
|
+
str = "#{msg} \n"
|
62
|
+
when "ERROR", "FATAL"
|
63
|
+
str = ANSI.bold(ANSI.red("#{severity}!!!")) + ": #{msg} \n"
|
64
|
+
when "WARN"
|
65
|
+
str = ANSI.bold(ANSI.yellow("WARNING")) + ": #{msg} \n"
|
66
|
+
else
|
67
|
+
str = "#{severity}: #{msg} \n"
|
68
|
+
end
|
69
|
+
str
|
70
|
+
end
|
71
|
+
PrcLib.log_file = sLogFile
|
72
|
+
end
|
73
|
+
|
74
|
+
def info?
|
75
|
+
return(@oOutLogger.info?)
|
76
|
+
end
|
77
|
+
|
78
|
+
def debug?
|
79
|
+
return(@oOutLogger.debug?)
|
80
|
+
end
|
81
|
+
|
82
|
+
def error?
|
83
|
+
return(@oOutLogger.error?)
|
84
|
+
end
|
85
|
+
|
86
|
+
def fatal?
|
87
|
+
return(@oOutLogger.fatal?)
|
88
|
+
end
|
89
|
+
|
90
|
+
def info(message)
|
91
|
+
@oOutLogger.info(message + ANSI.clear_line)
|
92
|
+
@oFileLogger.info(message)
|
93
|
+
end
|
94
|
+
|
95
|
+
def debug(message)
|
96
|
+
@oOutLogger.debug(message + ANSI.clear_line)
|
97
|
+
@oFileLogger.debug(message)
|
98
|
+
end
|
99
|
+
|
100
|
+
def error(message)
|
101
|
+
@oOutLogger.error(message + ANSI.clear_line)
|
102
|
+
@oFileLogger.error(message)
|
103
|
+
end
|
104
|
+
|
105
|
+
def fatal(message, e)
|
106
|
+
@oOutLogger.fatal(message + ANSI.clear_line)
|
107
|
+
@oFileLogger.fatal("%s\n%s\n%s" % [message, e.message, e.backtrace.join("\n")]) if e
|
108
|
+
@oFileLogger.fatal(message)
|
109
|
+
end
|
110
|
+
|
111
|
+
def warn(message)
|
112
|
+
@oOutLogger.warn(message + ANSI.clear_line)
|
113
|
+
@oFileLogger.warn(message)
|
114
|
+
end
|
115
|
+
|
116
|
+
def set_level(level)
|
117
|
+
@level = level
|
118
|
+
@oOutLogger.level = level
|
119
|
+
end
|
120
|
+
|
121
|
+
def unknown(message)
|
122
|
+
@oOutLogger.unknown(message + ANSI.clear_line)
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
module_function
|
128
|
+
|
129
|
+
def log_object()
|
130
|
+
if PrcLib.log.nil?
|
131
|
+
PrcLib.log = PrcLib::Logging.new
|
132
|
+
else
|
133
|
+
PrcLib.log
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def message(message)
|
138
|
+
log_object.unknown(message)
|
139
|
+
end
|
140
|
+
|
141
|
+
def info(message)
|
142
|
+
log_object.info(message)
|
143
|
+
nil
|
144
|
+
end
|
145
|
+
|
146
|
+
def debug(message)
|
147
|
+
log_object.debug(message)
|
148
|
+
nil
|
149
|
+
end
|
150
|
+
|
151
|
+
def warning(message)
|
152
|
+
log_object.warn(message)
|
153
|
+
nil
|
154
|
+
end
|
155
|
+
|
156
|
+
def error(message)
|
157
|
+
log_object.error(message)
|
158
|
+
nil
|
159
|
+
end
|
160
|
+
|
161
|
+
def fatal(rc, message, e = nil)
|
162
|
+
log_object.fatal(message, e)
|
163
|
+
puts 'Issues found. Please fix it and retry. Process aborted.'
|
164
|
+
exit rc
|
165
|
+
end
|
166
|
+
|
167
|
+
def set_level(level)
|
168
|
+
log_object.set_level(level)
|
169
|
+
nil
|
170
|
+
end
|
171
|
+
|
172
|
+
def state(message)
|
173
|
+
print("%s ...%s\r" % [message, ANSI.clear_line]) if log_object.level <= Logger::INFO
|
174
|
+
nil
|
175
|
+
end
|
176
|
+
|
177
|
+
def high_level_msg(message)
|
178
|
+
# Not DEBUG and not INFO. Just printed to the output.
|
179
|
+
print ("%s" % [message]) if log_object.level > 1
|
180
|
+
nil
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
data/lib/prc.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.module Lorj
|
14
|
+
|
15
|
+
require 'fileutils'
|
16
|
+
require 'logger'
|
17
|
+
|
18
|
+
|
19
|
+
module PrcLib
|
20
|
+
|
21
|
+
def PrcLib.dir_exists?(path)
|
22
|
+
if File.exists?(path)
|
23
|
+
if not File.directory?(path)
|
24
|
+
msg = "'%s' is not a directory. Please fix it." % path
|
25
|
+
unless log_object.nil?
|
26
|
+
log_object.fatal(1, msg)
|
27
|
+
else
|
28
|
+
raise msg
|
29
|
+
end
|
30
|
+
end
|
31
|
+
if not File.readable?(path) or not File.writable?(path) or not File.executable?(path)
|
32
|
+
msg = "%s is not a valid directory. Check permissions and fix it." % path
|
33
|
+
unless log_object.nil?
|
34
|
+
log_object.fatal(1, msg)
|
35
|
+
else
|
36
|
+
raise msg
|
37
|
+
end
|
38
|
+
end
|
39
|
+
return true
|
40
|
+
end
|
41
|
+
false
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def PrcLib.ensure_dir_exists(path)
|
46
|
+
if not dir_exists?(path)
|
47
|
+
FileUtils.mkpath(path) if not File.directory?(path)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
class << self
|
53
|
+
attr_accessor :log, :core_level
|
54
|
+
end
|
55
|
+
|
56
|
+
module_function
|
57
|
+
|
58
|
+
def data_path= v
|
59
|
+
@data_path = File.expand_path(v) if not @data_path
|
60
|
+
PrcLib.ensure_dir_exists(@data_path)
|
61
|
+
end
|
62
|
+
|
63
|
+
def data_path
|
64
|
+
@data_path
|
65
|
+
end
|
66
|
+
|
67
|
+
def app_name= v
|
68
|
+
@app_name = v if not @app_name
|
69
|
+
end
|
70
|
+
|
71
|
+
def app_name
|
72
|
+
@app_name
|
73
|
+
end
|
74
|
+
|
75
|
+
def app_defaults= v
|
76
|
+
@app_defaults = File.expand_path(v) if not @app_defaults
|
77
|
+
end
|
78
|
+
|
79
|
+
def app_defaults
|
80
|
+
@app_defaults
|
81
|
+
end
|
82
|
+
|
83
|
+
def log_file= v
|
84
|
+
sFile = File.basename(v)
|
85
|
+
sDir = File.dirname(File.expand_path(v))
|
86
|
+
if not File.exists?(sDir)
|
87
|
+
raise "'%s' doesn't exist. Unable to create file '%s'" % [sDir, sFile]
|
88
|
+
end
|
89
|
+
@log_file = File.join(sDir, sFile)
|
90
|
+
end
|
91
|
+
|
92
|
+
def log_file
|
93
|
+
@log_file
|
94
|
+
end
|
95
|
+
|
96
|
+
def level= v
|
97
|
+
|
98
|
+
@level = v
|
99
|
+
unless PrcLib.log.nil?
|
100
|
+
PrcLib.set_level(v)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def level
|
105
|
+
@level
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
@@ -0,0 +1,419 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
|
18
|
+
# This class describes how to process some actions, and will do everything prior
|
19
|
+
# this task to make it to work.
|
20
|
+
|
21
|
+
require 'fog' # We use fog to access HPCloud
|
22
|
+
|
23
|
+
$HPCLOUD_PATH = File.expand_path(File.dirname(__FILE__))
|
24
|
+
|
25
|
+
require File.join($HPCLOUD_PATH, "compute.rb")
|
26
|
+
require File.join($HPCLOUD_PATH, "network.rb")
|
27
|
+
require File.join($HPCLOUD_PATH, "security_groups.rb")
|
28
|
+
|
29
|
+
# Defines Meta HPCloud object
|
30
|
+
class Hpcloud < BaseDefinition
|
31
|
+
|
32
|
+
define_obj :services
|
33
|
+
obj_needs :data, :account_id, :mapping => :hp_access_key
|
34
|
+
obj_needs :data, :account_key, :mapping => :hp_secret_key
|
35
|
+
obj_needs :data, :auth_uri, :mapping => :hp_auth_uri
|
36
|
+
obj_needs :data, :tenant, :mapping => :hp_tenant_id
|
37
|
+
obj_needs :data, ":excon_opts/:connect_timeout", :default_value => 30
|
38
|
+
obj_needs :data, ":excon_opts/:read_timeout", :default_value => 240
|
39
|
+
obj_needs :data, ":excon_opts/:write_timeout", :default_value => 240
|
40
|
+
|
41
|
+
# Defines Object structure and function stored on the Hpcloud class object.
|
42
|
+
# Compute Object
|
43
|
+
define_obj :compute_connection
|
44
|
+
# Defines Data used by compute.
|
45
|
+
|
46
|
+
obj_needs :data, :account_id, :mapping => :hp_access_key
|
47
|
+
obj_needs :data, :account_key, :mapping => :hp_secret_key
|
48
|
+
obj_needs :data, :auth_uri, :mapping => :hp_auth_uri
|
49
|
+
obj_needs :data, :tenant, :mapping => :hp_tenant_id
|
50
|
+
obj_needs :data, :compute, :mapping => :hp_avl_zone
|
51
|
+
|
52
|
+
define_obj :network_connection
|
53
|
+
obj_needs :data, :account_id, :mapping => :hp_access_key
|
54
|
+
obj_needs :data, :account_key, :mapping => :hp_secret_key
|
55
|
+
obj_needs :data, :auth_uri, :mapping => :hp_auth_uri
|
56
|
+
obj_needs :data, :tenant, :mapping => :hp_tenant_id
|
57
|
+
obj_needs :data, :network, :mapping => :hp_avl_zone
|
58
|
+
|
59
|
+
# Forj predefine following query mapping, used by ForjProcess
|
60
|
+
# id => id, name => name
|
61
|
+
# If we need to add another mapping, add
|
62
|
+
# query_mapping :id => :MyID
|
63
|
+
# If the query is not push through and Hash object, the Provider
|
64
|
+
# will needs to create his own mapping function.
|
65
|
+
define_obj :network
|
66
|
+
query_mapping :external, :router_external
|
67
|
+
|
68
|
+
define_obj :rule
|
69
|
+
obj_needs :data, :dir, :mapping => :direction
|
70
|
+
attr_value_mapping :IN, 'ingress'
|
71
|
+
attr_value_mapping :OUT, 'egress'
|
72
|
+
|
73
|
+
obj_needs :data, :proto, :mapping => :protocol
|
74
|
+
obj_needs :data, :port_min, :mapping => :port_range_min
|
75
|
+
obj_needs :data, :port_max, :mapping => :port_range_max
|
76
|
+
obj_needs :data, :addr_map, :mapping => :remote_ip_prefix
|
77
|
+
obj_needs :data, :sg_id, :mapping => :security_group_id
|
78
|
+
|
79
|
+
get_attr_mapping :dir, :direction
|
80
|
+
get_attr_mapping :proto, :protocol
|
81
|
+
get_attr_mapping :port_min, :port_range_min
|
82
|
+
get_attr_mapping :port_max, :port_range_max
|
83
|
+
get_attr_mapping :addr_map, :remote_ip_prefix
|
84
|
+
get_attr_mapping :sg_id, :security_group_id
|
85
|
+
|
86
|
+
define_obj :keypairs
|
87
|
+
|
88
|
+
undefine_attribute :id # Do not return any predefined ID
|
89
|
+
|
90
|
+
# ************************************ Router Object
|
91
|
+
define_obj :router
|
92
|
+
|
93
|
+
obj_needs_optional
|
94
|
+
obj_needs :data, :router_name, :mapping => :name
|
95
|
+
# The FORJ gateway_network_id is extracted from Fog::HP::Network::Router[:external_gateway_info][:network_id]
|
96
|
+
obj_needs :data, :external_gateway_id, :mapping => [:external_gateway_info, 'network_id' ]
|
97
|
+
|
98
|
+
get_attr_mapping :gateway_network_id, [:external_gateway_info, 'network_id']
|
99
|
+
|
100
|
+
# ************************************ SERVER Object
|
101
|
+
define_obj :server
|
102
|
+
get_attr_mapping :status, :state
|
103
|
+
attr_value_mapping :create, "BUILD"
|
104
|
+
attr_value_mapping :boot, :boot
|
105
|
+
attr_value_mapping :active, "ACTIVE"
|
106
|
+
|
107
|
+
# ************************************ SERVER log Object
|
108
|
+
define_obj :server_log
|
109
|
+
|
110
|
+
# Excon::Response object type
|
111
|
+
get_attr_mapping :output, "output"
|
112
|
+
|
113
|
+
# ************************************* Public IP Object
|
114
|
+
define_obj :public_ip
|
115
|
+
get_attr_mapping :server_id, :instance_id
|
116
|
+
get_attr_mapping :public_ip, :ip
|
117
|
+
|
118
|
+
# defines setup Cloud data (:account => true for setup)
|
119
|
+
define_data(:account_id, {
|
120
|
+
:account => true,
|
121
|
+
:desc => 'HPCloud Access Key (From horizon, user drop down, manage keys)',
|
122
|
+
:validate => /^[A-Z0-9]*$/
|
123
|
+
})
|
124
|
+
define_data(:account_key, {
|
125
|
+
:account => true,
|
126
|
+
:desc => 'HPCloud secret Key (From horizon, user drop down, manage keys)',
|
127
|
+
:encrypted => false,
|
128
|
+
:validate => /^.+/
|
129
|
+
})
|
130
|
+
define_data(:auth_uri, {
|
131
|
+
:account => true,
|
132
|
+
:desc => 'HPCloud Authentication service URL (default is HP Public cloud)',
|
133
|
+
:validate => /^http(s)?:\/\/.*$/,
|
134
|
+
:default_value => "https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/"
|
135
|
+
})
|
136
|
+
define_data(:tenant, {
|
137
|
+
:account => true,
|
138
|
+
:desc => 'HPCloud Tenant ID (from horizon, identity, projecs, Project ID)',
|
139
|
+
:validate => /^[0-9]+$/
|
140
|
+
})
|
141
|
+
|
142
|
+
define_data(:compute, {
|
143
|
+
:account => true,
|
144
|
+
:desc => 'HPCloud Compute service zone (Ex: region-a.geo-1)',
|
145
|
+
:depends_on => [:account_id, :account_key, :auth_uri,:tenant ],
|
146
|
+
:list_values => {
|
147
|
+
:query_type => :controller_call,
|
148
|
+
:object => :services,
|
149
|
+
:query_call => :get_services,
|
150
|
+
:query_params => { :list_services => [:Compute, :compute] },
|
151
|
+
:validate => :list_strict
|
152
|
+
}
|
153
|
+
})
|
154
|
+
|
155
|
+
define_data(:network, {
|
156
|
+
:account => true,
|
157
|
+
:desc => 'HPCloud Network service zone (Ex: region-a.geo-1)',
|
158
|
+
:depends_on => [:account_id, :account_key, :auth_uri,:tenant ],
|
159
|
+
:list_values => {
|
160
|
+
:query_type => :controller_call,
|
161
|
+
:object => :services ,
|
162
|
+
:query_call => :get_services,
|
163
|
+
:query_params => { :list_services => [:Networking, :network] },
|
164
|
+
:validate => :list_strict
|
165
|
+
}
|
166
|
+
})
|
167
|
+
|
168
|
+
data_value_mapping 'xsmall', "standard.xsmall"
|
169
|
+
data_value_mapping 'small', "standard.small"
|
170
|
+
data_value_mapping 'medium', "standard.medium"
|
171
|
+
data_value_mapping 'large', "standard.large"
|
172
|
+
data_value_mapping 'xlarge', "standard.xlarge"
|
173
|
+
|
174
|
+
|
175
|
+
end
|
176
|
+
|
177
|
+
# Following class describe how FORJ should handle HP Cloud objects.
|
178
|
+
# Except Cloud connection, all HPCloud objects management are described/called in HP* modules.
|
179
|
+
class HpcloudController < BaseController
|
180
|
+
|
181
|
+
def connect(sObjectType, hParams)
|
182
|
+
case sObjectType
|
183
|
+
when :services
|
184
|
+
Fog::HP.authenticate_v2(hParams[:hdata], hParams[:excon_opts])
|
185
|
+
when :compute_connection
|
186
|
+
Fog::Compute.new(hParams[:hdata].merge({:provider => :hp,:version => 'v2'}))
|
187
|
+
when :network_connection
|
188
|
+
Fog::HP::Network.new(hParams[:hdata])
|
189
|
+
else
|
190
|
+
forjError "'%s' is not a valid object for 'connect'" % sObjectType
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def create(sObjectType, hParams)
|
195
|
+
case sObjectType
|
196
|
+
when :public_ip
|
197
|
+
required?(hParams, :compute_connection)
|
198
|
+
required?(hParams, :server)
|
199
|
+
HPCompute.server_assign_address(hParams[:compute_connection], hParams[:server])
|
200
|
+
when :server
|
201
|
+
required?(hParams, :compute_connection)
|
202
|
+
required?(hParams, :image)
|
203
|
+
required?(hParams, :network)
|
204
|
+
required?(hParams, :flavor)
|
205
|
+
required?(hParams, :keypairs)
|
206
|
+
required?(hParams, :security_groups)
|
207
|
+
required?(hParams, :server_name)
|
208
|
+
HPCompute.create_server(
|
209
|
+
hParams[:compute_connection],
|
210
|
+
hParams[:server_name], hParams[:security_groups],
|
211
|
+
hParams[:image], hParams[:network],
|
212
|
+
hParams[:flavor], hParams[:keypairs],
|
213
|
+
hParams[:user_data], hParams[:meta_data]
|
214
|
+
)
|
215
|
+
when :image
|
216
|
+
required?(hParams, :compute_connection)
|
217
|
+
required?(hParams, :image_name)
|
218
|
+
HPCompute.get_image(hParams[:compute_connection], hParams[:image_name])
|
219
|
+
when :network
|
220
|
+
required?(hParams, :network_connection)
|
221
|
+
required?(hParams, :network_name)
|
222
|
+
HPNetwork.create_network(hParams[:network_connection], hParams[:network_name])
|
223
|
+
when :subnetwork
|
224
|
+
required?(hParams, :network_connection)
|
225
|
+
required?(hParams, :network)
|
226
|
+
required?(hParams, :subnetwork_name)
|
227
|
+
HPNetwork.create_subnetwork(hParams[:network_connection], hParams[:network], hParams[:subnetwork_name])
|
228
|
+
when :security_groups
|
229
|
+
required?(hParams, :network_connection)
|
230
|
+
required?(hParams, :security_group)
|
231
|
+
HPSecurityGroups.create_sg(hParams[:network_connection], hParams[:security_group], hParams[:sg_desc])
|
232
|
+
when :keypairs
|
233
|
+
required?(hParams, :compute_connection)
|
234
|
+
required?(hParams, :keypair_name)
|
235
|
+
required?(hParams, :public_key)
|
236
|
+
HPKeyPairs.create_keypair(hParams[:compute_connection], hParams[:keypair_name], hParams[:public_key])
|
237
|
+
when :router
|
238
|
+
required?(hParams, :network_connection)
|
239
|
+
required?(hParams, :router_name)
|
240
|
+
#~ if hParams[:external_gateway_id]
|
241
|
+
#~ hParams[:hdata][:external_gateway_info] = { 'network_id' => hParams[:external_gateway_id] }
|
242
|
+
#~ end
|
243
|
+
hParams[:hdata] = hParams[:hdata].merge(:admin_state_up => true) # Forcelly used admin_status_up to true.
|
244
|
+
|
245
|
+
HPNetwork.create_router(hParams[:network_connection], hParams[:hdata])
|
246
|
+
when :rule
|
247
|
+
required?(hParams, :network_connection)
|
248
|
+
required?(hParams, :security_groups)
|
249
|
+
HPSecurityGroups.create_rule(hParams[:network_connection], hParams[:hdata])
|
250
|
+
when :router_interface
|
251
|
+
required?(hParams, :router)
|
252
|
+
required?(hParams, :subnetwork)
|
253
|
+
HPNetwork.add_interface(hParams[:router], hParams[:subnetwork])
|
254
|
+
else
|
255
|
+
forjError "'%s' is not a valid object for 'create'" % sObjectType
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# This function return a collection which have to provide:
|
260
|
+
# functions: [], length, each
|
261
|
+
# Used by network process.
|
262
|
+
def query(sObjectType, sQuery, hParams)
|
263
|
+
case sObjectType
|
264
|
+
when :public_ip
|
265
|
+
required?(hParams, :compute_connection)
|
266
|
+
required?(hParams, :server)
|
267
|
+
HPCompute.query_server_assigned_addresses(hParams[:compute_connection], hParams[:server], sQuery)
|
268
|
+
when :server
|
269
|
+
required?(hParams, :compute_connection)
|
270
|
+
HPCompute.query_server(hParams[:compute_connection], sQuery)
|
271
|
+
when :image
|
272
|
+
required?(hParams, :compute_connection)
|
273
|
+
HPCompute.query_image(hParams[:compute_connection], sQuery)
|
274
|
+
when :network
|
275
|
+
required?(hParams, :network_connection)
|
276
|
+
HPNetwork.query_network(hParams[:network_connection], sQuery)
|
277
|
+
when :subnetwork
|
278
|
+
required?(hParams, :network_connection)
|
279
|
+
HPNetwork.query_subnetwork(hParams[:network_connection], sQuery)
|
280
|
+
when :router
|
281
|
+
required?(hParams, :network_connection)
|
282
|
+
HPNetwork.query_router(hParams[:network_connection], sQuery)
|
283
|
+
when :port
|
284
|
+
required?(hParams, :network_connection)
|
285
|
+
HPNetwork.query_port(hParams[:network_connection], sQuery)
|
286
|
+
when :security_groups
|
287
|
+
required?(hParams, :network_connection)
|
288
|
+
HPSecurityGroups.query_sg(hParams[:network_connection], sQuery)
|
289
|
+
when :rule
|
290
|
+
required?(hParams, :network_connection)
|
291
|
+
HPSecurityGroups.query_rule(hParams[:network_connection], sQuery)
|
292
|
+
when :keypairs
|
293
|
+
required?(hParams, :compute_connection)
|
294
|
+
HPKeyPairs.query_keypair(hParams[:compute_connection], sQuery)
|
295
|
+
when :flavor
|
296
|
+
required?(hParams, :compute_connection)
|
297
|
+
HPCompute.query_flavor(hParams[:compute_connection], sQuery)
|
298
|
+
else
|
299
|
+
forjError "'%s' is not a valid object for 'query'" % sObjectType
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
def delete(sObjectType, hParams)
|
304
|
+
case sObjectType
|
305
|
+
when :network
|
306
|
+
HPNetwork.delete_network(hParams[:network_connection], hParams[:network])
|
307
|
+
when :rule
|
308
|
+
HPSecurityGroups.delete_rule(hParams[:network_connection], hParams[:id])
|
309
|
+
hParams[:network_connection].security_group_rules.get(hParams[:id]).destroy
|
310
|
+
else
|
311
|
+
nil
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
def get(sObjectType, sUniqId, hParams)
|
316
|
+
case sObjectType
|
317
|
+
when :server_log
|
318
|
+
required?(hParams, :server)
|
319
|
+
|
320
|
+
hParams[:server].console_output(sUniqId)
|
321
|
+
when :server
|
322
|
+
required?(hParams, :compute_connection)
|
323
|
+
HPCompute.get_server(hParams[:compute_connection], sUniqId)
|
324
|
+
when :image
|
325
|
+
required?(hParams, :compute_connection)
|
326
|
+
HPCompute.get_image(hParams[:compute_connection], sUniqId)
|
327
|
+
when :network
|
328
|
+
required?(hParams, :network_connection)
|
329
|
+
HPNetwork.get_network(hParams[:network_connection], sUniqId)
|
330
|
+
else
|
331
|
+
forjError "'%s' is not a valid object for 'get'" % sObjectType
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
def query_each(oFogObject)
|
336
|
+
case oFogObject.class.to_s
|
337
|
+
when "Fog::HP::Network::Networks"
|
338
|
+
oFogObject.each { | value |
|
339
|
+
yield(value)
|
340
|
+
}
|
341
|
+
else
|
342
|
+
forjError "'%s' is not a valid list for 'each'" % oFogObject.class
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
def get_attr(oControlerObject, key)
|
347
|
+
begin
|
348
|
+
if oControlerObject.is_a?(Excon::Response)
|
349
|
+
rhGet(oControlerObject.data, :body, key)
|
350
|
+
else
|
351
|
+
attributes = oControlerObject.attributes
|
352
|
+
raise "attribute '%s' is unknown in '%s'. Valid one are : '%s'" % [key[0], oControlerObject.class, oControlerObject.class.attributes ] unless oControlerObject.class.attributes.include?(key[0])
|
353
|
+
rhGet(attributes, key)
|
354
|
+
end
|
355
|
+
rescue => e
|
356
|
+
forjError "Unable to map '%s'. %s" % [key, e.message]
|
357
|
+
end
|
358
|
+
end
|
359
|
+
|
360
|
+
def set_attr(oControlerObject, key, value)
|
361
|
+
begin
|
362
|
+
raise "No set feature for '%s'" % oControlerObject.class if oControlerObject.is_a?(Excon::Response)
|
363
|
+
attributes = oControlerObject.attributes
|
364
|
+
raise "attribute '%s' is unknown in '%s'. Valid one are : '%s'" % [key[0], oControlerObject.class, oControlerObject.class.attributes ] unless oControlerObject.class.attributes.include?(key[0])
|
365
|
+
Lorj::rhSet(attributes, value, key)
|
366
|
+
rescue => e
|
367
|
+
forjError "Unable to map '%s' on '%s'" % [key, sObjectType]
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
|
+
|
372
|
+
def update(sObjectType, oObject, hParams)
|
373
|
+
case sObjectType
|
374
|
+
when :router
|
375
|
+
forjError "Object to update is nil" if oObject.nil?
|
376
|
+
|
377
|
+
HPNetwork.update_router(oObject[:object])
|
378
|
+
else
|
379
|
+
forjError "'%s' is not a valid list for 'update'" % oFogObject.class
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
# This function requires to return an Array of values or nil.
|
384
|
+
def get_services(sObjectType, oParams)
|
385
|
+
case sObjectType
|
386
|
+
when :services
|
387
|
+
# oParams[sObjectType] will provide the controller object.
|
388
|
+
# This one can be interpreted only by controller code,
|
389
|
+
# except if controller declares how to map with this object.
|
390
|
+
# Processes can deal only process mapped data.
|
391
|
+
# Currently there is no services process function. No need to map.
|
392
|
+
hServices = oParams[:services]
|
393
|
+
if not oParams[:list_services].is_a?(Array)
|
394
|
+
hServiceToFind = [oParams[:list_services]]
|
395
|
+
else
|
396
|
+
hServiceToFind = oParams[:list_services]
|
397
|
+
end
|
398
|
+
# Search for service. Ex: Can be :Networking or network. I currently do not know why...
|
399
|
+
hSearchServices= rhGet(hServices, :service_catalog)
|
400
|
+
sService = nil
|
401
|
+
hServiceToFind.each { | sServiceElem |
|
402
|
+
if hSearchServices.key?(sServiceElem)
|
403
|
+
sService = sServiceElem
|
404
|
+
break
|
405
|
+
end
|
406
|
+
}
|
407
|
+
|
408
|
+
forjError "Unable to find services %s" % hServiceToFind if sService.nil?
|
409
|
+
result = rhGet(hServices, :service_catalog, sService).keys
|
410
|
+
result.delete("name")
|
411
|
+
result.each_index { | iIndex |
|
412
|
+
result[iIndex] = result[iIndex].to_s if result[iIndex].is_a?(Symbol)
|
413
|
+
}
|
414
|
+
return result
|
415
|
+
else
|
416
|
+
forjError "'%s' is not a valid object for 'get_services'" % sObjectType
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|