Revision 58194535

b/snf-cyclades-app/synnefo/api/util.py
211 211
        raise faults.ItemNotFound('Flavor not found.')
212 212

  
213 213

  
214
def get_flavor_provider(flavor):
215
    """Extract provider from disk template.
216

  
217
    Provider for `ext` disk_template is encoded in the disk template
218
    name, which is formed `ext_<provider_name>`. Provider is None
219
    for all other disk templates.
220

  
221
    """
222
    disk_template = flavor.disk_template
223
    provider = None
224
    if disk_template.startswith("ext"):
225
        disk_template, provider = disk_template.split("_", 1)
226
    return disk_template, provider
227

  
228

  
229 214
def get_network(network_id, user_id, for_update=False, non_deleted=False):
230 215
    """Return a Network instance or raise ItemNotFound."""
231 216

  
b/snf-cyclades-app/synnefo/db/models.py
1011 1011
    userid = models.CharField("Owner's UUID", max_length=100, null=False,
1012 1012
                              db_index=True)
1013 1013
    size = models.IntegerField("Volume size in GB",  null=False)
1014
    disk_template = models.CharField('Disk template', max_length=32,
1015
                                     null=False)
1016

  
1014 1017
    delete_on_termination = models.BooleanField("Delete on Server Termination",
1015 1018
                                                default=True, null=False)
1016 1019

  
......
1068 1071
            return None
1069 1072

  
1070 1073
    @property
1071
    def disk_template(self):
1072
        if self.machine is None:
1073
            return None
1074
        else:
1075
            disk_template = self.machine.flavor.disk_template
1076
            return disk_template.split("_")[0]
1074
    def template(self):
1075
        return self.disk_template.split("_")[0]
1077 1076

  
1078 1077
    @property
1079
    def disk_provider(self):
1080
        if self.machine is None:
1081
            return None
1078
    def provider(self):
1079
        if "_" in self.disk_template:
1080
            return self.disk_template.split("_")[1]
1082 1081
        else:
1083
            disk_template = self.machine.flavor.disk_template
1084
            if "_" in disk_template:
1085
                return disk_template.split("_")[1]
1086
            else:
1087
                return None
1082
            return None
1088 1083

  
1089 1084
    @staticmethod
1090 1085
    def prefix_source(source_id, source_type):
b/snf-cyclades-app/synnefo/logic/backend.py
716 716
    for volume in volumes:
717 717
        disk = {"name": volume.backend_volume_uuid,
718 718
                "size": volume.size * 1024}
719
        provider = flavor.disk_provider
719
        provider = volume.provider
720 720
        if provider is not None:
721 721
            disk["provider"] = provider
722 722
            disk["origin"] = volume.origin
b/snf-cyclades-app/synnefo/volume/util.py
57 57
def snapshot_to_links(snapshot_id):
58 58
    href = join_urls(SNAPSHOTS_URL, str(snapshot_id))
59 59
    return [{"rel": rel, "href": href} for rel in ("self", "bookmark")]
60

  
61

  
62
def get_disk_template_provider(disk_template):
63
    """Extract provider from disk template.
64

  
65
    Provider for `ext` disk_template is encoded in the disk template
66
    name, which is formed `ext_<provider_name>`. Provider is None
67
    for all other disk templates.
68

  
69
    """
70
    provider = None
71
    if disk_template.startswith("ext") and "_" in disk_template:
72
        disk_template, provider = disk_template.split("_", 1)
73
    return disk_template, provider
b/snf-cyclades-app/synnefo/volume/volumes.py
1 1
import logging
2 2

  
3 3
from django.db import transaction
4
from django.conf import settings
4 5
from snf_django.lib.api import faults
5 6
from synnefo.db.models import Volume
6 7
from synnefo.volume import util
......
57 58
    # Only ext_ disk template supports cloning from another source. Otherwise
58 59
    # is must be the root volume so that 'snf-image' fill the volume
59 60
    disk_template = server.flavor.disk_template
60
    can_have_source = (index == 0 or disk_template.startswith("ext_"))
61
    teplate, provider = util.get_disk_template_provider(disk_template)
62
    can_have_source = (index == 0 or
63
                       provider in settings.GANETI_CLONE_PROVIDERS)
61 64
    if not can_have_source and source_type != "blank":
62 65
        msg = ("Volumes of '%s' disk template cannot have a source" %
63 66
               disk_template)
......
111 114

  
112 115
    volume = Volume.objects.create(userid=user_id,
113 116
                                   size=size,
117
                                   disk_template=disk_template,
114 118
                                   name=name,
115 119
                                   machine=server,
116 120
                                   description=description,

Also available in: Unified diff