NiciraNvpElement extends AdapterBase implements ConnectivityProvider, SourceNatServiceProvider, PortForwardingServiceProvider, StaticNatServiceProvider,
NiciraNvpElementService, ResourceStateAdapter, IpDeployer { @Override public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { s_logger.debug("entering NiciraNvpElement implement function for network " + network.getDisplayText() + " (state " + network.getState() + ")"); if (!canHandle(network, Service.Connectivity)) { return false; } if (network.getBroadcastUri() == null) { s_logger.error("Nic has no broadcast Uri with the LSwitch Uuid"); return false; } final List<NiciraNvpDeviceVO> devices = niciraNvpDao.listByPhysicalNetwork(network.getPhysicalNetworkId()); if (devices.isEmpty()) { s_logger.error("No NiciraNvp Controller on physical network " + network.getPhysicalNetworkId()); return false; } final NiciraNvpDeviceVO niciraNvpDevice = devices.get(0); final HostVO niciraNvpHost = hostDao.findById(niciraNvpDevice.getHostId()); hostDao.loadDetails(niciraNvpHost); final Account owner = context.getAccount(); if (networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.SourceNat, Provider.NiciraNvp)) { s_logger.debug("Apparently we are supposed to provide SourceNat on this network"); final PublicIp sourceNatIp = ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network); final String publicCidr = sourceNatIp.getAddress().addr() + "/" + NetUtils.getCidrSize(sourceNatIp.getVlanNetmask()); final String internalCidr = network.getGateway() + "/" + network.getCidr().split("/")[1]; String vtag = sourceNatIp.getVlanTag(); BroadcastDomainType tiep = null; try { tiep = BroadcastDomainType.getTypeOf(vtag); } catch (final URISyntaxException use) { throw new CloudRuntimeException("vlantag for sourceNatIp is not valid: " + vtag, use); } if (tiep == BroadcastDomainType.Vlan) { vtag = BroadcastDomainType.Vlan.getValueFrom(BroadcastDomainType.fromString(vtag)); } else if (!(tiep == BroadcastDomainType.UnDecided || tiep == BroadcastDomainType.Native)) { throw new CloudRuntimeException("only vlans are supported for sourceNatIp, at this moment: " + vtag); } final long vlanid = Vlan.UNTAGGED.equals(vtag) ? 0 : Long.parseLong(vtag); final CreateLogicalRouterCommand cmd = new CreateLogicalRouterCommand(niciraNvpHost.getDetail("l3gatewayserviceuuid"), vlanid, BroadcastDomainType.getValue(network.getBroadcastUri()), "router-" + network.getDisplayText(), publicCidr, sourceNatIp.getGateway(), internalCidr, context.getDomain().getName() + "-" + context.getAccount().getAccountName()); final CreateLogicalRouterAnswer answer = (CreateLogicalRouterAnswer)agentMgr.easySend(niciraNvpHost.getId(), cmd); if (answer.getResult() == false) { s_logger.error("Failed to create Logical Router for network " + network.getDisplayText()); return false; } final NiciraNvpRouterMappingVO routermapping = new NiciraNvpRouterMappingVO(answer.getLogicalRouterUuid(), network.getId()); niciraNvpRouterMappingDao.persist(routermapping); } return true; }  @Override Map<Service, Map<Capability, String>> getCapabilities(); @Override Provider getProvider(); @Override boolean configure(String name, Map<String, Object> params); @Override boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context); @Override boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context); @Override boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context); @Override boolean shutdown(Network network, ReservationContext context, boolean cleanup); @Override boolean destroy(Network network, ReservationContext context); @Override boolean isReady(PhysicalNetworkServiceProvider provider); @Override boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context); @Override boolean canEnableIndividualServices(); @Override boolean verifyServicesCombination(Set<Service> services); @Override List<Class<?>> getCommands(); @Override @DB NiciraNvpDeviceVO addNiciraNvpDevice(AddNiciraNvpDeviceCmd cmd); @Override NiciraNvpDeviceResponse createNiciraNvpDeviceResponse(NiciraNvpDeviceVO niciraNvpDeviceVO); @Override boolean deleteNiciraNvpDevice(DeleteNiciraNvpDeviceCmd cmd); @Override List<NiciraNvpDeviceVO> listNiciraNvpDevices(ListNiciraNvpDevicesCmd cmd); @Override List<? extends Network> listNiciraNvpDeviceNetworks(ListNiciraNvpDeviceNetworksCmd cmd); @Override HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd); @Override HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, Map<String, String> details, List<String> hostTags); @Override DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage); @Override IpDeployer getIpDeployer(Network network); @Override boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddress, Set<Service> services); @Override boolean applyStaticNats(Network network, List<? extends StaticNat> rules); @Override boolean applyPFRules(Network network, List<PortForwardingRule> rules);  }
@Test public void implementTest() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { final Network network = mock(Network.class); when(network.getBroadcastDomainType()).thenReturn(BroadcastDomainType.Lswitch); when(network.getId()).thenReturn(NETWORK_ID); final NetworkOffering offering = mock(NetworkOffering.class); when(offering.getId()).thenReturn(NETWORK_ID); when(offering.getTrafficType()).thenReturn(TrafficType.Guest); when(offering.getGuestType()).thenReturn(GuestType.Isolated); mock(DeployDestination.class); final Domain dom = mock(Domain.class); when(dom.getName()).thenReturn("domain"); final Account acc = mock(Account.class); when(acc.getAccountName()).thenReturn("accountname"); final ReservationContext context = mock(ReservationContext.class); when(context.getDomain()).thenReturn(dom); when(context.getAccount()).thenReturn(acc); }