Source code for metadataserver.models.nodeuserdata
# Copyright 2012 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Node user-data for cloud-init's use."""
from __future__ import (
absolute_import,
print_function,
unicode_literals,
)
str = None
__metaclass__ = type
__all__ = [
'NodeUserData',
]
from django.db.models import (
ForeignKey,
Manager,
Model,
)
from maasserver.models.cleansave import CleanSave
from metadataserver import DefaultMeta
from metadataserver.fields import (
Bin,
BinaryField,
)
class NodeUserDataManager(Manager):
"""Utility for the collection of NodeUserData items."""
def set_user_data(self, node, data):
"""Set user data for the given node.
If `data` is None, remove user data for the node.
"""
if data is None:
self._remove(node)
else:
self._set(node, data)
def get_user_data(self, node):
"""Retrieve user data for the given node."""
return self.get(node=node).data
def has_user_data(self, node):
"""Do we have user data registered for node?"""
return self.filter(node=node).exists()
def _set(self, node, data):
"""Set actual user data for a node. Not usable if data is None."""
wrapped_data = Bin(data)
(existing_entry, created) = self.get_or_create(
node=node, defaults={'data': wrapped_data})
if not created:
existing_entry.data = wrapped_data
existing_entry.save()
def _remove(self, node):
"""Remove metadata from node, if it has any any."""
self.filter(node=node).delete()
[docs]class NodeUserData(CleanSave, Model):
"""User-data portion of a node's metadata.
When cloud-init sets up a node, it retrieves specific data for that node
from the metadata service. One portion of that is the "user-data" binary
blob.
:ivar node: Node that this is for.
:ivar data: base64-encoded data.
"""
class Meta(DefaultMeta):
"""Needed for South to recognize this model."""
objects = NodeUserDataManager()
node = ForeignKey(
'maasserver.Node', null=False, editable=False, unique=True)
data = BinaryField(null=False)