Beispiel #1
0
 def _get_libcloud_network(self, network):
     kwargs = {'network_ids': [network.network_id]}
     networks = self.cloud.ctl.compute.connection.ex_list_networks(**kwargs)
     if networks:
         return networks[0]
     raise NetworkNotFoundError('Network %s with network_id %s' %
                                (network.name, network.network_id))
Beispiel #2
0
def create_subnet(request):
    """
    Tags: networks
    ---
    Create subnet in a given network on a cloud

    ADD permission required on subnet
    READ permission required on cloud
    READ permission required on network
    CREATE_SUBNETS permission required on network
    CREATE_RESOURCES permission required on cloud
    ---
    cloud_id:
      in: path
      required: true
      description: The Cloud ID
      type: string
    network_id:
      in: path
      required: true
      description: The ID of the Network that will contain the new subnet
      type: string
    subnet:
      required: true
      type: object
    """
    cloud_id = request.matchdict['cloud']
    network_id = request.matchdict['network']

    params = params_from_request(request)

    auth_context = auth_context_from_request(request)

    # SEC
    auth_context.check_perm('cloud', 'read', cloud_id)
    auth_context.check_perm('cloud', 'create_resources', cloud_id)
    auth_context.check_perm('network', 'read', network_id)
    auth_context.check_perm('network', 'edit_subnets', network_id)

    try:
        cloud = Cloud.objects.get(id=cloud_id, owner=auth_context.owner)
    except Cloud.DoesNotExist:
        raise CloudNotFoundError()
    try:
        network = Network.objects.get(id=network_id, cloud=cloud)
    except Network.DoesNotExist:
        raise NetworkNotFoundError()

    # Create subnet.
    subnet = SUBNETS[cloud.ctl.provider].add(network=network, **params)

    return subnet.as_dict()
Beispiel #3
0
def delete_subnet(request):
    """
    Tags: networks
    ---
    Delete a subnet

    READ permission required on cloud
    READ permission required on network
    READ permission required on subnet
    REMOVE permission required on subnet
    ---
    cloud_id:
      in: path
      required: true
      type: string
    network_id:
      in: path
      required: true
      type: string
    subnet_id:
      in: path
      required: true
      type: string
    """
    cloud_id = request.matchdict['cloud']
    subnet_id = request.matchdict['subnet']
    network_id = request.matchdict['network']

    auth_context = auth_context_from_request(request)

    # SEC
    auth_context.check_perm('cloud', 'read', cloud_id)
    auth_context.check_perm('network', 'read', network_id)
    auth_context.check_perm('network', 'edit_subnets', network_id)

    try:
        cloud = Cloud.objects.get(id=cloud_id, owner=auth_context.owner)
    except Cloud.DoesNotExist:
        raise CloudNotFoundError()
    try:
        network = Network.objects.get(id=network_id, cloud=cloud)
    except Network.DoesNotExist:
        raise NetworkNotFoundError()
    try:
        subnet = Subnet.objects.get(id=subnet_id, network=network)
        subnet.ctl.delete()
    except Subnet.DoesNotExist:
        raise SubnetNotFoundError()

    # Trigger a UI update.
    trigger_session_update(auth_context.owner, ['clouds'])
    return OK
Beispiel #4
0
def delete_network(request):
    """
    Tags: networks
    ---
    Delete a network and all corresponding subnets

    READ permission required on cloud
    READ permission required on network
    REMOVE permission required on network
    ---
    parameters:
    - name: cloud_id
      in: path
      required: true
      schema:
        type: string
    - name: network_id
      in: path
      required: true
      schema:
        type: string
    """
    cloud_id = request.matchdict['cloud']
    network_id = request.matchdict['network']

    auth_context = auth_context_from_request(request)

    # SEC
    auth_context.check_perm('cloud', 'read', cloud_id)
    auth_context.check_perm('network', 'read', network_id)
    auth_context.check_perm('network', 'remove', network_id)

    try:
        cloud = Cloud.objects.get(id=cloud_id, owner=auth_context.owner)
    except Cloud.DoesNotExist:
        raise CloudNotFoundError()
    try:
        network = Network.objects.get(id=network_id, cloud=cloud)
    except me.DoesNotExist:
        raise NetworkNotFoundError()

    # Delete the network
    network.ctl.delete()

    # Schedule a UI update
    trigger_session_update(auth_context.owner, ['clouds'])

    return OK
