Class: Backends::Ec2::Storage

Inherits:
Base
  • Object
show all
Includes:
Helpers::StorageActionHelper, Helpers::StorageParseHelper
Defined in:
lib/backends/ec2/storage.rb

Constant Summary

Constants inherited from Base

Base::API_VERSION, Base::IMAGE_FILTERING_POLICIES

Instance Method Summary collapse

Methods included from Helpers::StorageActionHelper

#trigger_action_snapshot, #trigger_action_state_check

Methods included from Helpers::StorageParseHelper

#parse_backend_obj

Methods inherited from Base

#add_other_backend, #initialize

Methods included from Helpers::ExtensionsHelper

#read_extensions

Methods included from Helpers::JsonCollectionHelper

#read_from_json

Constructor Details

This class inherits a constructor from Backends::Ec2::Base

Instance Method Details

#create(storage) ⇒ String

Instantiates a new storage instance from ::Occi::Infrastructure::Storage. ID given in the occi.core.id attribute is optional and can be changed inside this method. Final occi.core.id must be returned as a String. If the requested instance cannot be created, an error describing the problem must be raised, @see Backends::Errors.

Examples:

storage = ::Occi::Infrastructure::Storage.new
storage_id = create(storage)
    #=> "65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf"

Parameters:

  • storage (::Occi::Infrastructure::Storage)

    storage instance containing necessary attributes

Returns:

  • (String)

    final identifier of the new storage instance

Server-side Effects:

  • Initializes a volume

  • Creates tags for the volume


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/backends/ec2/storage.rb', line 96

def create(storage)
  tags = []
  tags << { key: 'Name', value: (storage.title || "rOCCI-server volume #{storage.size || 1}GB") }

  Backends::Ec2::Helpers::AwsConnectHelper.rescue_aws_service(@logger) do
    volume = @ec2_client.create_volume(
      size: storage.size || 1,
      availability_zone: @options.aws_availability_zone,
      volume_type: "standard"
    )

    @ec2_client.create_tags(
      resources: [volume[:volume_id]],
      tags: tags
    )

    volume[:volume_id]
  end
end

#delete(storage_id) ⇒ true, false

Deletes a specific storage instance, instance to be deleted is specified by an ID, this ID must match the occi.core.id attribute of the deleted instance. If the requested instance cannot be deleted, an error describing the problem must be raised, @see Backends::Errors.

Examples:

delete("65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf") #=> true

Parameters:

  • storage_id (String)

    an identifier of a storage instance to be deleted

Returns:

  • (true, false)

    result of the operation

Server-side Effects:

  • Deletes a volume


149
150
151
152
153
154
155
# File 'lib/backends/ec2/storage.rb', line 149

def delete(storage_id)
  Backends::Ec2::Helpers::AwsConnectHelper.rescue_aws_service(@logger) do
    @ec2_client.delete_volume(volume_id: storage_id)
  end

  true
end

#delete_all(mixins = nil) ⇒ true, false

Deletes all storage instances, instances to be deleted must be filtered by the specified filter, filter (if set) must contain an ::Occi::Core::Mixins instance. If the requested instances cannot be deleted, an error describing the problem must be raised, @see Backends::Errors.

Examples:

delete_all #=> true

mixins = ::Occi::Core::Mixins.new << ::Occi::Core::Mixin.new
delete_all(mixins)  #=> true

Parameters:

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (true, false)

    result of the operation

Server-side Effects:

  • Deletes volumes


130
131
132
133
134
135
# File 'lib/backends/ec2/storage.rb', line 130

def delete_all(mixins = nil)
  volume_ids = list_ids(mixins)
  volume_ids.each { |volume_id| delete(volume_id) }

  true
end

#get(storage_id) ⇒ ::Occi::Infrastructure::Storage?

