cloudkeeper-one 1.3.1 → 2.0.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.
Files changed (37) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +11 -9
  3. data/.rubocop.yml +10 -0
  4. data/Dockerfile +2 -2
  5. data/README.md +51 -43
  6. data/{cloudkeeper-one.gemspec → cloudkeeper_one.gemspec} +3 -3
  7. data/config/cloudkeeper-one.yml +1 -3
  8. data/config/templates/template.erb +1 -1
  9. data/lib/cloudkeeper/one.rb +0 -1
  10. data/lib/cloudkeeper/one/appliance_actions/list.rb +21 -7
  11. data/lib/cloudkeeper/one/appliance_actions/registration.rb +11 -18
  12. data/lib/cloudkeeper/one/appliance_actions/update.rb +3 -2
  13. data/lib/cloudkeeper/one/appliance_actions/utils/template_preparation.rb +7 -6
  14. data/lib/cloudkeeper/one/appliance_actions/utils/templates/attributes.erb +10 -1
  15. data/lib/cloudkeeper/one/cli.rb +7 -11
  16. data/lib/cloudkeeper/one/core_connector.rb +41 -49
  17. data/lib/cloudkeeper/one/opennebula/appliance_handler.rb +0 -14
  18. data/lib/cloudkeeper/one/opennebula/datastore_handler.rb +0 -4
  19. data/lib/cloudkeeper/one/opennebula/image_handler.rb +1 -4
  20. data/lib/cloudkeeper/one/opennebula/tags.rb +4 -1
  21. data/lib/cloudkeeper/one/opennebula/template_handler.rb +1 -2
  22. data/lib/cloudkeeper/one/version.rb +1 -1
  23. data/lib/cloudkeeper_grpc.rb +2 -0
  24. data/lib/cloudkeeper_grpc/.gitmodules +3 -3
  25. data/lib/cloudkeeper_grpc/README.md +6 -0
  26. data/lib/cloudkeeper_grpc/cloudkeeper_pb.rb +5 -2
  27. data/lib/cloudkeeper_grpc/cloudkeeper_services_pb.rb +2 -0
  28. data/lib/cloudkeeper_grpc/constants.rb +3 -5
  29. data/lib/cloudkeeper_grpc/protos/cloudkeeper.proto +7 -2
  30. data/lib/cloudkeeper_grpc/{metadata → status-codes}/CODE_OF_CONDUCT.md +0 -0
  31. data/lib/cloudkeeper_grpc/{metadata → status-codes}/LICENSE.txt +2 -6
  32. data/lib/cloudkeeper_grpc/status-codes/README.md +3 -0
  33. data/lib/cloudkeeper_grpc/status-codes/status-codes.yml +12 -0
  34. metadata +16 -23
  35. data/lib/cloudkeeper/one/opennebula/group_handler.rb +0 -12
  36. data/lib/cloudkeeper_grpc/metadata/README.md +0 -3
  37. data/lib/cloudkeeper_grpc/metadata/metadata.yml +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dbc48a405520c660028cc35656d0dd47ff17ac45
4
- data.tar.gz: c422f0474a07032eedecff64b8348c6c2f2570bf
2
+ SHA256:
3
+ metadata.gz: 8b8142e76a372832f41e114c4c8857a6d3a053850a26513bc6aed57b05a50307
4
+ data.tar.gz: 613d777b20247367cf1bd708f7cf2360875596387b6ab871ed947aa781c9c141
5
5
  SHA512:
6
- metadata.gz: d2be7e38e80e4a22e5b90768ed1c26dbf4d13e3708b995a8cc037496c68a39dd3678bf1b0aaf891e75372900016dcb55a111154deab09ad05b4a731207b8e98b
7
- data.tar.gz: a77fbd53adc364eaeb7a136fce354a5b2c0d2a6596ac1e131def6ec53cf237afd842e44caa5f2c117b17d460914d66d247d7fdbf0a65d3ced4911e800d40b2dc
6
+ metadata.gz: b2850302011a4dce74a674f6fa6c680c8e1d183949f244cbd1ca94ef96e08c1f0f3a0ba03277eddde4b2553037bcd9753e4182d704ebfbe81a92f5e72b3278a7
7
+ data.tar.gz: b3286b1caf923a0c92547900399d950c4bf67d76a9fc5e3b54c6e7f91fdad5b9133271c2d402502e574b52dac7527702f49251b9b9a880afc1981749d65d5462
@@ -1,9 +1,6 @@
1
1
  version: 2
2
2
  jobs:
3
- build:
4
- branches:
5
- ignore:
6
- - /.*/
3
+ build_upload:
7
4
  docker:
8
5
  - image: docker:stable
9
6
  working_directory: /root/working_directory
@@ -29,8 +26,13 @@ jobs:
29
26
  docker tag $DOCKERHUB_ORGANIZATION/$CIRCLE_PROJECT_REPONAME:$TAG $DOCKERHUB_ORGANIZATION/$CIRCLE_PROJECT_REPONAME:latest
30
27
  docker push $DOCKERHUB_ORGANIZATION/$CIRCLE_PROJECT_REPONAME:latest
31
28
  fi
32
- deployment:
33
- fake_deploy_for_cci2:
34
- tag: /v.*/
35
- commands:
36
- - echo "make tags run in 2.0"
29
+ workflows:
30
+ version: 2
31
+ release-docker-images:
32
+ jobs:
33
+ - build_upload:
34
+ filters:
35
+ tags:
36
+ only: /v.*/
37
+ branches:
38
+ ignore: /.*/
@@ -11,12 +11,22 @@ Metrics/LineLength:
11
11
  Exclude:
12
12
  - 'lib/cloudkeeper/one/appliance_actions/list.rb'
13
13
 
14
+ Metrics/LineLength:
15
+ Max: 140
16
+ Include:
17
+ - 'lib/cloudkeeper/one/core_connector.rb'
18
+
14
19
  Style/Documentation:
15
20
  Enabled: false
16
21
 
17
22
  Metrics/MethodLength:
18
23
  Max: 15
19
24
 
25
+ Metrics/MethodLength:
26
+ Max: 20
27
+ Include:
28
+ - 'lib/cloudkeeper/one/appliance_actions/list.rb'
29
+
20
30
  Metrics/AbcSize:
21
31
  Max: 20
22
32
  Exclude:
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM ubuntu:16.04
1
+ FROM ubuntu:18.04
2
2
 
3
3
  ARG branch=master
4
4
  ARG version
@@ -10,7 +10,7 @@ ENV applDir="${spoolDir}/appliances" \
10
10
  logDir="/var/log/${username}"
11
11
 
12
12
  LABEL application=${name} \
13
- description="A tool for synchronizing appliances between cloudkeeper and OpenNebula" \
13
+ description="A tool for synchronizing appliances between Cloudkeeper and OpenNebula" \
14
14
  maintainer="kimle@cesnet.cz" \
15
15
  version=${version} \
16
16
  branch=${branch}
