mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-9776: extra DHCP options support for Nuage VSP
Co-Authored-By: Frank Maximus <frank.maximus@nuagenetworks.net> Co-Authored-By: Prashanth Manthena <prashanth.manthena@nuagenetworks.net> Co-Authored-By: Raf Smeets <raf.smeets@nuagenetworks.net> Bug: https://issues.apache.org/jira/browse/CLOUDSTACK-9776 Design-Doc: https://cwiki.apache.org/confluence/display/CLOUDSTACK/CloudStack+extra+DHCP+option+support
This commit is contained in:
parent
421f1072d5
commit
77864992fe
@ -47,7 +47,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
|
||||
private static List<Service> supportedServices = new ArrayList<Service>();
|
||||
|
||||
public static final Service Vpn = new Service("Vpn", Capability.SupportedVpnProtocols, Capability.VpnTypes);
|
||||
public static final Service Dhcp = new Service("Dhcp");
|
||||
public static final Service Dhcp = new Service("Dhcp", Capability.ExtraDhcpOptions);
|
||||
public static final Service Dns = new Service("Dns", Capability.AllowDnsSuffixModification);
|
||||
public static final Service Gateway = new Service("Gateway");
|
||||
public static final Service Firewall = new Service("Firewall", Capability.SupportedProtocols, Capability.MultipleIps, Capability.TrafficStatistics,
|
||||
@ -218,6 +218,7 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
|
||||
public static final Capability RegionLevelVpc = new Capability("RegionLevelVpc");
|
||||
public static final Capability NoVlan = new Capability("NoVlan");
|
||||
public static final Capability PublicAccess = new Capability("PublicAccess");
|
||||
public static final Capability ExtraDhcpOptions = new Capability("ExtraDhcpOptions");
|
||||
|
||||
private final String name;
|
||||
|
||||
|
||||
@ -16,6 +16,8 @@
|
||||
// under the License.
|
||||
package com.cloud.network.element;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
@ -33,4 +35,6 @@ public interface DhcpServiceProvider extends NetworkElement {
|
||||
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
|
||||
|
||||
boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException;
|
||||
|
||||
boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions);
|
||||
}
|
||||
|
||||
41
api/src/com/cloud/vm/NicExtraDhcpOption.java
Normal file
41
api/src/com/cloud/vm/NicExtraDhcpOption.java
Normal file
@ -0,0 +1,41 @@
|
||||
// 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.vm;
|
||||
|
||||
import org.apache.cloudstack.api.Identity;
|
||||
import org.apache.cloudstack.api.InternalIdentity;
|
||||
|
||||
public interface NicExtraDhcpOption extends InternalIdentity, Identity {
|
||||
|
||||
/**
|
||||
* Returns the nic id for which the DHCP option applies
|
||||
* @return nic id
|
||||
*/
|
||||
long getNicId();
|
||||
|
||||
/**
|
||||
* Returns the DHCP option code
|
||||
* @return
|
||||
*/
|
||||
int getCode();
|
||||
|
||||
/**
|
||||
* Returns the Dhcp value
|
||||
* @return
|
||||
*/
|
||||
String getValue();
|
||||
}
|
||||
@ -194,6 +194,8 @@ public interface UserVmService {
|
||||
* @param memory
|
||||
* @param cpuNumber
|
||||
* @param customId
|
||||
* @param dhcpOptionMap
|
||||
* - Maps the dhcp option code and the dhcp value to the network uuid
|
||||
* @return UserVm object if successful.
|
||||
*
|
||||
* @throws InsufficientCapacityException
|
||||
@ -208,7 +210,7 @@ public interface UserVmService {
|
||||
UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> securityGroupIdList,
|
||||
Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod,
|
||||
String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameter, String customId) throws InsufficientCapacityException,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameter, String customId, Map<String, Map<Integer, String>> dhcpOptionMap) throws InsufficientCapacityException,
|
||||
ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
|
||||
|
||||
/**
|
||||
@ -267,6 +269,8 @@ public interface UserVmService {
|
||||
* @param memory
|
||||
* @param cpuNumber
|
||||
* @param customId
|
||||
* @param dhcpOptionMap
|
||||
* - Maps the dhcp option code and the dhcp value to the network uuid
|
||||
* @return UserVm object if successful.
|
||||
*
|
||||
* @throws InsufficientCapacityException
|
||||
@ -281,7 +285,7 @@ public interface UserVmService {
|
||||
UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList,
|
||||
List<Long> securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor,
|
||||
HTTPMethod httpmethod, String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId) throws InsufficientCapacityException,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap) throws InsufficientCapacityException,
|
||||
ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
|
||||
|
||||
/**
|
||||
@ -338,6 +342,8 @@ public interface UserVmService {
|
||||
* @param memory
|
||||
* @param cpuNumber
|
||||
* @param customId
|
||||
* @param dhcpOptionMap
|
||||
* - Map that maps the DhcpOption code and their value on the Network uuid
|
||||
* @return UserVm object if successful.
|
||||
*
|
||||
* @throws InsufficientCapacityException
|
||||
@ -352,7 +358,7 @@ public interface UserVmService {
|
||||
UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList, Account owner,
|
||||
String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData,
|
||||
String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List<Long> affinityGroupIdList,
|
||||
Map<String, String> customParameters, String customId)
|
||||
Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap)
|
||||
|
||||
throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
|
||||
|
||||
|
||||
@ -88,6 +88,9 @@ public class ApiConstants {
|
||||
public static final String UTILIZATION = "utilization";
|
||||
public static final String DRIVER = "driver";
|
||||
public static final String ROOT_DISK_SIZE = "rootdisksize";
|
||||
public static final String DHCP_OPTIONS_NETWORK_LIST = "dhcpoptionsnetworklist";
|
||||
public static final String DHCP_OPTIONS = "dhcpoptions";
|
||||
public static final String DHCP_PREFIX = "dhcp:";
|
||||
public static final String DISPLAY_NAME = "displayname";
|
||||
public static final String DISPLAY_NETWORK = "displaynetwork";
|
||||
public static final String DISPLAY_NIC = "displaynic";
|
||||
@ -111,6 +114,10 @@ public class ApiConstants {
|
||||
public static final String END_PORT = "endport";
|
||||
public static final String ENTRY_TIME = "entrytime";
|
||||
public static final String EXPIRES = "expires";
|
||||
public static final String EXTRA_DHCP_OPTION = "extradhcpoption";
|
||||
public static final String EXTRA_DHCP_OPTION_NAME = "extradhcpoptionname";
|
||||
public static final String EXTRA_DHCP_OPTION_CODE = "extradhcpoptioncode";
|
||||
public static final String EXTRA_DHCP_OPTION_VALUE = "extradhcpvalue";
|
||||
public static final String FENCE = "fence";
|
||||
public static final String FETCH_LATEST = "fetchlatest";
|
||||
public static final String FIRSTNAME = "firstname";
|
||||
@ -242,6 +249,7 @@ public class ApiConstants {
|
||||
public static final String SCHEDULE = "schedule";
|
||||
public static final String SCOPE = "scope";
|
||||
public static final String SECRET_KEY = "usersecretkey";
|
||||
public static final String SECONDARY_IP = "secondaryip";
|
||||
public static final String SINCE = "since";
|
||||
public static final String KEY = "key";
|
||||
public static final String SEARCH_BASE = "searchbase";
|
||||
@ -309,6 +317,7 @@ public class ApiConstants {
|
||||
public static final String REMOVE_VLAN = "removevlan";
|
||||
public static final String VLAN_ID = "vlanid";
|
||||
public static final String ISOLATED_PVLAN = "isolatedpvlan";
|
||||
public static final String ISOLATION_URI = "isolationuri";
|
||||
public static final String VM_AVAILABLE = "vmavailable";
|
||||
public static final String VM_LIMIT = "vmlimit";
|
||||
public static final String VM_TOTAL = "vmtotal";
|
||||
@ -410,6 +419,7 @@ public class ApiConstants {
|
||||
public static final String CAPACITY_IOPS = "capacityiops";
|
||||
public static final String NETWORK_SPEED = "networkspeed";
|
||||
public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange";
|
||||
public static final String BROADCAST_URI = "broadcasturi";
|
||||
public static final String ISOLATION_METHOD = "isolationmethod";
|
||||
public static final String ISOLATION_METHODS = "isolationmethods";
|
||||
public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid";
|
||||
@ -536,6 +546,8 @@ public class ApiConstants {
|
||||
public static final String NICIRA_NVP_DEVICE_NAME = "niciradevicename";
|
||||
public static final String NICIRA_NVP_GATEWAYSERVICE_UUID = "l3gatewayserviceuuid";
|
||||
public static final String NICIRA_NVP_L2_GATEWAYSERVICE_UUID = "l2gatewayserviceuuid";
|
||||
public static final String NSX_LOGICAL_SWITCH = "nsxlogicalswitch";
|
||||
public static final String NSX_LOGICAL_SWITCH_PORT = "nsxlogicalswitchport";
|
||||
public static final String S3_ACCESS_KEY = "accesskey";
|
||||
public static final String S3_SECRET_KEY = "secretkey";
|
||||
public static final String S3_END_POINT = "endpoint";
|
||||
@ -665,6 +677,7 @@ public class ApiConstants {
|
||||
public static final String SUPPORTS_PUBLIC_ACCESS = "supportspublicaccess";
|
||||
public static final String REGION_LEVEL_VPC = "regionlevelvpc";
|
||||
public static final String STRECHED_L2_SUBNET = "strechedl2subnet";
|
||||
public static final String NETWORK_NAME = "networkname";
|
||||
public static final String NETWORK_SPANNED_ZONES = "zonesnetworkspans";
|
||||
public static final String METADATA = "metadata";
|
||||
public static final String PHYSICAL_SIZE = "physicalsize";
|
||||
|
||||
@ -17,7 +17,10 @@
|
||||
package org.apache.cloudstack.api.command.user.vm;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
@ -39,6 +42,7 @@ import com.cloud.event.EventTypes;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.net.Dhcp;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
||||
@ -65,6 +69,10 @@ public class AddNicToVMCmd extends BaseAsyncCmd {
|
||||
@Parameter(name = ApiConstants.MAC_ADDRESS, type = CommandType.STRING, description = "Mac Address for the new network")
|
||||
private String macaddr;
|
||||
|
||||
@Parameter(name = ApiConstants.DHCP_OPTIONS, type = CommandType.MAP, description = "DHCP options which are passed to the nic"
|
||||
+ " Example: dhcpoptions[0].dhcp:114=url&dhcpoptions[0].dhcp:66=www.test.com")
|
||||
private Map dhcpOptions;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
@ -125,6 +133,28 @@ public class AddNicToVMCmd extends BaseAsyncCmd {
|
||||
return vm.getAccountId();
|
||||
}
|
||||
|
||||
public Map<Integer, String> getDhcpOptionsMap() {
|
||||
Map<Integer, String> dhcpOptionsMap = new HashMap<>();
|
||||
if (dhcpOptions != null && !dhcpOptions.isEmpty()) {
|
||||
|
||||
Collection<Map<String, String>> paramsCollection = this.dhcpOptions.values();
|
||||
for(Map<String, String> dhcpNetworkOptions : paramsCollection) {
|
||||
for (String key : dhcpNetworkOptions.keySet()) {
|
||||
if (key.startsWith(ApiConstants.DHCP_PREFIX)) {
|
||||
int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, ""));
|
||||
dhcpOptionsMap.put(dhcpOptionValue, dhcpNetworkOptions.get(key));
|
||||
} else {
|
||||
Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key);
|
||||
dhcpOptionsMap.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return dhcpOptionsMap;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
CallContext.current().setEventDetails("Vm Id: " + getVmId() + " Network Id: " + getNetworkId());
|
||||
|
||||
@ -59,6 +59,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Network.IpAddresses;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.net.Dhcp;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
||||
@ -187,6 +188,10 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG
|
||||
@Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin })
|
||||
private String deploymentPlanner;
|
||||
|
||||
@Parameter(name = ApiConstants.DHCP_OPTIONS_NETWORK_LIST, type = CommandType.MAP, description = "DHCP options which are passed to the VM on start up"
|
||||
+ " Example: dhcpoptionsnetworklist[0].dhcp:114=url&dhcpoptionsetworklist[0].networkid=networkid&dhcpoptionsetworklist[0].dhcp:66=www.test.com")
|
||||
private Map dhcpOptionsNetworkList;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
@ -407,6 +412,37 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG
|
||||
return keyboard;
|
||||
}
|
||||
|
||||
public Map<String, Map<Integer, String>> getDhcpOptionsMap() {
|
||||
Map<String, Map<Integer, String>> dhcpOptionsMap = new HashMap<>();
|
||||
if (dhcpOptionsNetworkList != null && !dhcpOptionsNetworkList.isEmpty()) {
|
||||
|
||||
Collection<Map<String, String>> paramsCollection = this.dhcpOptionsNetworkList.values();
|
||||
for(Map<String, String> dhcpNetworkOptions : paramsCollection) {
|
||||
String networkId = dhcpNetworkOptions.get(ApiConstants.NETWORK_ID);
|
||||
|
||||
if(networkId == null) {
|
||||
throw new IllegalArgumentException("No networkid specified when providing extra dhcp options.");
|
||||
}
|
||||
|
||||
Map<Integer, String> dhcpOptionsForNetwork = new HashMap<>();
|
||||
dhcpOptionsMap.put(networkId, dhcpOptionsForNetwork);
|
||||
|
||||
for (String key : dhcpNetworkOptions.keySet()) {
|
||||
if (key.startsWith(ApiConstants.DHCP_PREFIX)) {
|
||||
int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, ""));
|
||||
dhcpOptionsForNetwork.put(dhcpOptionValue, dhcpNetworkOptions.get(key));
|
||||
} else if (!key.equals(ApiConstants.NETWORK_ID)){
|
||||
Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key);
|
||||
dhcpOptionsForNetwork.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return dhcpOptionsMap;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
package org.apache.cloudstack.api.command.user.vm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -40,6 +41,7 @@ import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.net.Dhcp;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
||||
@APICommand(name = "updateVirtualMachine", description="Updates properties of a virtual machine. The VM has to be stopped and restarted for the " +
|
||||
@ -121,6 +123,11 @@ public class UpdateVMCmd extends BaseCustomIdCmd implements SecurityGroupAction
|
||||
description = "optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)")
|
||||
private Boolean cleanupDetails;
|
||||
|
||||
@Parameter(name = ApiConstants.DHCP_OPTIONS_NETWORK_LIST, type = CommandType.MAP, description = "DHCP options which are passed to the VM on start up"
|
||||
+ " Example: dhcpoptionsnetworklist[0].dhcp:114=url&dhcpoptionsetworklist[0].networkid=networkid&dhcpoptionsetworklist[0].dhcp:66=www.test.com")
|
||||
private Map dhcpOptionsNetworkList;
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
@ -182,6 +189,37 @@ public class UpdateVMCmd extends BaseCustomIdCmd implements SecurityGroupAction
|
||||
return cleanupDetails == null ? false : cleanupDetails.booleanValue();
|
||||
}
|
||||
|
||||
public Map<String, Map<Integer, String>> getDhcpOptionsMap() {
|
||||
Map<String, Map<Integer, String>> dhcpOptionsMap = new HashMap<>();
|
||||
if (dhcpOptionsNetworkList != null && !dhcpOptionsNetworkList.isEmpty()) {
|
||||
|
||||
Collection<Map<String, String>> paramsCollection = this.dhcpOptionsNetworkList.values();
|
||||
for(Map<String, String> dhcpNetworkOptions : paramsCollection) {
|
||||
String networkId = dhcpNetworkOptions.get(ApiConstants.NETWORK_ID);
|
||||
|
||||
if(networkId == null) {
|
||||
throw new IllegalArgumentException("No networkid specified when providing extra dhcp options.");
|
||||
}
|
||||
|
||||
Map<Integer, String> dhcpOptionsForNetwork = new HashMap<>();
|
||||
dhcpOptionsMap.put(networkId, dhcpOptionsForNetwork);
|
||||
|
||||
for (String key : dhcpNetworkOptions.keySet()) {
|
||||
if (key.startsWith(ApiConstants.DHCP_PREFIX)) {
|
||||
int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, ""));
|
||||
dhcpOptionsForNetwork.put(dhcpOptionValue, dhcpNetworkOptions.get(key));
|
||||
} else if (!key.equals(ApiConstants.NETWORK_ID)) {
|
||||
Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key);
|
||||
dhcpOptionsForNetwork.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return dhcpOptionsMap;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
@ -0,0 +1,99 @@
|
||||
// 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.api.response;
|
||||
|
||||
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseResponse;
|
||||
import org.apache.cloudstack.api.EntityReference;
|
||||
|
||||
import com.cloud.serializer.Param;
|
||||
|
||||
@EntityReference(value = NicExtraDhcpOptionResponse.class)
|
||||
public class NicExtraDhcpOptionResponse extends BaseResponse {
|
||||
|
||||
@SerializedName(ApiConstants.ID)
|
||||
@Param(description = "the ID of the extra dhcp option")
|
||||
private String id;
|
||||
|
||||
@SerializedName(ApiConstants.NIC_ID)
|
||||
@Param(description = "the ID of the nic")
|
||||
private String nicId;
|
||||
|
||||
@SerializedName(ApiConstants.EXTRA_DHCP_OPTION_NAME)
|
||||
@Param(description = "the name of the extra DHCP option")
|
||||
private String codeName;
|
||||
|
||||
@SerializedName(ApiConstants.EXTRA_DHCP_OPTION_CODE)
|
||||
@Param(description = "the extra DHCP option code")
|
||||
private int code;
|
||||
|
||||
@SerializedName(ApiConstants.EXTRA_DHCP_OPTION_VALUE)
|
||||
@Param(description = "the extra DHCP option value")
|
||||
private String value;
|
||||
|
||||
public NicExtraDhcpOptionResponse() {
|
||||
super();
|
||||
}
|
||||
|
||||
public NicExtraDhcpOptionResponse(String codeName, int code, String value) {
|
||||
this.codeName = codeName;
|
||||
this.code = code;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getNicId() {
|
||||
return nicId;
|
||||
}
|
||||
|
||||
public void setNicId(String nicId) {
|
||||
this.nicId = nicId;
|
||||
}
|
||||
|
||||
public String getCodeName() {
|
||||
return codeName;
|
||||
}
|
||||
|
||||
public void setCodeName(String codeName) {
|
||||
this.codeName = codeName;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public void setCode(int code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@ -29,15 +29,15 @@ import java.util.List;
|
||||
@EntityReference(value = Nic.class)
|
||||
public class NicResponse extends BaseResponse {
|
||||
|
||||
@SerializedName("id")
|
||||
@SerializedName(ApiConstants.ID)
|
||||
@Param(description = "the ID of the nic")
|
||||
private String id;
|
||||
|
||||
@SerializedName("networkid")
|
||||
@SerializedName(ApiConstants.NETWORK_ID)
|
||||
@Param(description = "the ID of the corresponding network")
|
||||
private String networkId;
|
||||
|
||||
@SerializedName("networkname")
|
||||
@SerializedName(ApiConstants.NETWORK_NAME)
|
||||
@Param(description = "the name of the corresponding network")
|
||||
private String networkName;
|
||||
|
||||
@ -53,11 +53,11 @@ public class NicResponse extends BaseResponse {
|
||||
@Param(description = "the ip address of the nic")
|
||||
private String ipaddress;
|
||||
|
||||
@SerializedName("isolationuri")
|
||||
@SerializedName(ApiConstants.ISOLATION_URI)
|
||||
@Param(description = "the isolation uri of the nic")
|
||||
private String isolationUri;
|
||||
|
||||
@SerializedName("broadcasturi")
|
||||
@SerializedName(ApiConstants.BROADCAST_URI)
|
||||
@Param(description = "the broadcast uri of the nic")
|
||||
private String broadcastUri;
|
||||
|
||||
@ -73,7 +73,7 @@ public class NicResponse extends BaseResponse {
|
||||
@Param(description = "true if nic is default, false otherwise")
|
||||
private Boolean isDefault;
|
||||
|
||||
@SerializedName("macaddress")
|
||||
@SerializedName(ApiConstants.MAC_ADDRESS)
|
||||
@Param(description = "true if nic is default, false otherwise")
|
||||
private String macAddress;
|
||||
|
||||
@ -89,10 +89,14 @@ public class NicResponse extends BaseResponse {
|
||||
@Param(description = "the IPv6 address of network")
|
||||
private String ip6Address;
|
||||
|
||||
@SerializedName("secondaryip")
|
||||
@SerializedName(ApiConstants.SECONDARY_IP)
|
||||
@Param(description = "the Secondary ipv4 addr of nic")
|
||||
private List<NicSecondaryIpResponse> secondaryIps;
|
||||
|
||||
@SerializedName(ApiConstants.EXTRA_DHCP_OPTION)
|
||||
@Param(description = "the extra dhcp options on the nic", since = "4.11.0")
|
||||
private List<NicExtraDhcpOptionResponse> extraDhcpOptions;
|
||||
|
||||
@SerializedName(ApiConstants.DEVICE_ID)
|
||||
@Param(description = "device id for the network when plugged into the virtual machine", since = "4.4")
|
||||
private String deviceId;
|
||||
@ -101,11 +105,11 @@ public class NicResponse extends BaseResponse {
|
||||
@Param(description = "Id of the vm to which the nic belongs")
|
||||
private String vmId;
|
||||
|
||||
@SerializedName("nsxlogicalswitch")
|
||||
@SerializedName(ApiConstants.NSX_LOGICAL_SWITCH)
|
||||
@Param(description = "Id of the NSX Logical Switch (if NSX based), null otherwise", since="4.6.0")
|
||||
private String nsxLogicalSwitch;
|
||||
|
||||
@SerializedName("nsxlogicalswitchport")
|
||||
@SerializedName(ApiConstants.NSX_LOGICAL_SWITCH_PORT)
|
||||
@Param(description = "Id of the NSX Logical Switch Port (if NSX based), null otherwise", since="4.6.0")
|
||||
private String nsxLogicalSwitchPort;
|
||||
|
||||
@ -181,6 +185,10 @@ public class NicResponse extends BaseResponse {
|
||||
this.deviceId = deviceId;
|
||||
}
|
||||
|
||||
public void setExtraDhcpOptions(List<NicExtraDhcpOptionResponse> extraDhcpOptions) {
|
||||
this.extraDhcpOptions = extraDhcpOptions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
|
||||
@ -78,7 +78,7 @@ public interface VirtualMachineManager extends Manager {
|
||||
*/
|
||||
void allocate(String vmInstanceName, VirtualMachineTemplate template, ServiceOffering serviceOffering, DiskOfferingInfo rootDiskOfferingInfo,
|
||||
List<DiskOfferingInfo> dataDiskOfferings, LinkedHashMap<? extends Network, List<? extends NicProfile>> auxiliaryNetworks, DeploymentPlan plan,
|
||||
HypervisorType hyperType) throws InsufficientCapacityException;
|
||||
HypervisorType hyperType, Map<String, Map<Integer, String>> extraDhcpOptions) throws InsufficientCapacityException;
|
||||
|
||||
void allocate(String vmInstanceName, VirtualMachineTemplate template, ServiceOffering serviceOffering,
|
||||
LinkedHashMap<? extends Network, List<? extends NicProfile>> networkProfiles, DeploymentPlan plan, HypervisorType hyperType) throws InsufficientCapacityException;
|
||||
|
||||
@ -93,9 +93,24 @@ public interface NetworkOrchestrationService {
|
||||
boolean errorIfAlreadySetup, Long domainId, ACLType aclType, Boolean subdomainAccess, Long vpcId, Boolean isDisplayNetworkEnabled)
|
||||
throws ConcurrentOperationException;
|
||||
|
||||
void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, List<? extends NicProfile>> networks) throws InsufficientCapacityException,
|
||||
void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, List<? extends NicProfile>> networks, Map<String, Map<Integer, String>> extraDhcpOptions) throws InsufficientCapacityException,
|
||||
ConcurrentOperationException;
|
||||
|
||||
/**
|
||||
* configures the provided dhcp options on the given nic.
|
||||
* @param network of the nic
|
||||
* @param nicId
|
||||
* @param extraDhcpOptions
|
||||
*/
|
||||
void configureExtraDhcpOptions(Network network, long nicId, Map<Integer, String> extraDhcpOptions);
|
||||
|
||||
/**
|
||||
* configures dhcp options on the given nic.
|
||||
* @param network of the nic
|
||||
* @param nicId
|
||||
*/
|
||||
void configureExtraDhcpOptions(Network network, long nicId);
|
||||
|
||||
void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException,
|
||||
ResourceUnavailableException;
|
||||
|
||||
@ -112,6 +127,8 @@ public interface NetworkOrchestrationService {
|
||||
Pair<? extends NetworkGuru, ? extends Network> implementNetwork(long networkId, DeployDestination dest, ReservationContext context)
|
||||
throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
|
||||
|
||||
Map<Integer, String> getExtraDhcpOptions(long nicId);
|
||||
|
||||
/**
|
||||
* prepares vm nic change for migration
|
||||
*
|
||||
@ -158,6 +175,8 @@ public interface NetworkOrchestrationService {
|
||||
|
||||
boolean reallocate(VirtualMachineProfile vm, DataCenterDeployment dest) throws InsufficientCapacityException, ConcurrentOperationException;
|
||||
|
||||
void saveExtraDhcpOptions(String networkUuid, Long nicId, Map<String, Map<Integer, String>> extraDhcpOptionMap);
|
||||
|
||||
/**
|
||||
* @param requested
|
||||
* @param network
|
||||
|
||||
@ -65,14 +65,14 @@ public interface OrchestrationService {
|
||||
@QueryParam("cpu") int cpu, @QueryParam("speed") int speed, @QueryParam("ram") long memory, @QueryParam("disk-size") Long diskSize,
|
||||
@QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags,
|
||||
@QueryParam("network-nic-map") Map<String, NicProfile> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan,
|
||||
@QueryParam("root-disk-size") Long rootDiskSize) throws InsufficientCapacityException;
|
||||
@QueryParam("root-disk-size") Long rootDiskSize, @QueryParam("extra-dhcp-option-map") Map<String, Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException;
|
||||
|
||||
@POST
|
||||
VirtualMachineEntity createVirtualMachineFromScratch(@QueryParam("id") String id, @QueryParam("owner") String owner, @QueryParam("iso-id") String isoId,
|
||||
@QueryParam("host-name") String hostName, @QueryParam("display-name") String displayName, @QueryParam("hypervisor") String hypervisor,
|
||||
@QueryParam("os") String os, @QueryParam("cpu") int cpu, @QueryParam("speed") int speed, @QueryParam("ram") long memory, @QueryParam("disk-size") Long diskSize,
|
||||
@QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags,
|
||||
@QueryParam("network-nic-map") Map<String, NicProfile> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan) throws InsufficientCapacityException;
|
||||
@QueryParam("network-nic-map") Map<String, NicProfile> networkNicMap, @QueryParam("deploymentplan") DeploymentPlan plan, @QueryParam("extra-dhcp-option-map") Map<String, Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException;
|
||||
|
||||
@POST
|
||||
NetworkEntity createNetwork(String id, String name, String domainName, String cidr, String gateway);
|
||||
|
||||
@ -387,7 +387,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
||||
@DB
|
||||
public void allocate(final String vmInstanceName, final VirtualMachineTemplate template, final ServiceOffering serviceOffering,
|
||||
final DiskOfferingInfo rootDiskOfferingInfo, final List<DiskOfferingInfo> dataDiskOfferings,
|
||||
final LinkedHashMap<? extends Network, List<? extends NicProfile>> auxiliaryNetworks, final DeploymentPlan plan, final HypervisorType hyperType)
|
||||
final LinkedHashMap<? extends Network, List<? extends NicProfile>> auxiliaryNetworks, final DeploymentPlan plan, final HypervisorType hyperType, final Map<String, Map<Integer, String>> extraDhcpOptions)
|
||||
throws InsufficientCapacityException {
|
||||
|
||||
final VMInstanceVO vm = _vmDao.findVMByInstanceName(vmInstanceName);
|
||||
@ -415,7 +415,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
||||
|
||||
try {
|
||||
if (!vmProfile.getBootArgs().contains("ExternalLoadBalancerVm"))
|
||||
_networkMgr.allocate(vmProfile, auxiliaryNetworks);
|
||||
_networkMgr.allocate(vmProfile, auxiliaryNetworks, extraDhcpOptions);
|
||||
} catch (final ConcurrentOperationException e) {
|
||||
throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e);
|
||||
}
|
||||
@ -451,7 +451,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
|
||||
@Override
|
||||
public void allocate(final String vmInstanceName, final VirtualMachineTemplate template, final ServiceOffering serviceOffering,
|
||||
final LinkedHashMap<? extends Network, List<? extends NicProfile>> networks, final DeploymentPlan plan, final HypervisorType hyperType) throws InsufficientCapacityException {
|
||||
allocate(vmInstanceName, template, serviceOffering, new DiskOfferingInfo(serviceOffering), new ArrayList<DiskOfferingInfo>(), networks, plan, hyperType);
|
||||
allocate(vmInstanceName, template, serviceOffering, new DiskOfferingInfo(serviceOffering), new ArrayList<DiskOfferingInfo>(), networks, plan, hyperType, null);
|
||||
}
|
||||
|
||||
private VirtualMachineGuru getVmGuru(final VirtualMachine vm) {
|
||||
|
||||
@ -155,7 +155,7 @@ public class CloudOrchestrator implements OrchestrationService {
|
||||
@Override
|
||||
public VirtualMachineEntity createVirtualMachine(String id, String owner, String templateId, String hostName, String displayName, String hypervisor, int cpu,
|
||||
int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, NicProfile> networkNicMap, DeploymentPlan plan,
|
||||
Long rootDiskSize) throws InsufficientCapacityException {
|
||||
Long rootDiskSize, Map<String, Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException {
|
||||
|
||||
// VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks,
|
||||
// vmEntityManager);
|
||||
@ -234,14 +234,14 @@ public class CloudOrchestrator implements OrchestrationService {
|
||||
}
|
||||
|
||||
_itMgr.allocate(vm.getInstanceName(), _templateDao.findById(new Long(templateId)), computeOffering, rootDiskOfferingInfo, dataDiskOfferings, networkIpMap, plan,
|
||||
hypervisorType);
|
||||
hypervisorType, extraDhcpOptionMap);
|
||||
|
||||
return vmEntity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public VirtualMachineEntity createVirtualMachineFromScratch(String id, String owner, String isoId, String hostName, String displayName, String hypervisor, String os,
|
||||
int cpu, int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, NicProfile> networkNicMap, DeploymentPlan plan)
|
||||
int cpu, int speed, long memory, Long diskSize, List<String> computeTags, List<String> rootDiskTags, Map<String, NicProfile> networkNicMap, DeploymentPlan plan, Map<String, Map<Integer, String>> extraDhcpOptionMap)
|
||||
throws InsufficientCapacityException {
|
||||
|
||||
// VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager);
|
||||
@ -299,7 +299,7 @@ public class CloudOrchestrator implements OrchestrationService {
|
||||
|
||||
HypervisorType hypervisorType = HypervisorType.valueOf(hypervisor);
|
||||
|
||||
_itMgr.allocate(vm.getInstanceName(), _templateDao.findById(new Long(isoId)), computeOffering, rootDiskOfferingInfo, new ArrayList<DiskOfferingInfo>(), networkIpMap, plan, hypervisorType);
|
||||
_itMgr.allocate(vm.getInstanceName(), _templateDao.findById(new Long(isoId)), computeOffering, rootDiskOfferingInfo, new ArrayList<DiskOfferingInfo>(), networkIpMap, plan, hypervisorType, extraDhcpOptionMap);
|
||||
|
||||
return vmEntity;
|
||||
}
|
||||
|
||||
@ -25,6 +25,7 @@ import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -32,10 +33,12 @@ import java.util.UUID;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import com.cloud.vm.NicExtraDhcpOptionVO;
|
||||
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
|
||||
import org.apache.cloudstack.context.CallContext;
|
||||
import org.apache.cloudstack.engine.cloud.entity.api.db.VMNetworkMapVO;
|
||||
@ -198,6 +201,7 @@ import com.cloud.utils.fsm.NoTransitionException;
|
||||
import com.cloud.utils.fsm.StateMachine2;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.utils.net.Dhcp;
|
||||
import com.cloud.vm.Nic;
|
||||
import com.cloud.vm.Nic.ReservationStrategy;
|
||||
import com.cloud.vm.NicIpAlias;
|
||||
@ -212,6 +216,7 @@ import com.cloud.vm.VirtualMachine.Type;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
import com.cloud.vm.dao.NicExtraDhcpOptionDao;
|
||||
import com.cloud.vm.dao.NicIpAliasDao;
|
||||
import com.cloud.vm.dao.NicIpAliasVO;
|
||||
import com.cloud.vm.dao.NicSecondaryIpDao;
|
||||
@ -269,6 +274,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
@Inject
|
||||
protected NicIpAliasDao _nicIpAliasDao;
|
||||
@Inject
|
||||
protected NicExtraDhcpOptionDao _nicExtraDhcpOptionDao;
|
||||
@Inject
|
||||
protected IPAddressDao _publicIpAddressDao;
|
||||
@Inject
|
||||
protected IpAddressManager _ipAddrMgr;
|
||||
@ -728,7 +735,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, List<? extends NicProfile>> networks) throws InsufficientCapacityException,
|
||||
public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, List<? extends NicProfile>> networks, final Map<String, Map<Integer, String>> extraDhcpOptions) throws InsufficientCapacityException,
|
||||
ConcurrentOperationException {
|
||||
|
||||
Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
|
||||
@ -800,6 +807,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
|
||||
nics.add(vmNic);
|
||||
vm.addNic(vmNic);
|
||||
saveExtraDhcpOptions(config.getUuid(), vmNic.getId(), extraDhcpOptions);
|
||||
}
|
||||
}
|
||||
if (nics.size() != size) {
|
||||
@ -814,6 +822,24 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveExtraDhcpOptions(final String networkUuid, final Long nicId, final Map<String, Map<Integer, String>> extraDhcpOptionMap) {
|
||||
|
||||
if(extraDhcpOptionMap != null) {
|
||||
Map<Integer, String> extraDhcpOption = extraDhcpOptionMap.get(networkUuid);
|
||||
if(extraDhcpOption != null) {
|
||||
List<NicExtraDhcpOptionVO> nicExtraDhcpOptionList = new LinkedList<>();
|
||||
|
||||
for (Integer code : extraDhcpOption.keySet()) {
|
||||
Dhcp.DhcpOptionCode.valueOfInt(code); //check if code is supported or not.
|
||||
NicExtraDhcpOptionVO nicExtraDhcpOptionVO = new NicExtraDhcpOptionVO(nicId, code, extraDhcpOption.get(code));
|
||||
nicExtraDhcpOptionList.add(nicExtraDhcpOptionVO);
|
||||
}
|
||||
_nicExtraDhcpOptionDao.saveExtraDhcpOptions(nicExtraDhcpOptionList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@DB
|
||||
@Override
|
||||
public Pair<NicProfile, Integer> allocateNic(final NicProfile requested, final Network network, final Boolean isDefaultNic, int deviceId, final VirtualMachineProfile vm)
|
||||
@ -1141,6 +1167,15 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Reset the extra DHCP option that may have been cleared per nic.
|
||||
List<NicVO> nicVOs = _nicDao.listByNetworkId(network.getId());
|
||||
for(NicVO nicVO : nicVOs) {
|
||||
if(nicVO.getState() == Nic.State.Reserved) {
|
||||
configureExtraDhcpOptions(network, nicVO.getId());
|
||||
}
|
||||
}
|
||||
|
||||
for (final NetworkElement element : networkElements) {
|
||||
if (element instanceof AggregatedCommandExecutor && providersToImplement.contains(element.getProvider())) {
|
||||
((AggregatedCommandExecutor)element).prepareAggregatedExecution(network, dest);
|
||||
@ -1457,6 +1492,22 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
return resourceCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureExtraDhcpOptions(Network network, long nicId, Map<Integer, String> extraDhcpOptions) {
|
||||
if(_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)) {
|
||||
if (_networkModel.getNetworkServiceCapabilities(network.getId(), Service.Dhcp).containsKey(Capability.ExtraDhcpOptions)) {
|
||||
DhcpServiceProvider sp = getDhcpServiceProvider(network);
|
||||
sp.setExtraDhcpOptions(network, nicId, extraDhcpOptions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureExtraDhcpOptions(Network network, long nicId) {
|
||||
Map<Integer, String> extraDhcpOptions = getExtraDhcpOptions(nicId);
|
||||
configureExtraDhcpOptions(network, nicId, extraDhcpOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finalizeUpdateInSequence(Network network, boolean success) {
|
||||
List<Provider> providers = getNetworkProviders(network.getId());
|
||||
@ -1593,9 +1644,20 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
|
||||
profile.setSecurityGroupEnabled(_networkModel.isSecurityGroupSupportedInNetwork(network));
|
||||
guru.updateNicProfile(profile, network);
|
||||
|
||||
configureExtraDhcpOptions(network, nicId);
|
||||
return profile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Integer, String> getExtraDhcpOptions(long nicId) {
|
||||
List<NicExtraDhcpOptionVO> nicExtraDhcpOptionVOList = _nicExtraDhcpOptionDao.listByNicId(nicId);
|
||||
return nicExtraDhcpOptionVOList
|
||||
.stream()
|
||||
.collect(Collectors.toMap(NicExtraDhcpOptionVO::getCode, NicExtraDhcpOptionVO::getValue));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void prepareNicForMigration(final VirtualMachineProfile vm, final DeployDestination dest) {
|
||||
if(vm.getType().equals(VirtualMachine.Type.DomainRouter) && (vm.getHypervisorType().equals(HypervisorType.KVM) || vm.getHypervisorType().equals(HypervisorType.VMware))) {
|
||||
@ -2949,7 +3011,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
||||
@Override
|
||||
public void doInTransactionWithoutResult(final TransactionStatus status) throws InsufficientCapacityException {
|
||||
cleanupNics(vm);
|
||||
allocate(vm, profiles);
|
||||
allocate(vm, profiles, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -215,6 +215,7 @@
|
||||
<bean id="networkServiceMapDaoImpl" class="com.cloud.network.dao.NetworkServiceMapDaoImpl" />
|
||||
<bean id="nicDaoImpl" class="com.cloud.vm.dao.NicDaoImpl" />
|
||||
<bean id="nicDetailsDaoImpl" class="com.cloud.vm.dao.NicDetailsDaoImpl" />
|
||||
<bean id="nicExtraDhcpOptionDaoImpl" class="com.cloud.vm.dao.NicExtraDhcpOptionDaoImpl" />
|
||||
<bean id="nicSecondaryIpDaoImpl" class="com.cloud.vm.dao.NicSecondaryIpDaoImpl" />
|
||||
<bean id="nicIpAliasDaoImpl" class="com.cloud.vm.dao.NicIpAliasDaoImpl" />
|
||||
<bean id="objectInDataStoreDaoImpl" class="org.apache.cloudstack.storage.db.ObjectInDataStoreDaoImpl" />
|
||||
|
||||
82
engine/schema/src/com/cloud/vm/NicExtraDhcpOptionVO.java
Normal file
82
engine/schema/src/com/cloud/vm/NicExtraDhcpOptionVO.java
Normal file
@ -0,0 +1,82 @@
|
||||
// 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.vm;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.Table;
|
||||
import java.util.UUID;
|
||||
|
||||
@Entity
|
||||
@Table(name = "nic_extra_dhcp_options")
|
||||
public class NicExtraDhcpOptionVO implements NicExtraDhcpOption {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private long id;
|
||||
|
||||
@Column(name = "uuid")
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
|
||||
@Column(name = "nic_id")
|
||||
private long nicId;
|
||||
|
||||
@Column(name="code")
|
||||
private int code;
|
||||
|
||||
@Column(name = "value")
|
||||
private String value;
|
||||
|
||||
public NicExtraDhcpOptionVO (){
|
||||
|
||||
}
|
||||
|
||||
public NicExtraDhcpOptionVO (long nicId, int code, String value) {
|
||||
this.nicId = nicId;
|
||||
this.code = code;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getNicId() {
|
||||
return nicId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
// 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.vm.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
import com.cloud.vm.NicExtraDhcpOptionVO;
|
||||
|
||||
public interface NicExtraDhcpOptionDao extends GenericDao<NicExtraDhcpOptionVO, Long> {
|
||||
List<NicExtraDhcpOptionVO> listByNicId(long nicId);
|
||||
|
||||
/**
|
||||
* Persists list of NicExtraDhcpOptionVO
|
||||
* @param extraDhcpOptions
|
||||
*/
|
||||
void saveExtraDhcpOptions(List<NicExtraDhcpOptionVO> extraDhcpOptions);
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
// 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.vm.dao;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.vm.NicExtraDhcpOption;
|
||||
import com.cloud.vm.NicExtraDhcpOptionVO;
|
||||
|
||||
@Component
|
||||
public class NicExtraDhcpOptionDaoImpl extends GenericDaoBase<NicExtraDhcpOptionVO, Long> implements NicExtraDhcpOptionDao {
|
||||
private SearchBuilder<NicExtraDhcpOptionVO> AllFieldsSearch;
|
||||
|
||||
protected NicExtraDhcpOptionDaoImpl() {
|
||||
super();
|
||||
|
||||
AllFieldsSearch = createSearchBuilder();
|
||||
AllFieldsSearch.and("nic_id", AllFieldsSearch.entity().getNicId(), SearchCriteria.Op.EQ);
|
||||
AllFieldsSearch.and("code", AllFieldsSearch.entity().getCode(), SearchCriteria.Op.IN);
|
||||
|
||||
AllFieldsSearch.done();
|
||||
}
|
||||
|
||||
@DB()
|
||||
@Override
|
||||
public List<NicExtraDhcpOptionVO> listByNicId(long nicId) {
|
||||
SearchCriteria<NicExtraDhcpOptionVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("nic_id", nicId);
|
||||
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@DB()
|
||||
@Override
|
||||
public void saveExtraDhcpOptions(List<NicExtraDhcpOptionVO> extraDhcpOptions) {
|
||||
if (extraDhcpOptions.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
extraDhcpOptions
|
||||
.stream()
|
||||
.map(NicExtraDhcpOption::getNicId)
|
||||
.distinct()
|
||||
.forEach(this::removeByNicId);
|
||||
|
||||
extraDhcpOptions.stream()
|
||||
.forEach(this::persist);
|
||||
}
|
||||
|
||||
public void removeByNicId(long nicId) {
|
||||
SearchCriteria<NicExtraDhcpOptionVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("nic_id", nicId);
|
||||
expunge(sc);
|
||||
}
|
||||
|
||||
}
|
||||
@ -180,4 +180,9 @@ public class BaremetalDhcpElement extends AdapterBase implements DhcpServiceProv
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -374,4 +374,9 @@ public class ContrailElementImpl extends AdapterBase
|
||||
throws ResourceUnavailableException {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,86 @@
|
||||
//
|
||||
// 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.agent.api.element;
|
||||
|
||||
import net.nuage.vsp.acs.client.api.model.VspNetwork;
|
||||
import org.apache.commons.lang.builder.HashCodeBuilder;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import com.cloud.agent.api.Command;
|
||||
|
||||
public class ExtraDhcpOptionsVspCommand extends Command {
|
||||
private final VspNetwork network;
|
||||
private final String nicUuid;
|
||||
private final Map<Integer, String> dhcpOptions;
|
||||
|
||||
public ExtraDhcpOptionsVspCommand (VspNetwork network, String nicUuid, Map<Integer, String> dhcpOptions) {
|
||||
super();
|
||||
this.network = network;
|
||||
this.nicUuid = nicUuid;
|
||||
this.dhcpOptions = dhcpOptions;
|
||||
}
|
||||
|
||||
public VspNetwork getNetwork() {
|
||||
return network;
|
||||
}
|
||||
|
||||
public String getNicUuid() {
|
||||
return nicUuid;
|
||||
}
|
||||
|
||||
public Map<Integer, String> getDhcpOptions() {
|
||||
return dhcpOptions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!(o instanceof ExtraDhcpOptionsVspCommand)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
ExtraDhcpOptionsVspCommand that = (ExtraDhcpOptionsVspCommand) o;
|
||||
|
||||
return super.equals(that)
|
||||
&& Objects.equals(network, that.network)
|
||||
&& Objects.equals(nicUuid, that.nicUuid)
|
||||
&& Objects.equals(dhcpOptions, that.dhcpOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return new HashCodeBuilder()
|
||||
.appendSuper(super.hashCode())
|
||||
.append(nicUuid)
|
||||
.append(network)
|
||||
.append(dhcpOptions)
|
||||
.toHashCode();
|
||||
}
|
||||
}
|
||||
@ -59,6 +59,7 @@ import com.cloud.agent.api.StartupCommand;
|
||||
import com.cloud.agent.api.StartupVspCommand;
|
||||
import com.cloud.agent.api.element.ApplyAclRuleVspCommand;
|
||||
import com.cloud.agent.api.element.ApplyStaticNatVspCommand;
|
||||
import com.cloud.agent.api.element.ExtraDhcpOptionsVspCommand;
|
||||
import com.cloud.agent.api.element.ImplementVspCommand;
|
||||
import com.cloud.agent.api.element.ShutDownVpcVspCommand;
|
||||
import com.cloud.agent.api.element.ShutDownVspCommand;
|
||||
@ -252,7 +253,8 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
|
||||
Capability.MultipleIps, "true"
|
||||
))
|
||||
.put(Service.Dhcp, ImmutableMap.of(
|
||||
Capability.DhcpAccrossMultipleSubnets, "true"
|
||||
Capability.DhcpAccrossMultipleSubnets, "true",
|
||||
Capability.ExtraDhcpOptions, "true"
|
||||
))
|
||||
.put(Service.NetworkACL, ImmutableMap.of(
|
||||
Capability.SupportedProtocols, "tcp,udp,icmp"
|
||||
@ -515,6 +517,23 @@ public class NuageVspElement extends AdapterBase implements ConnectivityProvider
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions) {
|
||||
VspNetwork vspNetwork = _nuageVspEntityBuilder.buildVspNetwork(network);
|
||||
HostVO nuageVspHost = _nuageVspManager.getNuageVspHost(network.getPhysicalNetworkId());
|
||||
NicVO nic = _nicDao.findById(nicId);
|
||||
|
||||
ExtraDhcpOptionsVspCommand extraDhcpOptionsVspCommand = new ExtraDhcpOptionsVspCommand(vspNetwork, nic.getUuid(), dhcpOptions);
|
||||
Answer answer = _agentMgr.easySend(nuageVspHost.getId(), extraDhcpOptionsVspCommand);
|
||||
|
||||
if (answer == null || !answer.getResult()) {
|
||||
s_logger.error("[setExtraDhcpOptions] setting extra DHCP options for nic " + nic.getUuid() + " failed.");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
|
||||
|
||||
@ -19,6 +19,7 @@
|
||||
|
||||
package com.cloud.network.guru;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -42,6 +43,7 @@ import com.google.common.collect.LinkedListMultimap;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
|
||||
import org.apache.cloudstack.resourcedetail.VpcDetailVO;
|
||||
import org.apache.cloudstack.resourcedetail.dao.VpcDetailsDao;
|
||||
|
||||
@ -131,6 +133,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
|
||||
NetworkDetailsDao _networkDetailsDao;
|
||||
@Inject
|
||||
VpcDetailsDao _vpcDetailsDao;
|
||||
@Inject
|
||||
NetworkOrchestrationService _networkOrchestrationService;
|
||||
|
||||
public NuageVspGuestNetworkGuru() {
|
||||
super();
|
||||
@ -225,7 +229,9 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
|
||||
implemented.setBroadcastUri(Networks.BroadcastDomainType.Vsp.toUri(broadcastUriStr));
|
||||
implemented.setBroadcastDomainType(Networks.BroadcastDomainType.Vsp);
|
||||
|
||||
if (!implement(network.getVpcId(), physicalNetworkId, vspNetwork, _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering))) {
|
||||
boolean implementSucceeded = implement(network.getVpcId(), physicalNetworkId, vspNetwork, _nuageVspEntityBuilder.buildNetworkDhcpOption(network, offering));
|
||||
|
||||
if (!implementSucceeded) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -383,6 +389,8 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
|
||||
// Determine if dhcp options of the other nics in the network need to be updated
|
||||
if (vm.getType() == VirtualMachine.Type.DomainRouter && network.getState() != State.Implementing) {
|
||||
updateDhcpOptionsForExistingVms(network, nuageVspHost, vspNetwork, networkHasDns, networkHasDnsCache);
|
||||
//update the extra DHCP options
|
||||
|
||||
}
|
||||
|
||||
nic.setBroadcastUri(network.getBroadcastUri());
|
||||
@ -427,6 +435,10 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
|
||||
}
|
||||
}
|
||||
|
||||
private void updateExtraDhcpOptionsForExistingVm(Network network, Nic nic) {
|
||||
_networkOrchestrationService.configureExtraDhcpOptions(network, nic.getId());
|
||||
}
|
||||
|
||||
private void updateDhcpOptionsForExistingVms(Network network, HostVO nuageVspHost, VspNetwork vspNetwork, boolean networkHasDns, Map<Long, Boolean> networkHasDnsCache)
|
||||
throws InsufficientVirtualNetworkCapacityException {
|
||||
// Update dhcp options if a VR is added when we are not initiating the network
|
||||
@ -437,8 +449,10 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
|
||||
List<NicVO> userNics = _nicDao.listByNetworkId(network.getId());
|
||||
LinkedListMultimap<Long, VspDhcpVMOption> dhcpOptionsPerDomain = LinkedListMultimap.create();
|
||||
|
||||
for (NicVO userNic : userNics) {
|
||||
if (userNic.getVmType() == VirtualMachine.Type.DomainRouter) {
|
||||
for (Iterator<NicVO> iterator = userNics.iterator(); iterator.hasNext(); ) {
|
||||
NicVO userNic = iterator.next();
|
||||
if (userNic.getVmType() == VirtualMachine.Type.DomainRouter || userNic.getState() != Nic.State.Reserved) {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -463,6 +477,10 @@ public class NuageVspGuestNetworkGuru extends GuestNetworkGuru {
|
||||
throw new InsufficientVirtualNetworkCapacityException("Failed to reserve VM in Nuage VSP.", Network.class, network.getId());
|
||||
}
|
||||
}
|
||||
|
||||
for (NicVO userNic : userNics) {
|
||||
updateExtraDhcpOptionsForExistingVm(network, userNic);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkMultipleSubnetsCombinedWithUseData(Network network) {
|
||||
|
||||
@ -301,10 +301,10 @@ public class NuageVspManagerImpl extends ManagerBase implements NuageVspManager,
|
||||
|
||||
|
||||
if (StringUtils.isNotBlank(cmd.getApiVersion())){
|
||||
if (!clientLoader.getNuageVspManagerClient().isSupportedApiVersion(cmd.getApiVersion())){
|
||||
apiVersion = cmd.getApiVersion();
|
||||
if (!clientLoader.getNuageVspManagerClient().isSupportedApiVersion(apiVersion)){
|
||||
throw new CloudRuntimeException("Unsupported API version : " + cmd.getApiVersion());
|
||||
}
|
||||
apiVersion = cmd.getApiVersion();
|
||||
} else {
|
||||
List<NuageVspApiVersion> supportedVsdVersions = clientLoader.getNuageVspManagerClient().getSupportedVersionList();
|
||||
supportedVsdVersions.retainAll(Arrays.asList(NuageVspApiVersion.SUPPORTED_VERSIONS));
|
||||
|
||||
@ -248,7 +248,7 @@ public class NuageVspResource extends ManagerBase implements ServerResource, Vsp
|
||||
return wrapper.execute(cmd, this);
|
||||
} catch (final Exception e) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Received unsupported command " + cmd.toString());
|
||||
s_logger.debug("Received unsupported command " + cmd.toString(), e);
|
||||
}
|
||||
return Answer.createUnsupportedCommandAnswer(cmd);
|
||||
}
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
//
|
||||
// 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.vsp.resource.wrapper;
|
||||
|
||||
import net.nuage.vsp.acs.client.exception.NuageVspException;
|
||||
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import com.cloud.agent.api.element.ExtraDhcpOptionsVspCommand;
|
||||
import com.cloud.network.resource.NuageVspResource;
|
||||
import com.cloud.resource.ResourceWrapper;
|
||||
|
||||
@ResourceWrapper(handles=ExtraDhcpOptionsVspCommand.class)
|
||||
public class NuageVspExtraDhcpOptionsCommandWrapper extends NuageVspCommandWrapper<ExtraDhcpOptionsVspCommand> {
|
||||
@Override
|
||||
public boolean executeNuageVspCommand(ExtraDhcpOptionsVspCommand command, NuageVspResource nuageVspResource) throws ConfigurationException, NuageVspException {
|
||||
nuageVspResource.getNuageVspElementClient().setDhcpOptionsNic(command.getNetwork(), command.getNicUuid(), command.getDhcpOptions());
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuilder fillDetail(StringBuilder stringBuilder, ExtraDhcpOptionsVspCommand command) {
|
||||
return stringBuilder;
|
||||
}
|
||||
}
|
||||
@ -162,18 +162,21 @@ import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.StringUtils;
|
||||
import com.cloud.utils.db.EntityManager;
|
||||
import com.cloud.utils.net.Dhcp;
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.utils.net.Ip;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.ConsoleProxyVO;
|
||||
import com.cloud.vm.InstanceGroup;
|
||||
import com.cloud.vm.Nic;
|
||||
import com.cloud.vm.NicExtraDhcpOptionVO;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.NicSecondaryIp;
|
||||
import com.cloud.vm.NicVO;
|
||||
import com.cloud.vm.VMInstanceVO;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachine.Type;
|
||||
import com.cloud.vm.dao.NicExtraDhcpOptionDao;
|
||||
import com.cloud.vm.dao.NicSecondaryIpVO;
|
||||
import com.cloud.vm.snapshot.VMSnapshot;
|
||||
import org.apache.cloudstack.acl.ControlledEntity;
|
||||
@ -233,6 +236,7 @@ import org.apache.cloudstack.api.response.NetworkACLItemResponse;
|
||||
import org.apache.cloudstack.api.response.NetworkACLResponse;
|
||||
import org.apache.cloudstack.api.response.NetworkOfferingResponse;
|
||||
import org.apache.cloudstack.api.response.NetworkResponse;
|
||||
import org.apache.cloudstack.api.response.NicExtraDhcpOptionResponse;
|
||||
import org.apache.cloudstack.api.response.NicResponse;
|
||||
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
|
||||
import org.apache.cloudstack.api.response.OvsProviderResponse;
|
||||
@ -317,6 +321,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class ApiResponseHelper implements ResponseGenerator {
|
||||
|
||||
@ -349,6 +354,8 @@ public class ApiResponseHelper implements ResponseGenerator {
|
||||
private ClusterDetailsDao _clusterDetailsDao;
|
||||
@Inject
|
||||
private ResourceTagDao _resourceTagDao;
|
||||
@Inject
|
||||
private NicExtraDhcpOptionDao _nicExtraDhcpOptionDao;
|
||||
|
||||
@Override
|
||||
public UserResponse createUserResponse(User user) {
|
||||
@ -3583,6 +3590,7 @@ public class ApiResponseHelper implements ResponseGenerator {
|
||||
NetworkVO network = _entityMgr.findById(NetworkVO.class, result.getNetworkId());
|
||||
VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, result.getInstanceId());
|
||||
UserVmJoinVO userVm = _entityMgr.findById(UserVmJoinVO.class, result.getInstanceId());
|
||||
List<NicExtraDhcpOptionVO> nicExtraDhcpOptionVOs = _nicExtraDhcpOptionDao.listByNicId(result.getId());
|
||||
|
||||
response.setId(result.getUuid());
|
||||
response.setNetworkid(network.getUuid());
|
||||
@ -3601,6 +3609,13 @@ public class ApiResponseHelper implements ResponseGenerator {
|
||||
}
|
||||
response.setIpaddress(result.getIPv4Address());
|
||||
|
||||
List<NicExtraDhcpOptionResponse> nicExtraDhcpOptionResponses = nicExtraDhcpOptionVOs
|
||||
.stream()
|
||||
.map(vo -> new NicExtraDhcpOptionResponse(Dhcp.DhcpOptionCode.valueOfInt(vo.getCode()).getName(), vo.getCode(), vo.getValue()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
response.setExtraDhcpOptions(nicExtraDhcpOptionResponses);
|
||||
|
||||
if (result.getSecondaryIp()) {
|
||||
List<NicSecondaryIpVO> secondaryIps = ApiDBUtils.findNicSecondaryIps(result.getId());
|
||||
if (secondaryIps != null) {
|
||||
|
||||
@ -24,12 +24,14 @@ import java.util.Hashtable;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.affinity.AffinityGroupResponse;
|
||||
import org.apache.cloudstack.api.ApiConstants.VMDetails;
|
||||
import org.apache.cloudstack.api.ResponseObject.ResponseView;
|
||||
import org.apache.cloudstack.api.response.NicExtraDhcpOptionResponse;
|
||||
import org.apache.cloudstack.api.response.NicResponse;
|
||||
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
|
||||
import org.apache.cloudstack.api.response.SecurityGroupResponse;
|
||||
@ -49,9 +51,11 @@ import com.cloud.user.dao.UserDao;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
import com.cloud.utils.net.Dhcp;
|
||||
import com.cloud.vm.UserVmDetailVO;
|
||||
import com.cloud.vm.VirtualMachine.State;
|
||||
import com.cloud.vm.VmStats;
|
||||
import com.cloud.vm.dao.NicExtraDhcpOptionDao;
|
||||
import com.cloud.vm.dao.NicSecondaryIpVO;
|
||||
import com.cloud.vm.dao.UserVmDetailsDao;
|
||||
|
||||
@ -67,6 +71,8 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation<UserVmJo
|
||||
private UserVmDetailsDao _userVmDetailsDao;
|
||||
@Inject
|
||||
private UserDao _userDao;
|
||||
@Inject
|
||||
private NicExtraDhcpOptionDao _nicExtraDhcpOptionDao;
|
||||
|
||||
private final SearchBuilder<UserVmJoinVO> VmDetailSearch;
|
||||
private final SearchBuilder<UserVmJoinVO> activeVmByIsoSearch;
|
||||
@ -267,6 +273,13 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation<UserVmJo
|
||||
nicResponse.setSecondaryIps(ipList);
|
||||
}
|
||||
nicResponse.setObjectName("nic");
|
||||
|
||||
List<NicExtraDhcpOptionResponse> nicExtraDhcpOptionResponses = _nicExtraDhcpOptionDao.listByNicId(nic_id)
|
||||
.stream()
|
||||
.map(vo -> new NicExtraDhcpOptionResponse(Dhcp.DhcpOptionCode.valueOfInt(vo.getCode()).getName(), vo.getCode(), vo.getValue()))
|
||||
.collect(Collectors.toList());
|
||||
nicResponse.setExtraDhcpOptions(nicExtraDhcpOptionResponses);
|
||||
|
||||
userVmResponse.addNic(nicResponse);
|
||||
}
|
||||
}
|
||||
@ -368,6 +381,11 @@ public class UserVmJoinDaoImpl extends GenericDaoBaseWithTagInformation<UserVmJo
|
||||
}
|
||||
|
||||
nicResponse.setObjectName("nic");
|
||||
List<NicExtraDhcpOptionResponse> nicExtraDhcpOptionResponses = _nicExtraDhcpOptionDao.listByNicId(nic_id)
|
||||
.stream()
|
||||
.map(vo -> new NicExtraDhcpOptionResponse(Dhcp.DhcpOptionCode.valueOfInt(vo.getCode()).getName(), vo.getCode(), vo.getValue()))
|
||||
.collect(Collectors.toList());
|
||||
nicResponse.setExtraDhcpOptions(nicExtraDhcpOptionResponses);
|
||||
userVmData.addNic(nicResponse);
|
||||
}
|
||||
|
||||
|
||||
@ -1325,18 +1325,18 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
|
||||
vm = _userVmService.createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, null, owner, "autoScaleVm-" + asGroup.getId() + "-" +
|
||||
getCurrentTimeStampString(),
|
||||
"autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null,
|
||||
null, true, null, null, null, null);
|
||||
null, true, null, null, null, null, null);
|
||||
} else {
|
||||
if (zone.isSecurityGroupEnabled()) {
|
||||
vm = _userVmService.createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, null, null,
|
||||
owner, "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(),
|
||||
"autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(), null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null,
|
||||
null, null, true, null, null, null, null);
|
||||
null, null, true, null, null, null, null, null);
|
||||
|
||||
} else {
|
||||
vm = _userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, null, owner, "autoScaleVm-" + asGroup.getId() + "-" +
|
||||
getCurrentTimeStampString(), "autoScaleVm-" + asGroup.getId() + "-" + getCurrentTimeStampString(),
|
||||
null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, addrs, true, null, null, null, null);
|
||||
null, null, null, HypervisorType.XenServer, HTTPMethod.GET, null, null, null, addrs, true, null, null, null, null, null);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -930,6 +930,11 @@ NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource, DnsServ
|
||||
return removeDhcpSupportForSubnet(network, Service.Dhcp);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeDnsSupportForSubnet(Network network) throws ResourceUnavailableException {
|
||||
// Ignore if virtual router is already dhcp provider
|
||||
|
||||
@ -106,7 +106,7 @@ public interface UserVmManager extends UserVmService {
|
||||
boolean setupVmForPvlan(boolean add, Long hostId, NicProfile nic);
|
||||
|
||||
UserVm updateVirtualMachine(long id, String displayName, String group, Boolean ha, Boolean isDisplayVmEnabled, Long osTypeId, String userData,
|
||||
Boolean isDynamicallyScalable, HTTPMethod httpMethod, String customId, String hostName, String instanceName, List<Long> securityGroupIdList) throws ResourceUnavailableException, InsufficientCapacityException;
|
||||
Boolean isDynamicallyScalable, HTTPMethod httpMethod, String customId, String hostName, String instanceName, List<Long> securityGroupIdList, Map<String, Map<Integer, String>> extraDhcpOptionsMap) throws ResourceUnavailableException, InsufficientCapacityException;
|
||||
|
||||
//the validateCustomParameters, save and remove CustomOfferingDetils functions can be removed from the interface once we can
|
||||
//find a common place for all the scaling and upgrading code of both user and systemvms.
|
||||
|
||||
@ -32,10 +32,15 @@ import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
|
||||
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
|
||||
import org.apache.cloudstack.affinity.AffinityGroupService;
|
||||
@ -89,9 +94,6 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.api.Answer;
|
||||
@ -296,6 +298,7 @@ import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.InstanceGroupDao;
|
||||
import com.cloud.vm.dao.InstanceGroupVMMapDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
import com.cloud.vm.dao.NicExtraDhcpOptionDao;
|
||||
import com.cloud.vm.dao.SecondaryStorageVmDao;
|
||||
import com.cloud.vm.dao.UserVmDao;
|
||||
import com.cloud.vm.dao.UserVmDetailsDao;
|
||||
@ -496,6 +499,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
protected IpAddressManager _ipAddrMgr;
|
||||
@Inject
|
||||
private SnapshotApiService _snapshotService;
|
||||
@Inject
|
||||
NicExtraDhcpOptionDao _nicExtraDhcpOptionDao;
|
||||
|
||||
protected ScheduledExecutorService _executor = null;
|
||||
protected ScheduledExecutorService _vmIpFetchExecutor = null;
|
||||
@ -1220,6 +1225,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
|
||||
try {
|
||||
guestNic = _itMgr.addVmToNetwork(vmInstance, network, profile);
|
||||
saveExtraDhcpOptions(guestNic.getId(), cmd.getDhcpOptionsMap());
|
||||
_networkMgr.configureExtraDhcpOptions(network, guestNic.getId(), cmd.getDhcpOptionsMap());
|
||||
cleanUp = false;
|
||||
} catch (ResourceUnavailableException e) {
|
||||
throw new CloudRuntimeException("Unable to add NIC to " + vmInstance + ": " + e);
|
||||
@ -1245,6 +1252,17 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
return _vmDao.findById(vmInstance.getId());
|
||||
}
|
||||
|
||||
|
||||
private void saveExtraDhcpOptions(long nicId, Map<Integer, String> dhcpOptions) {
|
||||
List<NicExtraDhcpOptionVO> nicExtraDhcpOptionVOList = dhcpOptions
|
||||
.entrySet()
|
||||
.stream()
|
||||
.map(entry -> new NicExtraDhcpOptionVO(nicId, entry.getKey(), entry.getValue()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
_nicExtraDhcpOptionDao.saveExtraDhcpOptions(nicExtraDhcpOptionVOList);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ActionEvent(eventType = EventTypes.EVENT_NIC_DELETE, eventDescription = "Removing Nic", async = true)
|
||||
public UserVm removeNicFromVirtualMachine(RemoveNicFromVMCmd cmd) throws InvalidParameterValueException, PermissionDeniedException, CloudRuntimeException {
|
||||
@ -2417,7 +2435,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
|
||||
return updateVirtualMachine(id, displayName, group, ha, isDisplayVm, osTypeId, userData, isDynamicallyScalable,
|
||||
cmd.getHttpMethod(), cmd.getCustomId(), hostName, cmd.getInstanceName(), securityGroupIdList);
|
||||
cmd.getHttpMethod(), cmd.getCustomId(), hostName, cmd.getInstanceName(), securityGroupIdList, cmd.getDhcpOptionsMap());
|
||||
}
|
||||
|
||||
private void saveUsageEvent(UserVmVO vm) {
|
||||
@ -2467,7 +2485,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
|
||||
@Override
|
||||
public UserVm updateVirtualMachine(long id, String displayName, String group, Boolean ha, Boolean isDisplayVmEnabled, Long osTypeId, String userData,
|
||||
Boolean isDynamicallyScalable, HTTPMethod httpMethod, String customId, String hostName, String instanceName, List<Long> securityGroupIdList)
|
||||
Boolean isDynamicallyScalable, HTTPMethod httpMethod, String customId, String hostName, String instanceName, List<Long> securityGroupIdList, Map<String, Map<Integer, String>> extraDhcpOptionsMap)
|
||||
throws ResourceUnavailableException, InsufficientCapacityException {
|
||||
UserVmVO vm = _vmDao.findById(id);
|
||||
if (vm == null) {
|
||||
@ -2567,7 +2585,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<? extends Nic> nics = _nicDao.listByVmId(vm.getId());
|
||||
if (hostName != null) {
|
||||
// Check is hostName is RFC compliant
|
||||
checkNameForRFCCompliance(hostName);
|
||||
@ -2578,14 +2596,27 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
|
||||
// Verify that vm's hostName is unique
|
||||
List<NetworkVO> vmNtwks = new ArrayList<NetworkVO>();
|
||||
List<? extends Nic> nics = _nicDao.listByVmId(vm.getId());
|
||||
|
||||
List<NetworkVO> vmNtwks = new ArrayList<NetworkVO>(nics.size());
|
||||
for (Nic nic : nics) {
|
||||
vmNtwks.add(_networkDao.findById(nic.getNetworkId()));
|
||||
}
|
||||
checkIfHostNameUniqueInNtwkDomain(hostName, vmNtwks);
|
||||
}
|
||||
|
||||
List<NetworkVO> networks = nics.stream()
|
||||
.map(nic -> _networkDao.findById(nic.getNetworkId()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
verifyExtraDhcpOptionsNetwork(extraDhcpOptionsMap, networks);
|
||||
for (Nic nic : nics) {
|
||||
_networkMgr.saveExtraDhcpOptions(networks.stream()
|
||||
.filter(network -> network.getId() == nic.getNetworkId())
|
||||
.findFirst()
|
||||
.get()
|
||||
.getUuid(), nic.getId(), extraDhcpOptionsMap);
|
||||
}
|
||||
|
||||
_vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled, isDynamicallyScalable, customId, hostName, instanceName);
|
||||
|
||||
if (updateUserdata) {
|
||||
@ -2911,7 +2942,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
public UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> securityGroupIdList,
|
||||
Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod,
|
||||
String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List<Long> affinityGroupIdList,
|
||||
Map<String, String> customParametes, String customId) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException,
|
||||
Map<String, String> customParametes, String customId, Map<String, Map<Integer, String>> dhcpOptionMap) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException,
|
||||
StorageUnavailableException, ResourceAllocationException {
|
||||
|
||||
Account caller = CallContext.current().getCallingAccount();
|
||||
@ -2959,7 +2990,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
|
||||
return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, securityGroupIdList, group, httpmethod,
|
||||
userData, sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParametes, customId);
|
||||
userData, sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParametes, customId, dhcpOptionMap);
|
||||
|
||||
}
|
||||
|
||||
@ -2968,7 +2999,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
public UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList,
|
||||
List<Long> securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor,
|
||||
HTTPMethod httpmethod, String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId) throws InsufficientCapacityException, ConcurrentOperationException,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap) throws InsufficientCapacityException, ConcurrentOperationException,
|
||||
ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException {
|
||||
|
||||
Account caller = CallContext.current().getCallingAccount();
|
||||
@ -3070,7 +3101,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
|
||||
return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, securityGroupIdList, group, httpmethod,
|
||||
userData, sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParameters, customId);
|
||||
userData, sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayVm, keyboard, affinityGroupIdList, customParameters, customId, dhcpOptionMap);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -3078,7 +3109,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
public UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList, Account owner,
|
||||
String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData,
|
||||
String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayvm, String keyboard, List<Long> affinityGroupIdList,
|
||||
Map<String, String> customParametrs, String customId) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException,
|
||||
Map<String, String> customParametrs, String customId, Map<String, Map<Integer, String>> dhcpOptionsMap) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException,
|
||||
StorageUnavailableException, ResourceAllocationException {
|
||||
|
||||
Account caller = CallContext.current().getCallingAccount();
|
||||
@ -3171,9 +3202,28 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
networkList.add(network);
|
||||
}
|
||||
}
|
||||
verifyExtraDhcpOptionsNetwork(dhcpOptionsMap, networkList);
|
||||
|
||||
return createVirtualMachine(zone, serviceOffering, template, hostName, displayName, owner, diskOfferingId, diskSize, networkList, null, group, httpmethod, userData,
|
||||
sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayvm, keyboard, affinityGroupIdList, customParametrs, customId);
|
||||
sshKeyPair, hypervisor, caller, requestedIps, defaultIps, displayvm, keyboard, affinityGroupIdList, customParametrs, customId, dhcpOptionsMap);
|
||||
}
|
||||
|
||||
private void verifyExtraDhcpOptionsNetwork(Map<String, Map<Integer, String>> dhcpOptionsMap, List<NetworkVO> networkList) throws InvalidParameterValueException {
|
||||
if (dhcpOptionsMap != null) {
|
||||
for (String networkUuid : dhcpOptionsMap.keySet()) {
|
||||
boolean networkFound = false;
|
||||
for (NetworkVO network : networkList) {
|
||||
if (network.getUuid().equals(networkUuid)) {
|
||||
networkFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!networkFound) {
|
||||
throw new InvalidParameterValueException("VM does not has a nic in the Network (" + networkUuid + ") that is specified in the extra dhcp options.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void checkNameForRFCCompliance(String name) {
|
||||
@ -3187,7 +3237,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
protected UserVm createVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate tmplt, String hostName, String displayName, Account owner,
|
||||
Long diskOfferingId, Long diskSize, List<NetworkVO> networkList, List<Long> securityGroupIdList, String group, HTTPMethod httpmethod, String userData,
|
||||
String sshKeyPair, HypervisorType hypervisor, Account caller, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean isDisplayVm, String keyboard,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId) throws InsufficientCapacityException, ResourceUnavailableException,
|
||||
List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap) throws InsufficientCapacityException, ResourceUnavailableException,
|
||||
ConcurrentOperationException, StorageUnavailableException, ResourceAllocationException {
|
||||
|
||||
_accountMgr.checkAccess(caller, null, true, owner);
|
||||
@ -3520,7 +3570,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
|
||||
UserVmVO vm = commitUserVm(zone, template, hostName, displayName, owner, diskOfferingId, diskSize, userData, caller, isDisplayVm, keyboard, accountId, userId, offering,
|
||||
isIso, sshPublicKey, networkNicMap, id, instanceName, uuidName, hypervisorType, customParameters);
|
||||
isIso, sshPublicKey, networkNicMap, id, instanceName, uuidName, hypervisorType, customParameters, dhcpOptionMap);
|
||||
|
||||
// Assign instance to the group
|
||||
try {
|
||||
@ -3580,7 +3630,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
private UserVmVO commitUserVm(final DataCenter zone, final VirtualMachineTemplate template, final String hostName, final String displayName, final Account owner,
|
||||
final Long diskOfferingId, final Long diskSize, final String userData, final Account caller, final Boolean isDisplayVm, final String keyboard,
|
||||
final long accountId, final long userId, final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey, final LinkedHashMap<String, NicProfile> networkNicMap,
|
||||
final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType, final Map<String, String> customParameters) throws InsufficientCapacityException {
|
||||
final long id, final String instanceName, final String uuidName, final HypervisorType hypervisorType, final Map<String, String> customParameters, final Map<String, Map<Integer, String>> extraDhcpOptionMap) throws InsufficientCapacityException {
|
||||
return Transaction.execute(new TransactionCallbackWithException<UserVmVO, InsufficientCapacityException>() {
|
||||
@Override
|
||||
public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
|
||||
@ -3686,10 +3736,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
if (isIso) {
|
||||
_orchSrvc.createVirtualMachineFromScratch(vm.getUuid(), Long.toString(owner.getAccountId()), vm.getIsoId().toString(), hostName, displayName,
|
||||
hypervisorType.name(), guestOSCategory.getName(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags,
|
||||
networkNicMap, plan);
|
||||
networkNicMap, plan, extraDhcpOptionMap);
|
||||
} else {
|
||||
_orchSrvc.createVirtualMachine(vm.getUuid(), Long.toString(owner.getAccountId()), Long.toString(template.getId()), hostName, displayName, hypervisorType.name(),
|
||||
offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan, rootDiskSize);
|
||||
offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan, rootDiskSize, extraDhcpOptionMap);
|
||||
}
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
@ -4685,13 +4735,13 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
} else {
|
||||
vm = createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, getSecurityGroupIdList(cmd), owner, name, displayName, diskOfferingId,
|
||||
size , group , cmd.getHypervisor(), cmd.getHttpMethod(), userData , sshKeyPairName , cmd.getIpToNetworkMap(), addrs, displayVm , keyboard , cmd.getAffinityGroupIdList(),
|
||||
cmd.getDetails(), cmd.getCustomId());
|
||||
cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap());
|
||||
}
|
||||
} else {
|
||||
if (zone.isSecurityGroupEnabled()) {
|
||||
vm = createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, cmd.getNetworkIds(), getSecurityGroupIdList(cmd), owner, name,
|
||||
displayName, diskOfferingId, size, group, cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard,
|
||||
cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId());
|
||||
cmd.getAffinityGroupIdList(), cmd.getDetails(), cmd.getCustomId(), cmd.getDhcpOptionsMap());
|
||||
|
||||
} else {
|
||||
if (cmd.getSecurityGroupIdList() != null && !cmd.getSecurityGroupIdList().isEmpty()) {
|
||||
@ -4699,7 +4749,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
vm = createAdvancedVirtualMachine(zone, serviceOffering, template, cmd.getNetworkIds(), owner, name, displayName, diskOfferingId, size, group,
|
||||
cmd.getHypervisor(), cmd.getHttpMethod(), userData, sshKeyPairName, cmd.getIpToNetworkMap(), addrs, displayVm, keyboard, cmd.getAffinityGroupIdList(), cmd.getDetails(),
|
||||
cmd.getCustomId());
|
||||
cmd.getCustomId(), cmd.getDhcpOptionsMap());
|
||||
}
|
||||
}
|
||||
return vm;
|
||||
@ -5546,7 +5596,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
|
||||
VirtualMachine vmi = _itMgr.findById(vm.getId());
|
||||
VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmi);
|
||||
_networkMgr.allocate(vmProfile, networks);
|
||||
_networkMgr.allocate(vmProfile, networks, null);
|
||||
|
||||
_securityGroupMgr.addInstanceToGroups(vm.getId(), securityGroupIdList);
|
||||
|
||||
@ -5668,7 +5718,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
if (applicableNetworks.isEmpty()) {
|
||||
throw new InvalidParameterValueException("No network is specified, please specify one when you move the vm. For now, please add a network to VM on NICs tab.");
|
||||
} else {
|
||||
_networkMgr.allocate(vmProfile, networks);
|
||||
_networkMgr.allocate(vmProfile, networks, null);
|
||||
}
|
||||
|
||||
_securityGroupMgr.addInstanceToGroups(vm.getId(),
|
||||
@ -5796,7 +5846,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
|
||||
}
|
||||
VirtualMachine vmi = _itMgr.findById(vm.getId());
|
||||
VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmi);
|
||||
_networkMgr.allocate(vmProfile, networks);
|
||||
_networkMgr.allocate(vmProfile, networks, null);
|
||||
s_logger.debug("AssignVM: Advance virtual, adding networks no " + networks.size() + " to " + vm.getInstanceName());
|
||||
} // END IF NON SEC GRP ENABLED
|
||||
} // END IF ADVANCED
|
||||
|
||||
@ -523,11 +523,20 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches
|
||||
* @see com.cloud.network.NetworkManager#allocate(com.cloud.vm.VirtualMachineProfile, java.util.List)
|
||||
*/
|
||||
@Override
|
||||
public void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, List<? extends NicProfile>> networks)
|
||||
public void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, List<? extends NicProfile>> networks, final Map<String, Map<Integer, String>> extraDhcpOptions)
|
||||
throws InsufficientCapacityException, ConcurrentOperationException {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void configureExtraDhcpOptions(Network network, long nicId, Map<Integer, String> extraDhcpOptions) {
|
||||
|
||||
}
|
||||
|
||||
@Override public void configureExtraDhcpOptions(Network network, long nicId) {
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#prepare(com.cloud.vm.VirtualMachineProfile, com.cloud.deploy.DeployDestination, com.cloud.vm.ReservationContext)
|
||||
*/
|
||||
@ -589,6 +598,11 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Integer, String> getExtraDhcpOptions(long nicId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#shutdownNetwork(long, com.cloud.vm.ReservationContext, boolean)
|
||||
*/
|
||||
@ -653,6 +667,11 @@ public class MockNetworkManagerImpl extends ManagerBase implements NetworkOrches
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveExtraDhcpOptions(String networkUuid, Long nicId, Map<String, Map<Integer, String>> extraDhcpOptionMap) {
|
||||
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.NetworkManager#allocateNic(com.cloud.vm.NicProfile, com.cloud.network.Network, java.lang.Boolean, int, com.cloud.vm.VirtualMachineProfile)
|
||||
*/
|
||||
|
||||
@ -449,3 +449,14 @@ CREATE VIEW `cloud`.`volume_view` AS
|
||||
`cloud`.`account` resource_tag_account ON resource_tag_account.id = resource_tags.account_id
|
||||
left join
|
||||
`cloud`.`domain` resource_tag_domain ON resource_tag_domain.id = resource_tags.domain_id;
|
||||
|
||||
-- Extra Dhcp Options
|
||||
CREATE TABLE `cloud`.`nic_extra_dhcp_options` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
|
||||
`uuid` varchar(255) UNIQUE,
|
||||
`nic_id` bigint unsigned NOT NULL COMMENT ' nic id where dhcp options are applied',
|
||||
`code` int(32),
|
||||
`value` text,
|
||||
PRIMARY KEY (`id`),
|
||||
CONSTRAINT `fk_nic_extra_dhcp_options_nic_id` FOREIGN KEY (`nic_id`) REFERENCES `nics`(`id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
@ -78,6 +78,35 @@ class needscleanup(object):
|
||||
return _wrapper
|
||||
|
||||
|
||||
class gherkin(object):
|
||||
BLACK = "\033[0;30m"
|
||||
BLUE = "\033[0;34m"
|
||||
GREEN = "\033[0;32m"
|
||||
CYAN = "\033[0;36m"
|
||||
RED = "\033[0;31m"
|
||||
BOLDBLUE = "\033[1;34m"
|
||||
NORMAL = "\033[0m"
|
||||
|
||||
def __init__(self, method):
|
||||
self.method = method
|
||||
|
||||
def __get__(self, obj=None, objtype=None):
|
||||
@functools.wraps(self.method)
|
||||
def _wrapper(*args, **kwargs):
|
||||
gherkin_step = self.method.__name__.replace("_", " ").capitalize()
|
||||
obj.info("=G= %s%s%s" % (self.BOLDBLUE, gherkin_step, self.NORMAL))
|
||||
try:
|
||||
result = self.method(obj, *args, **kwargs)
|
||||
obj.info("=G= %s%s: [SUCCESS]%s" %
|
||||
(self.GREEN, gherkin_step, self.NORMAL))
|
||||
return result
|
||||
except Exception as e:
|
||||
obj.info("=G= %s%s: [FAILED]%s%s" %
|
||||
(self.RED, gherkin_step, self.NORMAL, e))
|
||||
raise
|
||||
return _wrapper
|
||||
|
||||
|
||||
class nuageTestCase(cloudstackTestCase):
|
||||
|
||||
@classmethod
|
||||
|
||||
2037
test/integration/plugins/nuagevsp/test_nuage_extra_dhcp.py
Normal file
2037
test/integration/plugins/nuagevsp/test_nuage_extra_dhcp.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -1952,6 +1952,42 @@ test_data = {
|
||||
"Dns": "VpcVirtualRouter"
|
||||
}
|
||||
},
|
||||
# Services supported by the Nuage VSP plugin for VPC without userdata
|
||||
"vpc_network_offering_nuage_dhcp": {
|
||||
"name": 'nuage_vpc_marvin',
|
||||
"displaytext": 'nuage_vpc_marvin',
|
||||
"guestiptype": 'Isolated',
|
||||
"supportedservices": 'Dhcp,StaticNat,SourceNat,NetworkACL,Connectivity,Dns',
|
||||
"traffictype": 'GUEST',
|
||||
"availability": 'Optional',
|
||||
"useVpc": 'on',
|
||||
"ispersistent": 'True',
|
||||
"serviceProviderList": {
|
||||
"Dhcp": "NuageVsp",
|
||||
"StaticNat": "NuageVsp",
|
||||
"SourceNat": "NuageVsp",
|
||||
"NetworkACL": "NuageVsp",
|
||||
"Connectivity": "NuageVsp",
|
||||
"Dns": "VpcVirtualRouter",
|
||||
},
|
||||
"serviceCapabilityList": {
|
||||
"SourceNat": {"SupportedSourceNatTypes": "perzone"}
|
||||
}
|
||||
},
|
||||
# Services supported by the Nuage VSP plugin for VPCs
|
||||
"vpc_offering_nuage_dhcp": {
|
||||
"name": 'Nuage VSP VPC offering',
|
||||
"displaytext": 'Nuage VSP VPC offering',
|
||||
"supportedservices": 'Dhcp,StaticNat,SourceNat,NetworkACL,Connectivity,Dns',
|
||||
"serviceProviderList": {
|
||||
"Dhcp": "NuageVsp",
|
||||
"StaticNat": "NuageVsp",
|
||||
"SourceNat": "NuageVsp",
|
||||
"NetworkACL": "NuageVsp",
|
||||
"Connectivity": "NuageVsp",
|
||||
"Dns": "VpcVirtualRouter",
|
||||
}
|
||||
},
|
||||
"shared_nuage_network_offering": {
|
||||
"name": 'nuage_marvin',
|
||||
"displaytext": 'nuage_marvin',
|
||||
@ -2048,3 +2084,4 @@ test_data = {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -539,6 +539,9 @@ class VirtualMachine:
|
||||
if "userdata" in services:
|
||||
cmd.userdata = base64.urlsafe_b64encode(services["userdata"])
|
||||
|
||||
if "dhcpoptionsnetworklist" in services:
|
||||
cmd.dhcpoptionsnetworklist = services["dhcpoptionsnetworklist"]
|
||||
|
||||
cmd.details = [{}]
|
||||
|
||||
if customcpunumber:
|
||||
@ -780,7 +783,7 @@ class VirtualMachine:
|
||||
cmd.id = volume.id
|
||||
return apiclient.detachVolume(cmd)
|
||||
|
||||
def add_nic(self, apiclient, networkId, ipaddress=None, macaddress=None):
|
||||
def add_nic(self, apiclient, networkId, ipaddress=None, macaddress=None, dhcpoptions=None):
|
||||
"""Add a NIC to a VM"""
|
||||
cmd = addNicToVirtualMachine.addNicToVirtualMachineCmd()
|
||||
cmd.virtualmachineid = self.id
|
||||
@ -788,6 +791,8 @@ class VirtualMachine:
|
||||
|
||||
if ipaddress:
|
||||
cmd.ipaddress = ipaddress
|
||||
if dhcpoptions:
|
||||
cmd.dhcpoptions = dhcpoptions
|
||||
|
||||
if macaddress:
|
||||
cmd.macaddress = macaddress
|
||||
|
||||
125
utils/src/main/java/com/cloud/utils/net/Dhcp.java
Normal file
125
utils/src/main/java/com/cloud/utils/net/Dhcp.java
Normal file
@ -0,0 +1,125 @@
|
||||
//
|
||||
// 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.utils.net;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Dhcp {
|
||||
public enum DhcpOptionCode {
|
||||
NETMASK(1, "netmask"),
|
||||
TIME_OFFSET(2, "time-offset"),
|
||||
ROUTER(3, "router"),
|
||||
TIME_SERVER(4, "time-server"),
|
||||
DNS_SERVER(6, "dns-server"),
|
||||
LOG_SERVER(7, "log-server"),
|
||||
LPR_SERVER(9, "lpr-server"),
|
||||
HOSTNAME(12, "hostname"),
|
||||
BOOT_FILE_SIZE(13, "boot-file-size"),
|
||||
DOMAIN_NAME(15, "domain-name"),
|
||||
SWAP_SERVER(16, "swap-server"),
|
||||
ROOT_PATH(17, "root-path"),
|
||||
EXTENSION_PATH(18, "extension-path"),
|
||||
IP_FORWARD_ENABLE(19, "ip-forward-enable"),
|
||||
NON_LOCAL_SOURCE_ROUTING(20, "non-local-source-routing"),
|
||||
POLICY_FILTER(21, "policy-filter"),
|
||||
MAX_DATAGRAM_REASSEMBLY(22, "max-datagram-reassembly"),
|
||||
DEFAULT_TTL(23, "default-ttl"),
|
||||
MTU(26, "mtu"),
|
||||
ALL_SUBNETS_LOCAL(27, "all-subnets-local"),
|
||||
BROADCAST(28, "broadcast"),
|
||||
ROUTER_DISCOVERY(31, "router-discovery"),
|
||||
ROUTER_SOLICITATION(32, "router-solicitation"),
|
||||
STATIC_ROUTE(33, "static-route"),
|
||||
TRAILER_ENCAPSULATION(34, "trailer-encapsulation"),
|
||||
ARP_TIMEOUT(35, "arp-timeout"),
|
||||
ETHERNET_ENCAP(36, "ethernet-encap"),
|
||||
TCP_TTL(37, "tcp-ttl"),
|
||||
TCP_KEEPALIVE(38, "tcp-keepalive"),
|
||||
NIS_DOMAIN(40, "nis-domain"),
|
||||
NIS_SERVER(41, "nis-server"),
|
||||
NTP_SERVER(42, "ntp-server"),
|
||||
VENDOR_ENCAP(43, "vendor-encap"),
|
||||
NETBIOS_NS(44, "netbios-ns"),
|
||||
NETBIOS_DD(45, "netbios-dd"),
|
||||
NETBIOS_NODETYPE(46, "netbios-nodetype"),
|
||||
NETBIOS_SCOPE(47, "netbios-scope"),
|
||||
X_WINDOWS_FS(48, "x-windows-fs"),
|
||||
X_WINDOWS_DM(49, "x-windows-dm"),
|
||||
REQUESTED_ADDRESS(50, "requested-address"),
|
||||
LEASE_TIME(51, "lease-time"),
|
||||
OPTION_OVERLOAD(52, "option-overload"),
|
||||
MESSAGE_TYPE(53, "message-type"),
|
||||
SERVER_IDENTIFIER(54, "server-identifier"),
|
||||
PARAMETER_REQUEST(55, "parameter-request"),
|
||||
MESSAGE(56, "message"),
|
||||
MAX_MESSAGE_SIZE(57, "max-message-size"),
|
||||
T1(58, "T1"),
|
||||
T2(59, "T2"),
|
||||
VENDOR_CLASS(60, "vendor-class"),
|
||||
CLIENT_ID(61, "client-id"),
|
||||
NISPLUS_DOMAIN(64, "nis+-domain"),
|
||||
NISPLUS_SERVER(65, "nis+-server"),
|
||||
TFTP_SERVER(66, "tftp-server"),
|
||||
BOOTFILE_NAME(67, "bootfile-name"),
|
||||
MOBILE_IP_HOME(68, "mobile-ip-home"),
|
||||
SMTP_SERVER(69, "smtp-server"),
|
||||
POP3_SERVER(70, "pop3-server"),
|
||||
NNTP_SERVER(71, "nntp-server"),
|
||||
IRC_SERVER(74, "irc-server"),
|
||||
USER_CLASS(77, "user-class"),
|
||||
CLIENT_ARCH(93, "client-arch"),
|
||||
CLIENT_INTERFACE_ID(94, "client-interface-id"),
|
||||
CLIENT_MACHINE_ID(97, "client-machine-id"),
|
||||
URL(114, "url"),
|
||||
DOMAIN_SEARCH(119, "domain-search"),
|
||||
SIP_SERVER(120, "sip-server"),
|
||||
CLASSLESS_STATIC_ROUTE(121, "classless-static-route"),
|
||||
VENDOR_ID_ENCAP(125, "vendor-id-encap"),
|
||||
SERVER_IP_ADDRESS(255, "server-ip-address");
|
||||
|
||||
private int code;
|
||||
private String name;
|
||||
|
||||
DhcpOptionCode(int code, String name){
|
||||
this.code = code;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getName() { return name; }
|
||||
|
||||
public static DhcpOptionCode valueOfInt(int code) {
|
||||
return Arrays.stream(DhcpOptionCode.values())
|
||||
.filter(option -> option.getCode() == code)
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("Dhcp option code " + code + " not supported."));
|
||||
}
|
||||
|
||||
public static DhcpOptionCode valueOfString(String name) {
|
||||
return Arrays.stream(DhcpOptionCode.values())
|
||||
.filter(option -> option.getName().equals(name))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new IllegalArgumentException("Dhcp option " + name + " not supported."));
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user