blob: 8693e61a72b0448fe67ec8234aca76f5a02af0a1 [file] [log] [blame]
// 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 org.apache.cloudstack.network.contrail.model;
import java.io.IOException;
import net.juniper.contrail.api.ApiConnector;
import net.juniper.contrail.api.ObjectReference;
import net.juniper.contrail.api.types.InstanceIp;
import net.juniper.contrail.api.types.VirtualMachineInterface;
import net.juniper.contrail.api.types.VirtualNetwork;
import org.apache.log4j.Logger;
import com.cloud.exception.InternalErrorException;
public class InstanceIpModel extends ModelObjectBase {
private static final Logger s_logger = Logger.getLogger(InstanceIpModel.class);
private String _name;
private String _uuid;
private String _ipAddress;
private VMInterfaceModel _vmiModel;
public InstanceIpModel(String vmName, int deviceId) {
_name = vmName + '-' + deviceId;
}
public void addToVMInterface(VMInterfaceModel vmiModel) {
_vmiModel = vmiModel;
if (vmiModel != null) {
vmiModel.addSuccessor(this);
s_logger.debug("vmiModel has " + vmiModel.successors().size() + " IP addresses");
}
}
@Override
public int compareTo(ModelObject o) {
InstanceIpModel other;
try {
other = (InstanceIpModel)o;
} catch (ClassCastException ex) {
String clsname = o.getClass().getName();
return InstanceIpModel.class.getName().compareTo(clsname);
}
return _name.compareTo(other._name);
}
@Override
public void delete(ModelController controller) throws IOException {
ApiConnector api = controller.getApiAccessor();
if (_uuid != null) {
api.delete(InstanceIp.class, _uuid);
}
_uuid = null;
}
@Override
public void destroy(ModelController controller) throws IOException {
}
public String getAddress() {
return _ipAddress;
}
public String getName() {
return _name;
}
public void setAddress(String ipaddress) {
_ipAddress = ipaddress;
}
@Override
public void update(ModelController controller) throws InternalErrorException, IOException {
assert _vmiModel != null;
ApiConnector api = controller.getApiAccessor();
VirtualNetworkModel vnModel = _vmiModel.getVirtualNetworkModel();
assert vnModel != null;
VirtualMachineInterface vmi = _vmiModel.getVMInterface();
VirtualNetwork vnet = vnModel.getVirtualNetwork();
if (vnet == null) {
vnet = (VirtualNetwork)api.findById(VirtualNetwork.class, _vmiModel.getNetworkUuid());
}
String ipid = api.findByName(InstanceIp.class, null, _name);
if (ipid == null) {
InstanceIp ip_obj = new InstanceIp();
ip_obj.setName(_name);
ip_obj.setVirtualNetwork(vnet);
if (_ipAddress != null) {
ip_obj.setAddress(_ipAddress);
}
ip_obj.setVirtualMachineInterface(vmi);
if (!api.create(ip_obj)) {
throw new InternalErrorException("Unable to create instance-ip " + _name);
}
api.read(ip_obj);
_uuid = ip_obj.getUuid();
if (_ipAddress == null) {
if (!api.read(ip_obj)) {
throw new InternalErrorException("Unable to read instance-ip " + _name);
}
}
_ipAddress = ip_obj.getAddress();
} else {
// Ensure that the instance-ip has the correct value and is pointing at the VMI.
InstanceIp ip_obj = (InstanceIp)api.findById(InstanceIp.class, ipid);
if (ip_obj == null) {
throw new InternalErrorException("Unable to read instance-ip " + _name);
}
boolean update = false;
String ipnet_id = ObjectReference.getReferenceListUuid(ip_obj.getVirtualNetwork());
if (ipnet_id == null || !ipnet_id.equals(_vmiModel.getNetworkUuid())) {
ip_obj.setVirtualNetwork(vnet);
update = true;
}
if (_ipAddress != null && !ip_obj.getAddress().equals(_ipAddress)) {
ip_obj.setAddress(_ipAddress);
update = true;
}
String vmi_id = ObjectReference.getReferenceListUuid(ip_obj.getVirtualMachineInterface());
if (vmi_id == null || !vmi_id.equals(_vmiModel.getUuid())) {
if (vmi != null) {
ip_obj.setVirtualMachineInterface(vmi);
update = true;
}
}
if (update && !api.update(ip_obj)) {
throw new InternalErrorException("Unable to update instance-ip: " + ip_obj.getName());
}
api.read(ip_obj);
_uuid = ip_obj.getUuid();
_ipAddress = ip_obj.getAddress();
}
}
@Override
public boolean verify(ModelController controller) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean compare(ModelController controller, ModelObject current) {
// TODO Auto-generated method stub
return false;
}
}