lmc 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 31077763003e89d0d7d95ccf0882eca185921b9b
4
- data.tar.gz: 20f58644eeb3bbf19f9a20142f6603147f028a51
3
+ metadata.gz: 4cf28191aafd359f60cc8d8d3eb7b9c4ffb4ff6a
4
+ data.tar.gz: 109b27a7784b63820b94a63d04ca53174a59a687
5
5
  SHA512:
6
- metadata.gz: 7eb1f25f826afe31759b6a553acd5fbeee9aaef610a09a9e280441d21390fca1e169fc00a1aa77ba81d7567940ecb5b7de3730658ee4cc93b7262fb79be04bd6
7
- data.tar.gz: 2054e10d846866b107e70e12c6413adc863cf5a48a0b3399254db08c72e4f042b887bee326cb8d8efd3f2e5922c8fab2e372eabcf24ce644c9876548198c1035
6
+ metadata.gz: 2ce921af5e82516e865bb5241719f7efb09b90dfac67d6d82402ffa06bc4b27bd108735784b25cccff56e0c2193e8c8c198ad879d443b9ea723353b93bb0a1bc
7
+ data.tar.gz: db341afd04ed21951870cd9a982c27d0bf93eee1a9872dce292bc6c9f324e27d62ca66021709cb7d9a04a09d709f2ca1154bb7eec7cb18a22baece62f4775492
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Encoding" addBOMForNewFiles="with NO BOM" />
4
+ </project>
@@ -1,2 +1,4 @@
1
1
  Layout/IndentHash:
2
- IndentationWidth: 4
2
+ IndentationWidth: 4
3
+ Metrics/LineLength:
4
+ Max: 110
@@ -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
File without changes
data/Rakefile CHANGED
@@ -1,17 +1,40 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
4
- require "rake/testtask"
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 << "test"
9
- t.libs << "lib"
10
- t.test_files = FileList["test/**/*_test.rb"]
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
- t.options = ['--only', 'Style/FrozenStringLiteralComment', '--auto-correct', 'lib', 'test', 'Rakefile', 'lmc.gemspec']
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/TrailingBlankLines',
25
+ 'Style/BracesAroundHashParameters',
26
+ 'Style/CommentAnnotation',
27
+ 'Style/FrozenStringLiteralComment',
28
+ 'Style/MethodDefParentheses',
29
+ 'Style/RedundantSelf',
30
+ 'Style/RedundantReturn',
31
+ 'Style/StringLiterals',
32
+ 'Style/StringLiteralsInInterpolation']
33
+ t.options = ['--only', autofix.join(','), '--auto-correct', 'lib', 'test', 'Rakefile', 'lmc.gemspec']
16
34
  end
17
35
  task :default => :test
36
+
37
+ RDoc::Task.new do |rdoc|
38
+ rdoc.main = 'README.rdoc'
39
+ rdoc.rdoc_files.include('README.rdoc', 'lib/**/*.rb')
40
+ end
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "result": {
3
- "covered_percent": 84.99
3
+ "covered_percent": 90.56
4
4
  }
5
5
  }
data/lib/lmc.rb CHANGED
@@ -11,7 +11,7 @@ module LMC
11
11
  'cloud-service-licenses']
12
12
 
13
13
  def self.useful
14
- return true
14
+ true
15
15
  end
16
16
  end
17
17
 
@@ -23,9 +23,8 @@ 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'].each do |folder|
27
27
  Dir.glob(File.expand_path("../lmc/#{folder}/*.rb", __FILE__)).each do |file|
28
28
  require file
29
29
  end
30
30
  end
31
-
@@ -10,17 +10,17 @@ module LMC
10
10
 
11
11
  def self.get(id)
12
12
  cloud = Cloud.instance
13
- result = cloud.get ["cloud-service-auth", "accounts", id.to_s]
14
- return Account.new(result.body)
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 uuid
18
- raise "Missing argument" if uuid.nil?
19
- return self.get uuid
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 "Missing argument" if name.nil?
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
@@ -33,21 +33,21 @@ module LMC
33
33
  end