data/README.md CHANGED
@@ -1,14 +1,21 @@
1
- # cloudkeeper-one
2
- OpenNebula backend for [cloudkeeper](https://github.com/the-cloudkeeper-project/cloudkeeper)
1
+ <h1 align="center">
2
+ <img src="https://i.imgur.com/95iUPzX.png" alt="Logo Cloudkeeper-ONE" title="Logo Cloudkeeper-ONE" width="256"/>
3
+ <p>Cloudkeeper-ONE</p>
4
+ </h1>
3
5
 
4
- [![Travis](https://img.shields.io/travis/the-cloudkeeper-project/cloudkeeper-one.svg?style=flat-square)](http://travis-ci.org/the-cloudkeeper-project/cloudkeeper-one)
5
- [![Gemnasium](https://img.shields.io/gemnasium/the-cloudkeeper-project/cloudkeeper-one.svg?style=flat-square)](https://gemnasium.com/the-cloudkeeper-project/cloudkeeper-one)
6
- [![Gem](https://img.shields.io/gem/v/cloudkeeper-one.svg?style=flat-square)](https://rubygems.org/gems/cloudkeeper-one)
7
- [![Code Climate](https://img.shields.io/codeclimate/github/the-cloudkeeper-project/cloudkeeper-one.svg?style=flat-square)](https://codeclimate.com/github/the-cloudkeeper-project/cloudkeeper-one)
8
- [![DockerHub](https://img.shields.io/badge/docker-ready-blue.svg?style=flat-square)](https://hub.docker.com/r/cloudkeeper/cloudkeeper-one/)
6
+ <p align="center">
7
+ <a href="http://travis-ci.org/the-cloudkeeper-project/cloudkeeper-one"><img src="https://img.shields.io/travis/the-cloudkeeper-project/cloudkeeper-one.svg?style=flat-square" alt="Travis"></a>
8
+ <a href="https://depfu.com/repos/the-cloudkeeper-project/cloudkeeper-one"><img src="https://img.shields.io/depfu/the-cloudkeeper-project/cloudkeeper-one.svg?style=flat-square" alt="Depfu"></a>
9
+ <a href="https://rubygems.org/gems/cloudkeeper-one"><img src="https://img.shields.io/gem/v/cloudkeeper-one.svg?style=flat-square" alt="Gem"></a>
10
+ <a href="https://codeclimate.com/github/the-cloudkeeper-project/cloudkeeper-one"><img src="https://img.shields.io/codeclimate/maintainability/the-cloudkeeper-project/cloudkeeper-one.svg?style=flat-square" alt="Code Climate"></a>
11
+ <a href="https://hub.docker.com/r/cloudkeeper/cloudkeeper-one/"><img src="https://img.shields.io/badge/docker-ready-blue.svg?style=flat-square" alt="DockerHub"></a>
12
+ <a href="https://zenodo.org/record/1134571"><img src="https://img.shields.io/badge/dynamic/json.svg?label=DOI&colorB=0D7EBE&prefix=&suffix=&query=$.doi&uri=https%3A%2F%2Fzenodo.org%2Fapi%2Frecords%2F1134571&style=flat-square" alt="DOI"></a>
13
+ </p>
9
14
 
10
- ## What does cloudkeeper-one do?
11
- cloudkeeper-one is able to manage [OpenNebula](https://opennebula.org/) cloud - upload, update and remove images and templates representing EGI AppDB appliances. cloudkeeper-one runs as a server listening for [gRPC](http://www.grpc.io/) communication usually from core [cloudkeeper](https://github.com/the-cloudkeeper-project/cloudkeeper) component.
15
+ <h4 align="center">OpenNebula backend for <a href="https://github.com/the-cloudkeeper-project/cloudkeeper">Cloudkeeper</a></h4>
16
+
17
+ ## What does Cloudkeeper-ONE do?
18
+ Cloudkeeper-ONE is able to manage [OpenNebula](https://opennebula.org/) CMF - upload, update and remove images and templates representing EGI AppDB appliances. Cloudkeeper-ONE runs as a server listening for [gRPC](http://www.grpc.io/) communication usually from core [cloudkeeper](https://github.com/the-cloudkeeper-project/cloudkeeper) component.
12
19
 
13
20
  ## Requirements
14
21
  * Ruby >= 2.2.0
@@ -40,8 +47,8 @@ bundle exec rake spec
40
47
  ```
41
48
 
42
49
  ## Configuration
43
- ### Create a configuration file for cloudkeeper-one
44
- Configuration file can be read by cloudkeeper-one from these
50
+ ### Create a configuration file for Cloudkeeper-ONE
51
+ Configuration file can be read by Cloudkeeper-ONE from these
45
52
  three locations:
46
53
 
47
54
  * `~/.cloudkeeper-one/cloudkeeper-one.yml`
@@ -52,43 +59,44 @@ The default configuration file can be found at the last location
52
59
  `PATH_TO_GEM_DIR/config/cloudkeeper-one.yml`.
53
60
 
54
61
  ## Usage
55
- cloudkeeper-one is run with executable `cloudkeeper-one`. For further assistance run `cloudkeeper-one help sync`:
62
+ Cloudkeeper-ONE is run with executable `cloudkeeper-one`. For further assistance run `cloudkeeper-one help sync`:
56
63
  ```bash
57
64
  Usage:
58
- cloudkeeper-one sync --appliances-permissions=APPLIANCES-PERMISSIONS --appliances-tmp-dir=APPLIANCES-TMP-DIR --identifier=IDENTIFIER --listen-address=LISTEN-ADDRESS --opennebula-api-call-timeout=OPENNEBULA-API-CALL-TIMEOUT --opennebula-datastores=one two three --opennebula-endpoint=OPENNEBULA-ENDPOINT --opennebula-secret=OPENNEBULA-SECRET
65
+ cloudkeeper-one sync --appliances-permissions=APPLIANCES-PERMISSIONS --appliances-tmp-dir=APPLIANCES-TMP-DIR --identifier=IDENTIFIER --listen-address=LISTEN-ADDRESS --opennebula-api-call-timeout=OPENNEBULA-API-CALL-TIMEOUT --opennebula-datastore=OPENNEBULA-DATASTORE
59
66
 
60
67
  Options:
61
- --listen-address=LISTEN-ADDRESS # IP address gRPC server will listen on
62
- # Default: 127.0.0.1:50051
63
- [--authentication], [--no-authentication] # Client <-> server authentication
64
- [--certificate=CERTIFICATE] # Backend's host certificate
65
- # Default: /etc/grid-security/hostcert.pem
66
- [--key=KEY] # Backend's host key
67
- # Default: /etc/grid-security/hostkey.pem
68
- --identifier=IDENTIFIER # Instance identifier
69
- # Default: cloudkeeper-one
70
- [--core-certificate=CORE-CERTIFICATE] # Core's certificate
71
- # Default: /etc/grid-security/corecert.pem
72
- --appliances-tmp-dir=APPLIANCES-TMP-DIR # Directory where to temporarily store appliances
73
- # Default: /var/spool/cloudkeeper/appliances
74
- [--appliances-template-dir=APPLIANCES-TEMPLATE-DIR] # If set, templates within this directory are used to construct images and templates in OpenNebula
75
- --appliances-permissions=APPLIANCES-PERMISSIONS # UNIX-like permissions appliances will have within OpenNebula
76
- # Default: 640
77
- --opennebula-secret=OPENNEBULA-SECRET # OpenNebula authentication secret
78
- # Default: oneadmin:opennebula
79
- --opennebula-endpoint=OPENNEBULA-ENDPOINT # OpenNebula XML-RPC endpoint
80
- # Default: http://localhost:2633/RPC2
81
- --opennebula-datastores=one two three # OpenNebula datastores images will be uploaded to
82
- # Default: ["default"]
83
- [--opennebula-users=one two three] # Handle only images/templates of specified users
84
- --opennebula-api-call-timeout=OPENNEBULA-API-CALL-TIMEOUT # How long will cloudkeeper-one wait for image/template operations to finish in OpenNebula
85
- # Default: 3h
68
+ --listen-address=LISTEN-ADDRESS # IP address gRPC server will listen on
69
+ # Default: 127.0.0.1:50051
70
+ [--authentication], [--no-authentication] # Client <-> server authentication
71
+ [--certificate=CERTIFICATE] # Backend's host certificate
72
+ # Default: /etc/grid-security/hostcert.pem
73
+ [--key=KEY] # Backend's host key
74
+ # Default: /etc/grid-security/hostkey.pem
75
+ --identifier=IDENTIFIER # Instance identifier
76
+ # Default: cloudkeeper-one
77
+ [--core-certificate=CORE-CERTIFICATE] # Core's certificate
78
+ # Default: /etc/grid-security/corecert.pem
79
+ --appliances-tmp-dir=APPLIANCES-TMP-DIR # Directory where to temporarily store appliances
80
+ # Default: /var/spool/cloudkeeper/appliances
81
+ [--appliances-template-dir=APPLIANCES-TEMPLATE-DIR] # If set, templates within this directory are used to construct images and templates in OpenNebula
82
+ --appliances-permissions=APPLIANCES-PERMISSIONS # UNIX-like permissions appliances will have within OpenNebula
83
+ # Default: 640
84
+ [--opennebula-secret=OPENNEBULA-SECRET] # OpenNebula authentication secret
85
+ # Default: oneadmin:opennebula
86
+ [--opennebula-endpoint=OPENNEBULA-ENDPOINT] # OpenNebula XML-RPC endpoint
87
+ # Default: http://localhost:2633/RPC2
88
+ --opennebula-datastore=OPENNEBULA-DATASTORE # OpenNebula datastore images will be uploaded to
89
+ # Default: default
90
+ --opennebula-api-call-timeout=OPENNEBULA-API-CALL-TIMEOUT # How long will cloudkeeper-one wait for image/template operations to finish in OpenNebula
91
+ # Default: 3h
92
+ [--opennebula-allow-remote-source], [--no-opennebula-allow-remote-source] # Allows OpenNebula to directly download remote image
93
+ # Default: true
86
94
  --logging-level=LOGGING-LEVEL
87
- # Default: ERROR
88
- # Possible values: DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN
89
- [--logging-file=LOGGING-FILE] # File to write logs to
90
- # Default: /var/log/cloudkeeper/cloudkeeper-one.log
91
- [--debug], [--no-debug] # Runs cloudkeeper in debug mode
95
+ # Default: ERROR
96
+ # Possible values: DEBUG, INFO, WARN, ERROR, FATAL, UNKNOWN
97
+ [--logging-file=LOGGING-FILE] # File to write logs to
98
+ # Default: /var/log/cloudkeeper/cloudkeeper-one.log
99
+ [--debug], [--no-debug] # Runs cloudkeeper in debug mode
92
100
  ```
93
101
 
94
102
  ## Contributing
@@ -30,16 +30,16 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ['lib']
31
31
 
32
32
  spec.add_development_dependency 'bundler', '~> 1.14'
33
- spec.add_development_dependency 'grpc-tools', '>= 1.1', '<= 1.2.5'
33
+ spec.add_development_dependency 'grpc-tools', '~> 1.14'
34
34
  spec.add_development_dependency 'pry', '~> 0.10'
35
35
  spec.add_development_dependency 'pry-byebug', '~> 3.4'
36
- spec.add_development_dependency 'rake', '~> 11.2'
36
+ spec.add_development_dependency 'rake', '~> 12.3'
37
37
  spec.add_development_dependency 'rspec', '~> 3.5'
38
38
  spec.add_development_dependency 'rspec-collection_matchers', '~> 1.1'
39
39
  spec.add_development_dependency 'rubocop', '~> 0.48'
40
40
  spec.add_development_dependency 'rubocop-rspec', '~> 1.15'
41
41
  spec.add_development_dependency 'simplecov', '~> 0.12'
42
- spec.add_development_dependency 'vcr', '~> 3.0'
42
+ spec.add_development_dependency 'vcr', '~> 4.0'
43
43
  spec.add_development_dependency 'webmock', '~> 3.0'
44
44
 
45
45
  spec.add_runtime_dependency 'activesupport', '>= 4.0', '< 6.0'
@@ -13,9 +13,7 @@ cloudkeeper-one:
13
13
  opennebula:
14
14
  secret: oneadmin:opennebula # If not specified, looking for secret in environment variable ONE_AUTH and file ~/.one/one_auth
15
15
  endpoint: http://localhost:2633/RPC2 # If not specified, looking for endpoint in environment variable ONE_XMLRPC and file ~/.one/one_endpoint
16
- datastores: # Array of OpenNebula datastores images will be uploaded to
17
- - default
18
- users: # Handle only images/templates of specified users
16
+ datastore: default # OpenNebula datastore images will be uploaded to
19
17
  api-call-timeout: 3h # How long will cloudkeeper-one wait for image/template operations to finish in OpenNebula
20
18
  allow-remote-source: true # Allows OpenNebula to directly download remote image
21
19
  logging:
@@ -6,7 +6,7 @@ DESCRIPTION = "<%= "#{appliance.title} - #{appliance.description}" %>"
6
6
  DESCRIPTION = "<%= appliance.title %>"
7
7
  <% end %>
8
8
 
9
- MEMORY = "<%= appliance.ram != 0 ? appliance.ram : 1024 %>"
9
+ MEMORY = "<%= appliance.ram != 0 ? (appliance.ram / (1024**2)) : 1024 %>"
10
10
  CPU = "<%= appliance.core != 0 ? appliance.core : 0.25 %>"
11
11
  VCPU = "<%= appliance.core != 0 ? appliance.core : 1 %>"
12
12
 
@@ -2,7 +2,6 @@ require 'active_support/all'
2
2
  require 'opennebula'
3
3
  require 'json'
4
4
  require 'base64'
5
- require 'tempfile'
6
5
 
7
6
  module Cloudkeeper
8
7
  module One
@@ -23,8 +23,8 @@ module Cloudkeeper
23
23
  templates.uniq! { |template| template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_ID}"] }
24
24
 
25
25
  appliances = templates.map do |template|
26
- check_image_for_template! template
27
- populate_proto_appliance template
26
+ image = find_image_for_template template
27
+ populate_proto_appliance template, image
28
28
  end
29
29
 
30
30
  logger.debug "Appliances: #{appliances.map(&:identifier).inspect}"
@@ -33,12 +33,15 @@ module Cloudkeeper
33
33
 
34
34
  private
35
35
 
36
- def check_image_for_template!(template)
36
+ def find_image_for_template(template)
37
+ image = image_handler.find_by_name template.name
37
38
  raise Cloudkeeper::One::Errors::Actions::ListingError, "Missing coresponding image for template #{template.id.inspect}" \
38
- unless image_handler.find_by_name template.name
39
+ unless image
40
+
41
+ image
39
42
  end
40
43
 
41
- def populate_proto_appliance(template)
44
+ def populate_proto_appliance(template, image)
42
45
  CloudkeeperGrpc::Appliance.new identifier: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_ID}"].to_s,
43
46
  description: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_DESCRIPTION}"].to_s,
44
47
  mpuri: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_MPURI}"].to_s,
@@ -50,10 +53,21 @@ module Cloudkeeper
50
53
  architecture: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_ARCHITECTURE}"].to_s,
51
54
  operating_system: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_OPERATING_SYSTEM}"].to_s,
52
55
  vo: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_VO}"].to_s,
53
- image: nil,
56
+ image: populate_proto_image(image),
54
57
  expiration_date: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_EXPIRATION_DATE}"].to_i,
55
58
  image_list_identifier: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_IMAGE_LIST_ID}"].to_s,
56
- attributes: JSON.parse(Base64.strict_decode64(template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_ATTRIBUTES}"]))
59
+ base_mpuri: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_BASE_MPURI}"].to_s,
60
+ appid: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_APPID}"].to_s,
61
+ digest: template["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::APPLIANCE_DIGEST}"].to_s
62
+ end
63
+
64
+ def populate_proto_image(image)
65
+ CloudkeeperGrpc::Image.new mode: :LOCAL, location: '',
66
+ format: image["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::IMAGE_FORMAT}"].upcase.to_sym,
67
+ checksum: image["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::IMAGE_CHECKSUM}"].to_s,
68
+ size: image["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::IMAGE_SIZE}"].to_i,
69
+ uri: image["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::IMAGE_URI}"].to_s,
70
+ digest: image["TEMPLATE/#{Cloudkeeper::One::Opennebula::Tags::IMAGE_DIGEST}"].to_s
57
71
  end
58
72
  end
59
73
  end
@@ -10,54 +10,47 @@ module Cloudkeeper
10
10
  def register_or_update_appliance(proto_appliance)
11
11
  raise Cloudkeeper::One::Errors::ArgumentError, 'appliance cannot be nil' unless proto_appliance
12
12
 
13
- group = group_handler.find_by_name proto_appliance.vo
14
- raise Cloudkeeper::One::Errors::Actions::RegistrationError, "Missing group with name #{proto_appliance.vo}" unless group
15
-
16
13
  discard_images :find_by_appliance_id, proto_appliance.identifier
17
14
 
18
- datastores = datastore_handler.find_by_names Cloudkeeper::One::Settings[:'opennebula-datastores']
19
- datastores.each do |datastore|
20
- image = register_image proto_appliance, datastore, group
21
- register_or_update_template proto_appliance, image, group
22
- end
15
+ datastore = datastore_handler.find_by_name Cloudkeeper::One::Settings[:'opennebula-datastore']
16
+ image = register_image proto_appliance, datastore
17
+ register_or_update_template proto_appliance, image
23
18
  end
24
19
 
25
20
  private
26
21
 
27
- def register_or_update_template(proto_appliance, image, group)
22
+ def register_or_update_template(proto_appliance, image)
28
23
  template = template_handler.find_by_name image.name
29
24
  if template
30
25
  update_template template, image, proto_appliance
31
26
  return
32
27
  end
33
28
 
34
- register_template proto_appliance, image.id, image.name, group
29
+ register_template proto_appliance, image.id, image.name
35
30
  end
36
31
 
37
- def register_image(proto_appliance, datastore, group)
32
+ def register_image(proto_appliance, datastore)
38
33
  raise Cloudkeeper::One::Errors::ArgumentError, 'appliance and image cannot be nil' \
39
34
  unless proto_appliance && proto_appliance.image
40
35
 
41
- logger.debug "Registering image for appliance #{proto_appliance.identifier}, datastore #{datastore.name.inspect} and " \
42
- "group #{group.name.inspect}"
36
+ logger.debug "Registering image for appliance #{proto_appliance.identifier} and datastore #{datastore.name.inspect}"
43
37
 
44
38
  proto_image = prepare_image proto_appliance
45
39
  name = "#{proto_appliance.identifier}@#{datastore.name}"
46
40
  template = prepare_template 'image.erb', appliance: proto_appliance, image: proto_image, name: name
47
- image_handler.register template, datastore, group
41
+ image_handler.register template, datastore
48
42
  end
49
43
 
50
- def register_template(proto_appliance, image_id, name, group)
44
+ def register_template(proto_appliance, image_id, name)
51
45
  raise Cloudkeeper::One::Errors::ArgumentError, 'appliance cannot be nil' \
52
46
  unless proto_appliance
53
47
 
54
- logger.debug "Registering template for appliance #{proto_appliance.identifier}, image #{image_id.inspect} and " \
55
- "group #{group.name.inspect}"
48
+ logger.debug "Registering template for appliance #{proto_appliance.identifier} and image #{image_id.inspect}"
56
49
 
57
50
  proto_image = proto_appliance.image
58
51
  template = prepare_template 'template.erb', appliance: proto_appliance, image: proto_image,
59
52
  name: name, image_id: image_id
60
- template_handler.register template, group
53
+ template_handler.register template
61
54
  end
62
55
 
63
56
  def prepare_image(proto_appliance)
@@ -4,7 +4,7 @@ module Cloudkeeper
4
4
  module Update
5
5
  include Utils::TemplatePreparation
6
6
 
7
- def update_appliance_metadata(proto_appliance)
7
+ def update_metadata(proto_appliance)
8
8
  raise Cloudkeeper::One::Errors::ArgumentError, 'appliance cannot be nil' unless proto_appliance
9
9
 
10
10
  templates = template_handler.find_by_appliance_id proto_appliance.identifier
@@ -12,6 +12,7 @@ module Cloudkeeper
12
12
  image = image_handler.find_by_name template.name
13
13
  raise Cloudkeeper::One::Errors::Actions::UpdateError, "Missing coresponding image for template #{template.id.inspect}"\
14
14
  unless image
15
+
15
16
  update_image image, proto_appliance
16
17
  update_template template, image, proto_appliance
17
18
  end
@@ -25,7 +26,7 @@ module Cloudkeeper
25
26
 
26
27
  def update_template(template, image, proto_appliance)
27
28
  logger.debug "Updating template metadata for appliance #{proto_appliance.identifier.inspect}"
28
- template_template = prepare_template 'template.erb', appliance: proto_appliance, name: template.name, image_id: image.id
29
+ template_template = prepare_template 'template.erb', appliance: proto_appliance, image: proto_appliance.image, name: template.name, image_id: image.id
29
30
  template_handler.update template, template_template
30
31
  end
31
32
  end
@@ -1,3 +1,4 @@
1
+ require 'stringio'
1
2
  require 'erb'
2
3
  require 'tilt/erb'
3
4
 
@@ -21,13 +22,13 @@ module Cloudkeeper
21
22
  end
22
23
 
23
24
  def render_templates(templates, data)
24
- Tempfile.open 'cloudkeeper-template' do |tmp|
25
- templates.each { |template| tmp.write(File.read(template)) }
26
- tmp.flush
27
-
28
- template = Tilt::ERBTemplate.new tmp
29
- template.render Object.new, data
25
+ template = Tilt::ERBTemplate.new do
26
+ io = StringIO.new
27
+ templates.each { |file| io.write(File.read(file)) }
28
+ io.string
30
29
  end
30
+
31
+ template.render Object.new, data
31
32
  end
32
33
  end
33
34
  end
@@ -12,5 +12,14 @@
12
12
  <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_VO %> = "<%= appliance.vo %>"
13
13
  <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_EXPIRATION_DATE %> = "<%= appliance.expiration_date %>"
14
14
  <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_IMAGE_LIST_ID %> = "<%= appliance.image_list_identifier %>"
15
+ <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_BASE_MPURI %> = "<%= appliance.base_mpuri %>"
16
+ <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_APPID %> = "<%= appliance.appid %>"
17
+ <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_DIGEST %> = "<%= appliance.digest %>"
15
18
 
16
- <%= Cloudkeeper::One::Opennebula::Tags::APPLIANCE_ATTRIBUTES %> = "<%= Base64.strict_encode64 appliance.attributes.to_h.to_json %>"
19
+ <% if image %>
20
+ <%= Cloudkeeper::One::Opennebula::Tags::IMAGE_URI %> = "<%= image.uri %>"
21
+ <%= Cloudkeeper::One::Opennebula::Tags::IMAGE_CHECKSUM %> = "<%= image.checksum %>"
22
+ <%= Cloudkeeper::One::Opennebula::Tags::IMAGE_SIZE %> = "<%= image.size %>"
23
+ <%= Cloudkeeper::One::Opennebula::Tags::IMAGE_FORMAT %> = "<%= image.format %>"
24
+ <%= Cloudkeeper::One::Opennebula::Tags::IMAGE_DIGEST %> = "<%= image.digest %>"
25
+ <% end %>
@@ -68,25 +68,20 @@ module Cloudkeeper
68
68
  type: :string,
69
69
  desc: 'UNIX-like permissions appliances will have within OpenNebula'
70
70
  method_option :'opennebula-secret',
71
- required: true,
71
+ required: false,
72
72
  default: Cloudkeeper::One::Settings['opennebula']['secret'],
73
73
  type: :string,
74
74
  desc: 'OpenNebula authentication secret'
75
75
  method_option :'opennebula-endpoint',
76
- required: true,
76
+ required: false,
77
77
  default: Cloudkeeper::One::Settings['opennebula']['endpoint'],
78
78
  type: :string,
79
79
  desc: 'OpenNebula XML-RPC endpoint'
80
- method_option :'opennebula-datastores',
80
+ method_option :'opennebula-datastore',
81
81
  required: true,
82
- default: Cloudkeeper::One::Settings['opennebula']['datastores'],
83
- type: :array,
84
- desc: 'OpenNebula datastores images will be uploaded to'
85
- method_option :'opennebula-users',
86
- required: false,
87
- default: Cloudkeeper::One::Settings['opennebula']['users'],
88
- type: :array,
89
- desc: 'Handle only images/templates of specified users'
82
+ default: Cloudkeeper::One::Settings['opennebula']['datastore'],
83
+ type: :string,
84
+ desc: 'OpenNebula datastore images will be uploaded to'
90
85
  method_option :'opennebula-api-call-timeout',
91
86
  required: true,
92
87
  default: Cloudkeeper::One::Settings['opennebula']['api-call-timeout'],
@@ -106,6 +101,7 @@ module Cloudkeeper
106
101
  grpc_server.run_till_terminated
107
102
  rescue SignalException => ex
108
103
  raise ex unless SIGNALS.include? ex.signo
104
+
109
105
  grpc_server.stop
110
106
  rescue Cloudkeeper::One::Errors::InvalidConfigurationError => ex
111
107
  abort ex.message
@@ -1,24 +1,24 @@
1
1
  module Cloudkeeper
2
2
  module One
3
3
  class CoreConnector < CloudkeeperGrpc::Communicator::Service
4
- attr_reader :image_handler, :template_handler, :datastore_handler, :group_handler
4
+ attr_reader :image_handler, :template_handler, :datastore_handler
5
5
 
6
6
  include Cloudkeeper::One::ApplianceActions::Registration
7
7
  include Cloudkeeper::One::ApplianceActions::Discard
8
8
  include Cloudkeeper::One::ApplianceActions::Update
9
9
  include Cloudkeeper::One::ApplianceActions::List
10
10
 
11
- ERRORS = Hash.new(CloudkeeperGrpc::Constants::STATUS_ERROR).update(
12
- Cloudkeeper::One::Errors::Actions::ListingError => CloudkeeperGrpc::Constants::STATUS_ERROR_APPLIANCE_NOT_FOUND,
13
- Cloudkeeper::One::Errors::Actions::UpdateError => CloudkeeperGrpc::Constants::STATUS_ERROR_APPLIANCE_NOT_FOUND,
14
- Cloudkeeper::One::Errors::NetworkConnectionError => CloudkeeperGrpc::Constants::STATUS_ERROR_APPLIANCE_TRANSFER,
15
- Cloudkeeper::One::Errors::Opennebula::AuthenticationError => CloudkeeperGrpc::Constants::STATUS_ERROR_AUTHENTICATION,
16
- Cloudkeeper::One::Errors::Opennebula::UserNotAuthorizedError => CloudkeeperGrpc::Constants::STATUS_ERROR_USER_NOT_AUTHORIZED,
17
- Cloudkeeper::One::Errors::Opennebula::ResourceNotFoundError => CloudkeeperGrpc::Constants::STATUS_ERROR_RESOURCE_NOT_FOUND,
18
- Cloudkeeper::One::Errors::Actions::RegistrationError => CloudkeeperGrpc::Constants::STATUS_ERROR_RESOURCE_NOT_FOUND,
19
- Cloudkeeper::One::Errors::Opennebula::ResourceRetrievalError => CloudkeeperGrpc::Constants::STATUS_ERROR_RESOURCE_RETRIEVAL,
20
- Cloudkeeper::One::Errors::Opennebula::ResourceStateError => CloudkeeperGrpc::Constants::STATUS_ERROR_RESOURCE_STATE,
21
- Cloudkeeper::One::Errors::Opennebula::ApiCallTimeoutError => CloudkeeperGrpc::Constants::STATUS_ERROR_RESOURCE_STATE
11
+ STATUS_CODES = Hash.new(CloudkeeperGrpc::Constants::STATUS_CODE_UNKNOWN).update(
12
+ Cloudkeeper::One::Errors::Actions::ListingError => CloudkeeperGrpc::Constants::STATUS_CODE_APPLIANCE_NOT_FOUND,
13
+ Cloudkeeper::One::Errors::Actions::UpdateError => CloudkeeperGrpc::Constants::STATUS_CODE_APPLIANCE_NOT_FOUND,
14
+ Cloudkeeper::One::Errors::NetworkConnectionError => CloudkeeperGrpc::Constants::STATUS_CODE_FAILED_APPLIANCE_TRANSFER,
15
+ Cloudkeeper::One::Errors::Opennebula::AuthenticationError => CloudkeeperGrpc::Constants::STATUS_CODE_UNAUTHENTICATED,
16
+ Cloudkeeper::One::Errors::Opennebula::UserNotAuthorizedError => CloudkeeperGrpc::Constants::STATUS_CODE_PERMISSION_DENIED,
17
+ Cloudkeeper::One::Errors::Opennebula::ResourceNotFoundError => CloudkeeperGrpc::Constants::STATUS_CODE_RESOURCE_NOT_FOUND,
18
+ Cloudkeeper::One::Errors::Actions::RegistrationError => CloudkeeperGrpc::Constants::STATUS_CODE_RESOURCE_NOT_FOUND,
19
+ Cloudkeeper::One::Errors::Opennebula::ResourceRetrievalError => CloudkeeperGrpc::Constants::STATUS_CODE_FAILED_RESOURCE_RETRIEVAL,
20
+ Cloudkeeper::One::Errors::Opennebula::ResourceStateError => CloudkeeperGrpc::Constants::STATUS_CODE_INVALID_RESOURCE_STATE,
21
+ Cloudkeeper::One::Errors::Opennebula::ApiCallTimeoutError => CloudkeeperGrpc::Constants::STATUS_CODE_INVALID_RESOURCE_STATE
22
22
  ).freeze
23
23
 
24
24
  def initialize
@@ -27,78 +27,70 @@ module Cloudkeeper
27
27
  @image_handler = Cloudkeeper::One::Opennebula::ImageHandler.new
28
28
  @template_handler = Cloudkeeper::One::Opennebula::TemplateHandler.new
29
29
  @datastore_handler = Cloudkeeper::One::Opennebula::DatastoreHandler.new
30
- @group_handler = Cloudkeeper::One::Opennebula::GroupHandler.new
31
30
  end
32
31
 
33
- def pre_action(_empty, call)
32
+ def pre_action(_empty, _call)
34
33
  logger.debug 'Running \'pre-action\'...'
35
- call_backend(call) { discard_expired }
34
+ Google::Protobuf::Empty.new
36
35
  end
37
36
 
38
- def post_action(_empty, call)
37
+ def post_action(_empty, _call)
39
38
  logger.debug 'Running \'post-action\'...'
40
- call.output_metadata['status'] = 'SUCCESS'
41
39
  Google::Protobuf::Empty.new
42
40
  end
43
41
 
44
- def add_appliance(appliance, call)
42
+ def add_appliance(appliance, _call)
45
43
  logger.debug "Registering appliance #{appliance.identifier.inspect}"
46
- call_backend(call) { register_or_update_appliance appliance }
44
+ call_backend { register_or_update_appliance appliance }
47
45
  end
48
46
 
49
- def update_appliance(appliance, call)
47
+ def update_appliance(appliance, _call)
50
48
  logger.debug "Updating appliance #{appliance.identifier.inspect}"
51
- call_backend(call) { appliance.image ? register_or_update_appliance(appliance) : update_appliance_metadata(appliance) }
49
+ call_backend { register_or_update_appliance appliance }
50
+ end
51
+
52
+ def update_appliance_metadata(appliance, _call)
53
+ logger.debug "Updating appliance metadata of #{appliance.identifier.inspect}"
54
+ call_backend { update_metadata appliance }
52
55
  end
53
56
 
54
- def remove_appliance(appliance, call)
57
+ def remove_appliance(appliance, _call)
55
58
  logger.debug "Removing appliance #{appliance.identifier.inspect}"
56
- call_backend(call) { discard_appliance appliance.identifier }
59
+ call_backend { discard_appliance appliance.identifier }
57
60
  end
58
61
 
59
- def remove_image_list(image_list_identifier, call)
62
+ def remove_image_list(image_list_identifier, _call)
60
63
  logger.debug "Removing appliances from image list #{image_list_identifier.image_list_identifier.inspect}"
61
- call_backend(call) { discard_image_list image_list_identifier.image_list_identifier }
64
+ call_backend { discard_image_list image_list_identifier.image_list_identifier }
62
65
  end
63
66
 
64
- def image_lists(_empty, call)
67
+ def image_lists(_empty, _call)
65
68
  logger.debug 'Retrieving image lists registered in OpenNebula'
66
- call_backend(call, default_return_value: [], use_return_value: true) { list_image_lists.each }
69
+ call_backend(use_return_value: true) { list_image_lists.each }
67
70
  end
68
71
 
69
- def appliances(image_list_identifier, call)
72
+ def appliances(image_list_identifier, _call)
70
73
  logger.debug "Retrieving appliances from image list #{image_list_identifier.image_list_identifier.inspect} " \
71
74
  'registered in OpenNebula'
72
- call_backend(call, default_return_value: [], use_return_value: true) do
73
- list_appliances(image_list_identifier.image_list_identifier).each
74
- end
75
+ call_backend(use_return_value: true) { list_appliances(image_list_identifier.image_list_identifier).each }
76
+ end
77
+
78
+ def remove_expired_appliances(_empty, _call)
79
+ logger.debug 'Removing expired appliances'
80
+
81
+ call_backend { discard_expired }
75
82
  end
76
83
 
77
84
  private
78
85
 
79
- def call_backend(call, default_return_value: Google::Protobuf::Empty.new, use_return_value: false)
86
+ def call_backend(use_return_value: false)
80
87
  raise Cloudkeeper::One::Errors::ArgumentError, 'Error handler was called without a block!' unless block_given?
81
88
 
82
- return_value = handle_errors(call) { yield }
83
- finalize_return_value(return_value, default_return_value, use_return_value)
84
- end
85
-
86
- def handle_errors(call)
87
89
  return_value = yield
88
- call.output_metadata[CloudkeeperGrpc::Constants::KEY_STATUS] = CloudkeeperGrpc::Constants::STATUS_SUCCESS
89
-
90
- return_value
90
+ use_return_value ? return_value : Google::Protobuf::Empty.new
91
91
  rescue Cloudkeeper::One::Errors::StandardError => ex
92
92
  logger.error "#{ex.class.inspect}: #{ex.message}"
93
- call.output_metadata[CloudkeeperGrpc::Constants::KEY_STATUS] = ERRORS[ex.class]
94
- call.output_metadata[CloudkeeperGrpc::Constants::KEY_MESSAGE] = ex.message
95
-
96
- return_value
97
- end
98
-
99
- def finalize_return_value(return_value, default_return_value, use_return_value)
100
- return return_value if return_value && use_return_value
101
- default_return_value
93
+ raise GRPC::BadStatus.new(STATUS_CODES[ex.class], ex.message)
102
94
  end
103
95
  end
104
96
  end
@@ -50,24 +50,10 @@ module Cloudkeeper
50
50
  end
51
51
  end
52
52
 
53
- def chgrp(element, group)
54
- raise Cloudkeeper::One::Errors::ArgumentError, 'element cannot be nil' unless element
55
-
56
- handle_opennebula_error { element.info! }
57
- return if group.id == element.gid
58
-
59
- handle_opennebula_error do
60
- element.chown(LEAVE_ID_AS_IS, group.id)
61
- element.info!
62
- end
63
- end
64
-
65
53
  private
66
54
 
67
55
  def find_all_by(attributes)
68
56
  xpaths = attributes.clone
69
- xpaths['UNAME'] = Cloudkeeper::One::Settings[:'opennebula-users'] \
70
- if Cloudkeeper::One::Settings[:'opennebula-users'] && !Cloudkeeper::One::Settings[:'opennebula-users'].empty?
71
57
 
72
58
  find_all xpaths
73
59
  end
@@ -6,10 +6,6 @@ module Cloudkeeper
6
6
  super
7
7
  @pool = OpenNebula::DatastorePool.new client
8
8
  end
9
-
10
- def find_by_names(names)
11
- names.map { |name| find_by_name name }.compact
12
- end
13
9
  end
14
10
  end
15
11
  end
@@ -18,8 +18,6 @@ module Cloudkeeper
18
18
 
19
19
  def expired
20
20
  xpaths = { "TEMPLATE/#{Tags::EXPIRED}" => 'yes' }
21
- xpaths['UNAME'] = Cloudkeeper::One::Settings[:'opennebula-users'] \
22
- if Cloudkeeper::One::Settings[:'opennebula-users'] && !Cloudkeeper::One::Settings[:'opennebula-users'].empty?
23
21
 
24
22
  find_all xpaths
25
23
  end
@@ -76,7 +74,7 @@ module Cloudkeeper
76
74
  handle_opennebula_error { image.update(expiration_attribute, true) }
77
75
  end
78
76
 
79
- def register(image_template, datastore, group)
77
+ def register(image_template, datastore)
80
78
  image_alloc = OpenNebula::Image.build_xml
81
79
  image = OpenNebula::Image.new(image_alloc, client)
82
80
 
@@ -93,7 +91,6 @@ module Cloudkeeper
93
91
  end
94
92
 
95
93
  chmod image, Cloudkeeper::One::Settings[:'appliances-permissions']
96
- chgrp image, group
97
94
 
98
95
  image
99
96
  end
@@ -22,12 +22,15 @@ module Cloudkeeper
22
22
  APPLIANCE_VO = "#{APPLIANCE}_VO".freeze
23
23
  APPLIANCE_EXPIRATION_DATE = "#{APPLIANCE}_EXPIRATION_DATE".freeze
24
24
  APPLIANCE_IMAGE_LIST_ID = "#{APPLIANCE}_IMAGE_LIST_ID".freeze
25
- APPLIANCE_ATTRIBUTES = "#{APPLIANCE}_ATTRIBUTES".freeze
25
+ APPLIANCE_BASE_MPURI = "#{APPLIANCE}_BASE_MPURI".freeze
26
+ APPLIANCE_APPID = "#{APPLIANCE}_APPID".freeze
27
+ APPLIANCE_DIGEST = "#{APPLIANCE}_DIGEST".freeze
26
28
 
27
29
  IMAGE_URI = "#{IMAGE}_URI".freeze
28
30
  IMAGE_CHECKSUM = "#{IMAGE}_CHECKSUM".freeze
29
31
  IMAGE_SIZE = "#{IMAGE}_SIZE".freeze
30
32
  IMAGE_FORMAT = "#{IMAGE}_FORMAT".freeze
33
+ IMAGE_DIGEST = "#{IMAGE}_DIGEST".freeze
31
34
  end
32
35
  end
33
36
  end
@@ -7,14 +7,13 @@ module Cloudkeeper
7
7
  @pool = OpenNebula::TemplatePool.new client
8
8
  end
9
9
 
10
- def register(template_template, group)
10
+ def register(template_template)
11
11
  template_alloc = OpenNebula::Template.build_xml
12
12
  template = OpenNebula::Template.new(template_alloc, client)
13
13
 
14
14
  handle_opennebula_error { template.allocate template_template }
15
15
 
16
16
  chmod template, Cloudkeeper::One::Settings[:'appliances-permissions']
17
- chgrp template, group
18
17
 
19
18
  template
20
19
  end
@@ -1,5 +1,5 @@
1
1
  module Cloudkeeper
2
2
  module One
3
- VERSION = '1.3.1'.freeze
3
+ VERSION = '2.0.0'.freeze
4
4
  end
5
5
  end
@@ -1,3 +1,5 @@
1
+ require 'active_support/all'
2
+
1
3
  module CloudkeeperGrpc
2
4
  require 'cloudkeeper_grpc/cloudkeeper_pb'
3
5
  require 'cloudkeeper_grpc/cloudkeeper_services_pb'
@@ -1,6 +1,6 @@
1
1
  [submodule "protos"]
2
2
  path = protos
3
3
  url = https://github.com/the-cloudkeeper-project/cloudkeeper-proto.git
4
- [submodule "metadata"]
5
- path = metadata
6
- url = https://github.com/the-cloudkeeper-project/cloudkeeper-metadata.git
4
+ [submodule "status-codes"]
5
+ path = status-codes
6
+ url = https://github.com/the-cloudkeeper-project/cloudkeeper-status-codes.git
@@ -1,3 +1,9 @@
1
1
  ## cloudkeeper gRPC generated classes for Ruby
2
2
 
3
3
  This repository contains Ruby classes generated for gRPC communication within the [cloudkeeper](https://github.com/the-cloudkeeper-project/cloudkeeper) project.
4
+
5
+ ### Important!
6
+ Code expects `String` class to contain method `underscore` which can be find within [Active Support](https://guides.rubyonrails.org/active_support_core_extensions.html) gem. At least extensions for `String` class must be required:
7
+ ```ruby
8
+ require 'active_support/core_ext/string'
9
+ ```
@@ -19,8 +19,10 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
19
19
  optional :vo, :string, 11
20
20
  optional :expiration_date, :int64, 12
21
21
  optional :image_list_identifier, :string, 13
22
- optional :image, :message, 14, "cloudkeeper_grpc.Image"
23
- map :attributes, :string, :string, 15
22
+ optional :base_mpuri, :string, 14
23
+ optional :appid, :string, 15
24
+ optional :digest, :string, 16
25
+ optional :image, :message, 17, "cloudkeeper_grpc.Image"
24
26
  end
25
27
  add_message "cloudkeeper_grpc.Image" do
26
28
  optional :mode, :enum, 1, "cloudkeeper_grpc.Image.Mode"
@@ -31,6 +33,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
31
33
  optional :size, :int64, 6
32
34
  optional :username, :string, 7
33
35
  optional :password, :string, 8
36
+ optional :digest, :string, 9
34
37
  end
35
38
  add_enum "cloudkeeper_grpc.Image.Mode" do
36
39
  value :LOCAL, 0
@@ -18,10 +18,12 @@ module CloudkeeperGrpc
18
18
  rpc :PostAction, Google::Protobuf::Empty, Google::Protobuf::Empty
19
19
  rpc :AddAppliance, Appliance, Google::Protobuf::Empty
20
20
  rpc :UpdateAppliance, Appliance, Google::Protobuf::Empty
21
+ rpc :UpdateApplianceMetadata, Appliance, Google::Protobuf::Empty
21
22
  rpc :RemoveAppliance, Appliance, Google::Protobuf::Empty
22
23
  rpc :RemoveImageList, ImageListIdentifier, Google::Protobuf::Empty
23
24
  rpc :ImageLists, Google::Protobuf::Empty, stream(ImageListIdentifier)
24
25
  rpc :Appliances, ImageListIdentifier, stream(Appliance)
26
+ rpc :RemoveExpiredAppliances, Google::Protobuf::Empty, Google::Protobuf::Empty
25
27
  end
26
28
 
27
29
  Stub = Service.rpc_stub_class
@@ -2,11 +2,9 @@ require 'yaml'
2
2
 
3
3
  module CloudkeeperGrpc
4
4
  class Constants
5
- metadata = YAML.load_file(File.join(File.dirname(__FILE__), 'metadata', 'metadata.yml'))
6
- metadata['keys'].each do |key|
7
- upcase_key = key.upcase
8
- const_set("KEY_#{upcase_key}", key)
9
- metadata[key].each { |value| const_set("#{upcase_key}_#{value.upcase}", value)} if metadata.has_key? key
5
+ status_codes = YAML.load_file(File.join(File.dirname(__FILE__), 'status-codes', 'status-codes.yml'))
6
+ status_codes.each do |key, value|
7
+ const_set("STATUS_CODE_#{key.underscore.upcase}", value)
10
8
  end
11
9
  end
12
10
  end
@@ -18,8 +18,10 @@ message Appliance {
18
18
  string vo = 11;
19
19
  int64 expiration_date = 12;
20
20
  string image_list_identifier = 13;
21
- Image image = 14;
22
- map<string, string> attributes = 15;
21
+ string base_mpuri = 14;
22
+ string appid = 15;
23
+ string digest = 16;
24
+ Image image = 17;
23
25
  }
24
26
 
25
27
  message Image {
@@ -41,6 +43,7 @@ message Image {
41
43
  int64 size = 6;
42
44
  string username = 7;
43
45
  string password = 8;
46
+ string digest = 9;
44
47
  }
45
48
 
46
49
  message ImageListIdentifier {
@@ -52,8 +55,10 @@ service Communicator {
52
55
  rpc PostAction(google.protobuf.Empty) returns (google.protobuf.Empty) {}
53
56
  rpc AddAppliance(Appliance) returns (google.protobuf.Empty) {}
54
57
  rpc UpdateAppliance(Appliance) returns (google.protobuf.Empty) {}
58
+ rpc UpdateApplianceMetadata(Appliance) returns (google.protobuf.Empty) {}
55
59
  rpc RemoveAppliance(Appliance) returns (google.protobuf.Empty) {}
56
60
  rpc RemoveImageList(ImageListIdentifier) returns (google.protobuf.Empty) {}
57
61
  rpc ImageLists(google.protobuf.Empty) returns (stream ImageListIdentifier) {}
58
62
  rpc Appliances(ImageListIdentifier) returns (stream Appliance) {}
63
+ rpc RemoveExpiredAppliances(google.protobuf.Empty) returns (google.protobuf.Empty) {}
59
64
  }
@@ -1,14 +1,10 @@
1
- The work represented by this source file was partially or entirely
2
- funded by the EGI-Engage project co-funded by the European Union (EU)
3
- Horizon 2020 program under Grant number 654142.
4
-
5
- Copyright (c) 2017 CESNET
1
+ Copyright 2018 Michal Kimle
6
2
 
7
3
  Licensed under the Apache License, Version 2.0 (the "License");
8
4
  you may not use this file except in compliance with the License.
9
5
  You may obtain a copy of the License at
10
6
 
11
- http://www.apache.org/licenses/LICENSE-2.0
7
+ http://www.apache.org/licenses/LICENSE-2.0
12
8
 
13
9
  Unless required by applicable law or agreed to in writing, software
14
10
  distributed under the License is distributed on an "AS IS" BASIS,
@@ -0,0 +1,3 @@
1
+ ## cloudkeeper status-codes file
2
+
3
+ This repository contains status codes for error handling of gRPC communication within [cloudkeeper](https://github.com/the-cloudkeeper-project/cloudkeeper) project.
@@ -0,0 +1,12 @@
1
+ ---
2
+ # Compatible with GRPC status codes
3
+ Ok: 0
4
+ Unknown: 2
5
+ PermissionDenied: 7
6
+ Unauthenticated: 16
7
+ # Custom status codes
8
+ ApplianceNotFound: 101
9
+ FailedApplianceTransfer: 102
10
+ ResourceNotFound: 103
11
+ FailedResourceRetrieval: 104
12
+ InvalidResourceState: 105
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudkeeper-one
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Kimle
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-12 00:00:00.000000000 Z
11
+ date: 2018-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,22 +28,16 @@ dependencies:
28
28
  name: grpc-tools
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '1.1'
34
- - - "<="
31
+ - - "~>"
35
32
  - !ruby/object:Gem::Version
36
- version: 1.2.5
33
+ version: '1.14'
37
34
  type: :development
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
40
37
  requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: '1.1'
44
- - - "<="
38
+ - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: 1.2.5
40
+ version: '1.14'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: pry
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -78,14 +72,14 @@ dependencies:
78
72
  requirements:
79
73
  - - "~>"
80
74
  - !ruby/object:Gem::Version
81
- version: '11.2'
75
+ version: '12.3'
82
76
  type: :development
83
77
  prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
80
  - - "~>"
87
81
  - !ruby/object:Gem::Version
88
- version: '11.2'
82
+ version: '12.3'
89
83
  - !ruby/object:Gem::Dependency
90
84
  name: rspec
91
85
  requirement: !ruby/object:Gem::Requirement
@@ -162,14 +156,14 @@ dependencies:
162
156
  requirements:
163
157
  - - "~>"
164
158
  - !ruby/object:Gem::Version
165
- version: '3.0'
159
+ version: '4.0'
166
160
  type: :development
167
161
  prerelease: false
168
162
  version_requirements: !ruby/object:Gem::Requirement
169
163
  requirements:
170
164
  - - "~>"
171
165
  - !ruby/object:Gem::Version
172
- version: '3.0'
166
+ version: '4.0'
173
167
  - !ruby/object:Gem::Dependency
174
168
  name: webmock
175
169
  requirement: !ruby/object:Gem::Requirement
@@ -323,7 +317,7 @@ files:
323
317
  - README.md
324
318
  - Rakefile
325
319
  - bin/cloudkeeper-one
326
- - cloudkeeper-one.gemspec
320
+ - cloudkeeper_one.gemspec
327
321
  - config/cloudkeeper-one.yml
328
322
  - config/templates/image.erb
329
323
  - config/templates/template.erb
@@ -364,7 +358,6 @@ files:
364
358
  - lib/cloudkeeper/one/opennebula.rb
365
359
  - lib/cloudkeeper/one/opennebula/appliance_handler.rb
366
360
  - lib/cloudkeeper/one/opennebula/datastore_handler.rb
367
- - lib/cloudkeeper/one/opennebula/group_handler.rb
368
361
  - lib/cloudkeeper/one/opennebula/handler.rb
369
362
  - lib/cloudkeeper/one/opennebula/helper.rb
370
363
  - lib/cloudkeeper/one/opennebula/image_handler.rb
@@ -380,14 +373,14 @@ files:
380
373
  - lib/cloudkeeper_grpc/cloudkeeper_pb.rb
381
374
  - lib/cloudkeeper_grpc/cloudkeeper_services_pb.rb
382
375
  - lib/cloudkeeper_grpc/constants.rb
383
- - lib/cloudkeeper_grpc/metadata/CODE_OF_CONDUCT.md
384
- - lib/cloudkeeper_grpc/metadata/LICENSE.txt
385
- - lib/cloudkeeper_grpc/metadata/README.md
386
- - lib/cloudkeeper_grpc/metadata/metadata.yml
387
376
  - lib/cloudkeeper_grpc/protos/CODE_OF_CONDUCT.md
388
377
  - lib/cloudkeeper_grpc/protos/LICENSE.txt
389
378
  - lib/cloudkeeper_grpc/protos/README.md
390
379
  - lib/cloudkeeper_grpc/protos/cloudkeeper.proto
380
+ - lib/cloudkeeper_grpc/status-codes/CODE_OF_CONDUCT.md
381
+ - lib/cloudkeeper_grpc/status-codes/LICENSE.txt
382
+ - lib/cloudkeeper_grpc/status-codes/README.md
383
+ - lib/cloudkeeper_grpc/status-codes/status-codes.yml
391
384
  homepage: https://github.com/the-cloudkeeper-project/cloudkeeper-one
392
385
  licenses:
393
386
  - Apache License, Version 2.0
@@ -408,7 +401,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
408
401
  version: '0'
409
402
  requirements: []
410
403
  rubyforge_project:
411
- rubygems_version: 2.6.14
404
+ rubygems_version: 2.7.4
412
405
  signing_key:
413
406
  specification_version: 4
414
407
  summary: OpenNebula backend for cloudkeeper
@@ -1,12 +0,0 @@
1
- module Cloudkeeper
2
- module One
3
- module Opennebula
4
- class GroupHandler < Handler
5
- def initialize
6
- super
7
- @pool = OpenNebula::GroupPool.new client
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,3 +0,0 @@
1
- ## cloudkeeper metadata file
2
-
3
- This repository contains potential metadata transfered during the gRPC communication within [cloudkeeper](https://github.com/the-cloudkeeper-project/cloudkeeper) project.
@@ -1,13 +0,0 @@
1
- keys:
2
- - status
3
- - message
4
- status:
5
- - SUCCESS
6
- - ERROR
7
- - ERROR_APPLIANCE_NOT_FOUND
8
- - ERROR_APPLIANCE_TRANSFER
9
- - ERROR_AUTHENTICATION
10
- - ERROR_USER_NOT_AUTHORIZED
11
- - ERROR_RESOURCE_NOT_FOUND
12
- - ERROR_RESOURCE_RETRIEVAL
13
- - ERROR_RESOURCE_STATE