Hyunsun Moon

Use openstack4j for OpenStack data model and rest client

Change-Id: I4eb52c3c82d847c442420d1287392fe9079bf699
......@@ -18,7 +18,7 @@
category="Traffic Steering" url="http://onosproject.org" title="CORD Virtual Tenant Network"
featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
features="${project.artifactId}"
apps="org.onosproject.ovsdb-base,org.onosproject.openstackinterface,org.onosproject.dhcp">
apps="org.onosproject.ovsdb-base,org.onosproject.dhcp">
<description>${project.description}</description>
<artifact>mvn:${project.groupId}/onos-app-cordvtn/${project.version}</artifact>
</app>
......
......@@ -19,5 +19,6 @@
<feature>onos-api</feature>
<bundle>mvn:${project.groupId}/onos-app-cordvtn/${project.version}</bundle>
<bundle>wrap:mvn:com.jcraft/jsch/0.1.53$Bundle-SymbolicName=jsch&amp;Bundle-Version=0.1.53</bundle>
<bundle>wrap:mvn:org.pacesys/openstack4j/2.11/jar/withdeps$Bundle-SymbolicName=openstack4j&amp;Bundle-Version=2.11</bundle>
</feature>
</features>
......
......@@ -112,6 +112,21 @@
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
<dependency>
<groupId>org.pacesys</groupId>
<artifactId>openstack4j-core</artifactId>
<version>2.11</version>
</dependency>
<dependency>
<groupId>org.pacesys.openstack4j.connectors</groupId>
<artifactId>openstack4j-http-connector</artifactId>
<version>2.11</version>
</dependency>
<dependency>
<groupId>org.pacesys.openstack4j.connectors</groupId>
<artifactId>openstack4j-httpclient</artifactId>
<version>2.11</version>
</dependency>
</dependencies>
<build>
......@@ -131,8 +146,14 @@
${project.groupId}.${project.artifactId}
</Bundle-SymbolicName>
<Import-Package>
!org.apache.http.*,
*,org.glassfish.jersey.servlet
</Import-Package>
<Embed-Dependency>
openstack4j-core,
openstack4j-http-connector,
openstack4j-httpclient
</Embed-Dependency>
<Web-ContextPath>${web.context}</Web-ContextPath>
</instructions>
</configuration>
......
......@@ -19,8 +19,8 @@ import com.google.common.base.MoreObjects;
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onosproject.net.Host;
import org.onosproject.openstackinterface.OpenstackNetwork;
import org.onosproject.openstackinterface.OpenstackSubnet;
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.Subnet;
import java.util.Map;
import java.util.Objects;
......@@ -47,18 +47,18 @@ public final class CordService {
/**
* Default constructor.
*
* @param vNet OpenStack network
* @param subnet OpenStack subnet
* @param osNet OpenStack network
* @param osSubnet OpenStack subnet
* @param hosts host and tunnel ip map
* @param tenantServices list of tenant service ids
*/
public CordService(OpenstackNetwork vNet, OpenstackSubnet subnet,
public CordService(Network osNet, Subnet osSubnet,
Map<Host, IpAddress> hosts, Set<CordServiceId> tenantServices) {
this.id = CordServiceId.of(vNet.id());
this.segmentationId = Long.parseLong(vNet.segmentId());
this.serviceType = getServiceType(vNet.name());
this.serviceIpRange = IpPrefix.valueOf(subnet.cidr());
this.serviceIp = IpAddress.valueOf(subnet.gatewayIp());
this.id = CordServiceId.of(osNet.getId());
this.segmentationId = Long.parseLong(osNet.getProviderSegID());
this.serviceType = getServiceType(osNet.getName());
this.serviceIpRange = IpPrefix.valueOf(osSubnet.getCidr());
this.serviceIp = IpAddress.valueOf(osSubnet.getGateway());
this.hosts = hosts;
this.tenantServices = tenantServices;
}
......
......@@ -46,10 +46,6 @@ public class CordVtnConfig extends Config<ApplicationId> {
public static final String LOCAL_MANAGEMENT_IP = "localManagementIp";
public static final String OVSDB_PORT = "ovsdbPort";
public static final String SSH_PORT = "sshPort";
public static final String SSH_USER = "sshUser";
public static final String SSH_KEY_FILE = "sshKeyFile";
public static final String CORDVTN_NODES = "nodes";
public static final String HOSTNAME = "hostname";
public static final String HOST_MANAGEMENT_IP = "hostManagementIp";
......@@ -57,6 +53,17 @@ public class CordVtnConfig extends Config<ApplicationId> {
public static final String DATA_PLANE_INTF = "dataPlaneIntf";
public static final String BRIDGE_ID = "bridgeId";
public static final String SSH = "ssh";
public static final String SSH_PORT = "sshPort";
public static final String SSH_USER = "sshUser";
public static final String SSH_KEY_FILE = "sshKeyFile";
public static final String OPENSTACK = "openstack";
public static final String OPENSTACK_ENDPOINT = "endpoint";
public static final String OPENSTACK_TENANT = "tenant";
public static final String OPENSTACK_USER = "user";
public static final String OPENSTACK_PASSWORD = "password";
/**
* Returns the set of nodes read from network config.
*
......@@ -65,15 +72,22 @@ public class CordVtnConfig extends Config<ApplicationId> {
public Set<CordVtnNode> cordVtnNodes() {
Set<CordVtnNode> nodes = Sets.newHashSet();
JsonNode jsonNodes = object.get(CORDVTN_NODES);
if (jsonNodes == null) {
JsonNode cordvtnNodes = object.get(CORDVTN_NODES);
if (cordvtnNodes == null) {
log.debug("No CORD VTN nodes found");
return nodes;
}
for (JsonNode jsonNode : jsonNodes) {
JsonNode sshNode = object.get(SSH);
if (sshNode == null) {
log.warn("SSH information not found");
return nodes;
}
for (JsonNode cordvtnNode : cordvtnNodes) {
try {
NetworkAddress hostMgmt = NetworkAddress.valueOf(getConfig(jsonNode, HOST_MANAGEMENT_IP));
NetworkAddress hostMgmt = NetworkAddress.valueOf(getConfig(cordvtnNode, HOST_MANAGEMENT_IP));
NetworkAddress localMgmt = NetworkAddress.valueOf(getConfig(object, LOCAL_MANAGEMENT_IP));
if (hostMgmt.prefix().contains(localMgmt.prefix()) ||
localMgmt.prefix().contains(hostMgmt.prefix())) {
......@@ -84,22 +98,22 @@ public class CordVtnConfig extends Config<ApplicationId> {
Ip4Address hostMgmtIp = hostMgmt.ip().getIp4Address();
SshAccessInfo sshInfo = new SshAccessInfo(
hostMgmtIp,
TpPort.tpPort(Integer.parseInt(getConfig(object, SSH_PORT))),
getConfig(object, SSH_USER), getConfig(object, SSH_KEY_FILE));
TpPort.tpPort(Integer.parseInt(getConfig(sshNode, SSH_PORT))),
getConfig(sshNode, SSH_USER), getConfig(sshNode, SSH_KEY_FILE));
String hostname = getConfig(jsonNode, HOSTNAME);
String hostname = getConfig(cordvtnNode, HOSTNAME);
CordVtnNode newNode = new CordVtnNode(
hostname, hostMgmt, localMgmt,
NetworkAddress.valueOf(getConfig(jsonNode, DATA_PLANE_IP)),
NetworkAddress.valueOf(getConfig(cordvtnNode, DATA_PLANE_IP)),
TpPort.tpPort(Integer.parseInt(getConfig(object, OVSDB_PORT))),
sshInfo,
DeviceId.deviceId(getConfig(jsonNode, BRIDGE_ID)),
getConfig(jsonNode, DATA_PLANE_INTF),
DeviceId.deviceId(getConfig(cordvtnNode, BRIDGE_ID)),
getConfig(cordvtnNode, DATA_PLANE_INTF),
CordVtnNodeState.noState());
nodes.add(newNode);
} catch (IllegalArgumentException | NullPointerException e) {
log.error("{}", e.toString());
log.error("{}", e);
}
}
......@@ -167,5 +181,90 @@ public class CordVtnConfig extends Config<ApplicationId> {
return publicGateways;
}
}
/**
* Returns OpenStack API access information.
*
* @return openstack config
*/
public OpenStackConfig openstackConfig() {
JsonNode jsonNode = object.get(OPENSTACK);
if (jsonNode == null) {
log.error("Failed to get OpenStack configurations");
return null;
}
try {
return new OpenStackConfig(
jsonNode.path(OPENSTACK_ENDPOINT).asText(),
jsonNode.path(OPENSTACK_TENANT).asText(),
jsonNode.path(OPENSTACK_USER).asText(),
jsonNode.path(OPENSTACK_PASSWORD).asText());
} catch (IllegalArgumentException | NullPointerException e) {
log.error("Failed to get OpenStack configurations");
return null;
}
}
/**
* Configuration for OpenStack API access.
*/
public static class OpenStackConfig {
private final String endpoint;
private final String tenant;
private final String user;
private final String password;
/**
* Default constructor.
*
* @param endpoint Keystone endpoint
* @param tenant tenant name
* @param user user name
* @param password passwowrd
*/
public OpenStackConfig(String endpoint, String tenant, String user, String password) {
this.endpoint = endpoint;
this.tenant = tenant;
this.user = user;
this.password = password;
}
/**
* Returns OpenStack API endpoint.
*
* @return endpoint
*/
public String endpoint() {
return this.endpoint;
}
/**
* Returns OpenStack tenant name.
*
* @return tenant name
*/
public String tenant() {
return this.tenant;
}
/**
* Returns OpenStack user.
*
* @return user name
*/
public String user() {
return this.user;
}
/**
* Returns OpenStack password for the user.
*
* @return password
*/
public String password() {
return this.password;
}
}
}
......
......@@ -67,10 +67,13 @@ import org.onosproject.net.packet.PacketProcessor;
import org.onosproject.net.packet.PacketService;
import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId;
import org.onosproject.openstackinterface.OpenstackInterfaceService;
import org.onosproject.openstackinterface.OpenstackNetwork;
import org.onosproject.openstackinterface.OpenstackPort;
import org.onosproject.openstackinterface.OpenstackSubnet;
import org.openstack4j.api.OSClient;
import org.openstack4j.api.exceptions.AuthenticationException;
import org.openstack4j.model.identity.Access;
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.Subnet;
import org.openstack4j.openstack.OSFactory;
import org.slf4j.Logger;
import java.util.List;
......@@ -130,9 +133,6 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
protected GroupService groupService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected OpenstackInterfaceService openstackService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DhcpService dhcpService;
private final ConfigFactory configFactory =
......@@ -165,6 +165,8 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
private HostProviderService hostProvider;
private CordVtnRuleInstaller ruleInstaller;
private CordVtnArpProxy arpProxy;
private volatile Access osAccess = null;
private volatile MacAddress privateGatewayMac = MacAddress.NONE;
/**
......@@ -250,20 +252,26 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
@Override
public void addServiceVm(CordVtnNode node, ConnectPoint connectPoint) {
checkNotNull(osAccess, "OpenStack access is not set");
OSClient osClient = OSFactory.clientFromAccess(osAccess);
Port port = deviceService.getPort(connectPoint.deviceId(), connectPoint.port());
OpenstackPort vPort = openstackService.port(port);
if (vPort == null) {
log.warn("Failed to get OpenstackPort for {}", getPortName(port));
org.openstack4j.model.network.Port osPort = osClient.networking().port().list()
.stream()
.filter(p -> p.getId().contains(getPortName(port).substring(3)))
.findFirst().orElse(null);
if (osPort == null) {
log.warn("Failed to get OpenStack port for {}", getPortName(port));
return;
}
MacAddress mac = vPort.macAddress();
MacAddress mac = MacAddress.valueOf(osPort.getMacAddress());
HostId hostId = HostId.hostId(mac);
Host existingHost = hostService.getHost(hostId);
if (existingHost != null) {
String serviceId = existingHost.annotations().value(SERVICE_ID);
if (serviceId == null || !serviceId.equals(vPort.networkId())) {
if (serviceId == null || !serviceId.equals(osPort.getNetworkId())) {
// this host is not injected by cordvtn or a stale host, remove it
hostProvider.hostVanished(existingHost.id());
}
......@@ -273,15 +281,18 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
// event so that the flow rule population for this host can happen.
// This ensures refreshing data plane by pushing network config always make
// the data plane synced.
Set<IpAddress> fixedIp = Sets.newHashSet(vPort.fixedIps().values());
Set<IpAddress> fixedIps = osPort.getFixedIps().stream()
.map(ip -> IpAddress.valueOf(ip.getIpAddress()))
.collect(Collectors.toSet());
DefaultAnnotations.Builder annotations = DefaultAnnotations.builder()
.set(SERVICE_ID, vPort.networkId())
.set(OPENSTACK_PORT_ID, vPort.id())
.set(SERVICE_ID, osPort.getNetworkId())
.set(OPENSTACK_PORT_ID, osPort.getId())
.set(DATA_PLANE_IP, node.dpIp().ip().toString())
.set(DATA_PLANE_INTF, node.dpIntf())
.set(CREATED_TIME, String.valueOf(System.currentTimeMillis()));
String serviceVlan = getServiceVlan(vPort);
String serviceVlan = getServiceVlan(osPort);
if (serviceVlan != null) {
annotations.set(S_TAG, serviceVlan);
}
......@@ -290,7 +301,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
mac,
VlanId.NONE,
new HostLocation(connectPoint, System.currentTimeMillis()),
fixedIp,
fixedIps,
annotations.build());
hostProvider.hostDetected(hostId, hostDesc, false);
......@@ -365,21 +376,30 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
* @return map of ip and mac address, or empty map
*/
private Map<IpAddress, MacAddress> getSubscriberGateways(Host vSgHost) {
String vPortId = vSgHost.annotations().value(OPENSTACK_PORT_ID);
checkNotNull(osAccess, "OpenStack access is not set");
String osPortId = vSgHost.annotations().value(OPENSTACK_PORT_ID);
String serviceVlan = vSgHost.annotations().value(S_TAG);
OpenstackPort vPort = openstackService.port(vPortId);
if (vPort == null) {
log.warn("Failed to get OpenStack port {} for VM {}", vPortId, vSgHost.id());
OSClient osClient = OSFactory.clientFromAccess(osAccess);
org.openstack4j.model.network.Port osPort = osClient.networking().port().get(osPortId);
if (osPort == null) {
log.warn("Failed to get OpenStack port {} for VM {}", osPortId, vSgHost.id());
return Maps.newHashMap();
}
if (!serviceVlan.equals(getServiceVlan(vPort))) {
log.error("Host({}) s-tag does not match with vPort s-tag", vSgHost.id());
if (!serviceVlan.equals(getServiceVlan(osPort))) {
log.error("Host({}) s-tag does not match with OpenStack port s-tag", vSgHost.id());
return Maps.newHashMap();
}
return vPort.allowedAddressPairs();
Map<IpAddress, MacAddress> addressPairs = Maps.newHashMap();
osPort.getAllowedAddressPairs()
.stream().forEach(p -> addressPairs.put(
IpAddress.valueOf(p.getIpAddress()),
MacAddress.valueOf(p.getMacAddress())));
return addressPairs;
}
/**
......@@ -389,16 +409,20 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
* @return cord service, or null if it fails to get network from OpenStack
*/
private CordService getCordService(CordServiceId serviceId) {
OpenstackNetwork vNet = openstackService.network(serviceId.id());
if (vNet == null) {
checkNotNull(osAccess, "OpenStack access is not set");
OSClient osClient = OSFactory.clientFromAccess(osAccess);
Network osNet = osClient.networking().network().get(serviceId.id());
if (osNet == null) {
log.warn("Couldn't find OpenStack network for service {}", serviceId.id());
return null;
}
OpenstackSubnet subnet = vNet.subnets().stream()
// here it assumes all cord service networks has only one subnet
Subnet osSubnet = osNet.getNeutronSubnets().stream()
.findFirst()
.orElse(null);
if (subnet == null) {
if (osSubnet == null) {
log.warn("Couldn't find OpenStack subnet for service {}", serviceId.id());
return null;
}
......@@ -406,39 +430,40 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
Set<CordServiceId> tServices = Sets.newHashSet();
// TODO get tenant services from XOS
Map<Host, IpAddress> hosts = getHostsWithOpenstackNetwork(vNet)
Map<Host, IpAddress> hosts = getHostsWithOpenstackNetwork(osNet)
.stream()
.collect(Collectors.toMap(host -> host, this::getTunnelIp));
return new CordService(vNet, subnet, hosts, tServices);
return new CordService(osNet, osSubnet, hosts, tServices);
}
/**
* Returns CordService by OpenStack network.
*
* @param vNet OpenStack network
* @param osNet OpenStack network
* @return cord service
*/
private CordService getCordService(OpenstackNetwork vNet) {
checkNotNull(vNet);
private CordService getCordService(Network osNet) {
checkNotNull(osNet);
CordServiceId serviceId = CordServiceId.of(vNet.id());
OpenstackSubnet subnet = vNet.subnets().stream()
CordServiceId serviceId = CordServiceId.of(osNet.getId());
// here it assumes all cord service networks has only one subnet
Subnet osSubnet = osNet.getNeutronSubnets().stream()
.findFirst()
.orElse(null);
if (subnet == null) {
log.warn("Couldn't find OpenStack subnet for service {}", serviceId);
if (osSubnet == null) {
log.warn("Couldn't find OpenStack subnet for service {}", serviceId.id());
return null;
}
Set<CordServiceId> tServices = Sets.newHashSet();
// TODO get tenant services from XOS
Map<Host, IpAddress> hosts = getHostsWithOpenstackNetwork(vNet)
Map<Host, IpAddress> hosts = getHostsWithOpenstackNetwork(osNet)
.stream()
.collect(Collectors.toMap(host -> host, this::getTunnelIp));
return new CordService(vNet, subnet, hosts, tServices);
return new CordService(osNet, osSubnet, hosts, tServices);
}
/**
......@@ -465,14 +490,15 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
/**
* Returns s-tag from a given OpenStack port.
*
* @param vPort openstack port
* @param osPort openstack port
* @return s-tag string
*/
private String getServiceVlan(OpenstackPort vPort) {
checkNotNull(vPort);
private String getServiceVlan(org.openstack4j.model.network.Port osPort) {
checkNotNull(osPort);
if (vPort.name() != null && vPort.name().startsWith(S_TAG)) {
return vPort.name().split("-")[1];
String portName = osPort.getName();
if (portName != null && portName.startsWith(S_TAG)) {
return portName.split("-")[1];
} else {
return null;
}
......@@ -491,15 +517,15 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
/**
* Returns hosts associated with a given OpenStack network.
*
* @param vNet openstack network
* @param osNet openstack network
* @return set of hosts
*/
private Set<Host> getHostsWithOpenstackNetwork(OpenstackNetwork vNet) {
checkNotNull(vNet);
private Set<Host> getHostsWithOpenstackNetwork(Network osNet) {
checkNotNull(osNet);
String vNetId = vNet.id();
String osNetId = osNet.getId();
return StreamSupport.stream(hostService.getHosts().spliterator(), false)
.filter(host -> Objects.equals(vNetId, getServiceId(host)))
.filter(host -> Objects.equals(osNetId, getServiceId(host)))
.collect(Collectors.toSet());
}
......@@ -529,21 +555,24 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
* @param host host
*/
private void serviceVmAdded(Host host) {
checkNotNull(osAccess, "OpenStack access is not set");
String serviceVlan = host.annotations().value(S_TAG);
if (serviceVlan != null) {
virtualSubscriberGatewayAdded(host, serviceVlan);
}
String vNetId = host.annotations().value(SERVICE_ID);
if (vNetId == null) {
String osNetId = host.annotations().value(SERVICE_ID);
if (osNetId == null) {
// ignore this host, it is not the service VM, or it's a vSG
return;
}
OpenstackNetwork vNet = openstackService.network(vNetId);
if (vNet == null) {
OSClient osClient = OSFactory.clientFromAccess(osAccess);
Network osNet = osClient.networking().network().get(osNetId);
if (osNet == null) {
log.warn("Failed to get OpenStack network {} for VM {}.",
vNetId, host.id());
osNetId, host.id());
return;
}
......@@ -551,7 +580,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
host.mac(),
host.ipAddresses().stream().findFirst().get());
CordService service = getCordService(vNet);
CordService service = getCordService(osNet);
if (service == null) {
return;
}
......@@ -573,7 +602,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
}
registerDhcpLease(host, service);
ruleInstaller.populateBasicConnectionRules(host, getTunnelIp(host), vNet);
ruleInstaller.populateBasicConnectionRules(host, getTunnelIp(host), osNet);
}
/**
......@@ -582,21 +611,24 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
* @param host host
*/
private void serviceVmRemoved(Host host) {
checkNotNull(osAccess, "OpenStack access is not set");
String serviceVlan = host.annotations().value(S_TAG);
if (serviceVlan != null) {
virtualSubscriberGatewayRemoved(host);
}
String vNetId = host.annotations().value(SERVICE_ID);
if (vNetId == null) {
String osNetId = host.annotations().value(SERVICE_ID);
if (osNetId == null) {
// ignore it, it's not the service VM or it's a vSG
return;
}
OpenstackNetwork vNet = openstackService.network(vNetId);
if (vNet == null) {
OSClient osClient = OSFactory.clientFromAccess(osAccess);
Network osNet = osClient.networking().network().get(osNetId);
if (osNet == null) {
log.warn("Failed to get OpenStack network {} for VM {}",
vNetId, host.id());
osNetId, host.id());
return;
}
......@@ -607,7 +639,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
ruleInstaller.removeBasicConnectionRules(host);
dhcpService.removeStaticMapping(host.mac());
CordService service = getCordService(vNet);
CordService service = getCordService(osNet);
if (service == null) {
return;
}
......@@ -617,7 +649,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
ruleInstaller.removeManagementNetworkRules(host, service);
break;
case PRIVATE:
if (getHostsWithOpenstackNetwork(vNet).isEmpty()) {
if (getHostsWithOpenstackNetwork(osNet).isEmpty()) {
arpProxy.removeGateway(service.serviceIp());
}
case PUBLIC:
......@@ -723,13 +755,38 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
.stream()
.forEach(entry -> {
arpProxy.addGateway(entry.getKey(), entry.getValue());
log.info("Added public gateway IP {}, MAC {}",
log.debug("Added public gateway IP {}, MAC {}",
entry.getKey().toString(), entry.getValue().toString());
});
// TODO notice gateway MAC change to VMs holds this gateway IP
}
/**
* Sets OpenStack access information.
* Access is the entity returned when authenticated and provides a singleton client
* between multiple threads.
*
* @param osConfig openstack config
*/
private void setOpenstackAccess(CordVtnConfig.OpenStackConfig osConfig) {
log.debug("Get OpenStack access with Endpoint: {} Tenant: {} User: {} Passwd: {}",
osConfig.endpoint(),
osConfig.tenant(),
osConfig.user(),
osConfig.password());
try {
osAccess = OSFactory.builder()
.endpoint(osConfig.endpoint())
.credentials(osConfig.user(), osConfig.password())
.tenantName(osConfig.tenant())
.authenticate()
.getAccess();
} catch (AuthenticationException e) {
log.error("Failed to get OpenStack Access");
}
}
/**
* Updates configurations.
*/
private void readConfiguration() {
......@@ -739,6 +796,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro
return;
}
setOpenstackAccess(config.openstackConfig());
setPrivateGatewayMac(config.privateGatewayMac());
setPublicGatewayMac(config.publicGateways());
}
......
......@@ -75,8 +75,8 @@ import org.onosproject.net.group.GroupBuckets;
import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.group.GroupKey;
import org.onosproject.net.group.GroupService;
import org.onosproject.openstackinterface.OpenstackNetwork;
import org.onosproject.openstackinterface.OpenstackSubnet;
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.Subnet;
import org.slf4j.Logger;
import java.util.ArrayList;
......@@ -190,30 +190,31 @@ public class CordVtnRuleInstaller {
*
* @param host host
* @param tunnelIp tunnel ip
* @param vNet openstack network
* @param osNet openstack network
*/
public void populateBasicConnectionRules(Host host, IpAddress tunnelIp, OpenstackNetwork vNet) {
public void populateBasicConnectionRules(Host host, IpAddress tunnelIp, Network osNet) {
checkNotNull(host);
checkNotNull(vNet);
checkNotNull(osNet);
DeviceId deviceId = host.location().deviceId();
PortNumber inPort = host.location().port();
MacAddress dstMac = host.mac();
IpAddress hostIp = host.ipAddresses().stream().findFirst().get();
long tunnelId = Long.parseLong(vNet.segmentId());
long tunnelId = Long.parseLong(osNet.getProviderSegID());
OpenstackSubnet subnet = vNet.subnets().stream()
Subnet osSubnet = osNet.getNeutronSubnets().stream()
.findFirst()
.orElse(null);
if (subnet == null) {
if (osSubnet == null) {
log.error("Failed to get subnet for {}", host.id());
return;
}
Ip4Prefix cidr = Ip4Prefix.valueOf(osSubnet.getCidr());
populateLocalInPortRule(deviceId, inPort, hostIp);
populateDirectAccessRule(Ip4Prefix.valueOf(subnet.cidr()), Ip4Prefix.valueOf(subnet.cidr()));
populateServiceIsolationRule(Ip4Prefix.valueOf(subnet.cidr()));
populateDirectAccessRule(cidr, cidr);
populateServiceIsolationRule(cidr);
populateDstIpRule(deviceId, inPort, dstMac, hostIp, tunnelId, tunnelIp);
populateTunnelInRule(deviceId, inPort, dstMac, tunnelId);
}
......
......@@ -47,6 +47,10 @@
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.onosproject.cordvtn.rest.CordVtnWebApplication</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.disableAutoDiscovery</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
......