nucleus 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.gitignore +19 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +44 -0
  6. data/.travis.yml +21 -0
  7. data/CHANGELOG.md +19 -0
  8. data/CONTRIBUTING.md +13 -0
  9. data/Gemfile +16 -0
  10. data/Guardfile +22 -0
  11. data/LICENSE +21 -0
  12. data/README.md +675 -0
  13. data/Rakefile +137 -0
  14. data/bin/nucleus +91 -0
  15. data/bin/nucleus.bat +1 -0
  16. data/config.ru +18 -0
  17. data/config/adapters/cloud_control.yml +32 -0
  18. data/config/adapters/cloud_foundry_v2.yml +61 -0
  19. data/config/adapters/heroku.yml +13 -0
  20. data/config/adapters/openshift_v2.yml +20 -0
  21. data/config/nucleus_config.rb +47 -0
  22. data/lib/nucleus.rb +13 -0
  23. data/lib/nucleus/adapter_resolver.rb +115 -0
  24. data/lib/nucleus/adapters/base_adapter.rb +109 -0
  25. data/lib/nucleus/adapters/buildpack_translator.rb +79 -0
  26. data/lib/nucleus/adapters/v1/cloud_control/application.rb +108 -0
  27. data/lib/nucleus/adapters/v1/cloud_control/authentication.rb +27 -0
  28. data/lib/nucleus/adapters/v1/cloud_control/buildpacks.rb +23 -0
  29. data/lib/nucleus/adapters/v1/cloud_control/cloud_control.rb +153 -0
  30. data/lib/nucleus/adapters/v1/cloud_control/data.rb +76 -0
  31. data/lib/nucleus/adapters/v1/cloud_control/domains.rb +68 -0
  32. data/lib/nucleus/adapters/v1/cloud_control/lifecycle.rb +27 -0
  33. data/lib/nucleus/adapters/v1/cloud_control/log_poller.rb +71 -0
  34. data/lib/nucleus/adapters/v1/cloud_control/logs.rb +103 -0
  35. data/lib/nucleus/adapters/v1/cloud_control/regions.rb +32 -0
  36. data/lib/nucleus/adapters/v1/cloud_control/scaling.rb +17 -0
  37. data/lib/nucleus/adapters/v1/cloud_control/semantic_errors.rb +31 -0
  38. data/lib/nucleus/adapters/v1/cloud_control/services.rb +162 -0
  39. data/lib/nucleus/adapters/v1/cloud_control/token.rb +17 -0
  40. data/lib/nucleus/adapters/v1/cloud_control/vars.rb +88 -0
  41. data/lib/nucleus/adapters/v1/cloud_foundry_v2/app_states.rb +28 -0
  42. data/lib/nucleus/adapters/v1/cloud_foundry_v2/application.rb +111 -0
  43. data/lib/nucleus/adapters/v1/cloud_foundry_v2/authentication.rb +17 -0
  44. data/lib/nucleus/adapters/v1/cloud_foundry_v2/buildpacks.rb +23 -0
  45. data/lib/nucleus/adapters/v1/cloud_foundry_v2/cloud_foundry_v2.rb +141 -0
  46. data/lib/nucleus/adapters/v1/cloud_foundry_v2/data.rb +97 -0
  47. data/lib/nucleus/adapters/v1/cloud_foundry_v2/domains.rb +149 -0
  48. data/lib/nucleus/adapters/v1/cloud_foundry_v2/lifecycle.rb +41 -0
  49. data/lib/nucleus/adapters/v1/cloud_foundry_v2/logs.rb +303 -0
  50. data/lib/nucleus/adapters/v1/cloud_foundry_v2/regions.rb +33 -0
  51. data/lib/nucleus/adapters/v1/cloud_foundry_v2/scaling.rb +15 -0
  52. data/lib/nucleus/adapters/v1/cloud_foundry_v2/semantic_errors.rb +27 -0
  53. data/lib/nucleus/adapters/v1/cloud_foundry_v2/services.rb +286 -0
  54. data/lib/nucleus/adapters/v1/cloud_foundry_v2/vars.rb +80 -0
  55. data/lib/nucleus/adapters/v1/heroku/app_states.rb +57 -0
  56. data/lib/nucleus/adapters/v1/heroku/application.rb +93 -0
  57. data/lib/nucleus/adapters/v1/heroku/authentication.rb +27 -0
  58. data/lib/nucleus/adapters/v1/heroku/buildpacks.rb +27 -0
  59. data/lib/nucleus/adapters/v1/heroku/data.rb +78 -0
  60. data/lib/nucleus/adapters/v1/heroku/domains.rb +43 -0
  61. data/lib/nucleus/adapters/v1/heroku/heroku.rb +146 -0
  62. data/lib/nucleus/adapters/v1/heroku/lifecycle.rb +51 -0
  63. data/lib/nucleus/adapters/v1/heroku/logs.rb +108 -0
  64. data/lib/nucleus/adapters/v1/heroku/regions.rb +42 -0
  65. data/lib/nucleus/adapters/v1/heroku/scaling.rb +28 -0
  66. data/lib/nucleus/adapters/v1/heroku/semantic_errors.rb +23 -0
  67. data/lib/nucleus/adapters/v1/heroku/services.rb +168 -0
  68. data/lib/nucleus/adapters/v1/heroku/vars.rb +65 -0
  69. data/lib/nucleus/adapters/v1/openshift_v2/app_states.rb +68 -0
  70. data/lib/nucleus/adapters/v1/openshift_v2/application.rb +108 -0
  71. data/lib/nucleus/adapters/v1/openshift_v2/authentication.rb +21 -0
  72. data/lib/nucleus/adapters/v1/openshift_v2/data.rb +96 -0
  73. data/lib/nucleus/adapters/v1/openshift_v2/domains.rb +37 -0
  74. data/lib/nucleus/adapters/v1/openshift_v2/lifecycle.rb +60 -0
  75. data/lib/nucleus/adapters/v1/openshift_v2/logs.rb +106 -0
  76. data/lib/nucleus/adapters/v1/openshift_v2/openshift_v2.rb +125 -0
  77. data/lib/nucleus/adapters/v1/openshift_v2/regions.rb +58 -0
  78. data/lib/nucleus/adapters/v1/openshift_v2/scaling.rb +39 -0
  79. data/lib/nucleus/adapters/v1/openshift_v2/semantic_errors.rb +40 -0
  80. data/lib/nucleus/adapters/v1/openshift_v2/services.rb +173 -0
  81. data/lib/nucleus/adapters/v1/openshift_v2/vars.rb +49 -0
  82. data/lib/nucleus/adapters/v1/stub_adapter.rb +464 -0
  83. data/lib/nucleus/core/adapter_authentication_inductor.rb +62 -0
  84. data/lib/nucleus/core/adapter_extensions/auth/auth_client.rb +44 -0
  85. data/lib/nucleus/core/adapter_extensions/auth/authentication_retry_wrapper.rb +79 -0
  86. data/lib/nucleus/core/adapter_extensions/auth/expiring_token_auth_client.rb +53 -0
  87. data/lib/nucleus/core/adapter_extensions/auth/http_basic_auth_client.rb +37 -0
  88. data/lib/nucleus/core/adapter_extensions/auth/o_auth2_auth_client.rb +95 -0
  89. data/lib/nucleus/core/adapter_extensions/auth/token_auth_client.rb +36 -0
  90. data/lib/nucleus/core/adapter_extensions/http_client.rb +177 -0
  91. data/lib/nucleus/core/adapter_extensions/http_tail_client.rb +26 -0
  92. data/lib/nucleus/core/adapter_extensions/tail_stopper.rb +25 -0
  93. data/lib/nucleus/core/common/errors/ambiguous_adapter_error.rb +7 -0
  94. data/lib/nucleus/core/common/errors/file_existence_error.rb +7 -0
  95. data/lib/nucleus/core/common/errors/startup_error.rb +12 -0
  96. data/lib/nucleus/core/common/exit_codes.rb +25 -0
  97. data/lib/nucleus/core/common/files/application_repo_sanitizer.rb +52 -0
  98. data/lib/nucleus/core/common/files/archive_extractor.rb +112 -0
  99. data/lib/nucleus/core/common/files/archiver.rb +91 -0
  100. data/lib/nucleus/core/common/link_generator.rb +46 -0
  101. data/lib/nucleus/core/common/logging/logging.rb +52 -0
  102. data/lib/nucleus/core/common/logging/multi_logger.rb +59 -0
  103. data/lib/nucleus/core/common/logging/request_log_formatter.rb +48 -0
  104. data/lib/nucleus/core/common/ssh_handler.rb +108 -0
  105. data/lib/nucleus/core/common/stream_callback.rb +27 -0
  106. data/lib/nucleus/core/common/thread_config_accessor.rb +85 -0
  107. data/lib/nucleus/core/common/url_converter.rb +28 -0
  108. data/lib/nucleus/core/enums/application_states.rb +26 -0
  109. data/lib/nucleus/core/enums/logfile_types.rb +28 -0
  110. data/lib/nucleus/core/error_messages.rb +127 -0
  111. data/lib/nucleus/core/errors/adapter_error.rb +13 -0
  112. data/lib/nucleus/core/errors/adapter_missing_implementation_error.rb +12 -0
  113. data/lib/nucleus/core/errors/adapter_request_error.rb +10 -0
  114. data/lib/nucleus/core/errors/adapter_resource_not_found_error.rb +10 -0
  115. data/lib/nucleus/core/errors/endpoint_authentication_error.rb +10 -0
  116. data/lib/nucleus/core/errors/platform_specific_semantic_error.rb +12 -0
  117. data/lib/nucleus/core/errors/platform_timeout_error.rb +10 -0
  118. data/lib/nucleus/core/errors/platform_unavailable_error.rb +10 -0
  119. data/lib/nucleus/core/errors/semantic_adapter_request_error.rb +19 -0
  120. data/lib/nucleus/core/errors/unknown_adapter_call_error.rb +10 -0
  121. data/lib/nucleus/core/file_handling/archive_converter.rb +29 -0
  122. data/lib/nucleus/core/file_handling/file_manager.rb +64 -0
  123. data/lib/nucleus/core/file_handling/git_deployer.rb +133 -0
  124. data/lib/nucleus/core/file_handling/git_repo_analyzer.rb +23 -0
  125. data/lib/nucleus/core/import/adapter_configuration.rb +53 -0
  126. data/lib/nucleus/core/import/vendor_parser.rb +28 -0
  127. data/lib/nucleus/core/import/version_detector.rb +18 -0
  128. data/lib/nucleus/core/models/abstract_model.rb +29 -0
  129. data/lib/nucleus/core/models/endpoint.rb +30 -0
  130. data/lib/nucleus/core/models/provider.rb +26 -0
  131. data/lib/nucleus/core/models/vendor.rb +22 -0
  132. data/lib/nucleus/ext/kernel.rb +5 -0
  133. data/lib/nucleus/ext/regexp.rb +49 -0
  134. data/lib/nucleus/os.rb +15 -0
  135. data/lib/nucleus/root_dir.rb +13 -0
  136. data/lib/nucleus/scripts/finalize.rb +8 -0
  137. data/lib/nucleus/scripts/initialize.rb +9 -0
  138. data/lib/nucleus/scripts/initialize_config_defaults.rb +26 -0
  139. data/lib/nucleus/scripts/load.rb +17 -0
  140. data/lib/nucleus/scripts/load_dependencies.rb +43 -0
  141. data/lib/nucleus/scripts/setup_config.rb +28 -0
  142. data/lib/nucleus/scripts/shutdown.rb +11 -0
  143. data/lib/nucleus/version.rb +3 -0
  144. data/nucleus.gemspec +88 -0
  145. data/public/robots.txt +2 -0
  146. data/public/swagger-ui/css/reset.css +125 -0
  147. data/public/swagger-ui/css/screen.css +1224 -0
  148. data/public/swagger-ui/images/apple-touch-icon-114x114.png +0 -0
  149. data/public/swagger-ui/images/apple-touch-icon-120x120.png +0 -0
  150. data/public/swagger-ui/images/apple-touch-icon-144x144.png +0 -0
  151. data/public/swagger-ui/images/apple-touch-icon-152x152.png +0 -0
  152. data/public/swagger-ui/images/apple-touch-icon-57x57.png +0 -0
  153. data/public/swagger-ui/images/apple-touch-icon-60x60.png +0 -0
  154. data/public/swagger-ui/images/apple-touch-icon-72x72.png +0 -0
  155. data/public/swagger-ui/images/apple-touch-icon-76x76.png +0 -0
  156. data/public/swagger-ui/images/explorer_icons.png +0 -0
  157. data/public/swagger-ui/images/favicon-128.png +0 -0
  158. data/public/swagger-ui/images/favicon-16x16.png +0 -0
  159. data/public/swagger-ui/images/favicon-196x196.png +0 -0
  160. data/public/swagger-ui/images/favicon-32x32.png +0 -0
  161. data/public/swagger-ui/images/favicon-96x96.png +0 -0
  162. data/public/swagger-ui/images/favicon.ico +0 -0
  163. data/public/swagger-ui/images/logo_small.png +0 -0
  164. data/public/swagger-ui/images/mstile-144x144.png +0 -0
  165. data/public/swagger-ui/images/mstile-150x150.png +0 -0
  166. data/public/swagger-ui/images/mstile-310x150.png +0 -0
  167. data/public/swagger-ui/images/mstile-310x310.png +0 -0
  168. data/public/swagger-ui/images/mstile-70x70.png +0 -0
  169. data/public/swagger-ui/images/pet_store_api.png +0 -0
  170. data/public/swagger-ui/images/throbber.gif +0 -0
  171. data/public/swagger-ui/images/wordnik_api.png +0 -0
  172. data/public/swagger-ui/index.html +107 -0
  173. data/public/swagger-ui/lib/backbone-min.js +38 -0
  174. data/public/swagger-ui/lib/handlebars-1.0.0.js +2278 -0
  175. data/public/swagger-ui/lib/highlight.7.3.pack.js +1 -0
  176. data/public/swagger-ui/lib/jquery-1.8.0.min.js +2 -0
  177. data/public/swagger-ui/lib/jquery.ba-bbq.min.js +18 -0
  178. data/public/swagger-ui/lib/jquery.slideto.min.js +1 -0
  179. data/public/swagger-ui/lib/jquery.wiggle.min.js +8 -0
  180. data/public/swagger-ui/lib/shred.bundle.js +2765 -0
  181. data/public/swagger-ui/lib/shred/content.js +193 -0
  182. data/public/swagger-ui/lib/swagger-oauth.js +211 -0
  183. data/public/swagger-ui/lib/swagger.js +1653 -0
  184. data/public/swagger-ui/lib/underscore-min.js +32 -0
  185. data/public/swagger-ui/o2c.html +15 -0
  186. data/public/swagger-ui/redirect.html +14 -0
  187. data/public/swagger-ui/swagger-ui.js +2324 -0
  188. data/public/swagger-ui/swagger-ui.min.js +1 -0
  189. data/schemas/api.adapter.schema.yml +31 -0
  190. data/schemas/api.requirements.schema.yml +17 -0
  191. data/spec/factories/models.rb +61 -0
  192. data/spec/integration/api/auth_spec.rb +58 -0
  193. data/spec/integration/api/endpoints_spec.rb +167 -0
  194. data/spec/integration/api/errors_spec.rb +47 -0
  195. data/spec/integration/api/providers_spec.rb +157 -0
  196. data/spec/integration/api/swagger_schema_spec.rb +64 -0
  197. data/spec/integration/api/vendors_spec.rb +45 -0
  198. data/spec/integration/integration_spec_helper.rb +27 -0
  199. data/spec/integration/test_data_generator.rb +55 -0
  200. data/spec/nucleus_git_key.pem +51 -0
  201. data/spec/spec_helper.rb +98 -0
  202. data/spec/support/shared_example_request_types.rb +99 -0
  203. data/spec/test_suites.rake +31 -0
  204. data/spec/unit/adapters/archive_converter_spec.rb +25 -0
  205. data/spec/unit/adapters/file_manager_spec.rb +93 -0
  206. data/spec/unit/adapters/git_deployer_spec.rb +262 -0
  207. data/spec/unit/adapters/v1/stub_spec.rb +14 -0
  208. data/spec/unit/common/helpers/auth_helper_spec.rb +73 -0
  209. data/spec/unit/common/oauth2_auth_client_spec.rb +108 -0
  210. data/spec/unit/common/regexp_spec.rb +33 -0
  211. data/spec/unit/common/request_log_formatter_spec.rb +108 -0
  212. data/spec/unit/common/thread_config_accessor_spec.rb +97 -0
  213. data/spec/unit/models/endpoint_spec.rb +83 -0
  214. data/spec/unit/models/provider_spec.rb +102 -0
  215. data/spec/unit/models/vendor_spec.rb +100 -0
  216. data/spec/unit/schemas/adapter_schema_spec.rb +16 -0
  217. data/spec/unit/schemas/adapter_validation_spec.rb +56 -0
  218. data/spec/unit/schemas/requirements_schema_spec.rb +16 -0
  219. data/spec/unit/unit_spec_helper.rb +11 -0
  220. data/tasks/compatibility.rake +113 -0
  221. data/tasks/evaluation.rake +162 -0
  222. data/wiki/adapter_tests.md +99 -0
  223. data/wiki/implement_new_adapter.md +155 -0
  224. metadata +836 -0
