Integrate storage (cinder) information in the model¶
https://blueprints.launchpad.net/watcher/+spec/cinder-model-integration
Problem description¶
As of now, Watcher only provides compute data model. Watcher needs storage data model for optimizing storage provided by Cinder.
Use Cases¶
As a developer, I want to develop storage optimization strategy using storage data model.
As as developer, I want to develop zone migration strategy using storage data model.
Proposed change¶
This spec adds storage data model separate from compute data model. Since Cinder backend has many pools, physical layer composed of backends and it’s pools. Backend information can be retrieved by python-cinderclient Service resource. The model has host, zone, status, and state attributes of Service resource. For using Multi backends feature, volume type is also needed. Volume type information can be retrieved by python-cinderclient VolumeType resource.
Pool information can be retrieved by python-cinderclient Pool resource. The model has name, total_volumes, total_capacity_gb, free_capacity_gb and provisioned_capacity_gb and allocated_capacity_gb attributes of Pool resource. Virtual_fee is also element of the model which is not retrieved by python-cinderclient, but retrieved from cinder notification.
Virtual layer is Cinder volume. Volume information can be retrieved by python-cinderclient Volume resource. The model has id, name, size, status, attachements, snapshot_id, project_id and metadata attributes of Volume resource.
In order to maintain consistency of the model, notification endpoint to consume all needed cinder notifications will be added:
CapacityNotificationEndpoint
This consumes the notification emitted in _publish_service_capabilities method periodically in cinder/manager.py from cinder-scheduler service.
Payload is defined as return value of _usage_from_capacity method in cinder.volume.utils.py.
Filter_rule is publisher_id equals r’capacity.*’ and event_type equals ‘capacity_pool’.
This endpoint updates pool information:
pool element
notification payload
name
name_to_id
total_volumes
None
total_capacity_gb
total
free_capacity_gb
free
provisioned_capacity_gb
provisioned
allocated_capacity_gb
allocated
virtual_free
virtual_free
Total_volumes is not included in notification payload so that it is calculated when updating pool information.
Notifications for updating volume information are emitted in cinder/volume/manager.py from cinder-volume service. Payload is defined as return value of _usage_from_volume method in cinder.volume.utils.py.
VolumeCreateEnd
Filter_rule is publisher_id equals r’volume.*’ and event_type equals ‘volume.create.end’.
This endpoint creates an element of virtual layer under the pool element with the condition that host included in publisher_id equals pool name:
volume element
notification payload
id
volume_id
name
display_name
size
size
status
status
attachements
volume_attachment
snapshot_id
snapshot_id
project_id
tenant_id
metadata
volume_metadata
VolumeDeleteEnd
Filter_rule is publisher_id equals r’volume.*’ and event_type equals ‘volume.delete.end’.
This endpoint deletes the element of virtual layer with the condition that volume_id equals id.
VolumeUpdateEnd
Filter_rule is publisher_id equals r’volume.*’ and event_type equals ‘volume.update.end’.
This endpoint updates the element of virtual layer with the condition that volume_id equals id:
volume element
notification payload
name
display_name
size
size
status
status
attachements
volume_attachment
snapshot_id
snapshot_id
project_id
tenant_id
metadata
volume_metadata
VolumeAttachEnd
Filter_rule is publisher_id equals r’volume.*’ and event_type equals ‘volume.attach.end’.
This endpoint updates the element of virtual layer with the condition that volume_id equals id. The attributes updating are the same as VolumeUpdateEnd.
VolumeDetachEnd
filter_rule is publisher_id equals r’volume.*’ and event_type equals ‘volume.detach.end’.
This endpoint updates the element of virtual layer with the condition that volume_id equals id. The attributes updating are the same as VolumeUpdateEnd.
VolumeResizeEnd
Filter_rule is publisher_id equals r’volume.*’ and event_type equals ‘volume.resize.end’.
This endpoint updates the element of virtual layer with the condition that volume_id equals id. The attributes updating are the same as VolumeUpdateEnd.
Alternatives¶
None
Data model impact¶
None
REST API impact¶
None
Security impact¶
None
Notifications impact¶
Notification endpoint to consume cinder notifications will be added.
Other end user impact¶
None
Performance Impact¶
Watcher stores data model in memory. Watcher-decision-engine may need more physical memory.
Other deployer impact¶
The following is added in setup.cfg.
[entry_points]
watcher_cluster_data_model_collectors =
storage = watcher.decision_engine.model.collector.cinder:CinderClusterDataModelCollector
Developer impact¶
None
Implementation¶
Assignee(s)¶
- Primary assignee:
<nakamura-h>
- Other contributors:
<None>
Work Items¶
Add storage data model
Add storage data model entry point in setup.cfg
Add _storage_model instance variable and storage_model method with property decorator to BaseStrategy class
Add notification endpoint for updating storage deta model
Dependencies¶
None
Testing¶
Unit tests should be updated.
Documentation Impact¶
Architecture documentation will be updated.
References¶
History¶
None