noms-client 1.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 +7 -0
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/LICENSE +191 -0
- data/README.rst +16 -0
- data/Rakefile +21 -0
- data/TODO +8 -0
- data/bin/ansible-cmdb +70 -0
- data/bin/noms +774 -0
- data/control.m4 +8 -0
- data/etc/noms.conf +11 -0
- data/lib/ncc/client.rb +108 -0
- data/lib/noms/client/version.rb +7 -0
- data/lib/noms/cmdb.rb +136 -0
- data/lib/noms/errors.rb +11 -0
- data/lib/noms/httpclient.rb +508 -0
- data/lib/noms/nagui.rb +57 -0
- data/lib/spec_helper.rb +28 -0
- data/noms-client.gemspec +26 -0
- data/spec/01nomscmdb_spec.rb +21 -0
- data/spec/02noms.sh +8 -0
- data/spec/03ncc_spec.rb +90 -0
- data/spec/04cmdb-mock_spec.rb +214 -0
- data/spec/05restmock-persist_spec.rb +83 -0
- data/spec/06noms-mock.sh +35 -0
- data/spec/07noms-admin.sh +91 -0
- metadata +148 -0
data/control.m4
ADDED
data/etc/noms.conf
ADDED
data/lib/ncc/client.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
#!ruby
|
2
|
+
# /* Copyright 2014 Evernote Corporation. All rights reserved.
|
3
|
+
# Copyright 2013 Proofpoint, Inc. All rights reserved.
|
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
|
+
|
19
|
+
require 'noms/httpclient'
|
20
|
+
|
21
|
+
class NCC
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class NCC::Client < NOMS::HttpClient
|
26
|
+
|
27
|
+
def config_key
|
28
|
+
'ncc'
|
29
|
+
end
|
30
|
+
|
31
|
+
# ncc-api (probably due to nginx) returns bad content-types
|
32
|
+
def ignore_content_type
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def info
|
37
|
+
do_request :GET => ''
|
38
|
+
end
|
39
|
+
|
40
|
+
def list(cloud=nil)
|
41
|
+
if cloud.nil?
|
42
|
+
clouds = do_request "clouds"
|
43
|
+
clouds.map do |c|
|
44
|
+
list c
|
45
|
+
end.flatten
|
46
|
+
else
|
47
|
+
do_request :GET => "clouds/#{cloud}/instances"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def instance(cloud, id)
|
52
|
+
do_request :GET => "clouds/#{cloud}/instances/#{id}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def clouds(cloudname=nil)
|
56
|
+
unless cloudname
|
57
|
+
cloudnames = do_request :GET => "clouds"
|
58
|
+
cloudnames.map do |cloudname|
|
59
|
+
if cloudname.respond_to? :keys
|
60
|
+
cloudname
|
61
|
+
else
|
62
|
+
do_request :GET => "clouds/#{cloudname}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
do_request :GET => "clouds/#{cloudname}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def create(cloud, attrs)
|
71
|
+
do_request :POST => "clouds/#{cloud}/instances",
|
72
|
+
:body => attrs
|
73
|
+
end
|
74
|
+
|
75
|
+
def delete(cloud, attrs)
|
76
|
+
if attrs.has_key? :id
|
77
|
+
do_request :DELETE => "clouds/#{cloud}/instances/#{attrs[:id]}"
|
78
|
+
elsif attrs.has_key? :name
|
79
|
+
# For now I have to do this--not optimal, should be in NCC-API
|
80
|
+
instobj = find_by_name(cloud, attrs[:name])
|
81
|
+
if instobj
|
82
|
+
do_request :DELETE => "clouds/#{cloud}/instances/#{instobj['id']}"
|
83
|
+
else
|
84
|
+
raise "No instance found in cloud #{cloud} with name #{attrs[:name]}"
|
85
|
+
end
|
86
|
+
else
|
87
|
+
raise "Need to delete instance by name or id"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def find_by_name(cloud, name)
|
92
|
+
instobj = (list cloud).find { |i| i['name'] == name }
|
93
|
+
end
|
94
|
+
|
95
|
+
def create(cloud, attrs)
|
96
|
+
do_request :POST => "clouds/#{cloud}/instances",
|
97
|
+
:body => attrs
|
98
|
+
end
|
99
|
+
|
100
|
+
def instance(cloud, id)
|
101
|
+
do_request :GET => "clouds/#{cloud}/instances/#{id}"
|
102
|
+
end
|
103
|
+
|
104
|
+
def console(cloud, id)
|
105
|
+
do_request :GET => "clouds/#{cloud}/instances/#{id}/console"
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
data/lib/noms/cmdb.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
#!ruby
|
2
|
+
# /* Copyright 2014 Evernote Corporation. All rights reserved.
|
3
|
+
# Copyright 2013 Proofpoint, Inc. All rights reserved.
|
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
|
+
require 'noms/httpclient'
|
19
|
+
require 'uri'
|
20
|
+
|
21
|
+
class NOMS
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class NOMS::CMDB < NOMS::HttpClient
|
26
|
+
|
27
|
+
def self.mockery
|
28
|
+
NOMS::CMDB::Mock
|
29
|
+
end
|
30
|
+
|
31
|
+
def config_key
|
32
|
+
'cmdb'
|
33
|
+
end
|
34
|
+
|
35
|
+
def query(type, *condlist)
|
36
|
+
do_request(:GET => "#{type}", :query => URI.encode(condlist.join('&')))
|
37
|
+
end
|
38
|
+
|
39
|
+
def help(type)
|
40
|
+
do_request(:GET => type, :query => 'help')
|
41
|
+
end
|
42
|
+
|
43
|
+
def key_field_of(type)
|
44
|
+
case type
|
45
|
+
when 'system'
|
46
|
+
'fqdn'
|
47
|
+
else
|
48
|
+
'id'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def system(hostname)
|
53
|
+
do_request(:GET => "system/#{hostname}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def system_audit(hostname)
|
57
|
+
do_request(:GET => "inv_audit", :query => "entity_key=#{hostname}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_or_assign_system_name(serial)
|
61
|
+
do_request(:GET => "pcmsystemname/#{serial}")
|
62
|
+
end
|
63
|
+
|
64
|
+
def update(type, obj, key=nil)
|
65
|
+
key ||= obj[key_field_of(type)]
|
66
|
+
do_request(:PUT => "#{type}/#{key}", :body => obj)
|
67
|
+
end
|
68
|
+
|
69
|
+
def tc_post(obj)
|
70
|
+
do_request(:POST => "fact", :body => obj)
|
71
|
+
end
|
72
|
+
def environments
|
73
|
+
do_request :GET => 'environments'
|
74
|
+
end
|
75
|
+
|
76
|
+
def environment(env)
|
77
|
+
do_request :GET => "environments/#{env}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_environment(env, attrs)
|
81
|
+
do_request :POST => "environments", :body => attrs.merge({ :name => env })
|
82
|
+
environment env
|
83
|
+
end
|
84
|
+
|
85
|
+
def delete_environment(env)
|
86
|
+
do_request :DELETE => "environments/#{env}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def services(env)
|
90
|
+
do_request :GET => "environments/#{env}/services"
|
91
|
+
end
|
92
|
+
|
93
|
+
def service(env, service)
|
94
|
+
do_request :GET => "environments/#{env}/services/#{service}"
|
95
|
+
end
|
96
|
+
|
97
|
+
def update_service(env, service, attrs)
|
98
|
+
do_request :PUT => "environments/#{env}/services/#{service}",
|
99
|
+
:body => attrs
|
100
|
+
end
|
101
|
+
|
102
|
+
# CMDB API bug means use this endpoint to create
|
103
|
+
def create_service(env, service, attrs)
|
104
|
+
attrs[:name] = service
|
105
|
+
attrs[:environment_name] = env
|
106
|
+
do_request :POST => "service_instance", :body => attrs
|
107
|
+
do_request :PUT => "environments/#{env}/services/#{service}",
|
108
|
+
:body => attrs
|
109
|
+
end
|
110
|
+
|
111
|
+
def delete_service(env, service)
|
112
|
+
do_request :DELETE => "environments/#{env}/services/#{service}"
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
class NOMS::CMDB::Mock < NOMS::HttpClient::RestMock
|
118
|
+
|
119
|
+
@@machine_id = 0
|
120
|
+
|
121
|
+
def handle_mock(method, uri, opt)
|
122
|
+
if m = Regexp.new('/pcmsystemname/([^/]+)').match(uri.path)
|
123
|
+
serial = m[1]
|
124
|
+
@@machine_id += 1
|
125
|
+
name = "m-%03d.mock" % @@machine_id
|
126
|
+
do_request :PUT => "system/#{name}",
|
127
|
+
:body => {
|
128
|
+
'serial' => serial,
|
129
|
+
'fqdn' => name
|
130
|
+
}
|
131
|
+
else
|
132
|
+
false
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|