@@ -0,0 +1,18 @@
1
+ module Nucleus
2
+ module VersionDetector
3
+ # Get all abstraction layer versions that are included in the project via the adapters.
4
+ # The abstraction layer versions are identified by the presence of a directory below 'adapters/'.
5
+ # An abstraction layer's directory will resolve to its version.
6
+ # Therefore, if there is a directory 'adapters/v3', 'v3' will be on of the returned versions.
7
+ # The method caches its detected versions and returns the previous result if called multiple times.
8
+ #
9
+ # @return [Array<String>] names of the abstraction layer versions
10
+ def self.api_versions
11
+ return @api_versions if @api_versions
12
+ abstraction_layer_api_versions_dir = "#{Nucleus.root}/lib/nucleus/adapters/*"
13
+ @api_versions = Dir.glob(abstraction_layer_api_versions_dir).map do |f|
14
+ File.basename(f) if File.directory?(f)
15
+ end.compact
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module Nucleus
2
+ #
3
+ # @author Cedric Roeck (cedric.roeck@gmail.com)
4
+ # @since 0.1.0
5
+ class AbstractModel
6
+ include Kwalify::Util::HashLike
7
+
8
+ attr_accessor :id
9
+ attr_accessor :name
10
+ attr_accessor :created_at
11
+ attr_accessor :updated_at
12
+
13
+ def initialize(hash = nil)
14
+ return if hash.nil?
15
+ @name = hash['name']
16
+ @id = hash['id']
17
+ end
18
+
19
+ def to_s
20
+ return name if self.respond_to?('name')
21
+ return id if id
22
+ super.to_s
23
+ end
24
+
25
+ def inspect
26
+ to_s
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,30 @@
1
+ module Nucleus
2
+ # The {Endpoint} model will initially be imported from +.yaml+ description files and shall be persisted
3
+ # in the {Nucleus::DB::Store store}. The endpoint has the following properties:<br>
4
+ # * id (String)
5
+ # * name (String)
6
+ # * provider (Nucleus::Provider)
7
+ # * url (String)
8
+ # * app_domain (String)
9
+ # * trust (Boolean)
10
+ #
11
+ # @author Cedric Roeck (cedric.roeck@gmail.com)
12
+ # @since 0.1.0
13
+ class Endpoint < Nucleus::AbstractModel
14
+ include Kwalify::Util::HashLike
15
+
16
+ attr_accessor :provider
17
+ attr_accessor :url # str
18
+ attr_accessor :app_domain # str
19
+ attr_accessor :trust # bool
20
+
21
+ def initialize(hash = nil)
22
+ super(hash)
23
+ @trust = false
24
+ return if hash.nil?
25
+ @url = hash['url']
26
+ @app_domain = hash['app_domain']
27
+ @trust = hash['trust'] if hash.key?('trust')
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ module Nucleus
2
+ # The {Provider} model will initially be imported from +.yaml+ description files and shall be persisted
3
+ # in the {Nucleus::DB::Store store}. The provider has the following properties:<br>
4
+ # * id (String)
5
+ # * name (String)
6
+ # * vendor (Nucleus::Vendor)
7
+ # * endpoints (Array<Nucleus::Endpoint>)
8
+ #
9
+ # @author Cedric Roeck (cedric.roeck@gmail.com)
10
+ # @since 0.1.0
11
+ class Provider < Nucleus::AbstractModel
12
+ include Kwalify::Util::HashLike
13
+
14
+ attr_accessor :vendor
15
+ attr_accessor :endpoints # seq
16
+
17
+ def initialize(hash = nil)
18
+ super(hash)
19
+ @endpoints = []
20
+ return if hash.nil?
21
+
22
+ return unless hash.key?('endpoints')
23
+ @endpoints = hash['endpoints'].map! { |e| e.is_a?(Nucleus::Endpoint) ? e : Nucleus::Endpoint.new(e) }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ module Nucleus
2
+ # The {Vendor} model will initially be imported from +.yaml+ description files and shall be persisted
3
+ # in the {Nucleus::DB::Store store}. The vendor has the following properties:<br>
4
+ # * id (String)
5
+ # * name (String)
6
+ # * providers (Array<Nucleus::Provider>)
7
+ #
8
+ # @author Cedric Roeck (cedric.roeck@gmail.com)
9
+ # @since 0.1.0
10
+ class Vendor < Nucleus::AbstractModel
11
+ attr_accessor :providers # seq
12
+
13
+ def initialize(hash = nil)
14
+ super(hash)
15
+ @providers = []
16
+ return if hash.nil?
17
+
18
+ return unless hash.key?('providers')
19
+ @providers = hash['providers'].map! { |e| e.is_a?(Nucleus::Provider) ? e : Nucleus::Provider.new(e) }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module Kernel
2
+ def nucleus_config
3
+ Configatron::RootStore.instance
4
+ end
5
+ end
@@ -0,0 +1,49 @@
1
+ class Regexp
2
+ PERFECT_URL_PATTERN = %r{
3
+ \A
4
+
5
+ # protocol identifier
6
+ (?:(?:https?|ftp)://)
7
+
8
+ # user:pass authentication
9
+ (?:\S+(?::\S*)?@)?
10
+
11
+ (?:
12
+ # IP address exclusion
13
+ # private & local networks
14
+ (?!10(?:\.\d{1,3}){3})
15
+ (?!127(?:\.\d{1,3}){3})
16
+ (?!169\.254(?:\.\d{1,3}){2})
17
+ (?!192\.168(?:\.\d{1,3}){2})
18
+ (?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})
19
+
20
+ # IP address dotted notation octets
21
+ # excludes loopback network 0.0.0.0
22
+ # excludes reserved space >= 224.0.0.0
23
+ # excludes network & broacast addresses
24
+ # (first & last IP address of each class)
25
+ (?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])
26
+ (?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}
27
+ (?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))
28
+ |
29
+ # host name
30
+ (?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)
31
+
32
+ # domain name
33
+ (?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*
34
+
35
+ # TLD identifier
36
+ (?:\.(?:[a-z\u00a1-\uffff]{2,}))
37
+ )
38
+
39
+ # port number
40
+ (?::\d{2,5})?
41
+
42
+ # resource path
43
+ (?:/[^\s]*)?
44
+
45
+ \z
46
+ }xi
47
+
48
+ UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
49
+ end
@@ -0,0 +1,15 @@
1
+ # Operating System module to detect the current platform
2
+ # From: http://stackoverflow.com/questions/170956/how-can-i-find-which-operating-system-my-ruby-program-is-running-on
3
+ module OS
4
+ # Is the current platform windows?
5
+ # @return [Boolean] true if on windows, else false
6
+ def self.windows?
7
+ (/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
8
+ end
9
+
10
+ # Is the current platform Unix?
11
+ # @return [Boolean] true if on Unix, else false
12
+ def self.unix?
13
+ !OS.windows?
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module Nucleus
2
+ # Return the project's root directory.
3
+ # @return [Path] project's root directory
4
+ def self.root
5
+ File.join(__dir__, '..', '..')
6
+ end
7
+
8
+ # Return the project's main source code directory 'lib/nucleus''.
9
+ # @return [Path] project's main source code directory
10
+ def self.src
11
+ File.join(Nucleus.root, '/lib/nucleus')
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ # Lock the configuration, so it can't be manipulated
2
+ nucleus_config.lock!
3
+
4
+ puts "Rack environment: #{ENV['RACK_ENV']}" if ENV.key?('RACK_ENV')
5
+ puts 'Configuration locked!'
6
+
7
+ puts 'Initialization complete'
8
+ puts '-----------------------------------------------'
@@ -0,0 +1,9 @@
1
+ include Nucleus::Logging
2
+
3
+ begin
4
+ # Shutdown hook to cleanup
5
+ require 'nucleus/scripts/shutdown'
6
+ rescue Nucleus::StartupError => e
7
+ log.error "Application startup failed (#{e.exit_code}), exit now"
8
+ exit e.exit_code
9
+ end
@@ -0,0 +1,26 @@
1
+ # Check the API versions once and make them available via configatron
2
+ nucleus_config.api.versions = Nucleus::VersionDetector.api_versions
3
+
4
+ # make sure the key is always set
5
+ key_file = nil
6
+ if nucleus_config.ssh.key?(:custom_key) && !nucleus_config.ssh.custom_key.nil?
7
+ puts "Loading custom SSH key #{nucleus_config.ssh.custom_key}"
8
+ # use the custom key file
9
+ key_file = nucleus_config.ssh.custom_key
10
+
11
+ # fail if file does not exist
12
+ unless File.exist?(key_file)
13
+ msg = "Could not find the SSH key: '#{key_file}'"
14
+ STDERR.puts msg
15
+ fail Nucleus::StartupError.new(msg, Nucleus::ExitCodes::INVALID_SSH_KEY_FILE)
16
+ end
17
+
18
+ if File.read(key_file).include?('ENCRYPTED')
19
+ msg = "Provided private key '#{key_file}' must not be protected with a passphrase."
20
+ STDERR.puts msg
21
+ fail Nucleus::StartupError.new(msg, Nucleus::ExitCodes::INVALID_SSH_KEY_FILE_PROTECTED)
22
+ end
23
+ end
24
+
25
+ # now setup the SSHHandler
26
+ nucleus_config.ssh.handler = Nucleus::SSHHandler.new(key_file)
@@ -0,0 +1,17 @@
1
+ # First, load 3rd party dependencies
2
+ require_relative 'load_dependencies'
3
+
4
+ # require all patched classes
5
+ require_rel '../ext'
6
+
7
+ # OS detection
8
+ require 'nucleus/os'
9
+
10
+ # Root directory convenience module
11
+ require 'nucleus/root_dir'
12
+
13
+ # core
14
+ require_rel '../core'
15
+
16
+ # adapters
17
+ require_rel '../adapters'
@@ -0,0 +1,43 @@
1
+ require 'require_all'
2
+
3
+ # actually more native
4
+ require 'tmpdir'
5
+ require 'find'
6
+ require 'time'
7
+ require 'securerandom'
8
+ require 'logger'
9
+
10
+ # database
11
+ require 'moneta'
12
+ require 'daybreak'
13
+ require 'lmdb'
14
+
15
+ # schema
16
+ require 'kwalify'
17
+
18
+ # serialization
19
+ require 'oj'
20
+
21
+ # SSH keys
22
+ require 'sshkey'
23
+
24
+ # Http clients, ...
25
+ # Currently we need excon AND rest_client, due to excon not supporting multipart requests. See also:
26
+ # https://github.com/excon/excon/issues/353
27
+ require 'excon'
28
+ require 'rest_client'
29
+ # faye is used to fetch logs from cloud foundry, using websocket communication
30
+ require 'faye/websocket'
31
+ require 'protobuf'
32
+ require 'eventmachine'
33
+ require 'em-http'
34
+
35
+ # others
36
+ require 'request_store'
37
+ require 'git'
38
+ require 'mime-types'
39
+
40
+ # require archive dependencies
41
+ require 'zip'
42
+ require 'zlib'
43
+ require 'rubygems/package'
@@ -0,0 +1,28 @@
1
+ # configuration
2
+ require 'logger'
3
+ require 'configatron/core'
4
+ require 'nucleus/ext/kernel'
5
+ require 'nucleus/os'
6
+
7
+ # import the configuration file that resides in the user's home directory as initial choice
8
+ if OS.windows?
9
+ home_dir_config = File.expand_path(File.join(Dir.home, 'nucleus', 'nucleus_config.rb'))
10
+ else
11
+ home_dir_config = File.expand_path(File.join(Dir.home, '.nucleus', 'nucleus_config.rb'))
12
+ end
13
+ if File.exist?(home_dir_config)
14
+ puts "Applying configuration from: #{home_dir_config}"
15
+ require home_dir_config
16
+ end
17
+
18
+ # include the configuration of the project to overwrite the home dir config
19
+ project_dir_config = '../../../config/nucleus_config.rb'
20
+ if File.exist?(File.expand_path(project_dir_config, File.dirname(__FILE__)))
21
+ puts "Applying configuration from: #{File.expand_path(project_dir_config, File.dirname(__FILE__))}"
22
+ require_relative project_dir_config
23
+ end
24
+
25
+ # make sure we have a logging directory
26
+ unless nucleus_config.logging.key?(:path)
27
+ nucleus_config.logging.path = File.join(__dir__, '..', '..', '..', 'log')
28
+ end
@@ -0,0 +1,11 @@
1
+ # Implement shutdown actions, tidy up the DB
2
+ at_exit do
3
+ puts '-----------------------------------------------', ''
4
+ puts 'Cleaning up...'
5
+
6
+ # delete the SSHHandler generated files
7
+ puts '... delete SSH files ...'
8
+ nucleus_config.ssh.handler.cleanup if nucleus_config.key?(:ssh) && nucleus_config.ssh.key?(:handler)
9
+
10
+ puts '... done!'
11
+ end
@@ -0,0 +1,3 @@
1
+ module Nucleus
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,88 @@
1
+ # coding: utf-8
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'nucleus/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'nucleus'
7
+ spec.version = Nucleus::VERSION
8
+ spec.authors = ['Stefan Kolb', 'Cedric Röck']
9
+ spec.email = ['stefan.kolb@uni-bamberg.de']
10
+ spec.summary = 'Nucleus unifies core management functions of Platform-as-a-Service (PaaS) systems.'
11
+ spec.description = 'Nucleus is a unified API for deployment and management of '\
12
+ 'Platform-as-a-Service (PaaS) systems.'
13
+ spec.homepage = 'https://github.com/stefan-kolb/nucleus'
14
+ spec.license = 'MIT'
15
+ spec.executables = 'nucleus'
16
+ spec.require_paths = ['lib']
17
+ spec.required_ruby_version = '>= 2.0'
18
+
19
+ # we ignore the test files and icons as they tremendously increase the gem size (up to 43MB)
20
+ spec.files = `git ls-files -z --exclude-standard`.split("\x0").reject do |f|
21
+ f[%r{^(lib/nucleus_api|spec/adapter|icons)/}]
22
+ end
23
+ # again only unit and integration, but no adapter test files
24
+ spec.test_files = spec.files.grep(%r{^(spec)/})
25
+
26
+ # used as global configuration
27
+ spec.add_runtime_dependency 'configatron', '~> 4.5'
28
+ # DB store (1)
29
+ spec.add_runtime_dependency 'daybreak', '~> 0.3'
30
+ # Required for log tailing against HTTP endpoints
31
+ spec.add_runtime_dependency 'em-http-request', '~> 1.1'
32
+ # Used as main HTTP / REST client
33
+ spec.add_runtime_dependency 'excon', '~> 0.44'
34
+ # Required for log tailing against websockets
35
+ spec.add_runtime_dependency 'faye-websocket', '~> 0.9'
36
+ # Application data handling
37
+ spec.add_runtime_dependency 'git', '~> 1.2'
38
+ # Used to build the API
39
+ spec.add_runtime_dependency 'grape', '~> 0.12'
40
+ spec.add_runtime_dependency 'grape-entity', '~> 0.4', '>= 0.4.5'
41
+ # Used to document the API
42
+ spec.add_runtime_dependency 'grape-swagger', '~> 0.10', '>= 0.10.1'
43
+ # Used to import the vendor, provider & adapter setup from configuration with schema validation
44
+ spec.add_runtime_dependency 'kwalify', '~> 0.7'
45
+ # DB store (2)
46
+ spec.add_runtime_dependency 'lmdb', '~> 0.4'
47
+ # Logging
48
+ spec.add_runtime_dependency 'logger', '~> 1.2'
49
+ # Application archive handling, detect unsupported uploads
50
+ spec.add_runtime_dependency 'mime-types', '~> 2.4'
51
+ # Generic interface for DB store implementations
52
+ spec.add_runtime_dependency 'moneta', '~> 0.8'
53
+ # Openshift logging access and direct Git SSH requests
54
+ spec.add_runtime_dependency 'net-ssh', '~> 3.0'
55
+ # Used for JSON / Hash conversion and test cassette serialization (is way faster than other JSON libs)
56
+ spec.add_runtime_dependency 'oj', '~> 2.12'
57
+ # Required for Cloud Foundry log messages
58
+ spec.add_runtime_dependency 'protobuf', '~> 3.4'
59
+ # To make sure HTTPS is used instead of HTTP
60
+ spec.add_runtime_dependency 'rack-ssl-enforcer', '~> 0.2', '>= 0.2.8'
61
+ # TODO: Should be removed as soon as excon supports multipart requests
62
+ spec.add_runtime_dependency 'rest-client', '~> 1.8'
63
+ # Used to build a streaming API for the log tail action
64
+ spec.add_runtime_dependency 'rack-stream', '= 0.0.5'
65
+ # Save certain information for the current request, e.g. the already loaded adapter
66
+ spec.add_runtime_dependency 'request_store', '~> 1.1'
67
+ # Application setup, require libs
68
+ spec.add_runtime_dependency 'require_all', '~> 1.3'
69
+ # Application data handling
70
+ spec.add_runtime_dependency 'rubyzip', '~> 1.1'
71
+ # Application data handling when using git deployment
72
+ spec.add_runtime_dependency 'sshkey', '~> 1.7'
73
+ # The ONLY supported server ATM
74
+ spec.add_runtime_dependency 'thin', '~> 1.6'
75
+
76
+ spec.add_development_dependency 'bundler'
77
+ spec.add_development_dependency 'guard'
78
+ spec.add_development_dependency 'guard-bundler'
79
+ spec.add_development_dependency 'guard-rack'
80
+ spec.add_development_dependency 'guard-rubocop'
81
+ spec.add_development_dependency 'guard-yard'
82
+ spec.add_development_dependency 'inch', '~> 0.7'
83
+ spec.add_development_dependency 'rake', '~> 10.4'
84
+ spec.add_development_dependency 'rubocop', '~> 0.34'
85
+ spec.add_development_dependency 'vcr', '~> 2.9'
86
+ spec.add_development_dependency 'webmock', '~> 1.20'
87
+ spec.add_development_dependency 'yard', '~> 0.8'
88
+ end