Gets a specific storage instance as ::Occi::Infrastructure::Storage. ID given as an argument must match the occi.core.id attribute inside the returned ::Occi::Infrastructure::Storage instance, however it is possible to implement internal mapping to a platform-specific identifier.

Examples:

storage = get('65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf')
    #=> #<::Occi::Infrastructure::Storage>

Parameters:

  • storage_id (String)

    OCCI identifier of the requested storage instance

Returns:

  • (::Occi::Infrastructure::Storage, nil)

    a storage instance or `nil`

Server-side Effects:

  • Gets status of volumes


68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/backends/ec2/storage.rb', line 68

def get(storage_id)
  filters = []
  filters << { name: 'volume-id', values: [storage_id] }

  Backends::Ec2::Helpers::AwsConnectHelper.rescue_aws_service(@logger) do
    volumes = @ec2_client.describe_volumes(filters: filters).volumes
    volume = volumes ? volumes.first : nil
    return nil unless volume

    parse_backend_obj(volume)
  end
end

#get_extensions::Occi::Collection

Returns a collection of custom mixins introduced (and specific for) the enabled backend. Only mixins and actions are allowed.

Returns:

  • (::Occi::Collection)

    collection of extensions (custom mixins and/or actions)


248
249
250
# File 'lib/backends/ec2/storage.rb', line 248

def get_extensions
  read_extensions 'storage', @options.model_extensions_dir
end

#list(mixins = nil) ⇒ ::Occi::Core::Resources

Gets all storage instances, instances must be filtered by the specified filter, filter (if set) must contain an ::Occi::Core::Mixins instance. Returned collection must contain ::Occi::Infrastructure::Storage instances wrapped in ::Occi::Core::Resources.

Examples:

storages = list #=> #<::Occi::Core::Resources>
storages.first #=> #<::Occi::Infrastructure::Storage>

mixins = ::Occi::Core::Mixins.new << ::Occi::Core::Mixin.new
storages = list(mixins) #=> #<::Occi::Core::Resources>

Parameters:

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (::Occi::Core::Resources)

    a collection of storage instances

Server-side Effects:

  • Gets status of volumes


42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/backends/ec2/storage.rb', line 42

def list(mixins = nil)
  storages = ::Occi::Core::Resources.new

  Backends::Ec2::Helpers::AwsConnectHelper.rescue_aws_service(@logger) do
    volumes = @ec2_client.describe_volumes.volumes
    volumes.each do |volume|
      next unless volume
      storages << parse_backend_obj(volume)
    end if volumes
  end

  storages
end

#list_ids(mixins = nil) ⇒ Array<String>

Gets all storage instance IDs, no details, no duplicates. Returned identifiers must correspond to those found in the occi.core.id attribute of ::Occi::Infrastructure::Storage instances.

Examples:

list_ids #=> []
list_ids #=> ["65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf",
                         "ggf4f65adfadf-adgg4ad-daggad-fydd4fadyfdfd"]

Parameters:

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (Array<String>)

    IDs for all available storage instances

Server-side Effects:

  • Gets status of volumes


16
17
18
19
20
21
22
23
24
25
# File 'lib/backends/ec2/storage.rb', line 16

def list_ids(mixins = nil)
  id_list = []

  Backends::Ec2::Helpers::AwsConnectHelper.rescue_aws_service(@logger) do
    volume_statuses = @ec2_client.describe_volume_status.volume_statuses
    volume_statuses.each { |vstatus| id_list << vstatus[:volume_id] } if volume_statuses
  end

  id_list
end

#partial_update(storage_id, attributes = nil, mixins = nil, links = nil) ⇒ true, false

TODO:

Method not yet implemented

Partially updates an existing storage instance, instance to be updated is specified by storage_id. If the requested instance cannot be updated, an error describing the problem must be raised, @see Backends::Errors.

Examples:

attributes = ::Occi::Core::Attributes.new
mixins = ::Occi::Core::Mixins.new
links = ::Occi::Core::Links.new
partial_update(storage_id, attributes, mixins, links) #=> true