34
34
  end
35
35
 
36
- def initialize(data)
37
- @cloud = LMC::Cloud.instance
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 ["cloud-service-auth", "accounts"], self
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
- return self
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
- return true
63
+ true
64
64
  end
65
65
  end
66
66
 
@@ -71,32 +71,32 @@ module LMC
71
71
  end
72
72
 
73
73
  def members
74
- ids = Cloud.instance.get ["cloud-service-auth", "accounts", @id, 'members'], {"select" => "id"}
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 ["cloud-service-auth", "accounts", @id, 'members', principal_id]
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
- return principals
82
+ principals
83
83
  end
84
84
 
85
- def find_member_by_name name
86
- members.find {|m| m.name == name}
85
+ def find_member_by_name(name)
86
+ members.find { |m| m.name == name }
87
87
  end
88
88
 
89
- #def update_member(principal_id, data)
89
+ # def update_member(principal_id, data)
90
90
  # response = @cloud.post ["cloud-service-auth", "accounts", id, 'members', principal_id], data
91
91
  # return response
92
- #end
92
+ # end
93
93
 
94
94
  def remove_membership(member_id)
95
- @cloud.delete ["cloud-service-auth", "accounts", id, "members", member_id]
95
+ @cloud.delete ['cloud-service-auth', 'accounts', id, 'members', member_id]
96
96
  end
97
97
 
98
98
  def remove_membership_self
99
- @cloud.delete ["cloud-service-auth", "accounts", id, "members", "self"]
99
+ @cloud.delete ['cloud-service-auth', 'accounts', id, 'members', 'self']
100
100
  end
101
101
 
102
102
  def authority(authority_id)
@@ -112,30 +112,29 @@ module LMC
112
112
  authorities = response.body.map do |r|
113
113
  Authority.new r, self
114
114
  end
115
- return authorities
115
+ authorities
116
116
  end
117
117
 
118
118
  def children
119
- @cloud.auth_for_accounts([self.id, ROOT_ACCOUNT_UUID])
119
+ @cloud.auth_for_accounts([id, ROOT_ACCOUNT_UUID])
120
120
  response = @cloud.get ['cloud-service-auth', 'accounts', id, 'children']
121
- response.map {|child| Account.new child}
121
+ response.map { |child| Account.new @cloud, child }
122
122
  end
123
123
 
124
-
125
124
  def logs
126
125
  # https://lmctest/cloud-service-logging/accounts/6392b234-b11c-498a-a077-a5f5b23c54a0/logs?lang=DE
127
126
  cloud = Cloud.instance
128
127
  cloud.auth_for_accounts [id]
129
- cloud.get(["cloud-service-logging", "accounts", id, "logs?lang=DE"]).body
128
+ cloud.get(['cloud-service-logging', 'accounts', id, 'logs?lang=DE']).body
130
129
  end
131
130
 
132
131
  def sites
133
132
  # private clouds can not have sites
134
- return [] if @type == "PRIVATE_CLOUD"
133
+ return [] if @type == 'PRIVATE_CLOUD'
135
134
  @cloud.auth_for_accounts([id])
