lmc 0.8.0 → 0.12.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 +5 -5
- data/.idea/encodings.xml +4 -0
- data/.idea/inspectionProfiles/Project_Default.xml +1 -1
- data/.rubocop.yml +8 -2
- data/.ruby-version +1 -1
- data/PATTERNS.md +26 -0
- data/{README.md → README.rdoc} +0 -0
- data/Rakefile +32 -7
- data/coverage/.last_run.json +1 -1
- data/lib/lmc.rb +2 -2
- data/lib/lmc/Account.rb +57 -47
- data/lib/lmc/Cloud.rb +45 -30
- data/lib/lmc/Configstates.rb +3 -4
- data/lib/lmc/Device.rb +18 -23
- data/lib/lmc/Response.rb +3 -4
- data/lib/lmc/Site.rb +11 -21
- data/lib/lmc/User.rb +9 -10
- data/lib/lmc/account_manager.rb +29 -28
- data/lib/lmc/auth/auth_action.rb +3 -2
- data/lib/lmc/authority.rb +11 -9
- data/lib/lmc/config/device_config.rb +193 -0
- data/lib/lmc/config/device_dsc_ui.rb +94 -0
- data/lib/lmc/device_config_state.rb +1 -1
- data/lib/lmc/entity.rb +8 -8
- data/lib/lmc/exceptions/lmc_outdated_terms_of_use_exception.rb +3 -3
- data/lib/lmc/logger.rb +9 -2
- data/lib/lmc/membership.rb +5 -5
- data/lib/lmc/mixins/json_able.rb +3 -2
- data/lib/lmc/mixins/service_resource.rb +5 -10
- data/lib/lmc/monitoring/monitoring_record.rb +5 -4
- data/lib/lmc/preferences/preferences.rb +24 -0
- data/lib/lmc/principal.rb +9 -8
- data/lib/lmc/uuid.rb +17 -0
- data/lib/lmc/version.rb +2 -1
- data/lmc.gemspec +17 -15
- metadata +32 -14
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ec4925e30542f46b5b9c991de79a672a9eabeffda07028620aaa6fa14e62c551
|
4
|
+
data.tar.gz: 0eb5b5654694a1eb90e920df6d00d67cf4b8dda7c42fa167760d9c329bd88341
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebbb8a5bcb4eb5cdaf9f0236394f18572922a70e42f7218b9d942420e4234ff30071549fff0c37e5e6e82ffcf3cce61b8b351921915ca749f7e947a8b33e74f0
|
7
|
+
data.tar.gz: c4008e578e219956662b9b0239a543c95f921099cee0dca7553b8770cf4a986fd872b3867a506327a2c4ea522244984341e72dfb970193f1837729c71b078601
|
data/.idea/encodings.xml
ADDED
@@ -1,7 +1,7 @@
|
|
1
1
|
<component name="InspectionProjectProfileManager">
|
2
2
|
<profile version="1.0">
|
3
3
|
<option name="myName" value="Project Default" />
|
4
|
-
<inspection_tool class="Rubocop" enabled="
|
4
|
+
<inspection_tool class="Rubocop" enabled="false" level="WARNING" enabled_by_default="true">
|
5
5
|
<scope name="Tests" level="ERROR" enabled="true" />
|
6
6
|
</inspection_tool>
|
7
7
|
<inspection_tool class="RubyInstanceMethodNamingConvention" enabled="true" level="WARNING" enabled_by_default="true">
|
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.7.1
|
data/PATTERNS.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Should establish
|
2
|
+
## URLs in ressource classes
|
3
|
+
Add methods to build urls
|
4
|
+
|
5
|
+
def url_configbuilder
|
6
|
+
['cloud-service-config', 'configbuilder', 'accounts',
|
7
|
+
@account.id, 'devices', @device.id, 'ui']
|
8
|
+
end
|
9
|
+
|
10
|
+
Not decided yet if private or public
|
11
|
+
|
12
|
+
## Parameter ordering for initialize methods
|
13
|
+
|
14
|
+
Library/API objects ordered from least to most specific.
|
15
|
+
Object specific data hashes go last.
|
16
|
+
|
17
|
+
### Embedding the Cloud object in ressources
|
18
|
+
* First parameter in initalizer
|
19
|
+
* Saved in @cloud instance var
|
20
|
+
* Should be exposed via getter (attr_reader)
|
21
|
+
|
22
|
+
It' is also okay to use Cloud object from parent object if a reasonable one is passed.
|
23
|
+
|
24
|
+
|
25
|
+
# Unsolved, bad
|
26
|
+
* Cloud http methods (get, etc.) return response object. 99% of the time, have to call .body on it
|
data/{README.md → README.rdoc}
RENAMED
File without changes
|
data/Rakefile
CHANGED
@@ -1,17 +1,42 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rake/testtask'
|
5
5
|
require 'rubocop/rake_task'
|
6
|
+
require 'rdoc/task'
|
6
7
|
|
7
8
|
Rake::TestTask.new(:test) do |t|
|
8
|
-
t.libs <<
|
9
|
-
t.libs <<
|
10
|
-
t.test_files = FileList[
|
9
|
+
t.libs << 'test'
|
10
|
+
t.libs << 'lib'
|
11
|
+
t.test_files = FileList['test/**/*_test.rb']
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
14
|
RuboCop::RakeTask.new(:autocop) do |t|
|
15
|
-
|
15
|
+
autofix = [
|
16
|
+
'Layout/EmptyLines',
|
17
|
+
'Layout/EmptyLinesAroundClassBody',
|
18
|
+
'Layout/EmptyLinesAroundModuleBody',
|
19
|
+
'Layout/EmptyLineBetweenDefs',
|
20
|
+
'Layout/LeadingCommentSpace',
|
21
|
+
'Layout/SpaceAroundOperators',
|
22
|
+
'Layout/SpaceInsideBlockBraces',
|
23
|
+
'Layout/SpaceInsideHashLiteralBraces',
|
24
|
+
'Layout/TrailingEmptyLines',
|
25
|
+
'Style/CommentAnnotation',
|
26
|
+
'Style/FrozenStringLiteralComment',
|
27
|
+
'Style/MethodDefParentheses',
|
28
|
+
'Style/RedundantSelf',
|
29
|
+
'Style/RedundantReturn',
|
30
|
+
'Style/StringLiterals',
|
31
|
+
'Style/StringLiteralsInInterpolation',
|
32
|
+
'Style/StabbyLambdaParentheses',
|
33
|
+
]
|
34
|
+
t.options = ['--only', autofix.join(','), '--auto-correct', 'lib', 'test', 'Rakefile', 'lmc.gemspec']
|
16
35
|
end
|
17
36
|
task :default => :test
|
37
|
+
|
38
|
+
RDoc::Task.new do |rdoc|
|
39
|
+
rdoc.main = 'README.rdoc'
|
40
|
+
rdoc.rdoc_files.include('README.rdoc', 'lib/**/*.rb')
|
41
|
+
end
|
42
|
+
|
data/coverage/.last_run.json
CHANGED
data/lib/lmc.rb
CHANGED
@@ -11,7 +11,7 @@ module LMC
|
|
11
11
|
'cloud-service-licenses']
|
12
12
|
|
13
13
|
def self.useful
|
14
|
-
|
14
|
+
true
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -23,7 +23,7 @@ Dir.glob(File.expand_path('../lmc/*.rb', __FILE__)).each do |file|
|
|
23
23
|
require file
|
24
24
|
end
|
25
25
|
|
26
|
-
['exceptions', 'auth', 'monitoring'].each do |folder|
|
26
|
+
['exceptions', 'auth', 'config', 'monitoring', 'preferences'].each do |folder|
|
27
27
|
Dir.glob(File.expand_path("../lmc/#{folder}/*.rb", __FILE__)).each do |file|
|
28
28
|
require file
|
29
29
|
end
|
data/lib/lmc/Account.rb
CHANGED
@@ -10,22 +10,22 @@ module LMC
|
|
10
10
|
|
11
11
|
def self.get(id)
|
12
12
|
cloud = Cloud.instance
|
13
|
-
result = cloud.get [
|
14
|
-
|
13
|
+
result = cloud.get ['cloud-service-auth', 'accounts', id.to_s]
|
14
|
+
Account.new(cloud, result.body)
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.get_by_uuid
|
18
|
-
raise
|
19
|
-
|
17
|
+
def self.get_by_uuid(uuid)
|
18
|
+
raise 'Missing argument' if uuid.nil?
|
19
|
+
get uuid
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.get_by_name(name, type = nil)
|
23
|
-
raise
|
23
|
+
raise 'Missing argument' if name.nil?
|
24
24
|
accounts = Cloud.instance.get_accounts_objects.select do |a|
|
25
25
|
(name.nil? || a.name == name) && (type.nil? || a.type == type)
|
26
26
|
end
|
27
27
|
if accounts.length == 1
|
28
|
-
|
28
|
+
accounts[0]
|
29
29
|
elsif accounts.length == 0
|
30
30
|
raise 'Did not find account'
|
31
31
|
else
|
@@ -33,21 +33,21 @@ module LMC
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
def initialize(data)
|
37
|
-
@cloud =
|
36
|
+
def initialize(cloud, data)
|
37
|
+
@cloud = cloud
|
38
38
|
apply_data(data)
|
39
39
|
end
|
40
40
|
|
41
|
-
#returns itself, allows chaining
|
41
|
+
# returns itself, allows chaining
|
42
42
|
def save
|
43
43
|
response = if @id.nil?
|
44
44
|
@cloud.auth_for_accounts [@parent]
|
45
|
-
@cloud.post [
|
45
|
+
@cloud.post ['cloud-service-auth', 'accounts'], self
|
46
46
|
else
|
47
47
|
@cloud.post path, self
|
48
48
|
end
|
49
49
|
apply_data(response.body)
|
50
|
-
|
50
|
+
self
|
51
51
|
end
|
52
52
|
|
53
53
|
def delete!
|
@@ -56,11 +56,11 @@ module LMC
|
|
56
56
|
delete_action = AuthAction.new @cloud
|
57
57
|
delete_action.type = AuthAction::ACCOUNT_DELETE
|
58
58
|
delete_action.name = Cloud.user
|
59
|
-
delete_action.data = {'password' => Cloud.password,
|
60
|
-
'accountId' => @id}
|
59
|
+
delete_action.data = { 'password' => Cloud.password,
|
60
|
+
'accountId' => @id }
|
61
61
|
delete_action.post
|
62
62
|
@id = nil
|
63
|
-
|
63
|
+
true
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -71,32 +71,39 @@ module LMC
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def members
|
74
|
-
ids = Cloud.instance.get [
|
74
|
+
ids = Cloud.instance.get ['cloud-service-auth', 'accounts', @id, 'members'], 'select' => 'id'
|
75
75
|
puts ids.inspect if Cloud.debug
|
76
76
|
principals = ids.map do |principal_id|
|
77
|
-
response = Cloud.instance.get [
|
77
|
+
response = Cloud.instance.get ['cloud-service-auth', 'accounts', @id, 'members', principal_id]
|
78
78
|
principal = response.body
|
79
79
|
puts principal.inspect if Cloud.debug
|
80
80
|
principal
|
81
81
|
end
|
82
|
-
|
82
|
+
principals
|
83
83
|
end
|
84
84
|
|
85
|
-
def find_member_by_name
|
86
|
-
|
85
|
+
def find_member_by_name(name)
|
86
|
+
if name.nil?
|
87
|
+
raise 'No member name given'
|
88
|
+
end
|
89
|
+
member = members.find { |m| m.name == name }
|
90
|
+
unless member
|
91
|
+
raise "Member named #{name} not found in account #{self}"
|
92
|
+
end
|
93
|
+
member
|
87
94
|
end
|
88
95
|
|
89
|
-
#def update_member(principal_id, data)
|
96
|
+
# def update_member(principal_id, data)
|
90
97
|
# response = @cloud.post ["cloud-service-auth", "accounts", id, 'members', principal_id], data
|
91
98
|
# return response
|
92
|
-
#end
|
99
|
+
# end
|
93
100
|
|
94
101
|
def remove_membership(member_id)
|
95
|
-
@cloud.delete [
|
102
|
+
@cloud.delete ['cloud-service-auth', 'accounts', id, 'members', member_id]
|
96
103
|
end
|
97
104
|
|
98
105
|
def remove_membership_self
|
99
|
-
@cloud.delete [
|
106
|
+
@cloud.delete ['cloud-service-auth', 'accounts', id, 'members', 'self']
|
100
107
|
end
|
101
108
|
|
102
109
|
def authority(authority_id)
|
@@ -112,30 +119,29 @@ module LMC
|
|
112
119
|
authorities = response.body.map do |r|
|
113
120
|
Authority.new r, self
|
114
121
|
end
|
115
|
-
|
122
|
+
authorities
|
116
123
|
end
|
117
124
|
|
118
125
|
def children
|
119
|
-
@cloud.auth_for_accounts([
|
126
|
+
@cloud.auth_for_accounts([id, ROOT_ACCOUNT_UUID])
|
120
127
|
response = @cloud.get ['cloud-service-auth', 'accounts', id, 'children']
|
121
|
-
response.map {|child| Account.new child}
|
128
|
+
response.map { |child| Account.new @cloud, child }
|
122
129
|
end
|
123
130
|
|
124
|
-
|
125
131
|
def logs
|
126
132
|
# https://lmctest/cloud-service-logging/accounts/6392b234-b11c-498a-a077-a5f5b23c54a0/logs?lang=DE
|
127
133
|
cloud = Cloud.instance
|
128
134
|
cloud.auth_for_accounts [id]
|
129
|
-
cloud.get([
|
135
|
+
cloud.get(['cloud-service-logging', 'accounts', id, 'logs?lang=DE']).body
|
130
136
|
end
|
131
137
|
|
132
138
|
def sites
|
133
139
|
# private clouds can not have sites
|
134
|
-
return [] if @type ==
|
140
|
+
return [] if @type == 'PRIVATE_CLOUD'
|
135
141
|
@cloud.auth_for_accounts([id])
|
136
|
-
response = @cloud.get [
|
137
|
-
|
138
|
-
Site.new(data, self)
|
142
|
+
response = @cloud.get ['cloud-service-devices', 'accounts', id, 'sites'], :select => :id
|
143
|
+
response.body.map { |data|
|
144
|
+
Site.new(UUID.new(data), self)
|
139
145
|
}
|
140
146
|
end
|
141
147
|
|
@@ -145,16 +151,16 @@ module LMC
|
|
145
151
|
|
146
152
|
def config_updatestates
|
147
153
|
@cloud.auth_for_accounts([id])
|
148
|
-
response = @cloud.get [
|
149
|
-
|
154
|
+
response = @cloud.get ['cloud-service-config', 'configdevice', 'accounts', id, 'updatestates']
|
155
|
+
LMC::Configstates.new response.body
|
150
156
|
end
|
151
157
|
|
152
158
|
def to_json(*a)
|
153
159
|
{
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
160
|
+
'name' => @name,
|
161
|
+
'state' => @state,
|
162
|
+
'type' => @type,
|
163
|
+
'parent' => @parent
|
158
164
|
}.to_json(*a)
|
159
165
|
end
|
160
166
|
|
@@ -162,21 +168,25 @@ module LMC
|
|
162
168
|
"#{name}"
|
163
169
|
end
|
164
170
|
|
171
|
+
def summary
|
172
|
+
"\"#{@name}\" (#{@type}) ID: #{@id}"
|
173
|
+
end
|
174
|
+
|
165
175
|
private
|
166
176
|
|
167
177
|
## should be put into entity or such
|
168
178
|
def path
|
169
|
-
[
|
179
|
+
['cloud-service-auth', 'accounts', @id].join('/')
|
170
180
|
end
|
171
181
|
|
172
182
|
def apply_data(data)
|
173
|
-
@id = data[
|
174
|
-
@parent = data[
|
175
|
-
@name = data[
|
176
|
-
@state = data[
|
177
|
-
@type = data[
|
178
|
-
@identifier = data[
|
183
|
+
@id = data['id']
|
184
|
+
@parent = data['parent']
|
185
|
+
@name = data['name']
|
186
|
+
@state = data['state']
|
187
|
+
@type = data['type']
|
188
|
+
@identifier = data['identifier']
|
179
189
|
end
|
180
|
-
|
181
190
|
end
|
182
191
|
end
|
192
|
+
|
data/lib/lmc/Cloud.rb
CHANGED
@@ -12,9 +12,10 @@ module LMC
|
|
12
12
|
Cloud.verify_tls = true
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.instance(opts = {authorize: true})
|
16
|
-
@@inst ||=
|
15
|
+
def self.instance(opts = { authorize: true })
|
16
|
+
@@inst ||= new(@cloud_host, @user, @password, opts[:authorize])
|
17
17
|
end
|
18
|
+
|
18
19
|
attr_reader :auth_ok, :cloud_host, :user, :password
|
19
20
|
|
20
21
|
def initialize(cloud_host, user, pass, auth = true)
|
@@ -47,21 +48,26 @@ module LMC
|
|
47
48
|
result = get ['cloud-service-auth', 'accounts']
|
48
49
|
if result.code == 200
|
49
50
|
accounts = result.map do |aj|
|
50
|
-
Account.new(aj)
|
51
|
+
Account.new(self, aj)
|
51
52
|
end
|
52
53
|
else
|
53
54
|
raise "Unable to fetch accounts: #{result.body.message}"
|
54
55
|
end
|
55
56
|
|
56
|
-
|
57
|
+
accounts
|
57
58
|
end
|
58
59
|
|
59
60
|
def invite_user_to_account(email, account_id, type, authorities = [])
|
60
|
-
body = {name: email, state: 'ACTIVE', type: type}
|
61
|
+
body = { name: email, state: 'ACTIVE', type: type }
|
61
62
|
body['authorities'] = authorities
|
62
63
|
post ['cloud-service-auth', 'accounts', account_id, 'members'], body
|
63
64
|
end
|
64
65
|
|
66
|
+
# @param section Array of String to indicate section to access. Example: ['principal', 'self', 'ui']
|
67
|
+
def preferences(section)
|
68
|
+
LMC::Preferences.new cloud: self, section: section
|
69
|
+
end
|
70
|
+
|
65
71
|
def get(path, params = nil)
|
66
72
|
prepared_headers = headers
|
67
73
|
prepared_headers[:params] = params
|
@@ -73,31 +79,37 @@ module LMC
|
|
73
79
|
execute_request args
|
74
80
|
end
|
75
81
|
|
76
|
-
def put(path, body_object)
|
82
|
+
def put(path, body_object, params = nil)
|
83
|
+
prepared_headers = headers
|
84
|
+
prepared_headers[:params] = params
|
77
85
|
args = {
|
78
86
|
:method => :put,
|
79
87
|
:url => build_url(path),
|
80
|
-
:payload => body_object.to_json
|
81
|
-
|
88
|
+
:payload => body_object.to_json,
|
89
|
+
:headers => prepared_headers
|
82
90
|
}
|
83
91
|
execute_request args
|
84
92
|
end
|
85
93
|
|
86
|
-
def post(path, body_object)
|
94
|
+
def post(path, body_object, params=nil )
|
95
|
+
prepared_headers = headers
|
96
|
+
prepared_headers[:params] = params
|
87
97
|
args = {
|
88
98
|
:method => :post,
|
89
99
|
:url => build_url(path),
|
90
|
-
:payload => body_object.to_json
|
100
|
+
:payload => body_object.to_json,
|
101
|
+
:headers => prepared_headers
|
91
102
|
}
|
92
103
|
execute_request args
|
93
104
|
end
|
94
105
|
|
95
|
-
def delete(path,
|
106
|
+
def delete(path, params = nil)
|
107
|
+
prepared_headers = headers
|
108
|
+
prepared_headers[:params] = params
|
96
109
|
args = {
|
97
110
|
:method => :delete,
|
98
111
|
:url => build_url(path),
|
99
|
-
:
|
100
|
-
:headers => headers
|
112
|
+
:headers => prepared_headers
|
101
113
|
}
|
102
114
|
execute_request args
|
103
115
|
end
|
@@ -117,27 +129,31 @@ module LMC
|
|
117
129
|
["#{protocol}://#{@cloud_host}", path_components].flatten.compact.join('/')
|
118
130
|
end
|
119
131
|
|
120
|
-
def auth_for_accounts(
|
121
|
-
|
122
|
-
authorize(account_ids)
|
132
|
+
def auth_for_accounts(accounts)
|
133
|
+
authorize(accounts)
|
123
134
|
end
|
124
135
|
|
125
136
|
def auth_for_account(account)
|
126
|
-
|
137
|
+
authorize([account])
|
127
138
|
end
|
128
139
|
|
129
140
|
def accept_tos(tos)
|
130
141
|
authorize([], tos)
|
131
142
|
end
|
132
143
|
|
133
|
-
|
134
144
|
private
|
135
145
|
|
136
|
-
def authorize(
|
146
|
+
def authorize(accounts = [], tos = [])
|
147
|
+
account_ids = accounts.map { |a|
|
148
|
+
if a.respond_to? :id
|
149
|
+
a.id
|
150
|
+
else
|
151
|
+
a
|
152
|
+
end
|
153
|
+
}
|
137
154
|
if account_ids != @last_authorized_account_ids
|
138
155
|
begin
|
139
|
-
reply = post(['cloud-service-auth', 'auth'],
|
140
|
-
puts 'authorize reply ' + reply.inspect if Cloud.debug
|
156
|
+
reply = post(['cloud-service-auth', 'auth'], name: @user, password: @password, accountIds: account_ids, termsOfUse: tos)
|
141
157
|
@last_authorized_account_ids = account_ids
|
142
158
|
@auth_token = reply
|
143
159
|
@auth_ok = true
|
@@ -160,7 +176,7 @@ module LMC
|
|
160
176
|
if @auth_ok
|
161
177
|
headers[:Authorization] = auth_bearer
|
162
178
|
end
|
163
|
-
|
179
|
+
headers
|
164
180
|
end
|
165
181
|
|
166
182
|
def rest_options
|
@@ -175,17 +191,16 @@ module LMC
|
|
175
191
|
internal_args.merge! args
|
176
192
|
begin
|
177
193
|
resp = RestClient::Request.execute internal_args
|
178
|
-
|
194
|
+
LMCResponse.new(resp)
|
179
195
|
rescue RestClient::ExceptionWithResponse => e
|
180
|
-
|
196
|
+
if Cloud.debug
|
197
|
+
puts 'EXCEPTION: ' + e.to_s
|
198
|
+
puts 'EX.response: ' + e.response.to_s
|
199
|
+
puts JSON.parse(e.response)['message']
|
200
|
+
end
|
181
201
|
raise e
|
182
202
|
end
|
183
203
|
end
|
184
|
-
|
185
|
-
def print_exception(execption)
|
186
|
-
puts 'EXCEPTION: ' + execption.to_s
|
187
|
-
puts 'EX.response: ' + execption.response.to_s
|
188
|
-
puts JSON.parse(execption.response)['message']
|
189
|
-
end
|
190
204
|
end
|
191
205
|
end
|
206
|
+
|