Parameters:

  • storage_id (String)

    unique identifier of a storage instance to be updated

  • attributes (::Occi::Core::Attributes) (defaults to: nil)

    a collection of attributes to be updated

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a collection of mixins to be added

  • links (::Occi::Core::Links) (defaults to: nil)

    a collection of links to be added

Returns:

  • (true, false)

    result of the operation


174
175
176
177
# File 'lib/backends/ec2/storage.rb', line 174

def partial_update(storage_id, attributes = nil, mixins = nil, links = nil)
  # TODO: impl
  fail Backends::Errors::MethodNotImplementedError, 'Partial updates are currently not supported!'
end

#trigger_action(storage_id, action_instance) ⇒ true, false

Triggers an action on an existing storage instance, the storage instance in question is identified by a storage instance ID, action is identified by the action.term attribute of the action instance passed as an argument. If the requested action cannot be triggered, an error describing the problem must be raised, @see Backends::Errors.

Examples:

action_instance = ::Occi::Core::ActionInstance.new
trigger_action("65d4f65adfadf-ad2f4ad-daf5ad-f5ad4fad4ffdf", action_instance)
  #=> true

Parameters:

  • storage_id (String)

    storage instance identifier

  • action_instance (::Occi::Core::ActionInstance)

    action to be triggered

Returns:

  • (true, false)

    result of the operation

Server-side Effects:

  • For action snapshot: Creates a snapshot of the given volume

  • no effect for other actions (not implemented)


232
233
234
235
236
237
238
239
240
241
242
# File 'lib/backends/ec2/storage.rb', line 232

def trigger_action(storage_id, action_instance)
  case action_instance.action.type_identifier
  when 'http://schemas.ogf.org/occi/infrastructure/storage/action#snapshot'
    trigger_action_snapshot(storage_id, action_instance.attributes)
  else
    fail Backends::Errors::ActionNotImplementedError,
         "Action #{action_instance.action.type_identifier.inspect} is not implemented!"
  end

  true
end

#trigger_action_on_all(action_instance, mixins = nil) ⇒ true, false

Triggers an action on all existing storage instance, instances must be filtered by the specified filter, filter (if set) must contain an ::Occi::Core::Mixins instance, action is identified by the action.term attribute of the action instance passed as an argument. If the requested action cannot be triggered, an error describing the problem must be raised, @see Backends::Errors.

Examples:

action_instance = ::Occi::Core::ActionInstance.new
mixins = ::Occi::Core::Mixins.new << ::Occi::Core::Mixin.new
trigger_action_on_all(action_instance, mixin) #=> true

Parameters:

  • action_instance (::Occi::Core::ActionInstance)

    action to be triggered

  • mixins (::Occi::Core::Mixins) (defaults to: nil)

    a filter containing mixins

Returns:

  • (true, false)

    result of the operation

Server-side Effects:

  • For action snapshot: Creates a snapshot of the given volume

  • no effect for other actions (not implemented)


211
212
213
214
# File 'lib/backends/ec2/storage.rb', line 211

def trigger_action_on_all(action_instance, mixins = nil)
  list_ids(mixins).each { |strg| trigger_action(strg, action_instance) }
  true
end

#update(storage) ⇒ true, false

TODO:

Method not implemented

Updates an existing storage instance, instance to be updated is specified using the occi.core.id attribute of the instance passed as an argument. If the requested instance cannot be updated, an error describing the problem must be raised, @see Backends::Errors.

Examples:

storage = ::Occi::Infrastructure::Storage.new
update(storage) #=> true

Parameters:

  • storage (::Occi::Infrastructure::Storage)

    instance containing updated information

Returns:

  • (true, false)

    result of the operation


191
192
193
# File 'lib/backends/ec2/storage.rb', line 191

def update(storage)
  fail Backends::Errors::MethodNotImplementedError, 'Not Implemented!'
end