public NetworkProfile(Network network) { this.id = network.getId(); this.uuid = network.getUuid(); this.broadcastUri = network.getBroadcastUri(); this.dataCenterId = network.getDataCenterId(); this.ownerId = network.getAccountId(); this.state = network.getState(); this.name = network.getName(); this.mode = network.getMode(); this.broadcastDomainType = network.getBroadcastDomainType(); this.trafficType = network.getTrafficType(); this.gateway = network.getGateway(); this.cidr = network.getCidr(); this.networkOfferingId = network.getNetworkOfferingId(); this.related = network.getRelated(); this.displayText = network.getDisplayText(); this.reservationId = network.getReservationId(); this.networkDomain = network.getNetworkDomain(); this.domainId = network.getDomainId(); this.guestType = network.getGuestType(); this.physicalNetworkId = network.getPhysicalNetworkId(); this.aclType = network.getAclType(); this.restartRequired = network.isRestartRequired(); this.specifyIpRanges = network.getSpecifyIpRanges(); this.vpcId = network.getVpcId(); }
@Override public boolean removeVpcRouterFromGuestNetwork(final VirtualRouter router, final Network network) throws ConcurrentOperationException, ResourceUnavailableException { if (network.getTrafficType() != TrafficType.Guest) { s_logger.warn("Network " + network + " is not of type " + TrafficType.Guest); return false; } boolean result = true; try { // Check if router is a part of the Guest network if (!_networkModel.isVmPartOfNetwork(router.getId(), network.getId())) { s_logger.debug("Router " + router + " is not a part of the Guest network " + network); return result; } result = setupVpcGuestNetwork( network, router, false, _networkModel.getNicProfile(router, network.getId(), null)); if (!result) { s_logger.warn("Failed to destroy guest network config " + network + " on router " + router); return false; } result = result && _itMgr.removeVmFromNetwork(router, network, null); } finally { if (result) { _routerDao.removeRouterFromGuestNetwork(router.getId(), network.getId()); } } return result; }
@Override public Network implement( Network config, NetworkOffering offering, DeployDestination destination, ReservationContext context) { assert config.getTrafficType() == TrafficType.Control : "Why are you sending this configuration to me " + config; return config; }
@Override public NicProfile allocate( Network config, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { if (config.getTrafficType() != TrafficType.Control) { return null; } if (vm.getHypervisorType() == HypervisorType.VmWare && vm.getType() != VirtualMachine.Type.DomainRouter) { NicProfile nicProf = new NicProfile(ReservationStrategy.Create, null, null, null, null); String mac = _networkMgr.getNextAvailableMacAddressInNetwork(config.getId()); nicProf.setMacAddress(mac); return nicProf; } if (nic != null) { throw new CloudRuntimeException("Does not support nic specification at this time: " + nic); } return new NicProfile(ReservationStrategy.Start, null, null, null, null); }
@Override public NicProfile allocate( Network network, NicProfile nic, VirtualMachineProfile<? extends VirtualMachine> vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException, ConcurrentOperationException { if (network.getTrafficType() != TrafficType.Public) { return null; } if (nic == null) { nic = new NicProfile(ReservationStrategy.Create, null, null, null, null); } DataCenter dc = _dcDao.findById(network.getDataCenterId()); getIp(nic, dc, vm, network); if (nic.getIp4Address() == null) { nic.setStrategy(ReservationStrategy.Start); } else { nic.setStrategy(ReservationStrategy.Create); } return nic; }
@Override public Network implement( final Network network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context) throws InsufficientVirtualNetworkCapacityException { assert network.getState() == State.Implementing : "Why are we implementing " + network; final long dcId = dest.getDataCenter().getId(); Long physicalNetworkId = network.getPhysicalNetworkId(); // physical network id can be null in Guest Network in Basic zone, so locate the physical // network if (physicalNetworkId == null) { physicalNetworkId = networkModel.findPhysicalNetworkId(dcId, offering.getTags(), offering.getTrafficType()); } final NetworkVO implemented = new NetworkVO( network.getTrafficType(), network.getMode(), network.getBroadcastDomainType(), network.getNetworkOfferingId(), State.Allocated, network.getDataCenterId(), physicalNetworkId, offering.getRedundantRouter()); if (network.getGateway() != null) { implemented.setGateway(network.getGateway()); } if (network.getCidr() != null) { implemented.setCidr(network.getCidr()); } // Name is either the given name or the uuid String name = network.getName(); if (name == null || name.isEmpty()) { name = ((NetworkVO) network).getUuid(); } if (name.length() > MAX_NAME_LENGTH) { name = name.substring(0, MAX_NAME_LENGTH - 1); } final List<NiciraNvpDeviceVO> devices = niciraNvpDao.listByPhysicalNetwork(physicalNetworkId); if (devices.isEmpty()) { s_logger.error("No NiciraNvp Controller on physical network " + physicalNetworkId); return null; } final NiciraNvpDeviceVO niciraNvpDevice = devices.get(0); final HostVO niciraNvpHost = hostDao.findById(niciraNvpDevice.getHostId()); hostDao.loadDetails(niciraNvpHost); final String transportzoneuuid = niciraNvpHost.getDetail("transportzoneuuid"); final String transportzoneisotype = niciraNvpHost.getDetail("transportzoneisotype"); final CreateLogicalSwitchCommand cmd = new CreateLogicalSwitchCommand( transportzoneuuid, transportzoneisotype, name, context.getDomain().getName() + "-" + context.getAccount().getAccountName()); final CreateLogicalSwitchAnswer answer = (CreateLogicalSwitchAnswer) agentMgr.easySend(niciraNvpHost.getId(), cmd); if (answer == null || !answer.getResult()) { s_logger.error("CreateLogicalSwitchCommand failed"); return null; } try { implemented.setBroadcastUri(new URI("lswitch", answer.getLogicalSwitchUuid(), null)); implemented.setBroadcastDomainType(BroadcastDomainType.Lswitch); s_logger.info( "Implemented OK, network linked to = " + implemented.getBroadcastUri().toString()); } catch (final URISyntaxException e) { s_logger.error( "Unable to store logical switch id in broadcast uri, uuid = " + implemented.getUuid(), e); return null; } return implemented; }
@Override public boolean finalizeCommandsOnStart(final Commands cmds, final VirtualMachineProfile profile) { final DomainRouterVO domainRouterVO = _routerDao.findById(profile.getId()); final boolean isVpc = domainRouterVO.getVpcId() != null; if (!isVpc) { return super.finalizeCommandsOnStart(cmds, profile); } if (domainRouterVO.getState() == State.Starting || domainRouterVO.getState() == State.Running) { // 1) FORM SSH CHECK COMMAND final NicProfile controlNic = getControlNic(profile); if (controlNic == null) { s_logger.error("Control network doesn't exist for the router " + domainRouterVO); return false; } finalizeSshAndVersionAndNetworkUsageOnStart(cmds, profile, domainRouterVO, controlNic); // 2) FORM PLUG NIC COMMANDS final List<Pair<Nic, Network>> guestNics = new ArrayList<Pair<Nic, Network>>(); final List<Pair<Nic, Network>> publicNics = new ArrayList<Pair<Nic, Network>>(); final Map<String, String> vlanMacAddress = new HashMap<String, String>(); final List<? extends Nic> routerNics = _nicDao.listByVmId(profile.getId()); for (final Nic routerNic : routerNics) { final Network network = _networkModel.getNetwork(routerNic.getNetworkId()); if (network.getTrafficType() == TrafficType.Guest) { final Pair<Nic, Network> guestNic = new Pair<Nic, Network>(routerNic, network); guestNics.add(guestNic); } else if (network.getTrafficType() == TrafficType.Public) { final Pair<Nic, Network> publicNic = new Pair<Nic, Network>(routerNic, network); publicNics.add(publicNic); final String vlanTag = BroadcastDomainType.getValue(routerNic.getBroadcastUri()); vlanMacAddress.put(vlanTag, routerNic.getMacAddress()); } } final List<Command> usageCmds = new ArrayList<Command>(); // 3) PREPARE PLUG NIC COMMANDS try { // add VPC router to public networks final List<PublicIp> sourceNat = new ArrayList<PublicIp>(1); for (final Pair<Nic, Network> nicNtwk : publicNics) { final Nic publicNic = nicNtwk.first(); final Network publicNtwk = nicNtwk.second(); final IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId( publicNtwk.getId(), publicNic.getIPv4Address()); if (userIp.isSourceNat()) { final PublicIp publicIp = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId())); sourceNat.add(publicIp); if (domainRouterVO.getPublicIpAddress() == null) { final DomainRouterVO routerVO = _routerDao.findById(domainRouterVO.getId()); routerVO.setPublicIpAddress(publicNic.getIPv4Address()); routerVO.setPublicNetmask(publicNic.getIPv4Netmask()); routerVO.setPublicMacAddress(publicNic.getMacAddress()); _routerDao.update(routerVO.getId(), routerVO); } } final PlugNicCommand plugNicCmd = new PlugNicCommand( _nwHelper.getNicTO( domainRouterVO, publicNic.getNetworkId(), publicNic.getBroadcastUri().toString()), domainRouterVO.getInstanceName(), domainRouterVO.getType()); cmds.addCommand(plugNicCmd); final VpcVO vpc = _vpcDao.findById(domainRouterVO.getVpcId()); final NetworkUsageCommand netUsageCmd = new NetworkUsageCommand( domainRouterVO.getPrivateIpAddress(), domainRouterVO.getInstanceName(), true, publicNic.getIPv4Address(), vpc.getCidr()); usageCmds.add(netUsageCmd); UserStatisticsVO stats = _userStatsDao.findBy( domainRouterVO.getAccountId(), domainRouterVO.getDataCenterId(), publicNtwk.getId(), publicNic.getIPv4Address(), domainRouterVO.getId(), domainRouterVO.getType().toString()); if (stats == null) { stats = new UserStatisticsVO( domainRouterVO.getAccountId(), domainRouterVO.getDataCenterId(), publicNic.getIPv4Address(), domainRouterVO.getId(), domainRouterVO.getType().toString(), publicNtwk.getId()); _userStatsDao.persist(stats); } } // create ip assoc for source nat if (!sourceNat.isEmpty()) { _commandSetupHelper.createVpcAssociatePublicIPCommands( domainRouterVO, sourceNat, cmds, vlanMacAddress); } // add VPC router to guest networks for (final Pair<Nic, Network> nicNtwk : guestNics) { final Nic guestNic = nicNtwk.first(); // plug guest nic final PlugNicCommand plugNicCmd = new PlugNicCommand( _nwHelper.getNicTO(domainRouterVO, guestNic.getNetworkId(), null), domainRouterVO.getInstanceName(), domainRouterVO.getType()); cmds.addCommand(plugNicCmd); if (!_networkModel.isPrivateGateway(guestNic.getNetworkId())) { // set guest network final VirtualMachine vm = _vmDao.findById(domainRouterVO.getId()); final NicProfile nicProfile = _networkModel.getNicProfile(vm, guestNic.getNetworkId(), null); final SetupGuestNetworkCommand setupCmd = _commandSetupHelper.createSetupGuestNetworkCommand( domainRouterVO, true, nicProfile); cmds.addCommand(setupCmd); } else { // set private network final PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId( guestNic.getNetworkId(), guestNic.getIPv4Address()); final Network network = _networkDao.findById(guestNic.getNetworkId()); BroadcastDomainType.getValue(network.getBroadcastUri()); final String netmask = NetUtils.getCidrNetmask(network.getCidr()); final PrivateIpAddress ip = new PrivateIpAddress( ipVO, network.getBroadcastUri().toString(), network.getGateway(), netmask, guestNic.getMacAddress()); final List<PrivateIpAddress> privateIps = new ArrayList<PrivateIpAddress>(1); privateIps.add(ip); _commandSetupHelper.createVpcAssociatePrivateIPCommands( domainRouterVO, privateIps, cmds, true); final Long privateGwAclId = _vpcGatewayDao.getNetworkAclIdForPrivateIp( ipVO.getVpcId(), ipVO.getNetworkId(), ipVO.getIpAddress()); if (privateGwAclId != null) { // set network acl on private gateway final List<NetworkACLItemVO> networkACLs = _networkACLItemDao.listByACL(privateGwAclId); s_logger.debug( "Found " + networkACLs.size() + " network ACLs to apply as a part of VPC VR " + domainRouterVO + " start for private gateway ip = " + ipVO.getIpAddress()); _commandSetupHelper.createNetworkACLsCommands( networkACLs, domainRouterVO, cmds, ipVO.getNetworkId(), true); } } } } catch (final Exception ex) { s_logger.warn( "Failed to add router " + domainRouterVO + " to network due to exception ", ex); return false; } // 4) RE-APPLY ALL STATIC ROUTE RULES final List<? extends StaticRoute> routes = _staticRouteDao.listByVpcId(domainRouterVO.getVpcId()); final List<StaticRouteProfile> staticRouteProfiles = new ArrayList<StaticRouteProfile>(routes.size()); final Map<Long, VpcGateway> gatewayMap = new HashMap<Long, VpcGateway>(); for (final StaticRoute route : routes) { VpcGateway gateway = gatewayMap.get(route.getVpcGatewayId()); if (gateway == null) { gateway = _entityMgr.findById(VpcGateway.class, route.getVpcGatewayId()); gatewayMap.put(gateway.getId(), gateway); } staticRouteProfiles.add(new StaticRouteProfile(route, gateway)); } s_logger.debug( "Found " + staticRouteProfiles.size() + " static routes to apply as a part of vpc route " + domainRouterVO + " start"); if (!staticRouteProfiles.isEmpty()) { _commandSetupHelper.createStaticRouteCommands(staticRouteProfiles, domainRouterVO, cmds); } // 5) RE-APPLY ALL REMOTE ACCESS VPNs final RemoteAccessVpnVO vpn = _vpnDao.findByAccountAndVpc(domainRouterVO.getAccountId(), domainRouterVO.getVpcId()); if (vpn != null) { _commandSetupHelper.createApplyVpnCommands(true, vpn, domainRouterVO, cmds); } // 6) REPROGRAM GUEST NETWORK boolean reprogramGuestNtwks = true; if (profile.getParameter(Param.ReProgramGuestNetworks) != null && (Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) { reprogramGuestNtwks = false; } final VirtualRouterProvider vrProvider = _vrProviderDao.findById(domainRouterVO.getElementId()); if (vrProvider == null) { throw new CloudRuntimeException( "Cannot find related virtual router provider of router: " + domainRouterVO.getHostName()); } final Provider provider = Network.Provider.getProvider(vrProvider.getType().toString()); if (provider == null) { throw new CloudRuntimeException( "Cannot find related provider of virtual router provider: " + vrProvider.getType().toString()); } for (final Pair<Nic, Network> nicNtwk : guestNics) { final Nic guestNic = nicNtwk.first(); final AggregationControlCommand startCmd = new AggregationControlCommand( Action.Start, domainRouterVO.getInstanceName(), controlNic.getIPv4Address(), _routerControlHelper.getRouterIpInNetwork( guestNic.getNetworkId(), domainRouterVO.getId())); cmds.addCommand(startCmd); if (reprogramGuestNtwks) { finalizeIpAssocForNetwork( cmds, domainRouterVO, provider, guestNic.getNetworkId(), vlanMacAddress); finalizeNetworkRulesForNetwork(cmds, domainRouterVO, provider, guestNic.getNetworkId()); } finalizeUserDataAndDhcpOnStart(cmds, domainRouterVO, provider, guestNic.getNetworkId()); final AggregationControlCommand finishCmd = new AggregationControlCommand( Action.Finish, domainRouterVO.getInstanceName(), controlNic.getIPv4Address(), _routerControlHelper.getRouterIpInNetwork( guestNic.getNetworkId(), domainRouterVO.getId())); cmds.addCommand(finishCmd); } // Add network usage commands cmds.addCommands(usageCmds); } return true; }
@Override public boolean addVpcRouterToGuestNetwork( final VirtualRouter router, final Network network, final Map<VirtualMachineProfile.Param, Object> params) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { if (network.getTrafficType() != TrafficType.Guest) { s_logger.warn("Network " + network + " is not of type " + TrafficType.Guest); return false; } // Add router to the Guest network boolean result = true; try { // 1) add nic to the router _routerDao.addRouterToGuestNetwork(router, network); final NicProfile guestNic = _itMgr.addVmToNetwork(router, network, null); // 2) setup guest network if (guestNic != null) { result = setupVpcGuestNetwork(network, router, true, guestNic); } else { s_logger.warn("Failed to add router " + router + " to guest network " + network); result = false; } // 3) apply networking rules if (result && params.get(Param.ReProgramGuestNetworks) != null && (Boolean) params.get(Param.ReProgramGuestNetworks) == true) { sendNetworkRulesToRouter(router.getId(), network.getId()); } } catch (final Exception ex) { s_logger.warn("Failed to add router " + router + " to network " + network + " due to ", ex); result = false; } finally { if (!result) { s_logger.debug( "Removing the router " + router + " from network " + network + " as a part of cleanup"); if (removeVpcRouterFromGuestNetwork(router, network)) { s_logger.debug( "Removed the router " + router + " from network " + network + " as a part of cleanup"); } else { s_logger.warn( "Failed to remove the router " + router + " from network " + network + " as a part of cleanup"); } } else { s_logger.debug("Succesfully added router " + router + " to guest network " + network); } } return result; }
@Override public Network implement( Network config, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws InsufficientVirtualNetworkCapcityException { assert (config.getState() == State.Implementing) : "Why are we implementing " + config; if (Boolean.parseBoolean(_configDao.getValue(Config.OvsTunnelNetwork.key()))) { return null; } if (!_networkModel.networkIsConfiguredForExternalNetworking( config.getDataCenterId(), config.getId())) { return super.implement(config, offering, dest, context); } DataCenter zone = dest.getDataCenter(); NetworkVO implemented = new NetworkVO( config.getTrafficType(), config.getMode(), config.getBroadcastDomainType(), config.getNetworkOfferingId(), State.Allocated, config.getDataCenterId(), config.getPhysicalNetworkId()); // Get a vlan tag int vlanTag; if (config.getBroadcastUri() == null) { String vnet = _dcDao.allocateVnet( zone.getId(), config.getPhysicalNetworkId(), config.getAccountId(), context.getReservationId()); try { vlanTag = Integer.parseInt(vnet); } catch (NumberFormatException e) { throw new CloudRuntimeException( "Obtained an invalid guest vlan tag. Exception: " + e.getMessage()); } implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlanTag)); ActionEventUtils.onCompletedActionEvent( UserContext.current().getCallerUserId(), config.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + config.getId(), 0); } else { vlanTag = Integer.parseInt(config.getBroadcastUri().getHost()); implemented.setBroadcastUri(config.getBroadcastUri()); } // Determine the new gateway and CIDR String[] oldCidr = config.getCidr().split("/"); String oldCidrAddress = oldCidr[0]; int cidrSize = Integer.parseInt(oldCidr[1]); long newCidrAddress = (NetUtils.ip2Long(oldCidrAddress)); // if the implementing network is for vpc, no need to generate newcidr, use the cidr that came // from super cidr if (config.getVpcId() != null) { implemented.setGateway(config.getGateway()); implemented.setCidr(config.getCidr()); implemented.setState(State.Implemented); } else { // Determine the offset from the lowest vlan tag int offset = getVlanOffset(config.getPhysicalNetworkId(), vlanTag); cidrSize = getGloballyConfiguredCidrSize(); // If the offset has more bits than there is room for, return null long bitsInOffset = 32 - Integer.numberOfLeadingZeros(offset); if (bitsInOffset > (cidrSize - 8)) { throw new CloudRuntimeException( "The offset " + offset + " needs " + bitsInOffset + " bits, but only have " + (cidrSize - 8) + " bits to work with."); } newCidrAddress = (NetUtils.ip2Long(oldCidrAddress) & 0xff000000) | (offset << (32 - cidrSize)); implemented.setGateway(NetUtils.long2Ip(newCidrAddress + 1)); implemented.setCidr(NetUtils.long2Ip(newCidrAddress) + "/" + cidrSize); implemented.setState(State.Implemented); } // Mask the Ipv4 address of all nics that use this network with the new guest VLAN offset List<NicVO> nicsInNetwork = _nicDao.listByNetworkId(config.getId()); for (NicVO nic : nicsInNetwork) { if (nic.getIp4Address() != null) { long ipMask = getIpMask(nic.getIp4Address(), cidrSize); nic.setIp4Address(NetUtils.long2Ip(newCidrAddress | ipMask)); _nicDao.persist(nic); } } // Mask the destination address of all port forwarding rules in this network with the new guest // VLAN offset List<PortForwardingRuleVO> pfRulesInNetwork = _pfRulesDao.listByNetwork(config.getId()); for (PortForwardingRuleVO pfRule : pfRulesInNetwork) { if (pfRule.getDestinationIpAddress() != null) { long ipMask = getIpMask(pfRule.getDestinationIpAddress().addr(), cidrSize); String maskedDestinationIpAddress = NetUtils.long2Ip(newCidrAddress | ipMask); pfRule.setDestinationIpAddress(new Ip(maskedDestinationIpAddress)); _pfRulesDao.update(pfRule.getId(), pfRule); } } return implemented; }