lmc 0.8.0 → 0.9.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 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