Beispiel #5
0
def delete_portforward(request):
    """
    Tags: networks
    ---
    Delete the portforward of a GigG8 network
    READ permission required on network
    EDIT permission required on network
    ---
    network:
      in: path
      required: true
      type: string
    public_port:
      required: true
      type: string
    protocol:
      required: true
      type: string
    """
    network_id = request.matchdict['network']
    auth_context = auth_context_from_request(request)

    params = params_from_request(request)

    if not params.get('public_port'):
        raise RequiredParameterMissingError('public_port')

    if not params.get('protocol'):
        raise RequiredParameterMissingError('protocol')

    # SEC
    auth_context.check_perm('network', 'read', network_id)
    auth_context.check_perm('network', 'edit', network_id)

    try:
        network = Network.objects.get(owner=auth_context.owner, id=network_id)
    except Network.DoesNotExist:
        raise NetworkNotFoundError()

    try:
        network.cloud.ctl.network.delete_portforward(network, **params)
    except NotImplementedError:
        raise MistNotImplementedError

    return OK
Beispiel #6
0
def list_portforwards(request):
    """
    Tags: networks
    ---
    List the portforwards of a GigG8 network
    READ permission required on network
    ---
    network:
      in: path
      required: true
      type: string
    """
    network_id = request.matchdict['network']
    auth_context = auth_context_from_request(request)

    # SEC
    auth_context.check_perm('network', 'read', network_id)

    try:
        network = Network.objects.get(owner=auth_context.owner, id=network_id)
    except Network.DoesNotExist:
        raise NetworkNotFoundError()

    try:
        portforwards = network.cloud.ctl.network.list_portforwards(network)
    except NotImplementedError:
        raise MistNotImplementedError

    ret = []

    for pf in portforwards:
        portforward = {
            'privateport': pf.privateport,
            'publicport': pf.publicport,
            'protocol': pf.protocol,
            'node_id': pf.node_id,
            'public_ip': pf.network.publicipaddress
        }
        ret.append(portforward)

    return ret
Beispiel #7
0
def list_subnets(request):
    """
    Tags: networks
    ---
    List the subnets of a network

    READ permission required on cloud
    READ permission required on network
    READ permission required on subnets
    ---
    cloud:
      in: path
      required: true
      type: string
    network_id:
      in: path
      required: true
      description: The DB ID of the network whose subnets will be returned
      type: string
    """
    cloud_id = request.matchdict['cloud']
    network_id = request.matchdict['network']

    auth_context = auth_context_from_request(request)

    # SEC
    auth_context.check_perm('cloud', 'read', cloud_id)
    auth_context.check_perm('network', 'read', network_id)

    try:
        cloud = Cloud.objects.get(owner=auth_context.owner, id=cloud_id)
    except Cloud.DoesNotExist:
        raise CloudNotFoundError()
    try:
        network = Network.objects.get(cloud=cloud, id=network_id)
    except Network.DoesNotExist:
        raise NetworkNotFoundError()

    return [subnet.as_dict() for subnet in network.ctl.list_subnets()]
Beispiel #8
0
def create_portforward(request):
    """
    Tags: networks
    ---
    Create a portforward in a GigG8 network
    READ permission required on network
    EDIT permission required on network
    ---
    network:
      in: path
      required: true
      type: string
    machine_id:
      required: true
      type: string
    public_port:
      required: true
      type: integer
    private_port:
      required: true
      type: integer
    protocol:
      required: false
      type: string
    """
    network_id = request.matchdict['network']
    auth_context = auth_context_from_request(request)

    params = params_from_request(request)

    # SEC
    auth_context.check_perm('network', 'read', network_id)
    auth_context.check_perm('network', 'edit', network_id)

    if not params.get('machine_id'):
        raise RequiredParameterMissingError('machine_id')

    if not params.get('public_port'):
        raise RequiredParameterMissingError('public_port')

    if not params.get('private_port'):
        raise RequiredParameterMissingError('private_port')

    try:
        network = Network.objects.get(owner=auth_context.owner, id=network_id)
    except Network.DoesNotExist:
        raise NetworkNotFoundError()

    try:
        port_forward = network.cloud.ctl.network.create_portforward(
            network, **params)
    except NotImplementedError:
        raise MistNotImplementedError

    return {
        'privateport': port_forward.privateport,
        'publicport': port_forward.publicport,
        'protocol': port_forward.protocol,
        'node_id': port_forward.node_id,
        'public_ip': port_forward.network.publicipaddress
    }