136
- response = @cloud.get ["cloud-service-devices", "accounts", id, "sites"]
137
- return response.body.map {|data|
138
- Site.new(data, self)
135
+ response = @cloud.get ['cloud-service-devices', 'accounts', id, 'sites'], {:select => :id}
136
+ response.body.map { |data|
137
+ Site.new(UUID.new(data), self)
139
138
  }
140
139
  end
141
140
 
@@ -145,16 +144,16 @@ module LMC
145
144
 
146
145
  def config_updatestates
147
146
  @cloud.auth_for_accounts([id])
148
- response = @cloud.get ["cloud-service-config", "configdevice", "accounts", id, "updatestates"]
149
- return LMC::Configstates.new response.body
147
+ response = @cloud.get ['cloud-service-config', 'configdevice', 'accounts', id, 'updatestates']
148
+ LMC::Configstates.new response.body
150
149
  end
151
150
 
152
151
  def to_json(*a)
153
152
  {
154
- "name" => @name,
155
- "state" => @state,
156
- "type" => @type,
157
- "parent" => @parent
153
+ 'name' => @name,
154
+ 'state' => @state,
155
+ 'type' => @type,
156
+ 'parent' => @parent
158
157
  }.to_json(*a)
159
158
  end
160
159
 
@@ -166,17 +165,16 @@ module LMC
166
165
 
167
166
  ## should be put into entity or such
168
167
  def path
169
- ["cloud-service-auth", "accounts", @id].join("/")
168
+ ['cloud-service-auth', 'accounts', @id].join('/')
170
169
  end
171
170
 
172
171
  def apply_data(data)
173
- @id = data["id"]
174
- @parent = data["parent"]
175
- @name = data["name"]
176
- @state = data["state"]
177
- @type = data["type"]
178
- @identifier = data["identifier"]
172
+ @id = data['id']
173
+ @parent = data['parent']
174
+ @name = data['name']
175
+ @state = data['state']
176
+ @type = data['type']
177
+ @identifier = data['identifier']
179
178
  end
180
-
181
179
  end
182
180
  end
@@ -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 ||= self.new(@cloud_host, @user, @password, opts[:authorize])
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,17 +48,17 @@ 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
- return accounts
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
@@ -117,26 +118,31 @@ module LMC
117
118
  ["#{protocol}://#{@cloud_host}", path_components].flatten.compact.join('/')
118
119
  end
119
120
 
120
- def auth_for_accounts(account_ids)
121
- puts 'Authorizing for accounts: ' + account_ids.to_s if Cloud.debug
122
- authorize(account_ids)
121
+ def auth_for_accounts(accounts)
122
+ authorize(accounts)
123
123
  end
124
124
 
125
125
  def auth_for_account(account)
126
- auth_for_accounts([account.id])
126
+ authorize([account])
127
127
  end
128
128
 
129
129
  def accept_tos(tos)
130
130
  authorize([], tos)
131
131
  end
132
132
 
133
-
134
133
  private
135
134
 
136
- def authorize(account_ids = [], tos = [])
135
+ def authorize(accounts = [], tos = [])
136
+ account_ids = accounts.map { |a|
137
+ if a.respond_to? :id
138
+ a.id
139
+ else
140
+ a
141
+ end
142
+ }
137
143
  if account_ids != @last_authorized_account_ids
138
144
  begin
139
- reply = post(['cloud-service-auth', 'auth'], {name: @user, password: @password, accountIds: account_ids, termsOfUse: tos})
145
+ reply = post(['cloud-service-auth', 'auth'], name: @user, password: @password, accountIds: account_ids, termsOfUse: tos)
140
146
  puts 'authorize reply ' + reply.inspect if Cloud.debug
141
147
  @last_authorized_account_ids = account_ids
142
148
  @auth_token = reply
@@ -160,7 +166,7 @@ module LMC
160
166
  if @auth_ok
161
167
  headers[:Authorization] = auth_bearer
162
168
  end
163
- return headers
169
+ headers
164
170
  end
165
171
 
166
172
  def rest_options
@@ -5,12 +5,10 @@ module LMC
5
5
  attr_reader :actual, :outdated
6
6
 
7
7
  def initialize(data)
8
- @actual = data["ACTUAL"]
9
- @outdated = data["OUTDATED"]
8
+ @actual = data['ACTUAL']
9
+ @outdated = data['OUTDATED']
10
10
  @actual ||= 0
11
11
  @outdated ||= 0
12
12
  end
13
-
14
13
  end
15
-
16
- end
14
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module LMC
4
4
  class Device
5
- attr_reader :id, :name, :model, :serial, :heartbeatstate
5
+ attr_reader :id, :name, :model, :serial, :heartbeatstate, :cloud, :account, :status
6
6
 
7
7
  def initialize(data)
8
8
  @id = data['id']
@@ -17,51 +17,42 @@ module LMC
17
17
  @cloud ||= Cloud.instance
18
18
  end
19
19
 
20
- def get_config_for_account(account)
21
- response = @cloud.get ["cloud-service-config", "configbuilder", "accounts", account.id, "devices", @id, "ui"]
22
- JSON.parse(JSON.generate(response.body.to_h)) #terrible hack to get it to work for now. needs way to get more raw body_object from Response
23
- end
24
-
25
20
  def set_config_for_account(config, account)
26
- @cloud.put ["cloud-service-config", "configbuilder", "accounts", account.id, "devices", @id, "ui"], config
21
+ @cloud.put ['cloud-service-config', 'configbuilder', 'accounts', account.id, 'devices', @id, 'ui'], config
27
22
  end
28
23
 
29
24
  def get_monitor_widgets(widget_item_ids)
30
- @cloud.get ["cloud-service-monitoring", @account.id, "devices", @id, "monitordata"], { :widgetItemIds => widget_item_ids.join(",") }
25
+ @cloud.get ['cloud-service-monitoring', @account.id, 'devices', @id, 'monitordata'], :widgetItemIds => widget_item_ids.join(',')
31
26
  end
32
27
 
33
28
  def self.get_for_account(account)
34
29
  cloud = Cloud.instance
35
30
  cloud.auth_for_accounts [account.id]
36
- list = cloud.get ["cloud-service-devices", "accounts", account.id, "devices"]
31
+ list = cloud.get ['cloud-service-devices', 'accounts', account.id, 'devices']
37
32
  if list.code != 200
38
33
  puts "Error getting devices: #{list.body.message}"
39
34
  exit 1
40
35
  end
41
36
  devices = list.map do |data|
42
- data["account"] = account
37
+ data['account'] = account
43
38
  LMC::Device.new(data)
44
39
  end
45
- return devices
40
+ devices
46
41
  end
47
42
 
48
43
  def self.get_for_account_id(account_id)
49
- self.get_for_account Account.get(account_id)
44
+ get_for_account Account.get(account_id)
50
45
  end
51
46
 
52
47
  def config_state
53
48
  @config_state ||= get_config_state
54
49
  end
55
50
 
56
- def logs
57
- # https://lmctest/#/project/6392b234-b11c-498a-a077-a5f5b23c54a0/devices/compact/eaafa152-62cf-48a1-be65-b222886daa6d/logging
58
- #cloud = Cloud.instance
59
- ##cloud.auth_for_accounts [id]
60
- #cloud.get ["cloud-service-logging", "accounts", id, "logs?lang=DE"]
61
- raise "device logs not supported"
51
+ def config
52
+ LMC::DeviceConfig.new(@cloud, @account, self)
62
53
  end
63
54
 
64
- def record name
55
+ def record(name)
65
56
  MonitoringRecord.new(@cloud, @account, self, name)
66
57
  end
67
58
 
@@ -69,17 +60,20 @@ module LMC
69
60
  'DEVICE'
70
61
  end
71
62
 
63
+ def hwmask_hex
64
+ format format '%#010x', status['hwMask']
65
+ end
66
+
72
67
  private
73
68
 
69
+ ##
70
+ # TODO: This functionality is now duplicated in the DeviceConfig class and it's worse there.
74
71
  def get_config_state
75
- reply = @cloud.get ["cloud-service-config", "configdevice", "accounts", @account.id, "state"], { "deviceIds" => @id }
72
+ reply = @cloud.get ['cloud-service-config', 'configdevice', 'accounts', @account.id, 'state'], 'deviceIds' => @id
76
73
  if reply.code == 200
77
74
  # binding.pry
78
75
  DeviceConfigState.new reply.body[@id]
79
76
  end
80
77
  end
81
-
82
-
83
78
  end
84
-
85
79
  end