From cf72aa32747a44ef876b9566d5c85db2f189b84e Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 29 Mar 2013 16:24:24 -0700 Subject: [PATCH] Fixes/improvements for VPC feature: 1) Added comments to VPC/VPCService/VPCManager interfaces 2) Moved VPC offering related methods from VpcService to the new interface - VpcProvisioningService 3) Fixed static nat creation in the VPC - used to result in NPE due to invalid method referencing while obtaining VPC VR information --- api/src/com/cloud/network/NetworkModel.java | 2 + api/src/com/cloud/network/vpc/Vpc.java | 43 ++++++- .../com/cloud/network/vpc/VpcOffering.java | 21 +++- .../network/vpc/VpcProvisioningService.java | 46 ++++++++ api/src/com/cloud/network/vpc/VpcService.java | 101 +++++++++++------ .../org/apache/cloudstack/api/BaseCmd.java | 2 + .../admin/vpc/CreateVPCOfferingCmd.java | 4 +- .../admin/vpc/DeleteVPCOfferingCmd.java | 2 +- .../admin/vpc/UpdateVPCOfferingCmd.java | 2 +- .../user/network/UpdateNetworkCmd.java | 9 +- .../command/user/vpc/ListVPCOfferingsCmd.java | 2 +- server/src/com/cloud/api/ApiDBUtils.java | 77 +++++++++++-- .../src/com/cloud/network/NetworkManager.java | 4 +- .../com/cloud/network/NetworkManagerImpl.java | 1 - .../com/cloud/network/NetworkModelImpl.java | 13 +++ .../com/cloud/network/NetworkServiceImpl.java | 7 ++ .../element/VpcVirtualRouterElement.java | 21 ++-- .../VpcVirtualNetworkApplianceManager.java | 6 + ...VpcVirtualNetworkApplianceManagerImpl.java | 15 ++- .../src/com/cloud/network/vpc/VpcManager.java | 84 ++++++++------ .../com/cloud/network/vpc/VpcManagerImpl.java | 77 +++---------- .../com/cloud/network/vpc/VpcOfferingVO.java | 1 - server/src/com/cloud/network/vpc/VpcVO.java | 7 -- .../cloud/network/MockNetworkModelImpl.java | 6 + .../com/cloud/vpc/MockNetworkModelImpl.java | 6 + .../com/cloud/vpc/MockVpcManagerImpl.java | 106 ++---------------- ...MockVpcVirtualNetworkApplianceManager.java | 6 + server/test/com/cloud/vpc/VpcApiUnitTest.java | 37 +----- 28 files changed, 398 insertions(+), 310 deletions(-) create mode 100644 api/src/com/cloud/network/vpc/VpcProvisioningService.java diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java index 916f28a00f2..c1f1674bad7 100644 --- a/api/src/com/cloud/network/NetworkModel.java +++ b/api/src/com/cloud/network/NetworkModel.java @@ -261,4 +261,6 @@ public interface NetworkModel { String getStartIpv6Address(long id); Nic getPlaceholderNic(Network network, Long podId); + + boolean isProviderEnabledInZone(long zoneId, String provider); } \ No newline at end of file diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java index c07077f7b7e..249e80f1aff 100644 --- a/api/src/com/cloud/network/vpc/Vpc.java +++ b/api/src/com/cloud/network/vpc/Vpc.java @@ -20,32 +20,63 @@ import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; -import com.cloud.network.Network; - public interface Vpc extends ControlledEntity, Identity, InternalIdentity { + public enum State { Enabled, Inactive } - public static final String _supportedProviders = Network.Provider.VPCVirtualRouter.getName(); - - boolean readyToUse(); - + /** + * + * @return VPC name + */ String getName(); + + /** + * @return the id of the zone the VPC belongs to + */ long getZoneId(); + + /** + * @return super CIDR of the VPC. All the networks participating in VPC, should have CIDRs that are the part of the super cidr + */ String getCidr(); + /** + * + * @return VPC state + */ State getState(); + + /** + * + * @return VPC offering id - the offering that VPC is created from + */ long getVpcOfferingId(); + + /** + * + * @return VPC display text + */ String getDisplayText(); + + /** + * + * @return VPC network domain. All networks participating in the VPC, become the part of the same network domain + */ String getNetworkDomain(); + + /** + * + * @return true if restart is required for the VPC; false otherwise + */ boolean isRestartRequired(); } diff --git a/api/src/com/cloud/network/vpc/VpcOffering.java b/api/src/com/cloud/network/vpc/VpcOffering.java index 1acfcd21418..3961d0aaba7 100644 --- a/api/src/com/cloud/network/vpc/VpcOffering.java +++ b/api/src/com/cloud/network/vpc/VpcOffering.java @@ -27,18 +27,33 @@ public interface VpcOffering extends InternalIdentity, Identity { public static final String defaultVPCOfferingName = "Default VPC offering"; + /** + * + * @return VPC offering name + */ String getName(); - String getUniqueName(); - + + /** + * @return VPC offering display text + */ String getDisplayText(); + + /** + * + * @return VPC offering state + */ State getState(); + /** + * + * @return true if offering is default - came with the cloudStack fresh install; false otherwise + */ boolean isDefault(); /** - * @return + * @return service offering id used by VPC virutal router */ Long getServiceOfferingId(); diff --git a/api/src/com/cloud/network/vpc/VpcProvisioningService.java b/api/src/com/cloud/network/vpc/VpcProvisioningService.java new file mode 100644 index 00000000000..70676ce07ab --- /dev/null +++ b/api/src/com/cloud/network/vpc/VpcProvisioningService.java @@ -0,0 +1,46 @@ +// 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. +package com.cloud.network.vpc; + +import java.util.List; +import java.util.Map; + +public interface VpcProvisioningService { + + public VpcOffering getVpcOffering(long vpcOfferingId); + + public VpcOffering createVpcOffering(String name, String displayText, List supportedServices, Map> serviceProviders); + + List listVpcOfferings(Long id, String name, String displayText, List supportedServicesStr, + Boolean isDefault, String keyword, String state, Long startIndex, Long pageSizeVal); + + /** + * @param offId + * @return + */ + public boolean deleteVpcOffering(long offId); + + /** + * @param vpcOffId + * @param vpcOfferingName + * @param displayText + * @param state + * @return + */ + public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state); + +} diff --git a/api/src/com/cloud/network/vpc/VpcService.java b/api/src/com/cloud/network/vpc/VpcService.java index 9bf1beea5f0..07ce89b0a3f 100644 --- a/api/src/com/cloud/network/vpc/VpcService.java +++ b/api/src/com/cloud/network/vpc/VpcService.java @@ -18,7 +18,6 @@ package com.cloud.network.vpc; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd; import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd; @@ -31,45 +30,29 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; import com.cloud.network.Network; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.user.Account; -import com.cloud.user.User; import com.cloud.utils.Pair; public interface VpcService { - public VpcOffering getVpcOffering(long vpcOfferingId); - - public VpcOffering createVpcOffering(String name, String displayText, List supportedServices, Map> serviceProviders); - + /**Returns existing VPC found by id + * + * @param vpcId + * @return + */ public Vpc getVpc(long vpcId); - public Vpc getActiveVpc(long vpcId); - + + /** + * Returns all the Guest networks that are part of VPC + * + * @param vpcId + * @return + */ public List getVpcNetworks(long vpcId); - Map> getVpcOffSvcProvidersMap(long vpcOffId); - - List listVpcOfferings(Long id, String name, String displayText, List supportedServicesStr, - Boolean isDefault, String keyword, String state, Long startIndex, Long pageSizeVal); - - /** - * @param offId - * @return - */ - public boolean deleteVpcOffering(long offId); - - /** - * @param vpcOffId - * @param vpcOfferingName - * @param displayText - * @param state - * @return - */ - public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state); - /** + * Persists VPC record in the database + * * @param zoneId * @param vpcOffId * @param vpcOwnerId @@ -83,7 +66,10 @@ public interface VpcService { public Vpc createVpc(long zoneId, long vpcOffId, long vpcOwnerId, String vpcName, String displayText, String cidr, String networkDomain) throws ResourceAllocationException; + /** + * Deletes a VPC + * * @param vpcId * @return * @throws InsufficientCapacityException @@ -92,7 +78,10 @@ public interface VpcService { */ public boolean deleteVpc(long vpcId) throws ConcurrentOperationException, ResourceUnavailableException; + /** + * Updates VPC with new name/displayText + * * @param vpcId * @param vpcName * @param displayText @@ -100,7 +89,10 @@ public interface VpcService { */ public Vpc updateVpc(long vpcId, String vpcName, String displayText); + /** + * Lists VPC(s) based on the parameters passed to the method call + * * @param id * @param vpcName * @param displayText @@ -127,6 +119,8 @@ public interface VpcService { Boolean restartRequired, Map tags, Long projectId); /** + * Starts VPC which includes starting VPC provider and applying all the neworking rules on the backend + * * @param vpcId * @param destroyOnFailure TODO * @return @@ -138,6 +132,8 @@ public interface VpcService { ResourceUnavailableException, InsufficientCapacityException; /** + * Shuts down the VPC which includes shutting down all VPC provider and rules cleanup on the backend + * * @param vpcId * @return * @throws ConcurrentOperationException @@ -145,16 +141,28 @@ public interface VpcService { */ boolean shutdownVpc(long vpcId) throws ConcurrentOperationException, ResourceUnavailableException; + /** + * Restarts the VPC. VPC gets shutdown and started as a part of it + * * @param id * @return * @throws InsufficientCapacityException */ boolean restartVpc(long id) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; + /** + * Returns a Private gateway found in the VPC by id + * + * @param id + * @return + */ PrivateGateway getVpcPrivateGateway(long id); + /** + * Persists VPC private gateway in the Database. + * * @param vpcId TODO * @param physicalNetworkId * @param vlan @@ -172,6 +180,8 @@ public interface VpcService { ConcurrentOperationException, InsufficientCapacityException; /** + * Applies VPC private gateway on the backend, so it becomes functional + * * @param gatewayId * @param destroyOnFailure TODO * @return @@ -180,7 +190,10 @@ public interface VpcService { */ public PrivateGateway applyVpcPrivateGateway(long gatewayId, boolean destroyOnFailure) throws ConcurrentOperationException, ResourceUnavailableException; + /** + * Deletes VPC private gateway + * * @param id * @return * @throws ResourceUnavailableException @@ -188,52 +201,76 @@ public interface VpcService { */ boolean deleteVpcPrivateGateway(long gatewayId) throws ConcurrentOperationException, ResourceUnavailableException; + /** + * Returns the list of Private gateways existing in the VPC + * * @param listPrivateGatewaysCmd * @return */ public Pair, Integer> listPrivateGateway(ListPrivateGatewaysCmd listPrivateGatewaysCmd); + /** + * Returns Static Route found by Id + * * @param routeId * @return */ StaticRoute getStaticRoute(long routeId); + /** + * Applies existing Static Routes to the VPC elements + * * @param vpcId * @return * @throws ResourceUnavailableException */ public boolean applyStaticRoutes(long vpcId) throws ResourceUnavailableException; + /** + * Deletes static route from the backend and the database + * * @param routeId * @return TODO * @throws ResourceUnavailableException */ public boolean revokeStaticRoute(long routeId) throws ResourceUnavailableException; + /** + * Persists static route entry in the Database + * * @param gatewayId * @param cidr * @return */ public StaticRoute createStaticRoute(long gatewayId, String cidr) throws NetworkRuleConflictException; + /** + * Lists static routes based on parameters passed to the call + * * @param listStaticRoutesCmd * @return */ public Pair, Integer> listStaticRoutes(ListStaticRoutesCmd cmd); + /** + * Returns gateway (VPN or Public) existign in the VPC + * * @param id * @return */ VpcGateway getVpcGateway(long id); + /** + * Associates IP address from the Public network, to the VPC + * * @param ipId * @param vpcId * @return @@ -245,6 +282,4 @@ public interface VpcService { IpAddress associateIPToVpc(long ipId, long vpcId) throws ResourceAllocationException, ResourceUnavailableException, InsufficientAddressCapacityException, ConcurrentOperationException; - public Network updateVpcGuestNetwork(long networkId, String name, String displayText, Account callerAccount, - User callerUser, String domainSuffix, Long ntwkOffId, Boolean changeCidr, String guestVmCidr); } diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index 7ccb72e8fb9..78a2af36aa2 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -52,6 +52,7 @@ import com.cloud.network.firewall.NetworkACLService; import com.cloud.network.lb.LoadBalancingRulesService; import com.cloud.network.rules.RulesService; import com.cloud.network.security.SecurityGroupService; +import com.cloud.network.vpc.VpcProvisioningService; import com.cloud.network.vpc.VpcService; import com.cloud.network.vpn.RemoteAccessVpnService; import com.cloud.network.vpn.Site2SiteVpnService; @@ -132,6 +133,7 @@ public abstract class BaseCmd { @Inject public NetworkUsageService _networkUsageService; @Inject public VMSnapshotService _vmSnapshotService; @Inject public DataStoreProviderApiService dataStoreProviderApiService; + @Inject public VpcProvisioningService _vpcProvSvc; public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java index 3c7956b7d7e..4a3a92a211c 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/CreateVPCOfferingCmd.java @@ -98,7 +98,7 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd{ @Override public void create() throws ResourceAllocationException { - VpcOffering vpcOff = _vpcService.createVpcOffering(getVpcOfferingName(), getDisplayText(), getSupportedServices(), getServiceProviders()); + VpcOffering vpcOff = _vpcProvSvc.createVpcOffering(getVpcOfferingName(), getDisplayText(), getSupportedServices(), getServiceProviders()); if (vpcOff != null) { this.setEntityId(vpcOff.getId()); this.setEntityUuid(vpcOff.getUuid()); @@ -109,7 +109,7 @@ public class CreateVPCOfferingCmd extends BaseAsyncCreateCmd{ @Override public void execute() { - VpcOffering vpc = _vpcService.getVpcOffering(this.getEntityId()); + VpcOffering vpc = _vpcProvSvc.getVpcOffering(this.getEntityId()); if (vpc != null) { VpcOfferingResponse response = _responseGenerator.createVpcOfferingResponse(vpc); response.setResponseName(getCommandName()); diff --git a/api/src/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java index 9e2968e66fe..4b16fa5fcb9 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/DeleteVPCOfferingCmd.java @@ -66,7 +66,7 @@ public class DeleteVPCOfferingCmd extends BaseAsyncCmd{ @Override public void execute(){ - boolean result = _vpcService.deleteVpcOffering(getId()); + boolean result = _vpcProvSvc.deleteVpcOffering(getId()); if (result) { SuccessResponse response = new SuccessResponse(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java index de61ee74b31..9bbae064376 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java @@ -88,7 +88,7 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd{ @Override public void execute(){ - VpcOffering result = _vpcService.updateVpcOffering(getId(), getVpcOfferingName(), getDisplayText(), getState()); + VpcOffering result = _vpcProvSvc.updateVpcOffering(getId(), getVpcOfferingName(), getDisplayText(), getState()); if (result != null) { VpcOfferingResponse response = _responseGenerator.createVpcOfferingResponse(result); response.setResponseName(getCommandName()); diff --git a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java index 41aaaaada12..a61474e69d0 100644 --- a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java @@ -129,14 +129,9 @@ public class UpdateNetworkCmd extends BaseAsyncCmd { throw new InvalidParameterValueException("Couldn't find network by id"); } - Network result = null; - if (network.getVpcId() != null) { - result = _vpcService.updateVpcGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount, + Network result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount, callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr(), getGuestVmCidr()); - } else { - result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount, - callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr(), getGuestVmCidr()); - } + if (result != null) { NetworkResponse response = _responseGenerator.createNetworkResponse(result); diff --git a/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCOfferingsCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCOfferingsCmd.java index 9aef26f016c..ddae7998784 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCOfferingsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpc/ListVPCOfferingsCmd.java @@ -92,7 +92,7 @@ public class ListVPCOfferingsCmd extends BaseListCmd{ @Override public void execute(){ - List offerings = _vpcService.listVpcOfferings(getId(), getVpcOffName(), getDisplayText(), + List offerings = _vpcProvSvc.listVpcOfferings(getId(), getVpcOffName(), getDisplayText(), getSupportedServices(), isDefault, this.getKeyword(), getState(), this.getStartIndex(), this.getPageSizeVal()); ListResponse response = new ListResponse(); List offeringResponses = new ArrayList(); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 8e6f8062463..7b441901d5e 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -95,8 +95,20 @@ import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationService; import com.cloud.configuration.Resource.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.*; -import com.cloud.dc.dao.*; +import com.cloud.dc.AccountVlanMapVO; +import com.cloud.dc.ClusterDetailsDao; +import com.cloud.dc.ClusterDetailsVO; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Vlan; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.AccountVlanMapDao; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; import com.cloud.event.Event; @@ -162,7 +174,12 @@ import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityGroupManager; import com.cloud.network.security.SecurityGroupVO; import com.cloud.network.security.dao.SecurityGroupDao; -import com.cloud.network.vpc.*; +import com.cloud.network.vpc.StaticRouteVO; +import com.cloud.network.vpc.VpcGatewayVO; +import com.cloud.network.vpc.VpcManager; +import com.cloud.network.vpc.VpcOffering; +import com.cloud.network.vpc.VpcProvisioningService; +import com.cloud.network.vpc.VpcVO; import com.cloud.network.vpc.dao.StaticRouteDao; import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcGatewayDao; @@ -177,19 +194,57 @@ import com.cloud.projects.ProjectAccount; import com.cloud.projects.ProjectInvitation; import com.cloud.projects.ProjectService; import com.cloud.resource.ResourceManager; -import com.cloud.server.*; +import com.cloud.server.Criteria; +import com.cloud.server.ManagementServer; +import com.cloud.server.ResourceTag; import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.server.StatsCollector; +import com.cloud.server.TaggedResourceService; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.*; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.GuestOS; +import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.storage.Snapshot; +import com.cloud.storage.SnapshotVO; import com.cloud.storage.Storage.ImageFormat; - +import com.cloud.storage.StorageManager; +import com.cloud.storage.StoragePool; +import com.cloud.storage.StorageStats; +import com.cloud.storage.UploadVO; +import com.cloud.storage.VMTemplateHostVO; +import com.cloud.storage.VMTemplateS3VO; +import com.cloud.storage.VMTemplateSwiftVO; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; import com.cloud.storage.Volume.Type; -import com.cloud.storage.dao.*; +import com.cloud.storage.VolumeHostVO; +import com.cloud.storage.VolumeManager; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.GuestOSCategoryDao; +import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.SnapshotPolicyDao; +import com.cloud.storage.dao.UploadDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateDetailsDao; +import com.cloud.storage.dao.VMTemplateHostDao; +import com.cloud.storage.dao.VMTemplateS3Dao; +import com.cloud.storage.dao.VMTemplateSwiftDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeHostDao; import com.cloud.storage.snapshot.SnapshotPolicy; import com.cloud.template.TemplateManager; -import com.cloud.user.*; - +import com.cloud.user.Account; +import com.cloud.user.AccountDetailsDao; +import com.cloud.user.AccountVO; +import com.cloud.user.ResourceLimitService; +import com.cloud.user.SSHKeyPairVO; +import com.cloud.user.User; +import com.cloud.user.UserAccount; +import com.cloud.user.UserStatisticsVO; +import com.cloud.user.UserVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.UserDao; @@ -202,7 +257,6 @@ import com.cloud.vm.DomainRouterVO; import com.cloud.vm.InstanceGroup; import com.cloud.vm.InstanceGroupVO; import com.cloud.vm.NicProfile; -import com.cloud.vm.NicSecondaryIp; import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmVO; @@ -324,6 +378,7 @@ public class ApiDBUtils { static VMSnapshotDao _vmSnapshotDao; static ClusterDetailsDao _clusterDetailsDao; static NicSecondaryIpDao _nicSecondaryIpDao; + static VpcProvisioningService _vpcProvSvc; @Inject private ManagementServer ms; @Inject public AsyncJobManager asyncMgr; @@ -427,6 +482,7 @@ public class ApiDBUtils { @Inject private ClusterDetailsDao clusterDetailsDao; @Inject private VMSnapshotDao vmSnapshotDao; @Inject private NicSecondaryIpDao nicSecondaryIpDao; + @Inject private VpcProvisioningService vpcProvSvc; @PostConstruct void init() { _ms = ms; @@ -528,6 +584,7 @@ public class ApiDBUtils { _clusterDetailsDao = clusterDetailsDao; _vmSnapshotDao = vmSnapshotDao; _nicSecondaryIpDao = nicSecondaryIpDao; + _vpcProvSvc = vpcProvSvc; // Note: stats collector should already have been initialized by this time, otherwise a null instance is returned _statsCollector = StatsCollector.getInstance(); } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index e961f049d73..851f7f54549 100755 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -20,8 +20,8 @@ import java.util.List; import java.util.Map; import org.apache.cloudstack.acl.ControlledEntity.ACLType; + import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenterVO; import com.cloud.dc.Pod; import com.cloud.dc.Vlan.VlanType; import com.cloud.deploy.DataCenterDeployment; @@ -51,13 +51,11 @@ import com.cloud.user.User; import com.cloud.utils.Pair; import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; -import com.cloud.vm.NicSecondaryIp; import com.cloud.vm.NicVO; import com.cloud.vm.ReservationContext; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.VirtualMachineProfileImpl; /** * NetworkManager manages the network for the different end users. diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 42544ae1240..c0685ba2033 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1528,7 +1528,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L // associate a source NAT IP (if one isn't already associated with the network) boolean sharedSourceNat = offering.getSharedSourceNat(); - DataCenter zone = _dcDao.findById(network.getDataCenterId()); if (network.getGuestType() == Network.GuestType.Isolated && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.SourceNat) && !sharedSourceNat) { diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index e7bdbca27c8..d967f3346bf 100644 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -1212,6 +1212,19 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { } return isProviderEnabled(ntwkSvcProvider); } + + @Override + public boolean isProviderEnabledInZone(long zoneId, String provider) + { + //the provider has to be enabled at least in one network in the zone + for (PhysicalNetwork pNtwk : _physicalNetworkDao.listByZone(zoneId)) { + if (isProviderEnabledInPhysicalNetwork(pNtwk.getId(), provider)) { + return true; + } + } + + return false; + } @Override public String getNetworkTag(HypervisorType hType, Network network) { diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 846d79e93cf..d5034597f4f 100755 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -94,6 +94,7 @@ import com.cloud.network.rules.FirewallRuleVO; import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.RulesManager; import com.cloud.network.vpc.PrivateIpVO; +import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcManager; import com.cloud.network.vpc.dao.PrivateIpDao; import com.cloud.offering.NetworkOffering; @@ -1715,6 +1716,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { ex.addProxyObject("networks", networkId, "networkId"); throw ex; } + + //perform below validation if the network is vpc network + if (network.getVpcId() != null && networkOfferingId != null) { + Vpc vpc = _vpcMgr.getVpc(network.getVpcId()); + _vpcMgr.validateNtwkOffForNtwkInVpc(networkId, networkOfferingId, null, null, vpc, null, _accountMgr.getAccount(network.getAccountId())); + } // don't allow to update network in Destroy state if (network.getState() == Network.State.Destroy) { diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java index c7d4aeda344..08443698ea0 100644 --- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java @@ -37,6 +37,7 @@ import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; +import com.cloud.network.NetworkModel; import com.cloud.network.PublicIpAddress; import com.cloud.network.Site2SiteVpnConnection; import com.cloud.network.Site2SiteVpnGateway; @@ -76,6 +77,8 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc Site2SiteVpnGatewayDao _vpnGatewayDao; @Inject IPAddressDao _ipAddressDao; + @Inject + NetworkModel _ntwkModel; private static final Map> capabilities = setCapabilities(); @@ -322,7 +325,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc return false; } - List routers = _vpcMgr.getVpcRouters(gateway.getVpcId()); + List routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId()); if (routers == null || routers.isEmpty()) { s_logger.debug(this.getName() + " element doesn't need to create Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" + gateway.getVpcId()); @@ -345,7 +348,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc return false; } - List routers = _vpcMgr.getVpcRouters(gateway.getVpcId()); + List routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId()); if (routers == null || routers.isEmpty()) { s_logger.debug(this.getName() + " element doesn't need to delete Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" + gateway.getVpcId()); @@ -361,10 +364,6 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc return _vpcRouterMgr.destroyPrivateGateway(gateway, router); } - @Override - protected List getRouters(Network network, DeployDestination dest) { - return _vpcMgr.getVpcRouters(network.getVpcId()); - } @Override public boolean applyIps(Network network, List ipAddress, Set services) @@ -377,7 +376,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc } } if (canHandle) { - List routers = getRouters(network, null); + List routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER); if (routers == null || routers.isEmpty()) { s_logger.debug(this.getName() + " element doesn't need to associate ip addresses on the backend; VPC virtual " + "router doesn't exist in the network " + network.getId()); @@ -446,12 +445,12 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc Long vpcId = ip.getVpcId(); Vpc vpc = _vpcMgr.getVpc(vpcId); - if (!_vpcMgr.vpcProviderEnabledInZone(vpc.getZoneId(), Provider.VPCVirtualRouter.getName())) { + if (!_ntwkModel.isProviderEnabledInZone(vpc.getZoneId(), Provider.VPCVirtualRouter.getName())) { throw new ResourceUnavailableException("VPC provider is not enabled in zone " + vpc.getZoneId(), DataCenter.class, vpc.getZoneId()); } - List routers = _vpcMgr.getVpcRouters(ip.getVpcId()); + List routers = _vpcRouterMgr.getVpcRouters(ip.getVpcId()); if (routers == null || routers.size() != 1) { throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(), DataCenter.class, vpc.getZoneId()); @@ -474,12 +473,12 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc Long vpcId = ip.getVpcId(); Vpc vpc = _vpcMgr.getVpc(vpcId); - if (!_vpcMgr.vpcProviderEnabledInZone(vpc.getZoneId(), Provider.VPCVirtualRouter.getName())) { + if (!_ntwkModel.isProviderEnabledInZone(vpc.getZoneId(), Provider.VPCVirtualRouter.getName())) { throw new ResourceUnavailableException("VPC provider is not enabled in zone " + vpc.getZoneId(), DataCenter.class, vpc.getZoneId()); } - List routers = _vpcMgr.getVpcRouters(ip.getVpcId()); + List routers = _vpcRouterMgr.getVpcRouters(ip.getVpcId()); if (routers == null || routers.size() != 1) { throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(), DataCenter.class, vpc.getZoneId()); diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java index 297ae9b1f13..76c8aa89173 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java @@ -101,4 +101,10 @@ public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplian * @throws ResourceUnavailableException */ boolean stopSite2SiteVpn(Site2SiteVpnConnection conn, VirtualRouter router) throws ResourceUnavailableException; + + /** + * @param vpcId + * @return + */ + List getVpcRouters(long vpcId); } diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 22d823fb364..bdfac060798 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -234,7 +234,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian long dcId = dest.getDataCenter().getId(); DeploymentPlan plan = new DataCenterDeployment(dcId); - List routers = _routerDao.listByVpcId(vpcId); + List routers = getVpcRouters(vpcId); return new Pair>(plan, routers); } @@ -1212,7 +1212,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian networks = super.createRouterNetworks(owner, isRedundant, plan, null, sourceNatIp); //2) allocate nic for private gateway if needed - VpcGateway privateGateway = _vpcMgr.getPrivateGatewayForVpc(vpcId); + PrivateGateway privateGateway = _vpcMgr.getVpcPrivateGateway(vpcId); if (privateGateway != null) { NicProfile privateNic = createPrivateNicProfileForGateway(privateGateway); Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId()); @@ -1233,7 +1233,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian for (IPAddressVO ip : ips) { PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, _vlanDao.findById(ip.getVlanId())); if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) - && _vpcMgr.ipUsedInVpc(ip)&& !publicVlans.contains(publicIp.getVlanTag())) { + && _vpcMgr.isIpAllocatedToVpc(ip)&& !publicVlans.contains(publicIp.getVlanTag())) { s_logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag()); NicProfile publicNic = new NicProfile(); publicNic.setDefaultNic(false); @@ -1314,7 +1314,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian long publicNtwkId = ip.getNetworkId(); //if ip is not associated to any network, and there are no firewall rules, release it on the backend - if (!_vpcMgr.ipUsedInVpc(ip)) { + if (!_vpcMgr.isIpAllocatedToVpc(ip)) { ip.setState(IpAddress.State.Releasing); } @@ -1334,7 +1334,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian long publicNtwkId = ip.getNetworkId(); //if ip is not associated to any network, and there are no firewall rules, release it on the backend - if (!_vpcMgr.ipUsedInVpc(ip)) { + if (!_vpcMgr.isIpAllocatedToVpc(ip)) { ip.setState(IpAddress.State.Releasing); } @@ -1376,4 +1376,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } + @Override + public List getVpcRouters(long vpcId) { + return _routerDao.listByVpcId(vpcId); + } + } diff --git a/server/src/com/cloud/network/vpc/VpcManager.java b/server/src/com/cloud/network/vpc/VpcManager.java index 714330dd5aa..84ab8ef5dd7 100644 --- a/server/src/com/cloud/network/vpc/VpcManager.java +++ b/server/src/com/cloud/network/vpc/VpcManager.java @@ -17,8 +17,11 @@ package com.cloud.network.vpc; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.cloudstack.acl.ControlledEntity.ACLType; + import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; @@ -27,33 +30,27 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.IpAddress; import com.cloud.network.Network; +import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.PhysicalNetwork; import com.cloud.network.addr.PublicIp; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; -import com.cloud.vm.DomainRouterVO; public interface VpcManager extends VpcService{ /** - * @param ntwkOffId - * @param cidr - * @param networkDomain - * @param networkOwner - * @param vpc TODO - * @param networkId TODO - * @param gateway TODO + * Returns all existing VPCs for a given account + * @param accountId * @return */ - void validateNtkwOffForVpc(long ntwkOffId, String cidr, String networkDomain, Account networkOwner, - Vpc vpc, Long networkId, String gateway); - - List getVpcsForAccount(long accountId); + /** + * Destroys the VPC + * * @param vpc * @param caller TODO * @param callerUserId TODO @@ -63,34 +60,19 @@ public interface VpcManager extends VpcService{ */ boolean destroyVpc(Vpc vpc, Account caller, Long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException; - /** - * @param vpcId - * @return - */ - List getVpcRouters(long vpcId); - - /** - * @param zoneId - * @param provider - * @return - */ - boolean vpcProviderEnabledInZone(long zoneId, String provider); - - /** - * @param vpcId - * @return - */ - VpcGateway getPrivateGatewayForVpc(long vpcId); - /** + * Returns true if the IP is allocated to the VPC; false otherwise + * * @param ip * @return */ - boolean ipUsedInVpc(IpAddress ip); + boolean isIpAllocatedToVpc(IpAddress ip); /** + * Disassociates the public IP address from VPC + * * @param ipId * @param networkId */ @@ -98,6 +80,8 @@ public interface VpcManager extends VpcService{ /** + * Creates guest network in the VPC + * * @param ntwkOffId * @param name * @param displayText @@ -125,9 +109,11 @@ public interface VpcManager extends VpcService{ /** + * Assigns source nat public IP address to VPC + * * @param owner * @param vpc - * @return + * @return public IP address object * @throws InsufficientAddressCapacityException * @throws ConcurrentOperationException */ @@ -135,6 +121,8 @@ public interface VpcManager extends VpcService{ /** + * Validates network offering to find if it can be used for network creation in VPC + * * @param guestNtwkOff * @param supportedSvcs TODO */ @@ -142,8 +130,36 @@ public interface VpcManager extends VpcService{ /** - * @return + * @return list of hypervisors that are supported by VPC */ List getSupportedVpcHypervisors(); + + + /** + * Lists all the services and providers that the current VPC suppots + * @param vpcOffId + * @return map of Service to Provider(s) map + */ + Map> getVpcOffSvcProvidersMap(long vpcOffId); + + + /** + * Returns VPC that is ready to be used + * @param vpcId + * @return VPC object + */ + public Vpc getActiveVpc(long vpcId); + + /** + * Performs network offering validation to determine if it can be used for network upgrade inside the VPC + * @param networkId + * @param newNtwkOffId + * @param newCidr + * @param newNetworkDomain + * @param vpc + * @param gateway + * @param networkOwner TODO + */ + void validateNtwkOffForNtwkInVpc(Long networkId, long newNtwkOffId, String newCidr, String newNetworkDomain, Vpc vpc, String gateway, Account networkOwner); } diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java index fee4ef310f7..3948f2ecf73 100644 --- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java @@ -31,13 +31,12 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.network.element.StaticNatServiceProvider; +import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd; import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import org.apache.cloudstack.acl.ControlledEntity.ACLType; -import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.Resource.ResourceType; @@ -77,6 +76,7 @@ import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.Site2SiteVpnGatewayDao; +import com.cloud.network.element.StaticNatServiceProvider; import com.cloud.network.element.VpcProvider; import com.cloud.network.vpc.VpcOffering.State; import com.cloud.network.vpc.dao.PrivateIpDao; @@ -103,8 +103,6 @@ import com.cloud.user.UserContext; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; - -import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; @@ -124,8 +122,8 @@ import com.cloud.vm.dao.DomainRouterDao; @Component -@Local(value = { VpcManager.class, VpcService.class }) -public class VpcManagerImpl extends ManagerBase implements VpcManager{ +@Local(value = { VpcManager.class, VpcService.class, VpcProvisioningService.class }) +public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvisioningService{ private static final Logger s_logger = Logger.getLogger(VpcManagerImpl.class); @Inject VpcOfferingDao _vpcOffDao; @@ -584,19 +582,6 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ return createVpc(zoneId, vpcOffId, owner, vpcName, displayText, cidr, networkDomain); } - - @Override - public boolean vpcProviderEnabledInZone(long zoneId, String provider) - { - //the provider has to be enabled at least in one network in the zone - for (PhysicalNetwork pNtwk : _pNtwkDao.listByZone(zoneId)) { - if (_ntwkModel.isProviderEnabledInPhysicalNetwork(pNtwk.getId(), provider)) { - return true; - } - } - - return false; - } @DB @@ -656,7 +641,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ } - if (!vpcProviderEnabledInZone(zoneId, provider)) { + if (!_ntwkModel.isProviderEnabledInZone(zoneId, provider)) { throw new InvalidParameterValueException("Provider " + provider + " should be enabled in at least one physical network of the zone specified"); } @@ -1015,20 +1000,20 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ return success; } - @Override @DB - public void validateNtkwOffForVpc(long ntwkOffId, String cidr, String networkDomain, - Account networkOwner, Vpc vpc, Long networkId, String gateway) { + @Override + public void validateNtwkOffForNtwkInVpc(Long networkId, long newNtwkOffId, String newCidr, + String newNetworkDomain, Vpc vpc, String gateway, Account networkOwner) { - NetworkOffering guestNtwkOff = _configMgr.getNetworkOffering(ntwkOffId); + NetworkOffering guestNtwkOff = _configMgr.getNetworkOffering(newNtwkOffId); if (guestNtwkOff == null) { throw new InvalidParameterValueException("Can't find network offering by id specified"); } - + if (networkId == null) { //1) Validate attributes that has to be passed in when create new guest network - validateNewVpcGuestNetwork(cidr, gateway, networkOwner, vpc, networkDomain); + validateNewVpcGuestNetwork(newCidr, gateway, networkOwner, vpc, newNetworkDomain); } //2) validate network offering attributes @@ -1213,7 +1198,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ } //4) Delete private gateway - VpcGateway gateway = getPrivateGatewayForVpc(vpcId); + PrivateGateway gateway = getVpcPrivateGateway(vpcId); if (gateway != null) { s_logger.debug("Deleting private gateway " + gateway + " as a part of vpc " + vpcId + " resources cleanup"); if (!deleteVpcPrivateGateway(gateway.getId())) { @@ -1270,11 +1255,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ } } - @Override - public List getVpcRouters(long vpcId) { - return _routerDao.listByVpcId(vpcId); - } - + @Override public PrivateGateway getVpcPrivateGateway(long id) { VpcGateway gateway = _vpcGatewayDao.findById(id); @@ -1835,11 +1816,6 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ } } } - - @Override - public VpcGateway getPrivateGatewayForVpc(long vpcId) { - return _vpcGatewayDao.getPrivateGatewayForVpc(vpcId); - } @DB @@ -1895,7 +1871,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ @Override public void unassignIPFromVpcNetwork(long ipId, long networkId) { IPAddressVO ip = _ipAddressDao.findById(ipId); - if (ipUsedInVpc(ip)) { + if (isIpAllocatedToVpc(ip)) { return; } @@ -1927,7 +1903,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ } @Override - public boolean ipUsedInVpc(IpAddress ip) { + public boolean isIpAllocatedToVpc(IpAddress ip) { return (ip != null && ip.getVpcId() != null && (ip.isOneToOneNat() || !_firewallDao.listByIp(ip.getId()).isEmpty())); } @@ -1957,7 +1933,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ } //1) Validate if network can be created for VPC - validateNtkwOffForVpc(ntwkOffId, cidr, networkDomain, owner, vpc, null, gateway); + validateNtwkOffForNtwkInVpc(null, ntwkOffId, cidr, networkDomain, vpc, gateway, owner); //2) Create network Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId, @@ -2020,24 +1996,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager{ return ipToReturn; } - - - @Override - public Network updateVpcGuestNetwork(long networkId, String name, String displayText, Account callerAccount, - User callerUser, String domainSuffix, Long ntwkOffId, Boolean changeCidr, String guestVmCidr) { - NetworkVO network = _ntwkDao.findById(networkId); - if (network == null) { - throw new InvalidParameterValueException("Couldn't find network by id"); - } - //perform below validation if the network is vpc network - if (network.getVpcId() != null && ntwkOffId != null) { - Vpc vpc = getVpc(network.getVpcId()); - validateNtkwOffForVpc(ntwkOffId, null, null, null, vpc, networkId, null); - } - - return _ntwkSvc.updateGuestNetwork(networkId, name, displayText, callerAccount, callerUser, domainSuffix, - ntwkOffId, changeCidr, guestVmCidr); - } + @Override public List getSupportedVpcHypervisors() { diff --git a/server/src/com/cloud/network/vpc/VpcOfferingVO.java b/server/src/com/cloud/network/vpc/VpcOfferingVO.java index dce7a81e4d0..9d5becf2333 100644 --- a/server/src/com/cloud/network/vpc/VpcOfferingVO.java +++ b/server/src/com/cloud/network/vpc/VpcOfferingVO.java @@ -102,7 +102,6 @@ public class VpcOfferingVO implements VpcOffering { return name; } - @Override public String getUniqueName() { return uniqueName; } diff --git a/server/src/com/cloud/network/vpc/VpcVO.java b/server/src/com/cloud/network/vpc/VpcVO.java index 634df052850..7b784eb6458 100644 --- a/server/src/com/cloud/network/vpc/VpcVO.java +++ b/server/src/com/cloud/network/vpc/VpcVO.java @@ -26,9 +26,7 @@ import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; -import org.apache.cloudstack.api.Identity; import com.cloud.utils.db.GenericDao; -import org.apache.cloudstack.api.InternalIdentity; @Entity @Table(name="vpc") @@ -94,11 +92,6 @@ public class VpcVO implements Vpc { this.networkDomain = networkDomain; this.vpcOfferingId = vpcOffId; } - - @Override - public boolean readyToUse() { - return state == State.Enabled; - } @Override public long getId() { diff --git a/server/test/com/cloud/network/MockNetworkModelImpl.java b/server/test/com/cloud/network/MockNetworkModelImpl.java index b926519d45b..c5789659008 100644 --- a/server/test/com/cloud/network/MockNetworkModelImpl.java +++ b/server/test/com/cloud/network/MockNetworkModelImpl.java @@ -844,4 +844,10 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { // TODO Auto-generated method stub return null; } + + @Override + public boolean isProviderEnabledInZone(long zoneId, String provider) { + // TODO Auto-generated method stub + return false; + } } diff --git a/server/test/com/cloud/vpc/MockNetworkModelImpl.java b/server/test/com/cloud/vpc/MockNetworkModelImpl.java index b05e8eaba6c..e1534cbf62a 100644 --- a/server/test/com/cloud/vpc/MockNetworkModelImpl.java +++ b/server/test/com/cloud/vpc/MockNetworkModelImpl.java @@ -857,4 +857,10 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel { return null; } + @Override + public boolean isProviderEnabledInZone(long zoneId, String provider) { + // TODO Auto-generated method stub + return false; + } + } diff --git a/server/test/com/cloud/vpc/MockVpcManagerImpl.java b/server/test/com/cloud/vpc/MockVpcManagerImpl.java index e6c65200ded..0f269284127 100644 --- a/server/test/com/cloud/vpc/MockVpcManagerImpl.java +++ b/server/test/com/cloud/vpc/MockVpcManagerImpl.java @@ -47,15 +47,11 @@ import com.cloud.network.vpc.StaticRoute; import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.VpcGateway; import com.cloud.network.vpc.VpcManager; -import com.cloud.network.vpc.VpcOffering; import com.cloud.network.vpc.VpcService; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; -import com.cloud.user.User; import com.cloud.utils.Pair; -import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; -import com.cloud.vm.DomainRouterVO; import com.cloud.vpc.dao.MockVpcDaoImpl; @Component @@ -63,19 +59,6 @@ import com.cloud.vpc.dao.MockVpcDaoImpl; public class MockVpcManagerImpl extends ManagerBase implements VpcManager { @Inject MockVpcDaoImpl _vpcDao; - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcService#getVpcOffering(long) - */ - @Override - public VpcOffering getVpcOffering(long vpcOfferingId) { - // TODO Auto-generated method stub - return null; - } - - @Override - public VpcOffering createVpcOffering(String name, String displayText, List supportedServices, Map> serviceProviders) { - return null; - } /* (non-Javadoc) * @see com.cloud.network.vpc.VpcService#getVpc(long) @@ -104,42 +87,6 @@ public class MockVpcManagerImpl extends ManagerBase implements VpcManager { return null; } - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcService#getVpcOffSvcProvidersMap(long) - */ - @Override - public Map> getVpcOffSvcProvidersMap(long vpcOffId) { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcService#listVpcOfferings(java.lang.Long, java.lang.String, java.lang.String, java.util.List, java.lang.Boolean, java.lang.String, java.lang.String, java.lang.Long, java.lang.Long) - */ - @Override - public List listVpcOfferings(Long id, String name, String displayText, List supportedServicesStr, Boolean isDefault, String keyword, String state, Long startIndex, Long pageSizeVal) { - // TODO Auto-generated method stub - return null; - } - - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcService#deleteVpcOffering(long) - */ - @Override - public boolean deleteVpcOffering(long offId) { - // TODO Auto-generated method stub - return false; - } - - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcService#updateVpcOffering(long, java.lang.String, java.lang.String, java.lang.String) - */ - @Override - public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state) { - // TODO Auto-generated method stub - return null; - } - /* (non-Javadoc) * @see com.cloud.network.vpc.VpcService#createVpc(long, long, long, java.lang.String, java.lang.String, java.lang.String, java.lang.String) */ @@ -313,19 +260,6 @@ public class MockVpcManagerImpl extends ManagerBase implements VpcManager { return null; } - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcService#updateVpcGuestNetwork(long, java.lang.String, java.lang.String, com.cloud.user.Account, com.cloud.user.User, java.lang.String, java.lang.Long, java.lang.Boolean) - */ - - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcManager#validateNtkwOffForVpc(long, java.lang.String, java.lang.String, com.cloud.user.Account, com.cloud.network.vpc.Vpc, java.lang.Long, java.lang.String) - */ - @Override - public void validateNtkwOffForVpc(long ntwkOffId, String cidr, String networkDomain, Account networkOwner, Vpc vpc, Long networkId, String gateway) { - // TODO Auto-generated method stub - - } - /* (non-Javadoc) * @see com.cloud.network.vpc.VpcManager#getVpcsForAccount(long) */ @@ -344,34 +278,13 @@ public class MockVpcManagerImpl extends ManagerBase implements VpcManager { return false; } - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcManager#getVpcRouters(long) - */ - @Override - public List getVpcRouters(long vpcId) { - // TODO Auto-generated method stub - return null; - } - @Override - public boolean vpcProviderEnabledInZone(long zoneId, String provider) { - return false; - } - - /* (non-Javadoc) - * @see com.cloud.network.vpc.VpcManager#getPrivateGatewayForVpc(long) - */ - @Override - public VpcGateway getPrivateGatewayForVpc(long vpcId) { - // TODO Auto-generated method stub - return null; - } /* (non-Javadoc) * @see com.cloud.network.vpc.VpcManager#ipUsedInVpc(com.cloud.network.IpAddress) */ @Override - public boolean ipUsedInVpc(IpAddress ip) { + public boolean isIpAllocatedToVpc(IpAddress ip) { // TODO Auto-generated method stub return false; } @@ -458,11 +371,16 @@ public class MockVpcManagerImpl extends ManagerBase implements VpcManager { return null; } - @Override - public Network updateVpcGuestNetwork(long networkId, String name, String displayText, Account callerAccount, User callerUser, - String domainSuffix, Long ntwkOffId, Boolean changeCidr, String guestVmCidr) { - // TODO Auto-generated method stub - return null; - } + @Override + public Map> getVpcOffSvcProvidersMap(long vpcOffId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void validateNtwkOffForNtwkInVpc(Long networkId, long newNtwkOffId, String newCidr, String newNetworkDomain, Vpc vpc, String gateway, Account networkOwner) { + // TODO Auto-generated method stub + + } } diff --git a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java index 0b47d1de697..ef5478bb1f8 100644 --- a/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java +++ b/server/test/com/cloud/vpc/MockVpcVirtualNetworkApplianceManager.java @@ -396,4 +396,10 @@ VpcVirtualNetworkApplianceService { return false; } + @Override + public List getVpcRouters(long vpcId) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/server/test/com/cloud/vpc/VpcApiUnitTest.java b/server/test/com/cloud/vpc/VpcApiUnitTest.java index 8e64ab18ebe..d4d5b29812d 100644 --- a/server/test/com/cloud/vpc/VpcApiUnitTest.java +++ b/server/test/com/cloud/vpc/VpcApiUnitTest.java @@ -30,38 +30,13 @@ import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import com.cloud.configuration.dao.ConfigurationDaoImpl; -import com.cloud.configuration.dao.ResourceCountDaoImpl; -import com.cloud.dc.dao.VlanDaoImpl; import com.cloud.exception.InvalidParameterValueException; import com.cloud.network.Network.Service; -import com.cloud.network.dao.FirewallRulesDaoImpl; -import com.cloud.network.dao.IPAddressDaoImpl; -import com.cloud.network.dao.PhysicalNetworkDaoImpl; -import com.cloud.network.dao.Site2SiteVpnGatewayDaoImpl; import com.cloud.network.vpc.Vpc; -import com.cloud.network.vpc.VpcManager; import com.cloud.network.vpc.VpcManagerImpl; -import com.cloud.network.vpc.dao.PrivateIpDaoImpl; -import com.cloud.network.vpc.dao.StaticRouteDaoImpl; -import com.cloud.network.vpc.dao.VpcGatewayDaoImpl; -import com.cloud.network.vpc.dao.VpcOfferingDaoImpl; -import com.cloud.server.ManagementService; -import com.cloud.tags.dao.ResourceTagsDaoImpl; import com.cloud.user.AccountVO; -import com.cloud.user.MockAccountManagerImpl; -import com.cloud.user.dao.AccountDaoImpl; import com.cloud.utils.component.ComponentContext; -import com.cloud.vm.dao.DomainRouterDaoImpl; -import com.cloud.vpc.dao.MockNetworkDaoImpl; -import com.cloud.vpc.dao.MockNetworkOfferingDaoImpl; -import com.cloud.vpc.dao.MockNetworkOfferingServiceMapDaoImpl; -import com.cloud.vpc.dao.MockNetworkServiceMapDaoImpl; -import com.cloud.vpc.dao.MockVpcDaoImpl; -import com.cloud.vpc.dao.MockVpcOfferingDaoImpl; -import com.cloud.vpc.dao.MockVpcOfferingServiceMapDaoImpl; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:/VpcTestContext.xml") public class VpcApiUnitTest extends TestCase{ @@ -180,7 +155,7 @@ public class VpcApiUnitTest extends TestCase{ //1) correct network offering boolean result = false; try { - _vpcService.validateNtkwOffForVpc(1, "0.0.0.0", "111-", new AccountVO(), _vpcService.getVpc(1), 2L, "10.1.1.1"); + _vpcService.validateNtwkOffForNtwkInVpc(2L, 1, "0.0.0.0", "111-", _vpcService.getVpc(1), "10.1.1.1", new AccountVO()); result = true; s_logger.debug("Validate network offering: Test passed: the offering is valid for vpc creation"); } catch (Exception ex) { @@ -191,7 +166,7 @@ public class VpcApiUnitTest extends TestCase{ result = false; String msg = null; try { - _vpcService.validateNtkwOffForVpc(2, "0.0.0.0", "111-", new AccountVO(), _vpcService.getVpc(1), 2L, "10.1.1.1"); + _vpcService.validateNtwkOffForNtwkInVpc(2L, 2, "0.0.0.0", "111-", _vpcService.getVpc(1), "10.1.1.1", new AccountVO()); result = true; } catch (InvalidParameterValueException ex) { msg = ex.getMessage(); @@ -207,7 +182,7 @@ public class VpcApiUnitTest extends TestCase{ result = false; msg = null; try { - _vpcService.validateNtkwOffForVpc(3, "0.0.0.0", "111-", new AccountVO(), _vpcService.getVpc(1), 2L, "10.1.1.1"); + _vpcService.validateNtwkOffForNtwkInVpc(2L, 3, "0.0.0.0", "111-", _vpcService.getVpc(1), "10.1.1.1", new AccountVO()); result = true; } catch (InvalidParameterValueException ex) { msg = ex.getMessage(); @@ -222,7 +197,7 @@ public class VpcApiUnitTest extends TestCase{ //4) invalid offering - guest type shared result = false; try { - _vpcService.validateNtkwOffForVpc(4, "0.0.0.0", "111-", new AccountVO(), _vpcService.getVpc(1), 2L, "10.1.1.1"); + _vpcService.validateNtwkOffForNtwkInVpc(2L, 4, "0.0.0.0", "111-", _vpcService.getVpc(1), "10.1.1.1", new AccountVO()); result = true; } catch (InvalidParameterValueException ex) { msg = ex.getMessage(); @@ -237,7 +212,7 @@ public class VpcApiUnitTest extends TestCase{ //5) Invalid offering - no redundant router support result = false; try { - _vpcService.validateNtkwOffForVpc(5, "0.0.0.0", "111-", new AccountVO(), _vpcService.getVpc(1), 2L, "10.1.1.1"); + _vpcService.validateNtwkOffForNtwkInVpc(2L, 5, "0.0.0.0", "111-", _vpcService.getVpc(1), "10.1.1.1", new AccountVO()); result = true; } catch (InvalidParameterValueException ex) { msg = ex.getMessage(); @@ -252,7 +227,7 @@ public class VpcApiUnitTest extends TestCase{ //6) Only one network in the VPC can support LB service - negative scenario result = false; try { - _vpcService.validateNtkwOffForVpc(6, "0.0.0.0", "111-", new AccountVO(), _vpcService.getVpc(1), 2L, "10.1.1.1"); + _vpcService.validateNtwkOffForNtwkInVpc(2L, 6, "0.0.0.0", "111-", _vpcService.getVpc(1), "10.1.1.1", new AccountVO()); result = true; s_logger.debug("Validate network offering: Test passed: the offering is valid for vpc creation"); } catch (InvalidParameterValueException ex) {