biosphere 0.0.7 → 0.0.8

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: a79a5dcf4507e01aac559a9398458e01471e3a6a
4
- data.tar.gz: a9191546b52c5e876f6047e1054b3e881428b715
3
+ metadata.gz: 9ee980513ddfc07689e198399e17b9abfc7050e0
4
+ data.tar.gz: 2c473550a6d4b5dccba280ac274dabd8a2b86115
5
5
  SHA512:
6
- metadata.gz: 8b93ed09bb9b7bc62a463436c1cb92f44b8e181eadc308e3dec006a6802aad126cecaa7732e0eea5c30eb95a9a8c7561ecbd74e3ce8de386e5f061746b66f292
7
- data.tar.gz: 8edb393eb8e5b8c8e16375647ad0a905b37b6c6fbd9ae7a35e3f094ffb79b670c108bd3d62b329a20950024f00d7a8b1502d1adfef40738d5e70ba99b34a42f2
6
+ metadata.gz: 9837f4dd741b461a7ff34723851a9b47656caa6274045cf4bacdd538f5325a6b29527332cb88dae55943dbe8bc55233571c2c0dcfda1c3ca9f5311c6e4e78a48
7
+ data.tar.gz: 10331fb8feea36c96e6ae41761ae32a4e161839b1e67075aafa0eaa11b5f46df39807ad681b3d36bec5f98af9195e6778eed3d9f8afed07871337485c59caa48
@@ -1,6 +1,26 @@
1
1
  require 'yaml'
2
2
  require 'kubeclient'
3
3
  require 'erb'
4
+ require 'hashdiff'
5
+
6
+ class String
7
+ # Converts "CamelCase"" into "camel_case"
8
+ def underscore_case()
9
+ str = ""
10
+ self.chars.each do |c|
11
+ if c == c.upcase
12
+ if str != ""
13
+ str += "_"
14
+ end
15
+ str += c.downcase
16
+ else
17
+ str += c
18
+ end
19
+ end
20
+
21
+ return str
22
+ end
23
+ end
4
24
 
5
25
  class Biosphere
6
26
  module Kube
@@ -8,12 +28,25 @@ class Biosphere
8
28
  return str
9
29
  end
10
30
 
31
+ def kube_load_manifest_files(dir)
32
+ files = Dir[dir + "/**/*.erb"]
33
+ resources = []
34
+ files.each do |file|
35
+ resources += kube_load_manifest_file(file)
36
+ end
37
+
38
+ files = Dir[dir + "/**/*.yaml"]
39
+ files.each do |file|
40
+ resources += kube_load_manifest_file(file)
41
+ end
42
+
43
+ resources
44
+ end
11
45
 
12
46
  def kube_load_manifest_file(file)
13
47
  resources = []
14
48
  puts "Loading file #{file}"
15
49
  str = ERB.new(IO.read(file)).result(binding)
16
- raise str
17
50
  Psych.load_stream(str) do |document|
18
51
  kind = document["kind"]
19
52
  resource = ::Kubeclient::Resource.new(document)
@@ -30,7 +63,55 @@ class Biosphere
30
63
  client.rest_client[ns_prefix + resource_name]
31
64
  .post(resource.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(client.instance_variable_get("@headers")))
32
65
  end
33
-
34
66
  end
67
+
68
+
69
+ def kube_apply_resource(client, resource)
70
+ name = resource[:metadata][:name]
71
+ resource_name = client.instance_variable_get("@entities")[resource[:kind].underscore_case].resource_name
72
+ ns_prefix = client.build_namespace_prefix(resource[:metadata][:namespace])
73
+
74
+ responses = []
75
+ begin
76
+ ret = client.rest_client[ns_prefix + resource_name]
77
+ .post(resource.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(client.instance_variable_get("@headers")))
78
+ responses << {
79
+ action: :post,
80
+ resource: ns_prefix + resource_name + "/#{name}",
81
+ body: JSON.parse(ret.body)
82
+ }
83
+ puts "Created resource #{key}/#{name}"
84
+
85
+ rescue RestClient::Conflict => e
86
+ key = ns_prefix + resource_name + "/#{name}"
87
+ rest = client.rest_client[key]
88
+
89
+ ret = rest.get(client.instance_variable_get("@headers"))
90
+ current_data = JSON.parse(ret.body, :symbolize_names => true)
91
+ puts "Updating resource #{key}"
92
+ headers = { 'Content-Type' => 'application/json' }.merge(client.instance_variable_get("@headers"))
93
+ update_resource = resource.dup
94
+ update_resource.delete_field(:apiVersion)
95
+ current_data.merge(update_resource)
96
+ pp current_data.to_h
97
+
98
+ begin
99
+ ret = rest.put(current_data.to_h.to_json, headers)
100
+ responses << {
101
+ action: :put,
102
+ resource: key,
103
+ body: JSON.parse(ret.body)
104
+ }
105
+
106
+ rescue RestClient::Exception => e
107
+ puts "Error updating resource: #{e} #{e.class}"
108
+ pp JSON.parse(e.response)
109
+ rescue RestClient::Exception => e
110
+ puts "Misc exception: #{e}, #{e.class}, #{e.response}"
111
+ end
112
+
113
+ return responses
114
+ end
115
+ end
35
116
  end
36
117
  end
@@ -31,6 +31,10 @@ class Biosphere
31
31
  def save()
32
32
  return Marshal.dump(self)
33
33
  end
34
+
35
+ def values
36
+ return @data.values
37
+ end
34
38
  end
35
39
  end
36
40
 
@@ -137,6 +137,10 @@ class Biosphere
137
137
  return src_path + "/" + File.basename(filename)
138
138
  end
139
139
 
140
+ def find_dir(dirname)
141
+ return Pathname.new(@src_path.last).cleanpath.to_s
142
+ end
143
+
140
144
  def load(filename)
141
145
  src_path = Pathname.new(@src_path.last + "/" + File.dirname(filename)).cleanpath.to_s
142
146
  # Push current src_path and overwrite @src_path so that it tracks recursive loads
@@ -271,5 +275,5 @@ class Biosphere
271
275
  end
272
276
  end
273
277
  end
274
-
278
+
275
279
  end
@@ -1,3 +1,3 @@
1
1
  class Biosphere
2
- Version = "0.0.7"
2
+ Version = "0.0.8"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: biosphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juho Mäkinen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-04 00:00:00.000000000 Z
11
+ date: 2016-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
68
  version: 2.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: hashdiff
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 0.3.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.3.0
69
83
  description: "Terraform's HCL lacks quite many programming features like iterators,
70
84
  true variables, advanced string manipulation, functions etc.\n\n This Ruby tool
71
85
  provides an easy-to-use DSL to define Terraform compatible .json files which can