From: Giovanni Meo Date: Mon, 15 Sep 2014 06:32:12 +0000 (+0000) Subject: Merge "Bug 1861 - Adding the missing moxy related bundles to the NSF feature that... X-Git-Tag: release/helium~80 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=1048cce77e241a1bdd152209dfae9ce13847e41c;hp=34ee2b92cd19959b0e3c70e98720bf9144097ea4 Merge "Bug 1861 - Adding the missing moxy related bundles to the NSF feature that resulted in Neutron Northbound API failures" --- diff --git a/opendaylight/distribution/opendaylight-karaf-resources/src/main/resources/bin/setenv b/opendaylight/distribution/opendaylight-karaf-resources/src/main/resources/bin/setenv new file mode 100755 index 0000000000..4f240447b4 --- /dev/null +++ b/opendaylight/distribution/opendaylight-karaf-resources/src/main/resources/bin/setenv @@ -0,0 +1,55 @@ +#!/bin/sh +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# +# handle specific scripts; the SCRIPT_NAME is exactly the name of the Karaf +# script; for example karaf, start, stop, admin, client, ... +# +# if [ "$KARAF_SCRIPT" == "SCRIPT_NAME" ]; then +# Actions go here... +# fi + +# +# general settings which should be applied for all scripts go here; please keep +# in mind that it is possible that scripts might be executed more than once, e.g. +# in example of the start script where the start script is executed first and the +# karaf script afterwards. +# + +# +# The following section shows the possible configuration options for the default +# karaf scripts +# +# export JAVA_HOME # Location of Java installation +# export JAVA_MIN_MEM # Minimum memory for the JVM +# export JAVA_MAX_MEM # Maximum memory for the JVM +# export JAVA_PERM_MEM # Minimum perm memory for the JVM +# export JAVA_MAX_PERM_MEM # Maximum perm memory for the JVM +# export KARAF_HOME # Karaf home folder +# export KARAF_DATA # Karaf data folder +# export KARAF_BASE # Karaf base folder +# export KARAF_ETC # Karaf etc folder +# export KARAF_OPTS # Additional available Karaf options +# export KARAF_DEBUG # Enable debug mode +if [ "x$JAVA_MAX_PERM_MEM" == "x" ]; then + export JAVA_MAX_PERM_MEM="512m" +fi +if [ "x$JAVA_MAX_MEM" == "x" ]; then + export JAVA_MAX_MEM="2048m" +fi + diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedTransactionFactory.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedTransactionFactory.java index 6838e39093..8ef60a43d4 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedTransactionFactory.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/AbstractDOMForwardedTransactionFactory.java @@ -212,8 +212,8 @@ abstract class AbstractDOMForwardedTransactionFactory + * members List * http://docs.openstack.org/api/openstack-network/2.0/openstack-network.pdf */ @@ -71,13 +71,10 @@ public class NeutronLoadBalancerPool extends ConfigurationObject implements Seri @XmlElement (name="status") String loadBalancerPoolStatus; - @XmlElement (name="members") - List loadBalancerPoolMembers; - - HashMap member; + @XmlElement(name="members") + List loadBalancerPoolMembers; public NeutronLoadBalancerPool() { - member = new HashMap(); } public String getLoadBalancerPoolID() { @@ -152,14 +149,27 @@ public class NeutronLoadBalancerPool extends ConfigurationObject implements Seri this.loadBalancerPoolStatus = loadBalancerPoolStatus; } - public List getLoadBalancerPoolMembers() { + public List getLoadBalancerPoolMembers() { + /* + * Update the pool_id of the member to that this.loadBalancerPoolID + */ + for (NeutronLoadBalancerPoolMember member: loadBalancerPoolMembers) + member.setPoolID(loadBalancerPoolID); return loadBalancerPoolMembers; } - public void setLoadBalancerPoolMembers(List loadBalancerPoolMembers) { + public void setLoadBalancerPoolMembers(List loadBalancerPoolMembers) { this.loadBalancerPoolMembers = loadBalancerPoolMembers; } + public void addLoadBalancerPoolMember(NeutronLoadBalancerPoolMember loadBalancerPoolMember) { + this.loadBalancerPoolMembers.add(loadBalancerPoolMember); + } + + public void removeLoadBalancerPoolMember(NeutronLoadBalancerPoolMember loadBalancerPoolMember) { + this.loadBalancerPoolMembers.remove(loadBalancerPoolMember); + } + public NeutronLoadBalancerPool extractFields(List fields) { NeutronLoadBalancerPool ans = new NeutronLoadBalancerPool(); Iterator i = fields.iterator(); @@ -198,4 +208,4 @@ public class NeutronLoadBalancerPool extends ConfigurationObject implements Seri } return ans; } -} \ No newline at end of file +} diff --git a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronLoadBalancerPoolMember.java b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronLoadBalancerPoolMember.java index 577c3bb528..683d45fcf2 100644 --- a/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronLoadBalancerPoolMember.java +++ b/opendaylight/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/NeutronLoadBalancerPoolMember.java @@ -10,11 +10,18 @@ package org.opendaylight.controller.networkconfig.neutron; import org.opendaylight.controller.configuration.ConfigurationObject; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import java.io.Serializable; import java.util.Iterator; import java.util.List; +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) + public class NeutronLoadBalancerPoolMember extends ConfigurationObject implements Serializable { private static final long serialVersionUID = 1L; @@ -46,9 +53,20 @@ public class NeutronLoadBalancerPoolMember extends ConfigurationObject implemen @XmlElement (name="status") String poolMemberStatus; + String poolID; + public NeutronLoadBalancerPoolMember() { } + @XmlTransient + public String getPoolID() { + return poolID; + } + + public void setPoolID(String poolID) { + this.poolID = poolID; + } + public String getPoolMemberID() { return poolMemberID; } @@ -121,6 +139,9 @@ public class NeutronLoadBalancerPoolMember extends ConfigurationObject implemen if (s.equals("id")) { ans.setPoolMemberID(this.getPoolMemberID()); } + if (s.equals("pool_id")) { + ans.setPoolID(this.getPoolID()); + } if (s.equals("tenant_id")) { ans.setPoolMemberTenantID(this.getPoolMemberTenantID()); } @@ -148,6 +169,7 @@ public class NeutronLoadBalancerPoolMember extends ConfigurationObject implemen @Override public String toString() { return "NeutronLoadBalancerPoolMember{" + "poolMemberID='" + poolMemberID + '\'' + + ", poolID='" + poolID + '\'' + ", poolMemberTenantID='" + poolMemberTenantID + '\'' + ", poolMemberAddress='" + poolMemberAddress + '\'' + ", poolMemberProtoPort=" + poolMemberProtoPort + diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerNorthbound.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerNorthbound.java index 748dffc8cf..863b3cbdc7 100644 --- a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerNorthbound.java +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerNorthbound.java @@ -38,8 +38,8 @@ import java.util.Iterator; import java.util.List; /** - * Neutron Northbound REST APIs for LoadBalancer Policies.
- * This class provides REST APIs for managing neutron LoadBalancer Policies + * Neutron Northbound REST APIs for LoadBalancers.
+ * This class provides REST APIs for managing neutron LoadBalancers * *
*
@@ -87,15 +87,13 @@ public class NeutronLoadBalancerNorthbound { @QueryParam("page_reverse") String pageReverse // sorting not supported ) { - INeutronLoadBalancerCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( - this); - // INeutronLoadBalancerRuleCRUD firewallRuleInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerRuleCRUD(this); + INeutronLoadBalancerCRUD loadBalancerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD(this); - if (loadBalancerPoolInterface == null) { + if (loadBalancerInterface == null) { throw new ServiceUnavailableException("LoadBalancer CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } - List allLoadBalancers = loadBalancerPoolInterface.getAllNeutronLoadBalancers(); + List allLoadBalancers = loadBalancerInterface.getAllNeutronLoadBalancers(); // List allLoadBalancerRules = firewallRuleInterface.getAllNeutronLoadBalancerRules(); List ans = new ArrayList(); // List rules = new ArrayList(); @@ -128,7 +126,7 @@ public class NeutronLoadBalancerNorthbound { /** * Returns a specific LoadBalancer */ - @Path("{loadBalancerPoolID}") + @Path("{loadBalancerID}") @GET @Produces({ MediaType.APPLICATION_JSON }) @@ -137,25 +135,25 @@ public class NeutronLoadBalancerNorthbound { @ResponseCode(code = 401, condition = "Unauthorized"), @ResponseCode(code = 404, condition = "Not Found"), @ResponseCode(code = 501, condition = "Not Implemented") }) - public Response showLoadBalancer(@PathParam("loadBalancerPoolID") String loadBalancerPoolID, + public Response showLoadBalancer(@PathParam("loadBalancerID") String loadBalancerID, // return fields @QueryParam("fields") List fields) { - INeutronLoadBalancerCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( + INeutronLoadBalancerCRUD loadBalancerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( this); - if (loadBalancerPoolInterface == null) { + if (loadBalancerInterface == null) { throw new ServiceUnavailableException("LoadBalancer CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } - if (!loadBalancerPoolInterface.neutronLoadBalancerExists(loadBalancerPoolID)) { + if (!loadBalancerInterface.neutronLoadBalancerExists(loadBalancerID)) { throw new ResourceNotFoundException("LoadBalancer UUID does not exist."); } if (fields.size() > 0) { - NeutronLoadBalancer ans = loadBalancerPoolInterface.getNeutronLoadBalancer(loadBalancerPoolID); + NeutronLoadBalancer ans = loadBalancerInterface.getNeutronLoadBalancer(loadBalancerID); return Response.status(200).entity( new NeutronLoadBalancerRequest(extractFields(ans, fields))).build(); } else { - return Response.status(200).entity(new NeutronLoadBalancerRequest(loadBalancerPoolInterface.getNeutronLoadBalancer( - loadBalancerPoolID))).build(); + return Response.status(200).entity(new NeutronLoadBalancerRequest(loadBalancerInterface.getNeutronLoadBalancer( + loadBalancerID))).build(); } } @@ -175,9 +173,9 @@ public class NeutronLoadBalancerNorthbound { @ResponseCode(code = 409, condition = "Conflict"), @ResponseCode(code = 501, condition = "Not Implemented") }) public Response createLoadBalancers(final NeutronLoadBalancerRequest input) { - INeutronLoadBalancerCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( + INeutronLoadBalancerCRUD loadBalancerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( this); - if (loadBalancerPoolInterface == null) { + if (loadBalancerInterface == null) { throw new ServiceUnavailableException("LoadBalancer CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } @@ -187,11 +185,9 @@ public class NeutronLoadBalancerNorthbound { /* * Verify that the LoadBalancer doesn't already exist. */ - if (loadBalancerPoolInterface.neutronLoadBalancerExists(singleton.getLoadBalancerID())) { + if (loadBalancerInterface.neutronLoadBalancerExists(singleton.getLoadBalancerID())) { throw new BadRequestException("LoadBalancer UUID already exists"); } - loadBalancerPoolInterface.addNeutronLoadBalancer(singleton); - Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerAware.class, this, null); if (instances != null) { for (Object instance : instances) { @@ -202,7 +198,7 @@ public class NeutronLoadBalancerNorthbound { } } } - loadBalancerPoolInterface.addNeutronLoadBalancer(singleton); + loadBalancerInterface.addNeutronLoadBalancer(singleton); if (instances != null) { for (Object instance : instances) { INeutronLoadBalancerAware service = (INeutronLoadBalancerAware) instance; @@ -218,10 +214,10 @@ public class NeutronLoadBalancerNorthbound { NeutronLoadBalancer test = i.next(); /* - * Verify that the firewall policy doesn't already exist + * Verify that the loadbalancer doesn't already exist */ - if (loadBalancerPoolInterface.neutronLoadBalancerExists(test.getLoadBalancerID())) { + if (loadBalancerInterface.neutronLoadBalancerExists(test.getLoadBalancerID())) { throw new BadRequestException("Load Balancer Pool UUID already is already created"); } if (testMap.containsKey(test.getLoadBalancerID())) { @@ -243,7 +239,7 @@ public class NeutronLoadBalancerNorthbound { i = bulk.iterator(); while (i.hasNext()) { NeutronLoadBalancer test = i.next(); - loadBalancerPoolInterface.addNeutronLoadBalancer(test); + loadBalancerInterface.addNeutronLoadBalancer(test); if (instances != null) { for (Object instance : instances) { INeutronLoadBalancerAware service = (INeutronLoadBalancerAware) instance; @@ -258,7 +254,7 @@ public class NeutronLoadBalancerNorthbound { /** * Updates a LoadBalancer Policy */ - @Path("{loadBalancerPoolID}") + @Path("{loadBalancerID}") @PUT @Produces({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON }) @@ -271,10 +267,10 @@ public class NeutronLoadBalancerNorthbound { @ResponseCode(code = 404, condition = "Not Found"), @ResponseCode(code = 501, condition = "Not Implemented") }) public Response updateLoadBalancer( - @PathParam("loadBalancerPoolID") String loadBalancerPoolID, final NeutronLoadBalancerRequest input) { - INeutronLoadBalancerCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( + @PathParam("loadBalancerID") String loadBalancerID, final NeutronLoadBalancerRequest input) { + INeutronLoadBalancerCRUD loadBalancerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( this); - if (loadBalancerPoolInterface == null) { + if (loadBalancerInterface == null) { throw new ServiceUnavailableException("LoadBalancer CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } @@ -282,14 +278,14 @@ public class NeutronLoadBalancerNorthbound { /* * verify the LoadBalancer exists and there is only one delta provided */ - if (!loadBalancerPoolInterface.neutronLoadBalancerExists(loadBalancerPoolID)) { + if (!loadBalancerInterface.neutronLoadBalancerExists(loadBalancerID)) { throw new ResourceNotFoundException("LoadBalancer UUID does not exist."); } if (!input.isSingleton()) { throw new BadRequestException("Only singleton edit supported"); } NeutronLoadBalancer delta = input.getSingleton(); - NeutronLoadBalancer original = loadBalancerPoolInterface.getNeutronLoadBalancer(loadBalancerPoolID); + NeutronLoadBalancer original = loadBalancerInterface.getNeutronLoadBalancer(loadBalancerID); /* * updates restricted by Neutron @@ -318,23 +314,23 @@ public class NeutronLoadBalancerNorthbound { /* * update the object and return it */ - loadBalancerPoolInterface.updateNeutronLoadBalancer(loadBalancerPoolID, delta); - NeutronLoadBalancer updatedLoadBalancer = loadBalancerPoolInterface.getNeutronLoadBalancer( - loadBalancerPoolID); + loadBalancerInterface.updateNeutronLoadBalancer(loadBalancerID, delta); + NeutronLoadBalancer updatedLoadBalancer = loadBalancerInterface.getNeutronLoadBalancer( + loadBalancerID); if (instances != null) { for (Object instance : instances) { INeutronLoadBalancerAware service = (INeutronLoadBalancerAware) instance; service.neutronLoadBalancerUpdated(updatedLoadBalancer); } } - return Response.status(200).entity(new NeutronLoadBalancerRequest(loadBalancerPoolInterface.getNeutronLoadBalancer( - loadBalancerPoolID))).build(); + return Response.status(200).entity(new NeutronLoadBalancerRequest(loadBalancerInterface.getNeutronLoadBalancer( + loadBalancerID))).build(); } /** * Deletes a LoadBalancer */ - @Path("{loadBalancerPoolID}") + @Path("{loadBalancerID}") @DELETE @StatusCodes({ @ResponseCode(code = 204, condition = "No Content"), @@ -343,10 +339,10 @@ public class NeutronLoadBalancerNorthbound { @ResponseCode(code = 409, condition = "Conflict"), @ResponseCode(code = 501, condition = "Not Implemented") }) public Response deleteLoadBalancer( - @PathParam("loadBalancerPoolID") String loadBalancerPoolID) { - INeutronLoadBalancerCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( + @PathParam("loadBalancerID") String loadBalancerID) { + INeutronLoadBalancerCRUD loadBalancerInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerCRUD( this); - if (loadBalancerPoolInterface == null) { + if (loadBalancerInterface == null) { throw new ServiceUnavailableException("LoadBalancer CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } @@ -354,13 +350,13 @@ public class NeutronLoadBalancerNorthbound { /* * verify the LoadBalancer exists and it isn't currently in use */ - if (!loadBalancerPoolInterface.neutronLoadBalancerExists(loadBalancerPoolID)) { + if (!loadBalancerInterface.neutronLoadBalancerExists(loadBalancerID)) { throw new ResourceNotFoundException("LoadBalancer UUID does not exist."); } - if (loadBalancerPoolInterface.neutronLoadBalancerInUse(loadBalancerPoolID)) { + if (loadBalancerInterface.neutronLoadBalancerInUse(loadBalancerID)) { return Response.status(409).build(); } - NeutronLoadBalancer singleton = loadBalancerPoolInterface.getNeutronLoadBalancer(loadBalancerPoolID); + NeutronLoadBalancer singleton = loadBalancerInterface.getNeutronLoadBalancer(loadBalancerID); Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerAware.class, this, null); if (instances != null) { for (Object instance : instances) { @@ -372,7 +368,7 @@ public class NeutronLoadBalancerNorthbound { } } - loadBalancerPoolInterface.removeNeutronLoadBalancer(loadBalancerPoolID); + loadBalancerInterface.removeNeutronLoadBalancer(loadBalancerID); if (instances != null) { for (Object instance : instances) { INeutronLoadBalancerAware service = (INeutronLoadBalancerAware) instance; diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/INeutronLoadBalancerPoolMemberRequest.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMemberRequest.java similarity index 82% rename from opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/INeutronLoadBalancerPoolMemberRequest.java rename to opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMemberRequest.java index 9d6616373c..9b949da72e 100644 --- a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/INeutronLoadBalancerPoolMemberRequest.java +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMemberRequest.java @@ -12,7 +12,7 @@ import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool import javax.xml.bind.annotation.XmlElement; import java.util.List; -public class INeutronLoadBalancerPoolMemberRequest { +public class NeutronLoadBalancerPoolMemberRequest { /** * See OpenStack Network API v2.0 Reference for description of @@ -25,15 +25,15 @@ public class INeutronLoadBalancerPoolMemberRequest { @XmlElement(name="members") List bulkRequest; - INeutronLoadBalancerPoolMemberRequest() { + NeutronLoadBalancerPoolMemberRequest() { } - INeutronLoadBalancerPoolMemberRequest(List bulk) { + NeutronLoadBalancerPoolMemberRequest(List bulk) { bulkRequest = bulk; singletonLoadBalancerPoolMember = null; } - INeutronLoadBalancerPoolMemberRequest(NeutronLoadBalancerPoolMember group) { + NeutronLoadBalancerPoolMemberRequest(NeutronLoadBalancerPoolMember group) { singletonLoadBalancerPoolMember = group; } diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMembersNorthbound.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMembersNorthbound.java index ff56fa0a9d..f8f3cd8c53 100644 --- a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMembersNorthbound.java +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolMembersNorthbound.java @@ -1,46 +1,51 @@ /* - * Copyright (C) 2014 Red Hat, Inc. + * Copyright (C) 2014 SDN Hub, LLC. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Authors : Srini Seetharaman */ package org.opendaylight.controller.networkconfig.neutron.northbound; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; +import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD; import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberAware; -import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberCRUD; import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces; +import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool; import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember; import org.opendaylight.controller.northbound.commons.RestMessages; import org.opendaylight.controller.northbound.commons.exception.BadRequestException; +import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; import org.opendaylight.controller.sal.utils.ServiceHelper; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; + import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; - -@Path("/pools/{loadBalancerPoolID}/members") +@Path("/pools/{loadBalancerPoolUUID}/members") public class NeutronLoadBalancerPoolMembersNorthbound { - private NeutronLoadBalancerPoolMember extractFields(NeutronLoadBalancerPoolMember o, List fields) { return o.extractFields(fields); } /** - * Returns a list of all LoadBalancerPool + * Returns a list of all LoadBalancerPoolMembers in specified pool */ @GET @Produces({MediaType.APPLICATION_JSON}) @@ -50,8 +55,12 @@ public class NeutronLoadBalancerPoolMembersNorthbound { @ResponseCode(code = 501, condition = "Not Implemented")}) public Response listMembers( + //Path param + @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID, + // return fields @QueryParam("fields") List fields, + // OpenStack LoadBalancerPool attributes @QueryParam("id") String queryLoadBalancerPoolMemberID, @QueryParam("tenant_id") String queryLoadBalancerPoolMemberTenantID, @@ -68,20 +77,24 @@ public Response listMembers( @QueryParam("page_reverse") String pageReverse // sorting not supported ) { - INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = NeutronCRUDInterfaces - .getINeutronLoadBalancerPoolMemberCRUD(this); - if (loadBalancerPoolMemberInterface == null) { + INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces + .getINeutronLoadBalancerPoolCRUD(this); + if (loadBalancerPoolInterface == null) { throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } - List allLoadBalancerPoolMembers = loadBalancerPoolMemberInterface - .getAllNeutronLoadBalancerPoolMembers(); + if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) { + throw new ResourceNotFoundException("loadBalancerPool UUID does not exist."); + } + List members = + loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers(); List ans = new ArrayList(); - Iterator i = allLoadBalancerPoolMembers.iterator(); + Iterator i = members.iterator(); while (i.hasNext()) { NeutronLoadBalancerPoolMember nsg = i.next(); if ((queryLoadBalancerPoolMemberID == null || queryLoadBalancerPoolMemberID.equals(nsg.getPoolMemberID())) && + loadBalancerPoolUUID.equals(nsg.getPoolID()) && (queryLoadBalancerPoolMemberTenantID == null || queryLoadBalancerPoolMemberTenantID.equals(nsg.getPoolMemberTenantID())) && (queryLoadBalancerPoolMemberAddress == null || @@ -102,13 +115,57 @@ public Response listMembers( } } return Response.status(200).entity( - new INeutronLoadBalancerPoolMemberRequest(ans)).build(); + new NeutronLoadBalancerPoolMemberRequest(ans)).build(); +} + +/** + * Returns a specific LoadBalancerPoolMember + */ + +@Path("{loadBalancerPoolMemberUUID}") +@GET +@Produces({ MediaType.APPLICATION_JSON }) +//@TypeHint(OpenStackLoadBalancerPoolMembers.class) +@StatusCodes({ + @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 401, condition = "Unauthorized"), + @ResponseCode(code = 404, condition = "Not Found"), + @ResponseCode(code = 501, condition = "Not Implemented") }) +public Response showLoadBalancerPoolMember( + @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID, + @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID, + // return fields + @QueryParam("fields") List fields ) { + + INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces + .getINeutronLoadBalancerPoolCRUD(this); + if (loadBalancerPoolInterface == null) { + throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface " + + RestMessages.SERVICEUNAVAILABLE.toString()); + } + if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) { + throw new ResourceNotFoundException("loadBalancerPool UUID does not exist."); + } + List members = + loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers(); + for (NeutronLoadBalancerPoolMember ans: members) { + if (!ans.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) + continue; + + if (fields.size() > 0) { + return Response.status(200).entity( + new NeutronLoadBalancerPoolMemberRequest(extractFields(ans, fields))).build(); + } else { + return Response.status(200).entity( + new NeutronLoadBalancerPoolMemberRequest(ans)).build(); + } + } + return Response.status(204).build(); } /** * Adds a Member to an LBaaS Pool member */ -@Path("/pools/{loadBalancerPoolID}/members") @PUT @Produces({MediaType.APPLICATION_JSON}) @Consumes({MediaType.APPLICATION_JSON}) @@ -117,25 +174,34 @@ public Response listMembers( @ResponseCode(code = 401, condition = "Unauthorized"), @ResponseCode(code = 404, condition = "Not Found"), @ResponseCode(code = 501, condition = "Not Implemented")}) -public Response createLoadBalancerPoolMember( INeutronLoadBalancerPoolMemberRequest input) { +public Response createLoadBalancerPoolMember( + @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID, + final NeutronLoadBalancerPoolMemberRequest input) { - INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolMemberCRUD( - this); - if (loadBalancerPoolMemberInterface == null) { - throw new ServiceUnavailableException("LoadBalancerPoolMember CRUD Interface " + INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolCRUD(this); + if (loadBalancerPoolInterface == null) { + throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface " + RestMessages.SERVICEUNAVAILABLE.toString()); } + // Verify that the loadBalancerPool exists, for the member to be added to its cache + if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) { + throw new ResourceNotFoundException("loadBalancerPool UUID does not exist."); + } + NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID); + if (input.isSingleton()) { NeutronLoadBalancerPoolMember singleton = input.getSingleton(); + singleton.setPoolID(loadBalancerPoolUUID); + String loadBalancerPoolMemberUUID = singleton.getPoolMemberID(); /* * Verify that the LoadBalancerPoolMember doesn't already exist. */ - if (loadBalancerPoolMemberInterface.neutronLoadBalancerPoolMemberExists( - singleton.getPoolMemberID())) { - throw new BadRequestException("LoadBalancerPoolMember UUID already exists"); + List members = singletonPool.getLoadBalancerPoolMembers(); + for (NeutronLoadBalancerPoolMember member: members) { + if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) + throw new BadRequestException("LoadBalancerPoolMember UUID already exists"); } - loadBalancerPoolMemberInterface.addNeutronLoadBalancerPoolMember(singleton); Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolMemberAware.class, this, null); if (instances != null) { @@ -147,13 +213,18 @@ public Response createLoadBalancerPoolMember( INeutronLoadBalancerPoolMemberReq } } } - loadBalancerPoolMemberInterface.addNeutronLoadBalancerPoolMember(singleton); if (instances != null) { for (Object instance : instances) { INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance; service.neutronLoadBalancerPoolMemberCreated(singleton); } } + + /** + * Add the member from the neutron load balancer pool as well + */ + singletonPool.addLoadBalancerPoolMember(singleton); + } else { List bulk = input.getBulk(); Iterator i = bulk.iterator(); @@ -161,15 +232,17 @@ public Response createLoadBalancerPoolMember( INeutronLoadBalancerPoolMemberReq Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolMemberAware.class, this, null); while (i.hasNext()) { NeutronLoadBalancerPoolMember test = i.next(); + String loadBalancerPoolMemberUUID = test.getPoolMemberID(); /* - * Verify that the firewall doesn't already exist + * Verify that the LoadBalancerPoolMember doesn't already exist. */ - - if (loadBalancerPoolMemberInterface.neutronLoadBalancerPoolMemberExists( - test.getPoolMemberID())) { - throw new BadRequestException("Load Balancer PoolMember UUID already is already created"); + List members = singletonPool.getLoadBalancerPoolMembers(); + for (NeutronLoadBalancerPoolMember member: members) { + if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) + throw new BadRequestException("LoadBalancerPoolMember UUID already exists"); } + if (testMap.containsKey(test.getPoolMemberID())) { throw new BadRequestException("Load Balancer PoolMember UUID already exists"); } @@ -189,15 +262,105 @@ public Response createLoadBalancerPoolMember( INeutronLoadBalancerPoolMemberReq i = bulk.iterator(); while (i.hasNext()) { NeutronLoadBalancerPoolMember test = i.next(); - loadBalancerPoolMemberInterface.addNeutronLoadBalancerPoolMember(test); if (instances != null) { for (Object instance : instances) { INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance; service.neutronLoadBalancerPoolMemberCreated(test); } } + singletonPool.addLoadBalancerPoolMember(test); } } return Response.status(201).entity(input).build(); } + +/** + * Updates a LB member pool + */ + +@Path("{loadBalancerPoolMemberUUID}") +@PUT +@Produces({ MediaType.APPLICATION_JSON }) +@Consumes({ MediaType.APPLICATION_JSON }) +@StatusCodes({ + @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 400, condition = "Bad Request"), + @ResponseCode(code = 401, condition = "Unauthorized"), + @ResponseCode(code = 403, condition = "Forbidden"), + @ResponseCode(code = 404, condition = "Not Found"), + @ResponseCode(code = 501, condition = "Not Implemented") }) +public Response updateLoadBalancerPoolMember( + @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID, + @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID, + final NeutronLoadBalancerPoolMemberRequest input) { + + //TODO: Implement update LB member pool + return Response.status(501).entity(input).build(); +} + +/** + * Deletes a LoadBalancerPoolMember + */ + +@Path("{loadBalancerPoolMemberUUID}") +@DELETE +@StatusCodes({ + @ResponseCode(code = 204, condition = "No Content"), + @ResponseCode(code = 401, condition = "Unauthorized"), + @ResponseCode(code = 403, condition = "Forbidden"), + @ResponseCode(code = 404, condition = "Not Found"), + @ResponseCode(code = 501, condition = "Not Implemented") }) +public Response deleteLoadBalancerPoolMember( + @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID, + @PathParam("loadBalancerPoolMemberUUID") String loadBalancerPoolMemberUUID) { + INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolCRUD(this); + if (loadBalancerPoolInterface == null) { + throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface " + + RestMessages.SERVICEUNAVAILABLE.toString()); + } + + // Verify that the loadBalancerPool exists, for the member to be removed from its cache + if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) { + throw new ResourceNotFoundException("loadBalancerPool UUID does not exist."); + } + + //Verify that the LB pool member exists + NeutronLoadBalancerPoolMember singleton = null; + List members = + loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID).getLoadBalancerPoolMembers(); + for (NeutronLoadBalancerPoolMember member: members) { + if (member.getPoolMemberID().equals(loadBalancerPoolMemberUUID)) { + singleton = member; + break; + } + } + if (singleton == null) + throw new BadRequestException("LoadBalancerPoolMember UUID does not exist."); + + Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolMemberAware.class, this, null); + if (instances != null) { + for (Object instance : instances) { + INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance; + int status = service.canDeleteNeutronLoadBalancerPoolMember(singleton); + if (status < 200 || status > 299) { + return Response.status(status).build(); + } + } + } + + if (instances != null) { + for (Object instance : instances) { + INeutronLoadBalancerPoolMemberAware service = (INeutronLoadBalancerPoolMemberAware) instance; + service.neutronLoadBalancerPoolMemberDeleted(singleton); + } + } + + /** + * Remove the member from the neutron load balancer pool + */ + NeutronLoadBalancerPool singletonPool = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID); + singletonPool.removeLoadBalancerPoolMember(singleton); + + return Response.status(204).build(); +} } diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolNorthbound.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolNorthbound.java index fc5357ccb5..7802dbb906 100644 --- a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolNorthbound.java +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronLoadBalancerPoolNorthbound.java @@ -1,9 +1,11 @@ /* - * Copyright (C) 2014 Red Hat, Inc. + * Copyright (C) 2014 SDN Hub, LLC. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Authors : Srini Seetharaman */ package org.opendaylight.controller.networkconfig.neutron.northbound; @@ -13,8 +15,10 @@ import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolAware; import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolCRUD; +import org.opendaylight.controller.networkconfig.neutron.INeutronLoadBalancerPoolMemberCRUD; import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces; import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPool; +import org.opendaylight.controller.networkconfig.neutron.NeutronLoadBalancerPoolMember; import org.opendaylight.controller.northbound.commons.RestMessages; import org.opendaylight.controller.northbound.commons.exception.BadRequestException; import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; @@ -22,6 +26,7 @@ import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailab import org.opendaylight.controller.sal.utils.ServiceHelper; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; @@ -31,6 +36,7 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; + import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -53,6 +59,13 @@ import java.util.List; * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration * */ + +/** + * For now, the LB pool member data is maintained with the INeutronLoadBalancerPoolCRUD, + * although there may be an overlap with INeutronLoadBalancerPoolMemberCRUD's cache. + * TODO: Consolidate and maintain a single copy + */ + @Path("/pools") public class NeutronLoadBalancerPoolNorthbound { @@ -83,7 +96,7 @@ public class NeutronLoadBalancerPoolNorthbound { @QueryParam("healthmonitor_id") String queryLoadBalancerPoolHealthMonitorID, @QueryParam("admin_state_up") String queryLoadBalancerIsAdminStateUp, @QueryParam("status") String queryLoadBalancerPoolStatus, - @QueryParam("members") List queryLoadBalancerPoolMembers, + @QueryParam("members") List queryLoadBalancerPoolMembers, // pagination @QueryParam("limit") String limit, @QueryParam("marker") String marker, @@ -217,7 +230,7 @@ public class NeutronLoadBalancerPoolNorthbound { NeutronLoadBalancerPool test = i.next(); /* - * Verify that the firewall doesn't already exist + * Verify that the loadBalancerPool doesn't already exist */ if (loadBalancerPoolInterface.neutronLoadBalancerPoolExists(test.getLoadBalancerPoolID())) { @@ -328,4 +341,73 @@ public class NeutronLoadBalancerPoolNorthbound { } return Response.status(200).entity(new NeutronLoadBalancerPoolRequest(loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolID))).build(); } + + /** + * Deletes a LoadBalancerPool + */ + + @Path("{loadBalancerPoolUUID}") + @DELETE + @StatusCodes({ + @ResponseCode(code = 204, condition = "No Content"), + @ResponseCode(code = 401, condition = "Unauthorized"), + @ResponseCode(code = 404, condition = "Not Found"), + @ResponseCode(code = 409, condition = "Conflict"), + @ResponseCode(code = 501, condition = "Not Implemented") }) + public Response deleteLoadBalancerPool( + @PathParam("loadBalancerPoolUUID") String loadBalancerPoolUUID) { + INeutronLoadBalancerPoolCRUD loadBalancerPoolInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolCRUD(this); + if (loadBalancerPoolInterface == null) { + throw new ServiceUnavailableException("LoadBalancerPool CRUD Interface " + + RestMessages.SERVICEUNAVAILABLE.toString()); + } + + /* + * verify the LoadBalancerPool exists and it isn't currently in use + */ + if (!loadBalancerPoolInterface.neutronLoadBalancerPoolExists(loadBalancerPoolUUID)) { + throw new ResourceNotFoundException("LoadBalancerPool UUID does not exist."); + } + if (loadBalancerPoolInterface.neutronLoadBalancerPoolInUse(loadBalancerPoolUUID)) { + return Response.status(409).build(); + } + NeutronLoadBalancerPool singleton = loadBalancerPoolInterface.getNeutronLoadBalancerPool(loadBalancerPoolUUID); + Object[] instances = ServiceHelper.getGlobalInstances(INeutronLoadBalancerPoolAware.class, this, null); + if (instances != null) { + for (Object instance : instances) { + INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance; + int status = service.canDeleteNeutronLoadBalancerPool(singleton); + if (status < 200 || status > 299) { + return Response.status(status).build(); + } + } + } + + /* + * remove it and return 204 status + */ + loadBalancerPoolInterface.removeNeutronLoadBalancerPool(loadBalancerPoolUUID); + if (instances != null) { + for (Object instance : instances) { + INeutronLoadBalancerPoolAware service = (INeutronLoadBalancerPoolAware) instance; + service.neutronLoadBalancerPoolDeleted(singleton); + } + } + + /* + * remove corresponding members from the member cache too + */ + INeutronLoadBalancerPoolMemberCRUD loadBalancerPoolMemberInterface = NeutronCRUDInterfaces.getINeutronLoadBalancerPoolMemberCRUD(this); + if (loadBalancerPoolMemberInterface != null) { + List allLoadBalancerPoolMembers = new + ArrayList(loadBalancerPoolMemberInterface.getAllNeutronLoadBalancerPoolMembers()); + Iterator i = allLoadBalancerPoolMembers.iterator(); + while (i.hasNext()) { + NeutronLoadBalancerPoolMember member = i.next(); + if (member.getPoolID() == loadBalancerPoolUUID) + loadBalancerPoolMemberInterface.removeNeutronLoadBalancerPoolMember(member.getPoolMemberID()); + } + } + return Response.status(204).build(); + } }