mirror of https://github.com/apache/cloudstack.git
Merge branch 'master' into ui-restyle
This commit is contained in:
commit
0fb669811d
|
|
@ -1,4 +1,4 @@
|
|||
G# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# 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
|
||||
|
|
|
|||
|
|
@ -167,7 +167,8 @@ public class AgentShell implements IAgentShell, Daemon {
|
|||
|
||||
void loadProperties() throws ConfigurationException {
|
||||
final File file = PropertiesUtil.findConfigFile("agent.properties");
|
||||
if (file == null) {
|
||||
|
||||
if (null == file) {
|
||||
throw new ConfigurationException("Unable to find agent.properties.");
|
||||
}
|
||||
|
||||
|
|
@ -303,12 +304,17 @@ public class AgentShell implements IAgentShell, Daemon {
|
|||
// For KVM agent, do it specially here
|
||||
|
||||
File file = new File("/etc/cloudstack/agent/log4j-cloud.xml");
|
||||
if (!file.exists()) {
|
||||
if(!file.exists()) {
|
||||
file = PropertiesUtil.findConfigFile("log4j-cloud.xml");
|
||||
}
|
||||
DOMConfigurator.configureAndWatch(file.getAbsolutePath());
|
||||
|
||||
s_logger.info("Agent started");
|
||||
if (null != file) {
|
||||
DOMConfigurator.configureAndWatch(file.getAbsolutePath());
|
||||
|
||||
s_logger.info("Agent started");
|
||||
} else {
|
||||
s_logger.error("Could not start the Agent because the absolut path of the \"log4j-cloud.xml\" file cannot be determined.");
|
||||
}
|
||||
|
||||
final Class<?> c = this.getClass();
|
||||
_version = c.getPackage().getImplementationVersion();
|
||||
|
|
|
|||
|
|
@ -39,4 +39,5 @@ public interface Alert extends Identity, InternalIdentity {
|
|||
Date getResolved();
|
||||
|
||||
boolean getArchived();
|
||||
String getName();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -398,6 +398,8 @@ public class EventTypes {
|
|||
public static final String EVENT_EXTERNAL_NVP_CONTROLLER_ADD = "PHYSICAL.NVPCONTROLLER.ADD";
|
||||
public static final String EVENT_EXTERNAL_NVP_CONTROLLER_DELETE = "PHYSICAL.NVPCONTROLLER.DELETE";
|
||||
public static final String EVENT_EXTERNAL_NVP_CONTROLLER_CONFIGURE = "PHYSICAL.NVPCONTROLLER.CONFIGURE";
|
||||
public static final String EVENT_EXTERNAL_OVS_CONTROLLER_ADD = "PHYSICAL.OVSCONTROLLER.ADD";
|
||||
public static final String EVENT_EXTERNAL_OVS_CONTROLLER_DELETE = "PHYSICAL.OVSCONTROLLER.DELETE";
|
||||
|
||||
// AutoScale
|
||||
public static final String EVENT_COUNTER_CREATE = "COUNTER.CREATE";
|
||||
|
|
@ -450,6 +452,10 @@ public class EventTypes {
|
|||
// Object store migration
|
||||
public static final String EVENT_MIGRATE_PREPARE_SECONDARY_STORAGE = "MIGRATE.PREPARE.SS";
|
||||
|
||||
//Alert generation
|
||||
public static final String ALERT_GENERATE = "ALERT.GENERATE";
|
||||
|
||||
|
||||
static {
|
||||
|
||||
// TODO: need a way to force author adding event types to declare the entity details as well, with out braking
|
||||
|
|
|
|||
|
|
@ -126,6 +126,8 @@ public interface Network extends ControlledEntity, StateObject<Network.State>, I
|
|||
public static final Provider NiciraNvp = new Provider("NiciraNvp", false);
|
||||
public static final Provider InternalLbVm = new Provider("InternalLbVm", false);
|
||||
public static final Provider CiscoVnmc = new Provider("CiscoVnmc", true);
|
||||
// add new Ovs provider
|
||||
public static final Provider Ovs = new Provider("Ovs", false);
|
||||
|
||||
private final String name;
|
||||
private final boolean isExternal;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
package com.cloud.network;
|
||||
|
||||
import org.apache.cloudstack.api.Identity;
|
||||
import org.apache.cloudstack.api.InternalIdentity;
|
||||
|
||||
public interface OvsProvider extends InternalIdentity, Identity {
|
||||
public boolean isEnabled();
|
||||
|
||||
public long getNspId();
|
||||
}
|
||||
|
|
@ -18,9 +18,12 @@ package com.cloud.network.element;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
|
||||
import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
|
||||
import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd;
|
||||
import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
|
||||
|
||||
import com.cloud.network.OvsProvider;
|
||||
import com.cloud.network.VirtualRouterProvider;
|
||||
import com.cloud.network.VirtualRouterProvider.Type;
|
||||
import com.cloud.utils.component.PluggableService;
|
||||
|
|
@ -28,9 +31,12 @@ import com.cloud.utils.component.PluggableService;
|
|||
public interface VirtualRouterElementService extends PluggableService {
|
||||
VirtualRouterProvider configure(ConfigureVirtualRouterElementCmd cmd);
|
||||
|
||||
OvsProvider configure(ConfigureOvsElementCmd cmd);
|
||||
VirtualRouterProvider addElement(Long nspId, Type providerType);
|
||||
|
||||
VirtualRouterProvider getCreatedElement(long id);
|
||||
|
||||
List<? extends VirtualRouterProvider> searchForVirtualRouterElement(ListVirtualRouterElementsCmd cmd);
|
||||
|
||||
List<? extends OvsProvider> searchForOvsElement(ListOvsElementsCmd cmd);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -437,13 +437,15 @@ public class LoadBalancingRule {
|
|||
private String key;
|
||||
private String password = null;
|
||||
private String chain = null;
|
||||
private String fingerprint;
|
||||
private boolean revoked;
|
||||
|
||||
public LbSslCert(String cert, String key, String password, String chain, boolean revoked) {
|
||||
public LbSslCert(String cert, String key, String password, String chain, String fingerprint, boolean revoked) {
|
||||
this.cert = cert;
|
||||
this.key = key;
|
||||
this.password = password;
|
||||
this.chain = chain;
|
||||
this.fingerprint = fingerprint;
|
||||
this.revoked = revoked;
|
||||
}
|
||||
|
||||
|
|
@ -464,6 +466,10 @@ public class LoadBalancingRule {
|
|||
return chain;
|
||||
}
|
||||
|
||||
public String getFingerprint() {
|
||||
return fingerprint;
|
||||
}
|
||||
|
||||
public boolean isRevoked() {
|
||||
return revoked;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ package com.cloud.network.vpc;
|
|||
import java.util.List;
|
||||
|
||||
import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd;
|
||||
import org.apache.cloudstack.api.command.user.network.ListNetworkACLListsCmd;
|
||||
import org.apache.cloudstack.api.command.user.network.ListNetworkACLsCmd;
|
||||
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
|
|
@ -43,13 +44,10 @@ public interface NetworkACLService {
|
|||
|
||||
/**
|
||||
* List NetworkACLs by Id/Name/Network or Vpc it belongs to
|
||||
* @param id
|
||||
* @param name
|
||||
* @param networkId
|
||||
* @param vpcId
|
||||
* @param cmd
|
||||
* @return
|
||||
*/
|
||||
Pair<List<? extends NetworkACL>, Integer> listNetworkACLs(Long id, String name, Long networkId, Long vpcId);
|
||||
Pair<List<? extends NetworkACL>,Integer> listNetworkACLs(ListNetworkACLListsCmd cmd);
|
||||
|
||||
/**
|
||||
* Delete specified network ACL. Deletion fails if the list is not empty
|
||||
|
|
|
|||
|
|
@ -22,15 +22,31 @@ import org.apache.cloudstack.api.InternalIdentity;
|
|||
|
||||
public interface ResourceTag extends ControlledEntity, Identity, InternalIdentity {
|
||||
|
||||
//FIXME - extract enum to another interface as its used both by resourceTags and resourceMetaData code
|
||||
// FIXME - extract enum to another interface as its used both by resourceTags and resourceMetaData code
|
||||
public enum ResourceObjectType {
|
||||
UserVm(true, true), Template(true, true), ISO(true, false), Volume(true, true), Snapshot(true, false), Network(true, true), Nic(false, true), LoadBalancer(
|
||||
true,
|
||||
true), PortForwardingRule(true, true), FirewallRule(true, true), SecurityGroup(true, false), PublicIpAddress(true, true), Project(true, false), Vpc(
|
||||
true,
|
||||
false), NetworkACL(true, false), StaticRoute(true, false), VMSnapshot(true, false), RemoteAccessVpn(true, true), Zone(false, true), ServiceOffering(
|
||||
false,
|
||||
true), Storage(false, true);
|
||||
UserVm(true, true),
|
||||
Template(true, true),
|
||||
ISO(true, false),
|
||||
Volume(true, true),
|
||||
Snapshot(true, false),
|
||||
Network(true, true),
|
||||
Nic(false, true),
|
||||
LoadBalancer(true, true),
|
||||
PortForwardingRule(true, true),
|
||||
FirewallRule(true, true),
|
||||
SecurityGroup(true, false),
|
||||
PublicIpAddress(true, true),
|
||||
Project(true, false),
|
||||
Vpc(true, true),
|
||||
NetworkACL(true, true),
|
||||
StaticRoute(true, false),
|
||||
VMSnapshot(true, false),
|
||||
RemoteAccessVpn(true, true),
|
||||
Zone(false, true),
|
||||
ServiceOffering(false, true),
|
||||
Storage(false, true),
|
||||
PrivateGateway(false, true),
|
||||
NetworkACLList(false, true);
|
||||
|
||||
ResourceObjectType(boolean resourceTagsSupport, boolean resourceMetadataSupport) {
|
||||
this.resourceTagsSupport = resourceTagsSupport;
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ public interface VolumeApiService {
|
|||
|
||||
Snapshot allocSnapshot(Long volumeId, Long policyId) throws ResourceAllocationException;
|
||||
|
||||
Volume updateVolume(long volumeId, String path, String state, Long storageId, Boolean displayVolume);
|
||||
Volume updateVolume(long volumeId, String path, String state, Long storageId, Boolean displayVolume, String customId, long owner);
|
||||
|
||||
/**
|
||||
* Extracts the volume to a particular location.
|
||||
|
|
|
|||
|
|
@ -139,4 +139,40 @@ public interface ResourceLimitService {
|
|||
*/
|
||||
public long getResourceCount(Account account, ResourceType type);
|
||||
|
||||
|
||||
/**
|
||||
* Checks if a limit has been exceeded for an account depending on the displayResource flag
|
||||
*
|
||||
* @param account
|
||||
* @param type
|
||||
* @param displayResource
|
||||
* @param count
|
||||
* the number of resources being allocated, count will be added to current allocation and compared
|
||||
* against maximum allowed allocation
|
||||
* @throws ResourceAllocationException
|
||||
*/
|
||||
void checkResourceLimit(Account account, ResourceType type, Boolean displayResource, long... count) throws ResourceAllocationException;
|
||||
|
||||
|
||||
/**
|
||||
* Increments the resource count depending on the displayResource flag
|
||||
*
|
||||
* @param accountId
|
||||
* @param type
|
||||
* @param displayResource
|
||||
* @param delta
|
||||
*/
|
||||
void incrementResourceCount(long accountId, ResourceType type, Boolean displayResource, Long... delta);
|
||||
|
||||
/**
|
||||
* Increments/Decrements the resource count depending on the displayResource flag
|
||||
*
|
||||
* @param accountId
|
||||
* @param type
|
||||
* @param displayResource
|
||||
* @param delta
|
||||
*/
|
||||
void changeResourceCount(long accountId, ResourceType type, Boolean displayResource, Long... delta);
|
||||
|
||||
void decrementResourceCount(long accountId, ResourceType type, Boolean displayResource, Long... delta);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -137,6 +137,7 @@ public interface UserVmService {
|
|||
* caller.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param zone
|
||||
* - availability zone for the virtual machine
|
||||
* @param serviceOffering
|
||||
|
|
@ -182,15 +183,10 @@ public interface UserVmService {
|
|||
* @param displayVm
|
||||
* - Boolean flag whether to the display the vm to the end user or not
|
||||
* @param affinityGroupIdList
|
||||
* @param accountName
|
||||
* - an optional account for the virtual machine. Must be used
|
||||
* with domainId
|
||||
* @param domainId
|
||||
* - an optional domainId for the virtual machine. If the account
|
||||
* parameter is used, domainId must also be used
|
||||
* @param cpuSpeed
|
||||
* @param memory
|
||||
* @param cpuNumber
|
||||
* @param customId
|
||||
* @return UserVm object if successful.
|
||||
*
|
||||
* @throws InsufficientCapacityException
|
||||
|
|
@ -204,9 +200,9 @@ public interface UserVmService {
|
|||
* @throws InsufficientResourcesException
|
||||
*/
|
||||
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, Integer cpuSpeed, Integer memory, Integer cpuNumber, Long rootdisksize) throws InsufficientCapacityException,
|
||||
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,
|
||||
ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
|
||||
|
||||
/**
|
||||
|
|
@ -214,6 +210,7 @@ public interface UserVmService {
|
|||
* the database and returns the VM to the caller.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param zone
|
||||
* - availability zone for the virtual machine
|
||||
* @param serviceOffering
|
||||
|
|
@ -261,15 +258,9 @@ public interface UserVmService {
|
|||
* @param displayVm
|
||||
* - Boolean flag whether to the display the vm to the end user or not
|
||||
* @param affinityGroupIdList
|
||||
* @param accountName
|
||||
* - an optional account for the virtual machine. Must be used
|
||||
* with domainId
|
||||
* @param domainId
|
||||
* - an optional domainId for the virtual machine. If the account
|
||||
* parameter is used, domainId must also be used
|
||||
* @param CpuSpeed
|
||||
* @param memory
|
||||
* @param cpuNumber
|
||||
* @param customId
|
||||
* @return UserVm object if successful.
|
||||
*
|
||||
* @throws InsufficientCapacityException
|
||||
|
|
@ -283,9 +274,9 @@ public interface UserVmService {
|
|||
* @throws InsufficientResourcesException
|
||||
*/
|
||||
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, Integer cpuSpeed, Integer memory, Integer cpuNumber, Long rootdisksize) throws InsufficientCapacityException,
|
||||
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, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
|
||||
|
||||
/**
|
||||
|
|
@ -293,6 +284,7 @@ public interface UserVmService {
|
|||
* in the database and returns the VM to the caller.
|
||||
*
|
||||
*
|
||||
*
|
||||
* @param zone
|
||||
* - availability zone for the virtual machine
|
||||
* @param serviceOffering
|
||||
|
|
@ -337,15 +329,10 @@ public interface UserVmService {
|
|||
* @param displayVm
|
||||
* - Boolean flag whether to the display the vm to the end user or not
|
||||
* @param affinityGroupIdList
|
||||
* @param accountName
|
||||
* - an optional account for the virtual machine. Must be used
|
||||
* with domainId
|
||||
* @param domainId
|
||||
* - an optional domainId for the virtual machine. If the account
|
||||
* parameter is used, domainId must also be used
|
||||
* @param cpuSpeed
|
||||
* @param memory
|
||||
* @param cpuNumber
|
||||
* @param customId
|
||||
* @return UserVm object if successful.
|
||||
*
|
||||
* @throws InsufficientCapacityException
|
||||
|
|
@ -359,9 +346,9 @@ public interface UserVmService {
|
|||
* @throws InsufficientResourcesException
|
||||
*/
|
||||
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,
|
||||
Integer cpuSpeed, Integer memory, Integer cpuNumber, Long rootdkisksize)
|
||||
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, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,103 @@
|
|||
|
||||
// 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.alert;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import com.cloud.capacity.Capacity;
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
|
||||
public interface AlertService {
|
||||
public static class AlertType {
|
||||
private static Set<AlertType> defaultAlertTypes = new HashSet<AlertType>();
|
||||
private final String name;
|
||||
private final short type;
|
||||
|
||||
private AlertType(short type, String name, boolean isDefault) {
|
||||
this.name = name;
|
||||
this.type = type;
|
||||
if (isDefault) {
|
||||
defaultAlertTypes.add(this);
|
||||
}
|
||||
}
|
||||
|
||||
public static final AlertType ALERT_TYPE_MEMORY = new AlertType(Capacity.CAPACITY_TYPE_MEMORY, "ALERT.MEMORY", true);
|
||||
public static final AlertType ALERT_TYPE_CPU = new AlertType(Capacity.CAPACITY_TYPE_CPU, "ALERT.CPU", true);
|
||||
public static final AlertType ALERT_TYPE_STORAGE = new AlertType(Capacity.CAPACITY_TYPE_STORAGE, "ALERT.STORAGE", true);
|
||||
public static final AlertType ALERT_TYPE_STORAGE_ALLOCATED = new AlertType(Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, "ALERT.STORAGE.ALLOCATED", true);
|
||||
public static final AlertType ALERT_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = new AlertType(Capacity.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP, "ALERT.NETWORK.PUBLICIP", true);
|
||||
public static final AlertType ALERT_TYPE_PRIVATE_IP = new AlertType(Capacity.CAPACITY_TYPE_PRIVATE_IP, "ALERT.NETWORK.PRIVATEIP", true);
|
||||
public static final AlertType ALERT_TYPE_SECONDARY_STORAGE = new AlertType(Capacity.CAPACITY_TYPE_SECONDARY_STORAGE, "ALERT.STORAGE.SECONDARY", true);
|
||||
public static final AlertType ALERT_TYPE_HOST = new AlertType((short)7, "ALERT.COMPUTE.HOST", true);
|
||||
public static final AlertType ALERT_TYPE_USERVM = new AlertType((short)8, "ALERT.USERVM", true);
|
||||
public static final AlertType ALERT_TYPE_DOMAIN_ROUTER = new AlertType((short)9, "ALERT.SERVICE.DOMAINROUTER", true);
|
||||
public static final AlertType ALERT_TYPE_CONSOLE_PROXY = new AlertType((short)10, "ALERT.SERVICE.CONSOLEPROXY", true);
|
||||
public static final AlertType ALERT_TYPE_ROUTING = new AlertType((short)11, "ALERT.NETWORK.ROUTING", true);
|
||||
public static final AlertType ALERT_TYPE_STORAGE_MISC = new AlertType((short)12, "ALERT.STORAGE.MISC", true);
|
||||
public static final AlertType ALERT_TYPE_USAGE_SERVER = new AlertType((short)13, "ALERT.USAGE", true);
|
||||
public static final AlertType ALERT_TYPE_MANAGMENT_NODE = new AlertType((short)14, "ALERT.MANAGEMENT", true);
|
||||
public static final AlertType ALERT_TYPE_DOMAIN_ROUTER_MIGRATE = new AlertType((short)15, "ALERT.NETWORK.DOMAINROUTERMIGRATE", true);
|
||||
public static final AlertType ALERT_TYPE_CONSOLE_PROXY_MIGRATE = new AlertType((short)16, "ALERT.SERVICE.CONSOLEPROXYMIGRATE", true);
|
||||
public static final AlertType ALERT_TYPE_USERVM_MIGRATE = new AlertType((short)17, "ALERT.USERVM.MIGRATE", true);
|
||||
public static final AlertType ALERT_TYPE_VLAN = new AlertType((short)18, "ALERT.NETWORK.VLAN", true);
|
||||
public static final AlertType ALERT_TYPE_SSVM = new AlertType((short)19, "ALERT.SERVICE.SSVM", true);
|
||||
public static final AlertType ALERT_TYPE_USAGE_SERVER_RESULT = new AlertType((short)20, "ALERT.USAGE.RESULT", true);
|
||||
public static final AlertType ALERT_TYPE_STORAGE_DELETE = new AlertType((short)21, "ALERT.STORAGE.DELETE", true);
|
||||
public static final AlertType ALERT_TYPE_UPDATE_RESOURCE_COUNT = new AlertType((short)22, "ALERT.RESOURCE.COUNT", true);
|
||||
public static final AlertType ALERT_TYPE_USAGE_SANITY_RESULT = new AlertType((short)23, "ALERT.USAGE.SANITY", true);
|
||||
public static final AlertType ALERT_TYPE_DIRECT_ATTACHED_PUBLIC_IP = new AlertType((short)24, "ALERT.NETWORK.DIRECTPUBLICIP", true);
|
||||
public static final AlertType ALERT_TYPE_LOCAL_STORAGE = new AlertType((short)25, "ALERT.STORAGE.LOCAL", true);
|
||||
public static final AlertType ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED = new AlertType((short)26, "ALERT.RESOURCE.EXCEED", true);
|
||||
public static final AlertType ALERT_TYPE_SYNC = new AlertType((short)27, "ALERT.TYPE.SYNC", true);
|
||||
|
||||
public short getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
private static AlertType getAlertType(short type) {
|
||||
for (AlertType alertType : defaultAlertTypes) {
|
||||
if (alertType.getType() == type) {
|
||||
return alertType;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.valueOf(this.getType());
|
||||
}
|
||||
|
||||
public static AlertType generateAlert(short type, String name) {
|
||||
AlertType defaultAlert = getAlertType(type);
|
||||
if (defaultAlert != null && !defaultAlert.getName().equalsIgnoreCase(name)) {
|
||||
throw new InvalidParameterValueException("There is a default alert having type " + type + " and name " + defaultAlert.getName());
|
||||
} else {
|
||||
return new AlertType(type, name, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean generateAlert(AlertType alertType, long dataCenterId, Long podId, String msg);
|
||||
|
||||
}
|
||||
|
|
@ -54,6 +54,7 @@ public class ApiConstants {
|
|||
public static final String CREATED = "created";
|
||||
public static final String CUSTOMIZED = "customized";
|
||||
public static final String CUSTOMIZED_IOPS = "customizediops";
|
||||
public static final String CUSTOM_ID = "customid";
|
||||
public static final String MIN_IOPS = "miniops";
|
||||
public static final String MAX_IOPS = "maxiops";
|
||||
public static final String HYPERVISOR_SNAPSHOT_RESERVE = "hypervisorsnapshotreserve";
|
||||
|
|
@ -71,6 +72,7 @@ public class ApiConstants {
|
|||
public static final String DISPLAY_VM = "displayvm";
|
||||
public static final String DISPLAY_OFFERING = "displayoffering";
|
||||
public static final String DISPLAY_VOLUME = "displayvolume";
|
||||
public static final String CUSTOM_PARAMETERS = "customparameters";
|
||||
public static final String DNS1 = "dns1";
|
||||
public static final String DNS2 = "dns2";
|
||||
public static final String IP6_DNS1 = "ip6dns1";
|
||||
|
|
@ -407,10 +409,20 @@ public class ApiConstants {
|
|||
public static final String VSWITCH_TYPE_PUBLIC_TRAFFIC = "publicvswitchtype";
|
||||
public static final String VSWITCH_NAME_GUEST_TRAFFIC = "guestvswitchname";
|
||||
public static final String VSWITCH_NAME_PUBLIC_TRAFFIC = "publicvswitchname";
|
||||
// Ovs controller
|
||||
public static final String OVS_DEVICE_ID = "ovsdeviceid";
|
||||
public static final String OVS_DEVICE_NAME = "ovsdevicename";
|
||||
// OpenDaylight controller
|
||||
public static final String ODL_DEVICE_ID = "odldeviceid";
|
||||
public static final String ODL_DEVICE_NAME = "odldevicename";
|
||||
public static final String ODL_TRANSPORT_ZONE_UUID = "transportzoneuuid";
|
||||
public static final String ODL_GATEWAYSERVICE_UUID = "l3gatewayserviceuuid";
|
||||
|
||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_ID = "vsmdeviceid";
|
||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_NAME = "vsmdevicename";
|
||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_STATE = "vsmdevicestate";
|
||||
// Would we need to have a capacity field for Cisco N1KV VSM? Max hosts managed by it perhaps? May remove this later.
|
||||
// Would we need to have a capacity field for Cisco N1KV VSM? Max hosts managed by it perhaps? May remove this
|
||||
// later.
|
||||
public static final String EXTERNAL_SWITCH_MGMT_DEVICE_CAPACITY = "vsmdevicecapacity";
|
||||
public static final String CISCO_NEXUS_VSM_NAME = "vsmname";
|
||||
public static final String VSM_USERNAME = "vsmusername";
|
||||
|
|
@ -534,6 +546,7 @@ public class ApiConstants {
|
|||
public static final String FOR_DISPLAY = "fordisplay";
|
||||
public static final String PASSIVE = "passive";
|
||||
public static final String VERSION = "version";
|
||||
public static final String START = "start";
|
||||
|
||||
public enum HostDetails {
|
||||
all, capacity, events, stats, min;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
// 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;
|
||||
|
||||
|
||||
public abstract class BaseAsyncCreateCustomIdCmd extends BaseAsyncCreateCmd{
|
||||
@Parameter(name=ApiConstants.CUSTOM_ID, type=CommandType.STRING, description="an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only")
|
||||
private String customId;
|
||||
|
||||
public String getCustomId() {
|
||||
return customId;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// 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;
|
||||
|
||||
|
||||
public abstract class BaseAsyncCustomIdCmd extends BaseAsyncCmd {
|
||||
@Parameter(name=ApiConstants.CUSTOM_ID, type=CommandType.STRING, description="an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only")
|
||||
private String customId;
|
||||
|
||||
public String getCustomId() {
|
||||
return customId;
|
||||
}
|
||||
}
|
||||
|
|
@ -26,14 +26,14 @@ import java.util.regex.Pattern;
|
|||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.affinity.AffinityGroupService;
|
||||
import org.apache.cloudstack.alert.AlertService;
|
||||
import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
|
||||
import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService;
|
||||
import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService;
|
||||
import org.apache.cloudstack.query.QueryService;
|
||||
import org.apache.cloudstack.usage.UsageService;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.configuration.ConfigurationService;
|
||||
import com.cloud.domain.Domain;
|
||||
|
|
@ -191,9 +191,12 @@ public abstract class BaseCmd {
|
|||
public InternalLoadBalancerVMService _internalLbSvc;
|
||||
@Inject
|
||||
public NetworkModel _ntwkModel;
|
||||
|
||||
@Inject
|
||||
public AlertService _alertSvc;
|
||||
|
||||
public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
|
||||
ResourceAllocationException, NetworkRuleConflictException;
|
||||
ResourceAllocationException, NetworkRuleConflictException;
|
||||
|
||||
|
||||
public void configure() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
// 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;
|
||||
|
||||
public abstract class BaseCustomIdCmd extends BaseCmd {
|
||||
|
||||
@Parameter(name=ApiConstants.CUSTOM_ID, type=CommandType.STRING, description="an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only")
|
||||
private String customId;
|
||||
|
||||
public String getCustomId() {
|
||||
return customId;
|
||||
}
|
||||
}
|
||||
|
|
@ -67,6 +67,7 @@ import org.apache.cloudstack.api.response.NetworkOfferingResponse;
|
|||
import org.apache.cloudstack.api.response.NetworkResponse;
|
||||
import org.apache.cloudstack.api.response.NicResponse;
|
||||
import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
|
||||
import org.apache.cloudstack.api.response.OvsProviderResponse;
|
||||
import org.apache.cloudstack.api.response.PhysicalNetworkResponse;
|
||||
import org.apache.cloudstack.api.response.PodResponse;
|
||||
import org.apache.cloudstack.api.response.PortableIpRangeResponse;
|
||||
|
|
@ -134,6 +135,7 @@ import com.cloud.network.IpAddress;
|
|||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Network.Service;
|
||||
import com.cloud.network.Networks.IsolationType;
|
||||
import com.cloud.network.OvsProvider;
|
||||
import com.cloud.network.PhysicalNetwork;
|
||||
import com.cloud.network.PhysicalNetworkServiceProvider;
|
||||
import com.cloud.network.PhysicalNetworkTrafficType;
|
||||
|
|
@ -353,6 +355,8 @@ public interface ResponseGenerator {
|
|||
|
||||
VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result);
|
||||
|
||||
OvsProviderResponse createOvsProviderResponse(OvsProvider result);
|
||||
|
||||
StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result);
|
||||
|
||||
RegionResponse createRegionResponse(Region region);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,123 @@
|
|||
// 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.command.admin.alert;
|
||||
|
||||
import org.apache.cloudstack.alert.AlertService;
|
||||
import org.apache.cloudstack.alert.AlertService.AlertType;
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.ServerApiException;
|
||||
import org.apache.cloudstack.api.response.PodResponse;
|
||||
import org.apache.cloudstack.api.response.SuccessResponse;
|
||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.event.EventTypes;
|
||||
|
||||
@APICommand(name = "generateAlert", description = "Generates an alert", responseObject = SuccessResponse.class, since="4.3")
|
||||
public class GenerateAlertCmd extends BaseAsyncCmd {
|
||||
|
||||
public static final Logger s_logger = Logger.getLogger(GenerateAlertCmd.class.getName());
|
||||
|
||||
private static final String s_name = "generatealertresponse";
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ////////////// API parameters /////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
@Parameter(name = ApiConstants.TYPE, type = CommandType.SHORT, description = "Type of the alert", required=true)
|
||||
private Short type;
|
||||
|
||||
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "Name of the alert", required=true)
|
||||
private String name;
|
||||
|
||||
@Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "Alert description", required=true)
|
||||
private String description;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class, description="Zone id for which alert is generated")
|
||||
private Long zoneId;
|
||||
|
||||
@Parameter(name=ApiConstants.POD_ID, type=CommandType.UUID, entityType=PodResponse.class, description="Pod id for which alert is generated")
|
||||
private Long podId;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////////// Accessors ///////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
@Override
|
||||
public String getCommandName() {
|
||||
return s_name;
|
||||
}
|
||||
|
||||
public Short getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public long getZoneId() {
|
||||
if (zoneId == null) {
|
||||
return 0L;
|
||||
}
|
||||
return zoneId;
|
||||
}
|
||||
|
||||
public Long getPodId() {
|
||||
return podId;
|
||||
}
|
||||
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////// API Implementation///////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
AlertType alertType = AlertService.AlertType.generateAlert(getType(), getName());
|
||||
if (_alertSvc.generateAlert(alertType, getZoneId(), getPodId(), getDescription())) {
|
||||
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||
this.setResponseObject(response);
|
||||
} else {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to generate an alert");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventType() {
|
||||
return EventTypes.ALERT_GENERATE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventDescription() {
|
||||
return "Generating alert of type " + type + "; name " + name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getEntityOwnerId() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -19,14 +19,13 @@ package org.apache.cloudstack.api.command.admin.resource;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseListCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.response.AlertResponse;
|
||||
import org.apache.cloudstack.api.response.ListResponse;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.alert.Alert;
|
||||
import com.cloud.utils.Pair;
|
||||
|
|
@ -47,6 +46,9 @@ public class ListAlertsCmd extends BaseListCmd {
|
|||
|
||||
@Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "list by alert type")
|
||||
private String type;
|
||||
|
||||
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "list by alert name", since="4.3")
|
||||
private String name;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////////// Accessors ///////////////////////
|
||||
|
|
@ -59,6 +61,10 @@ public class ListAlertsCmd extends BaseListCmd {
|
|||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////// API Implementation///////////////////
|
||||
|
|
@ -80,6 +86,7 @@ public class ListAlertsCmd extends BaseListCmd {
|
|||
alertResponse.setAlertType(alert.getType());
|
||||
alertResponse.setDescription(alert.getSubject());
|
||||
alertResponse.setLastSent(alert.getLastSent());
|
||||
alertResponse.setName(alert.getName());
|
||||
|
||||
alertResponse.setObjectName("alert");
|
||||
alertResponseList.add(alertResponse);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,116 @@
|
|||
package org.apache.cloudstack.api.command.admin.router;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiCommandJobType;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.ServerApiException;
|
||||
import org.apache.cloudstack.api.response.OvsProviderResponse;
|
||||
import org.apache.cloudstack.context.CallContext;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.event.EventTypes;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.OvsProvider;
|
||||
import com.cloud.network.element.VirtualRouterElementService;
|
||||
import com.cloud.user.Account;
|
||||
|
||||
@APICommand(name = "configureOvsElement", responseObject = OvsProviderResponse.class, description = "Configures an ovs element.")
|
||||
public class ConfigureOvsElementCmd extends BaseAsyncCmd {
|
||||
public static final Logger s_logger = Logger
|
||||
.getLogger(ConfigureOvsElementCmd.class.getName());
|
||||
private static final String s_name = "configureovselementresponse";
|
||||
@Inject
|
||||
private List<VirtualRouterElementService> _service;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ////////////// API parameters /////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = OvsProviderResponse.class, required = true, description = "the ID of the ovs provider")
|
||||
private Long id;
|
||||
|
||||
@Parameter(name = ApiConstants.ENABLED, type = CommandType.BOOLEAN, required = true, description = "Enabled/Disabled the service provider")
|
||||
private Boolean enabled;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////////// Accessors ///////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setEnabled(Boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public Boolean getEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////// API Implementation///////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
@Override
|
||||
public String getCommandName() {
|
||||
return s_name;
|
||||
}
|
||||
|
||||
public static String getResultObjectName() {
|
||||
return "boolean";
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getEntityOwnerId() {
|
||||
return Account.ACCOUNT_ID_SYSTEM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventType() {
|
||||
return EventTypes.EVENT_NETWORK_ELEMENT_CONFIGURE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventDescription() {
|
||||
return "configuring ovs provider: " + id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiCommandJobType getInstanceType() {
|
||||
return ApiCommandJobType.None;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getInstanceId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute() throws ConcurrentOperationException,
|
||||
ResourceUnavailableException, InsufficientCapacityException {
|
||||
CallContext.current().setEventDetails("Ovs element: " + id);
|
||||
OvsProvider result = _service.get(0).configure(this);
|
||||
if (result != null) {
|
||||
OvsProviderResponse ovsResponse = _responseGenerator
|
||||
.createOvsProviderResponse(result);
|
||||
ovsResponse.setResponseName(getCommandName());
|
||||
this.setResponseObject(ovsResponse);
|
||||
} else {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR,
|
||||
"Failed to configure the ovs provider");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
package org.apache.cloudstack.api.command.admin.router;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseListCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.ServerApiException;
|
||||
import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd;
|
||||
import org.apache.cloudstack.api.response.ListResponse;
|
||||
import org.apache.cloudstack.api.response.OvsProviderResponse;
|
||||
import org.apache.cloudstack.api.response.ProviderResponse;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.OvsProvider;
|
||||
import com.cloud.network.element.VirtualRouterElementService;
|
||||
|
||||
@APICommand(name = "listOvsElements", description = "Lists all available ovs elements.", responseObject = OvsProviderResponse.class)
|
||||
public class ListOvsElementsCmd extends BaseListCmd {
|
||||
public static final Logger s_logger = Logger
|
||||
.getLogger(ListNetworkOfferingsCmd.class.getName());
|
||||
private static final String _name = "listovselementsresponse";
|
||||
@Inject
|
||||
private List<VirtualRouterElementService> _service;
|
||||
// ///////////////////////////////////////////////////
|
||||
// ////////////// API parameters /////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = OvsProviderResponse.class, description = "list ovs elements by id")
|
||||
private Long id;
|
||||
|
||||
@Parameter(name = ApiConstants.NSP_ID, type = CommandType.UUID, entityType = ProviderResponse.class, description = "list ovs elements by network service provider id")
|
||||
private Long nspId;
|
||||
|
||||
@Parameter(name = ApiConstants.ENABLED, type = CommandType.BOOLEAN, description = "list network offerings by enabled state")
|
||||
private Boolean enabled;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////////// Accessors ///////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setNspId(Long nspId) {
|
||||
this.nspId = nspId;
|
||||
}
|
||||
|
||||
public Long getNspId() {
|
||||
return nspId;
|
||||
}
|
||||
|
||||
public void setEnabled(Boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public Boolean getEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandName() {
|
||||
return _name;
|
||||
}
|
||||
@Override
|
||||
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
|
||||
List<? extends OvsProvider> providers = _service.get(0).searchForOvsElement(this);
|
||||
ListResponse<OvsProviderResponse> response = new ListResponse<OvsProviderResponse>();
|
||||
List<OvsProviderResponse> providerResponses = new ArrayList<OvsProviderResponse>();
|
||||
for (OvsProvider provider : providers) {
|
||||
OvsProviderResponse providerResponse = _responseGenerator.createOvsProviderResponse(provider);
|
||||
providerResponses.add(providerResponse);
|
||||
}
|
||||
response.setResponses(providerResponses);
|
||||
response.setResponseName(getCommandName());
|
||||
this.setResponseObject(response);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -39,6 +39,11 @@ import com.cloud.offering.ServiceOffering;
|
|||
import com.cloud.user.Account;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
@APICommand(name = "scaleSystemVm",
|
||||
responseObject = SystemVmResponse.class,
|
||||
description = "Scale the service offering for a system vm (console proxy or secondary storage). " + "The system vm must be in a \"Stopped\" state for "
|
||||
|
|
@ -61,6 +66,11 @@ public class ScaleSystemVMCmd extends BaseAsyncCmd {
|
|||
description = "the service offering ID to apply to the system vm")
|
||||
private Long serviceOfferingId;
|
||||
|
||||
@Parameter(name=ApiConstants.CUSTOM_PARAMETERS,
|
||||
type = CommandType.MAP,
|
||||
description = "name value pairs of custom parameters for cpu, memory and cpunumber. example customparameters[i].name=value")
|
||||
private Map<String, String> customParameters;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -73,6 +83,21 @@ public class ScaleSystemVMCmd extends BaseAsyncCmd {
|
|||
return serviceOfferingId;
|
||||
}
|
||||
|
||||
public Map<String, String> getCustomParameters() {
|
||||
Map<String,String> customparameterMap = new HashMap<String, String>();
|
||||
if (customParameters != null && customParameters.size() != 0) {
|
||||
Collection parameterCollection = customParameters.values();
|
||||
Iterator iter = parameterCollection.iterator();
|
||||
while (iter.hasNext()) {
|
||||
HashMap<String, String> value = (HashMap<String, String>) iter.next();
|
||||
for (String key : value.keySet()) {
|
||||
customparameterMap.put(key, value.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
return customparameterMap;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -34,6 +34,11 @@ import com.cloud.offering.ServiceOffering;
|
|||
import com.cloud.user.Account;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
@APICommand(name = "changeServiceForSystemVm",
|
||||
responseObject = SystemVmResponse.class,
|
||||
description = "Changes the service offering for a system vm (console proxy or secondary storage). " + "The system vm must be in a \"Stopped\" state for "
|
||||
|
|
@ -56,6 +61,11 @@ public class UpgradeSystemVMCmd extends BaseCmd {
|
|||
description = "the service offering ID to apply to the system vm")
|
||||
private Long serviceOfferingId;
|
||||
|
||||
@Parameter(name=ApiConstants.CUSTOM_PARAMETERS,
|
||||
type = CommandType.MAP,
|
||||
description = "name value pairs of custom parameters for cpu, memory and cpunumber. example customparameters[i].name=value")
|
||||
private Map<String, String> customParameters;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -68,6 +78,21 @@ public class UpgradeSystemVMCmd extends BaseCmd {
|
|||
return serviceOfferingId;
|
||||
}
|
||||
|
||||
public Map<String, String> getCustomParameters() {
|
||||
Map<String,String> customparameterMap = new HashMap<String, String>();
|
||||
if (customParameters != null && customParameters.size() !=0){
|
||||
Collection parameterCollection = customParameters.values();
|
||||
Iterator iter = parameterCollection.iterator();
|
||||
while (iter.hasNext()) {
|
||||
HashMap<String, String> value = (HashMap<String, String>) iter.next();
|
||||
for (String key : value.keySet()) {
|
||||
customparameterMap.put(key, value.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
return customparameterMap;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ public class ListCapabilitiesCmd extends BaseCmd {
|
|||
response.setAllowUsersCreateProjects((Boolean)capabilities.get("allowusercreateprojects"));
|
||||
response.setDiskOffMaxSize((Long)capabilities.get("customDiskOffMaxSize"));
|
||||
response.setRegionSecondaryEnabled((Boolean)capabilities.get("regionSecondaryEnabled"));
|
||||
response.setKVMSnapshotEnabled((Boolean)capabilities.get("KVMSnapshotEnabled"));
|
||||
if (capabilities.containsKey("apiLimitInterval")) {
|
||||
response.setApiLimitInterval((Integer)capabilities.get("apiLimitInterval"));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import org.apache.log4j.Logger;
|
|||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseListCmd;
|
||||
import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.response.ListResponse;
|
||||
import org.apache.cloudstack.api.response.NetworkACLResponse;
|
||||
|
|
@ -33,8 +34,8 @@ import org.apache.cloudstack.api.response.VpcResponse;
|
|||
import com.cloud.network.vpc.NetworkACL;
|
||||
import com.cloud.utils.Pair;
|
||||
|
||||
@APICommand(name = "listNetworkACLLists", description = "Lists all network ACLs", responseObject = NetworkACLResponse.class)
|
||||
public class ListNetworkACLListsCmd extends BaseListCmd {
|
||||
@APICommand(name = "listNetworkACLLists", description="Lists all network ACLs", responseObject=NetworkACLResponse.class)
|
||||
public class ListNetworkACLListsCmd extends BaseListProjectAndAccountResourcesCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(ListNetworkACLListsCmd.class.getName());
|
||||
|
||||
private static final String s_name = "listnetworkacllistsresponse";
|
||||
|
|
@ -84,8 +85,8 @@ public class ListNetworkACLListsCmd extends BaseListCmd {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void execute() {
|
||||
Pair<List<? extends NetworkACL>, Integer> result = _networkACLService.listNetworkACLs(getId(), getName(), getNetworkId(), getVpcId());
|
||||
public void execute(){
|
||||
Pair<List<? extends NetworkACL>,Integer> result = _networkACLService.listNetworkACLs(this);
|
||||
ListResponse<NetworkACLResponse> response = new ListResponse<NetworkACLResponse>();
|
||||
List<NetworkACLResponse> aclResponses = new ArrayList<NetworkACLResponse>();
|
||||
|
||||
|
|
|
|||
|
|
@ -43,7 +43,8 @@ public class ListNetworkACLsCmd extends BaseListTaggedResourcesCmd {
|
|||
/////////////////////////////////////////////////////
|
||||
//////////////// API parameters /////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
@Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, description = "Lists network ACL Item with the specified ID")
|
||||
@Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = NetworkACLItemResponse.class,
|
||||
description="Lists network ACL Item with the specified ID")
|
||||
private Long id;
|
||||
|
||||
@Parameter(name = ApiConstants.NETWORK_ID, type = CommandType.UUID, entityType = NetworkResponse.class, description = "list network ACL Items by network Id")
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ import java.util.LinkedHashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.cloudstack.api.BaseAsyncCreateCustomIdCmd;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
|
||||
|
|
@ -69,7 +70,7 @@ import com.cloud.uservm.UserVm;
|
|||
@APICommand(name = "deployVirtualMachine",
|
||||
description = "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.",
|
||||
responseObject = UserVmResponse.class)
|
||||
public class DeployVMCmd extends BaseAsyncCreateCmd {
|
||||
public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(DeployVMCmd.class.getName());
|
||||
|
||||
private static final String s_name = "deployvirtualmachineresponse";
|
||||
|
|
@ -229,29 +230,11 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
|
|||
description = "an optional field, whether to the display the vm to the end user or not.")
|
||||
private Boolean displayVm;
|
||||
|
||||
@Parameter(name = ApiConstants.CPU_SPEED,
|
||||
type = CommandType.INTEGER,
|
||||
since = "4.3",
|
||||
description = "optional field to specify the cpu speed when using dynamic compute offering.")
|
||||
private Integer cpuSpeed;
|
||||
|
||||
@Parameter(name = ApiConstants.MEMORY,
|
||||
type = CommandType.INTEGER,
|
||||
since = "4.3",
|
||||
description = "optional field to specify the memory when using dynamic compute offering")
|
||||
private Integer memory;
|
||||
|
||||
@Parameter(name = ApiConstants.CPU_NUMBER,
|
||||
type = CommandType.INTEGER,
|
||||
since = "4.3",
|
||||
description = "optional field to specify the number of cpu cores when using dynamic offering.")
|
||||
private Integer cpuNumber;
|
||||
|
||||
@Parameter(name = ApiConstants.ROOT_DISK_SIZE,
|
||||
type = CommandType.LONG,
|
||||
since = "4.3",
|
||||
description = "optional field to specify the number of cpu cores when using dynamic offering.")
|
||||
private Long rootdisksize;
|
||||
@Parameter(name = ApiConstants.CUSTOM_PARAMETERS,
|
||||
type = CommandType.MAP,
|
||||
since= "4.3",
|
||||
description = "used to specify the custom parameters.")
|
||||
private Map customParameters;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
|
|
@ -279,6 +262,21 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
|
|||
return domainId;
|
||||
}
|
||||
|
||||
public Map<String, String> getCustomParameters() {
|
||||
Map<String,String> customparameterMap = new HashMap<String, String>();
|
||||
if (customParameters != null && customParameters.size() !=0){
|
||||
Collection parameterCollection = customParameters.values();
|
||||
Iterator iter = parameterCollection.iterator();
|
||||
while (iter.hasNext()) {
|
||||
HashMap<String, String> value = (HashMap<String, String>) iter.next();
|
||||
for (String key : value.keySet()) {
|
||||
customparameterMap.put(key, value.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
return customparameterMap;
|
||||
}
|
||||
|
||||
public String getGroup() {
|
||||
return group;
|
||||
}
|
||||
|
|
@ -291,21 +289,6 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
|
|||
return displayVm;
|
||||
}
|
||||
|
||||
public Integer getMemory() {
|
||||
return memory;
|
||||
}
|
||||
|
||||
public Integer getCpuSpeed() {
|
||||
return cpuSpeed;
|
||||
}
|
||||
|
||||
public Integer getCpuNumber() {
|
||||
return cpuNumber;
|
||||
}
|
||||
|
||||
public Long getRootdisksize() {
|
||||
return rootdisksize;
|
||||
}
|
||||
|
||||
public List<Long> getSecurityGroupIdList() {
|
||||
if (securityGroupNameList != null && securityGroupIdList != null) {
|
||||
|
|
@ -576,14 +559,14 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
|
|||
vm =
|
||||
_userVmService.createBasicSecurityGroupVirtualMachine(zone, serviceOffering, template, getSecurityGroupIdList(), owner, name, displayName,
|
||||
diskOfferingId, size, group, getHypervisor(), getHttpMethod(), userData, sshKeyPairName, getIpToNetworkMap(), addrs, displayVm, keyboard,
|
||||
getAffinityGroupIdList(), cpuSpeed, memory, cpuNumber, rootdisksize);
|
||||
getAffinityGroupIdList(), getCustomParameters(), getCustomId());
|
||||
}
|
||||
} else {
|
||||
if (zone.isSecurityGroupEnabled()) {
|
||||
vm =
|
||||
_userVmService.createAdvancedSecurityGroupVirtualMachine(zone, serviceOffering, template, getNetworkIds(), getSecurityGroupIdList(), owner, name,
|
||||
displayName, diskOfferingId, size, group, getHypervisor(), getHttpMethod(), userData, sshKeyPairName, getIpToNetworkMap(), addrs, displayVm,
|
||||
keyboard, getAffinityGroupIdList(), cpuSpeed, memory, cpuNumber, rootdisksize);
|
||||
keyboard, getAffinityGroupIdList(), getCustomParameters(), getCustomId());
|
||||
|
||||
} else {
|
||||
if (getSecurityGroupIdList() != null && !getSecurityGroupIdList().isEmpty()) {
|
||||
|
|
@ -592,7 +575,7 @@ public class DeployVMCmd extends BaseAsyncCreateCmd {
|
|||
vm =
|
||||
_userVmService.createAdvancedVirtualMachine(zone, serviceOffering, template, getNetworkIds(), owner, name, displayName, diskOfferingId, size,
|
||||
group, getHypervisor(), getHttpMethod(), userData, sshKeyPairName, getIpToNetworkMap(), addrs, displayVm, keyboard, getAffinityGroupIdList(),
|
||||
cpuSpeed, memory, cpuNumber, rootdisksize);
|
||||
getCustomParameters(), getCustomId());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ import com.cloud.network.Network;
|
|||
import com.cloud.user.Account;
|
||||
import com.cloud.vm.NicSecondaryIp;
|
||||
|
||||
@APICommand(name = "removeIpFromNic", description = "Assigns secondary IP to NIC.", responseObject = SuccessResponse.class)
|
||||
@APICommand(name = "removeIpFromNic", description = "Removes secondary IP from the NIC.", responseObject = SuccessResponse.class)
|
||||
public class RemoveIpFromVmNicCmd extends BaseAsyncCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(RemoveIpFromVmNicCmd.class.getName());
|
||||
private static final String s_name = "removeipfromnicresponse";
|
||||
|
|
|
|||
|
|
@ -39,6 +39,12 @@ import com.cloud.exception.VirtualMachineMigrationException;
|
|||
import com.cloud.user.Account;
|
||||
import com.cloud.uservm.UserVm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@APICommand(name = "scaleVirtualMachine", description = "Scales the virtual machine to a new service offering.", responseObject = SuccessResponse.class)
|
||||
public class ScaleVMCmd extends BaseAsyncCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(ScaleVMCmd.class.getName());
|
||||
|
|
@ -60,6 +66,11 @@ public class ScaleVMCmd extends BaseAsyncCmd {
|
|||
description = "the ID of the service offering for the virtual machine")
|
||||
private Long serviceOfferingId;
|
||||
|
||||
@Parameter(name=ApiConstants.CUSTOM_PARAMETERS,
|
||||
type = CommandType.MAP,
|
||||
description = "name value pairs of custom parameters for cpu, memory and cpunumber. example customparameters[i].name=value")
|
||||
private Map<String, String> customParameters;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -72,6 +83,24 @@ public class ScaleVMCmd extends BaseAsyncCmd {
|
|||
return serviceOfferingId;
|
||||
}
|
||||
|
||||
//instead of reading a map directly we are using collections.
|
||||
//it is because customParameters.values() cannot be cast to a map.
|
||||
//it gives a exception
|
||||
public Map<String, String> getCustomParameters() {
|
||||
Map<String,String> customparameterMap = new HashMap<String, String>();
|
||||
if (customParameters != null && customParameters.size() !=0){
|
||||
Collection parameterCollection = customParameters.values();
|
||||
Iterator iter = parameterCollection.iterator();
|
||||
while (iter.hasNext()) {
|
||||
HashMap<String, String> value = (HashMap<String, String>) iter.next();
|
||||
for (String key : value.keySet()) {
|
||||
customparameterMap.put(key, value.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
return customparameterMap;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
// under the License.
|
||||
package org.apache.cloudstack.api.command.user.vm;
|
||||
|
||||
import org.apache.cloudstack.api.BaseCustomIdCmd;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
|
|
@ -36,7 +37,7 @@ import com.cloud.uservm.UserVm;
|
|||
@APICommand(name = "updateVirtualMachine", description = "Updates properties of a virtual machine. The VM has to be stopped and restarted for the "
|
||||
+ "new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. "
|
||||
+ "Therefore, stop the VM manually before issuing this call.", responseObject = UserVmResponse.class)
|
||||
public class UpdateVMCmd extends BaseCmd {
|
||||
public class UpdateVMCmd extends BaseCustomIdCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(UpdateVMCmd.class.getName());
|
||||
private static final String s_name = "updatevirtualmachineresponse";
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,11 @@ import com.cloud.offering.ServiceOffering;
|
|||
import com.cloud.user.Account;
|
||||
import com.cloud.uservm.UserVm;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
@APICommand(name = "changeServiceForVirtualMachine", responseObject = UserVmResponse.class, description = "Changes the service offering for a virtual machine. "
|
||||
+ "The virtual machine must be in a \"Stopped\" state for " + "this command to take effect.")
|
||||
public class UpgradeVMCmd extends BaseCmd {
|
||||
|
|
@ -54,6 +59,11 @@ public class UpgradeVMCmd extends BaseCmd {
|
|||
description = "the service offering ID to apply to the virtual machine")
|
||||
private Long serviceOfferingId;
|
||||
|
||||
@Parameter(name=ApiConstants.CUSTOM_PARAMETERS,
|
||||
type = CommandType.MAP,
|
||||
description = "name value pairs of custom parameters for cpu, memory and cpunumber. example customparameters[i].name=value")
|
||||
private Map<String, String> customParameters;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -66,6 +76,21 @@ public class UpgradeVMCmd extends BaseCmd {
|
|||
return serviceOfferingId;
|
||||
}
|
||||
|
||||
public Map<String, String> getCustomParameters() {
|
||||
Map<String,String> customparameterMap = new HashMap<String, String>();
|
||||
if (customParameters != null && customParameters.size() !=0){
|
||||
Collection parameterCollection = customParameters.values();
|
||||
Iterator iter = parameterCollection.iterator();
|
||||
while (iter.hasNext()) {
|
||||
HashMap<String, String> value = (HashMap<String, String>) iter.next();
|
||||
for (String key : value.keySet()) {
|
||||
customparameterMap.put(key, value.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
return customparameterMap;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -16,19 +16,21 @@
|
|||
// under the License.
|
||||
package org.apache.cloudstack.api.command.user.volume;
|
||||
|
||||
import org.apache.cloudstack.api.BaseAsyncCreateCustomIdCmd;
|
||||
import org.apache.cloudstack.api.BaseCmd;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiCommandJobType;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
import org.apache.cloudstack.api.BaseAsyncCreateCmd;
|
||||
import org.apache.cloudstack.api.Parameter;
|
||||
import org.apache.cloudstack.api.ServerApiException;
|
||||
import org.apache.cloudstack.api.response.DiskOfferingResponse;
|
||||
import org.apache.cloudstack.api.response.DomainResponse;
|
||||
import org.apache.cloudstack.api.response.ProjectResponse;
|
||||
import org.apache.cloudstack.api.response.SnapshotResponse;
|
||||
import org.apache.cloudstack.api.response.UserVmResponse;
|
||||
import org.apache.cloudstack.api.response.VolumeResponse;
|
||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||
import org.apache.cloudstack.context.CallContext;
|
||||
|
|
@ -41,7 +43,7 @@ import com.cloud.storage.Volume;
|
|||
@APICommand(name = "createVolume",
|
||||
responseObject = VolumeResponse.class,
|
||||
description = "Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.")
|
||||
public class CreateVolumeCmd extends BaseAsyncCreateCmd {
|
||||
public class CreateVolumeCmd extends BaseAsyncCreateCustomIdCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(CreateVolumeCmd.class.getName());
|
||||
private static final String s_name = "createvolumeresponse";
|
||||
|
||||
|
|
@ -50,7 +52,7 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd {
|
|||
/////////////////////////////////////////////////////
|
||||
|
||||
@Parameter(name = ApiConstants.ACCOUNT,
|
||||
type = CommandType.STRING,
|
||||
type = BaseCmd.CommandType.STRING,
|
||||
description = "the account associated with the disk volume. Must be used with the domainId parameter.")
|
||||
private String accountName;
|
||||
|
||||
|
|
@ -98,6 +100,9 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd {
|
|||
@Parameter(name = ApiConstants.DISPLAY_VOLUME, type = CommandType.BOOLEAN, description = "an optional field, whether to display the volume to the end user or not.")
|
||||
private Boolean displayVolume;
|
||||
|
||||
@Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID, type = CommandType.UUID, entityType = UserVmResponse.class, description = "the ID of the virtual machine; to be used with snapshot Id, VM to which the volume gets attached after creation")
|
||||
private Long virtualMachineId;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -146,6 +151,10 @@ public class CreateVolumeCmd extends BaseAsyncCreateCmd {
|
|||
return displayVolume;
|
||||
}
|
||||
|
||||
public Long getVirtualMachineId() {
|
||||
return virtualMachineId;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
// under the License.
|
||||
package org.apache.cloudstack.api.command.user.volume;
|
||||
|
||||
import org.apache.cloudstack.api.BaseAsyncCustomIdCmd;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
|
|
@ -34,7 +35,7 @@ import com.cloud.exception.InvalidParameterValueException;
|
|||
import com.cloud.storage.Volume;
|
||||
|
||||
@APICommand(name = "updateVolume", description = "Updates the volume.", responseObject = VolumeResponse.class)
|
||||
public class UpdateVolumeCmd extends BaseAsyncCmd {
|
||||
public class UpdateVolumeCmd extends BaseAsyncCustomIdCmd {
|
||||
public static final Logger s_logger = Logger.getLogger(UpdateVolumeCmd.class.getName());
|
||||
private static final String s_name = "updatevolumeresponse";
|
||||
|
||||
|
|
@ -140,7 +141,7 @@ public class UpdateVolumeCmd extends BaseAsyncCmd {
|
|||
@Override
|
||||
public void execute() {
|
||||
CallContext.current().setEventDetails("Volume Id: " + getId());
|
||||
Volume result = _volumeService.updateVolume(getId(), getPath(), getState(), getStorageId(), getDisplayVolume());
|
||||
Volume result = _volumeService.updateVolume(getId(), getPath(), getState(), getStorageId(), getDisplayVolume(), getCustomId(), getEntityOwnerId());
|
||||
if (result != null) {
|
||||
VolumeResponse response = _responseGenerator.createVolumeResponse(result);
|
||||
response.setResponseName(getCommandName());
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@
|
|||
// under the License.
|
||||
package org.apache.cloudstack.api.command.user.vpc;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.api.APICommand;
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.ApiErrorCode;
|
||||
|
|
@ -30,6 +28,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse;
|
|||
import org.apache.cloudstack.api.response.VpcResponse;
|
||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||
import org.apache.cloudstack.context.CallContext;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.event.EventTypes;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
|
|
@ -43,47 +42,54 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||
public static final Logger s_logger = Logger.getLogger(CreateVPCCmd.class.getName());
|
||||
private static final String s_name = "createvpcresponse";
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
//////////////// API parameters /////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
// ////////////// API parameters /////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account associated with the VPC. "
|
||||
+ "Must be used with the domainId parameter.")
|
||||
@Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account associated with the VPC. " +
|
||||
"Must be used with the domainId parameter.")
|
||||
private String accountName;
|
||||
|
||||
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "the domain ID associated with the VPC. "
|
||||
+ "If used with the account parameter returns the VPC associated with the account for the specified domain.")
|
||||
@Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class,
|
||||
description = "the domain ID associated with the VPC. " +
|
||||
"If used with the account parameter returns the VPC associated with the account for the specified domain.")
|
||||
private Long domainId;
|
||||
|
||||
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "create VPC for the project")
|
||||
@Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class,
|
||||
description = "create VPC for the project")
|
||||
private Long projectId;
|
||||
|
||||
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of the availability zone")
|
||||
@Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class,
|
||||
required = true, description = "the ID of the availability zone")
|
||||
private Long zoneId;
|
||||
|
||||
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "the name of the VPC")
|
||||
private String vpcName;
|
||||
|
||||
@Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, required = true, description = "the display text of " + "the VPC")
|
||||
@Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, required = true, description = "the display text of " +
|
||||
"the VPC")
|
||||
private String displayText;
|
||||
|
||||
@Parameter(name = ApiConstants.CIDR, type = CommandType.STRING, required = true, description = "the cidr of the VPC. All VPC "
|
||||
+ "guest networks' cidrs should be within this CIDR")
|
||||
@Parameter(name = ApiConstants.CIDR, type = CommandType.STRING, required = true, description = "the cidr of the VPC. All VPC " +
|
||||
"guest networks' cidrs should be within this CIDR")
|
||||
private String cidr;
|
||||
|
||||
@Parameter(name = ApiConstants.VPC_OFF_ID,
|
||||
type = CommandType.UUID,
|
||||
entityType = VpcOfferingResponse.class,
|
||||
required = true,
|
||||
description = "the ID of the VPC offering")
|
||||
@Parameter(name = ApiConstants.VPC_OFF_ID, type = CommandType.UUID, entityType = VpcOfferingResponse.class,
|
||||
required = true, description = "the ID of the VPC offering")
|
||||
private Long vpcOffering;
|
||||
|
||||
@Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING, description = "VPC network domain. All networks inside the VPC will belong to this domain")
|
||||
@Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING,
|
||||
description = "VPC network domain. All networks inside the VPC will belong to this domain")
|
||||
private String networkDomain;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
@Parameter(name = ApiConstants.START, type = CommandType.BOOLEAN,
|
||||
description = "If set to false, the VPC won't start (VPC VR will not get allocated) until its first network gets implemented. " +
|
||||
"True by default.", since = "4.3")
|
||||
private Boolean start;
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
// ///////////////// Accessors ///////////////////////
|
||||
// ///////////////////////////////////////////////////
|
||||
|
||||
public String getAccountName() {
|
||||
return accountName;
|
||||
|
|
@ -117,6 +123,13 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||
return networkDomain;
|
||||
}
|
||||
|
||||
public boolean isStart() {
|
||||
if (start != null) {
|
||||
return start;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void create() throws ResourceAllocationException {
|
||||
Vpc vpc = _vpcService.createVpc(getZoneId(), getVpcOffering(), getEntityOwnerId(), getVpcName(), getDisplayText(), getCidr(), getNetworkDomain());
|
||||
|
|
@ -131,10 +144,14 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||
@Override
|
||||
public void execute() {
|
||||
Vpc vpc = null;
|
||||
boolean success = true;
|
||||
try {
|
||||
if (_vpcService.startVpc(getEntityId(), true)) {
|
||||
vpc = _entityMgr.findById(Vpc.class, getEntityId());
|
||||
if (isStart()) {
|
||||
success = _vpcService.startVpc(getEntityId(), true);
|
||||
} else {
|
||||
s_logger.debug("Not starting VPC as " + ApiConstants.START + "=false was passed to the API");
|
||||
}
|
||||
vpc = _entityMgr.findById(Vpc.class, getEntityId());
|
||||
} catch (ResourceUnavailableException ex) {
|
||||
s_logger.warn("Exception: ", ex);
|
||||
throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
|
||||
|
|
@ -147,7 +164,7 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd {
|
|||
throw new ServerApiException(ApiErrorCode.INSUFFICIENT_CAPACITY_ERROR, ex.getMessage());
|
||||
}
|
||||
|
||||
if (vpc != null) {
|
||||
if (vpc != null && success) {
|
||||
VpcResponse response = _responseGenerator.createVpcResponse(vpc);
|
||||
response.setResponseName(getCommandName());
|
||||
setResponseObject(response);
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ public class AlertResponse extends BaseResponse {
|
|||
+ "MANAGMENT_NODE = 13: lost connection to default route (to the gateway), "
|
||||
+ "DOMAIN_ROUTER_MIGRATE = 14, CONSOLE_PROXY_MIGRATE = 15, USERVM_MIGRATE = 16, VLAN = 17, SSVM = 18, " + "USAGE_SERVER_RESULT = 19")
|
||||
private Short alertType;
|
||||
|
||||
@SerializedName(ApiConstants.NAME) @Param(description="the name of the alert", since="4.3")
|
||||
private String alertName;
|
||||
|
||||
@SerializedName(ApiConstants.DESCRIPTION)
|
||||
@Param(description = "description of the alert")
|
||||
|
|
@ -66,4 +69,8 @@ public class AlertResponse extends BaseResponse {
|
|||
public void setLastSent(Date lastSent) {
|
||||
this.lastSent = lastSent;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.alertName = name;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,6 +61,10 @@ public class CapabilitiesResponse extends BaseResponse {
|
|||
@Param(description = "time interval (in seconds) to reset api count")
|
||||
private Integer apiLimitInterval;
|
||||
|
||||
@SerializedName("kvmsnapshotenabled")
|
||||
@Param(description = "true if snapshot is supported for KVM host, false otherwise")
|
||||
private boolean KVMSnapshotEnabled;
|
||||
|
||||
@SerializedName("apilimitmax")
|
||||
@Param(description = "Max allowed number of api requests within the specified interval")
|
||||
private Integer apiLimitMax;
|
||||
|
|
@ -97,6 +101,10 @@ public class CapabilitiesResponse extends BaseResponse {
|
|||
this.regionSecondaryEnabled = regionSecondaryEnabled;
|
||||
}
|
||||
|
||||
public void setKVMSnapshotEnabled(boolean KVMSnapshotEnabled) {
|
||||
this.KVMSnapshotEnabled = KVMSnapshotEnabled;
|
||||
}
|
||||
|
||||
public void setApiLimitInterval(Integer apiLimitInterval) {
|
||||
this.apiLimitInterval = apiLimitInterval;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,77 @@
|
|||
package org.apache.cloudstack.api.response;
|
||||
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.BaseResponse;
|
||||
import org.apache.cloudstack.api.EntityReference;
|
||||
|
||||
import com.cloud.network.OvsProvider;
|
||||
import com.cloud.serializer.Param;
|
||||
import com.google.gson.annotations.SerializedName;
|
||||
|
||||
@EntityReference(value = OvsProvider.class)
|
||||
@SuppressWarnings("unused")
|
||||
public class OvsProviderResponse extends BaseResponse implements
|
||||
ControlledEntityResponse {
|
||||
@SerializedName(ApiConstants.ID)
|
||||
@Param(description = "the id of the ovs")
|
||||
private String id;
|
||||
@SerializedName(ApiConstants.NSP_ID)
|
||||
@Param(description = "the physical network service provider id of the provider")
|
||||
private String nspId;
|
||||
@SerializedName(ApiConstants.ENABLED)
|
||||
@Param(description = "Enabled/Disabled the service provider")
|
||||
private Boolean enabled;
|
||||
@SerializedName(ApiConstants.ACCOUNT)
|
||||
@Param(description = "the account associated with the provider")
|
||||
private String accountName;
|
||||
@SerializedName(ApiConstants.PROJECT_ID)
|
||||
@Param(description = "the project id of the ipaddress")
|
||||
private String projectId;
|
||||
@SerializedName(ApiConstants.PROJECT)
|
||||
@Param(description = "the project name of the address")
|
||||
private String projectName;
|
||||
@SerializedName(ApiConstants.DOMAIN_ID)
|
||||
@Param(description = "the domain ID associated with the provider")
|
||||
private String domainId;
|
||||
|
||||
@SerializedName(ApiConstants.DOMAIN)
|
||||
@Param(description = "the domain associated with the provider")
|
||||
private String domainName;
|
||||
|
||||
@Override
|
||||
public void setAccountName(String accountName) {
|
||||
this.accountName = accountName;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDomainName(String domainName) {
|
||||
this.domainName = domainName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProjectId(String projectId) {
|
||||
this.projectId = projectId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProjectName(String projectName) {
|
||||
this.projectName = projectName;
|
||||
}
|
||||
|
||||
public void setNspId(String nspId) {
|
||||
this.nspId = nspId;
|
||||
}
|
||||
|
||||
public void setEnabled(Boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
}
|
||||
|
|
@ -44,15 +44,15 @@ public class ServiceOfferingResponse extends BaseResponse {
|
|||
|
||||
@SerializedName("cpunumber")
|
||||
@Param(description = "the number of CPU")
|
||||
private int cpuNumber;
|
||||
private Integer cpuNumber;
|
||||
|
||||
@SerializedName("cpuspeed")
|
||||
@Param(description = "the clock rate CPU speed in Mhz")
|
||||
private int cpuSpeed;
|
||||
private Integer cpuSpeed;
|
||||
|
||||
@SerializedName("memory")
|
||||
@Param(description = "the memory in MB")
|
||||
private int memory;
|
||||
private Integer memory;
|
||||
|
||||
@SerializedName("created")
|
||||
@Param(description = "the date this service offering was created")
|
||||
|
|
@ -130,6 +130,10 @@ public class ServiceOfferingResponse extends BaseResponse {
|
|||
@Param(description = "additional key/value details tied with this service offering", since = "4.2.0")
|
||||
private Map<String, String> details;
|
||||
|
||||
@SerializedName("iscustomized")
|
||||
@Param(description = "is true if the offering is customized", since = "4.3.0")
|
||||
private Boolean isCustomized;
|
||||
|
||||
public ServiceOfferingResponse() {
|
||||
}
|
||||
|
||||
|
|
@ -185,7 +189,7 @@ public class ServiceOfferingResponse extends BaseResponse {
|
|||
return cpuNumber;
|
||||
}
|
||||
|
||||
public void setCpuNumber(int cpuNumber) {
|
||||
public void setCpuNumber(Integer cpuNumber) {
|
||||
this.cpuNumber = cpuNumber;
|
||||
}
|
||||
|
||||
|
|
@ -193,7 +197,7 @@ public class ServiceOfferingResponse extends BaseResponse {
|
|||
return cpuSpeed;
|
||||
}
|
||||
|
||||
public void setCpuSpeed(int cpuSpeed) {
|
||||
public void setCpuSpeed(Integer cpuSpeed) {
|
||||
this.cpuSpeed = cpuSpeed;
|
||||
}
|
||||
|
||||
|
|
@ -201,7 +205,7 @@ public class ServiceOfferingResponse extends BaseResponse {
|
|||
return memory;
|
||||
}
|
||||
|
||||
public void setMemory(int memory) {
|
||||
public void setMemory(Integer memory) {
|
||||
this.memory = memory;
|
||||
}
|
||||
|
||||
|
|
@ -309,4 +313,9 @@ public class ServiceOfferingResponse extends BaseResponse {
|
|||
this.details = details;
|
||||
}
|
||||
|
||||
public void setIscutomized(boolean iscutomized) {
|
||||
this.isCustomized = iscutomized;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ import org.apache.axis2.databinding.ADBBean;
|
|||
import org.apache.axis2.databinding.ADBException;
|
||||
import org.apache.axis2.databinding.utils.writer.MTOMAwareXMLSerializer;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
|
||||
|
|
@ -103,7 +104,6 @@ import com.amazon.ec2.RunInstancesResponse;
|
|||
import com.amazon.ec2.StartInstancesResponse;
|
||||
import com.amazon.ec2.StopInstancesResponse;
|
||||
import com.amazon.ec2.TerminateInstancesResponse;
|
||||
|
||||
import com.cloud.bridge.model.UserCredentialsVO;
|
||||
import com.cloud.bridge.persist.dao.CloudStackUserDaoImpl;
|
||||
import com.cloud.bridge.persist.dao.OfferingDaoImpl;
|
||||
|
|
@ -203,12 +203,16 @@ public class EC2RestServlet extends HttpServlet {
|
|||
if (null != propertiesFile) {
|
||||
logger.info("Use EC2 properties file: " + propertiesFile.getAbsolutePath());
|
||||
EC2Prop = new Properties();
|
||||
FileInputStream ec2PropFile = null;
|
||||
try {
|
||||
EC2Prop.load(new FileInputStream(propertiesFile));
|
||||
ec2PropFile = new FileInputStream(propertiesFile);
|
||||
EC2Prop.load(ec2PropFile);
|
||||
} catch (FileNotFoundException e) {
|
||||
logger.warn("Unable to open properties file: " + propertiesFile.getAbsolutePath(), e);
|
||||
} catch (IOException e) {
|
||||
logger.warn("Unable to read properties file: " + propertiesFile.getAbsolutePath(), e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(ec2PropFile);
|
||||
}
|
||||
String keystore = EC2Prop.getProperty("keystore");
|
||||
keystorePassword = EC2Prop.getProperty("keystorePass");
|
||||
|
|
@ -492,7 +496,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
response.sendError(530, "Missing cert parameter");
|
||||
return;
|
||||
}
|
||||
// logger.debug( "SetCertificate cert: [" + certificate[0] + "]" );
|
||||
// logger.debug( "SetCertificate cert: [" + certificate[0] + "]" );
|
||||
|
||||
String[] accessKey = request.getParameterValues("AWSAccessKeyId");
|
||||
if (null == accessKey || 0 == accessKey.length) {
|
||||
|
|
@ -578,12 +582,12 @@ public class EC2RestServlet extends HttpServlet {
|
|||
credentialDao.setCertificateId( accessKey[0], null );
|
||||
|
||||
*/txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
|
||||
UserCredentialsVO user = ucDao.getByAccessKey(accessKey[0]);
|
||||
user.setCertUniqueId(null);
|
||||
ucDao.update(user.getId(), user);
|
||||
response.setStatus(200);
|
||||
endResponse(response, "User certificate deleted successfully");
|
||||
txn.commit();
|
||||
UserCredentialsVO user = ucDao.getByAccessKey(accessKey[0]);
|
||||
user.setCertUniqueId(null);
|
||||
ucDao.update(user.getId(), user);
|
||||
response.setStatus(200);
|
||||
endResponse(response, "User certificate deleted successfully");
|
||||
txn.commit();
|
||||
} else
|
||||
response.setStatus(404);
|
||||
|
||||
|
|
@ -830,7 +834,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
RevokeSecurityGroupIngressResponse EC2response =
|
||||
EC2SoapServiceImpl.toRevokeSecurityGroupIngressResponse(ServiceProvider.getInstance().getEC2Engine().revokeSecurityGroup(EC2request));
|
||||
EC2SoapServiceImpl.toRevokeSecurityGroupIngressResponse(ServiceProvider.getInstance().getEC2Engine().revokeSecurityGroup(EC2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -915,7 +919,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
AuthorizeSecurityGroupIngressResponse EC2response =
|
||||
EC2SoapServiceImpl.toAuthorizeSecurityGroupIngressResponse(ServiceProvider.getInstance().getEC2Engine().authorizeSecurityGroup(EC2request));
|
||||
EC2SoapServiceImpl.toAuthorizeSecurityGroupIngressResponse(ServiceProvider.getInstance().getEC2Engine().authorizeSecurityGroup(EC2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1012,7 +1016,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
CreateSecurityGroupResponse EC2response =
|
||||
EC2SoapServiceImpl.toCreateSecurityGroupResponse(ServiceProvider.getInstance().getEC2Engine().createSecurityGroup(groupName, groupDescription));
|
||||
EC2SoapServiceImpl.toCreateSecurityGroupResponse(ServiceProvider.getInstance().getEC2Engine().createSecurityGroup(groupName, groupDescription));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1028,7 +1032,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
DeleteSecurityGroupResponse EC2response =
|
||||
EC2SoapServiceImpl.toDeleteSecurityGroupResponse(ServiceProvider.getInstance().getEC2Engine().deleteSecurityGroup(groupName));
|
||||
EC2SoapServiceImpl.toDeleteSecurityGroupResponse(ServiceProvider.getInstance().getEC2Engine().deleteSecurityGroup(groupName));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1166,7 +1170,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
ModifyImageAttributeResponse EC2response =
|
||||
EC2SoapServiceImpl.toModifyImageAttributeResponse(ServiceProvider.getInstance().getEC2Engine().modifyImageAttribute(ec2request));
|
||||
EC2SoapServiceImpl.toModifyImageAttributeResponse(ServiceProvider.getInstance().getEC2Engine().modifyImageAttribute(ec2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1231,7 +1235,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
ResetImageAttributeResponse EC2response =
|
||||
EC2SoapServiceImpl.toResetImageAttributeResponse(ServiceProvider.getInstance().getEC2Engine().modifyImageAttribute(ec2request));
|
||||
EC2SoapServiceImpl.toResetImageAttributeResponse(ServiceProvider.getInstance().getEC2Engine().modifyImageAttribute(ec2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1443,7 +1447,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
DescribeAvailabilityZonesResponse EC2response =
|
||||
EC2SoapServiceImpl.toDescribeAvailabilityZonesResponse(ServiceProvider.getInstance().getEC2Engine().describeAvailabilityZones(EC2request));
|
||||
EC2SoapServiceImpl.toDescribeAvailabilityZonesResponse(ServiceProvider.getInstance().getEC2Engine().describeAvailabilityZones(EC2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1499,7 +1503,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
}
|
||||
|
||||
DescribeImageAttributeResponse EC2response =
|
||||
EC2SoapServiceImpl.toDescribeImageAttributeResponse(ServiceProvider.getInstance().getEC2Engine().describeImageAttribute(ec2request));
|
||||
EC2SoapServiceImpl.toDescribeImageAttributeResponse(ServiceProvider.getInstance().getEC2Engine().describeImageAttribute(ec2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1677,7 +1681,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
DescribeInstanceAttributeResponse EC2response =
|
||||
EC2SoapServiceImpl.toDescribeInstanceAttributeResponse(ServiceProvider.getInstance().getEC2Engine().describeInstances(EC2request));
|
||||
EC2SoapServiceImpl.toDescribeInstanceAttributeResponse(ServiceProvider.getInstance().getEC2Engine().describeInstances(EC2request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1707,7 +1711,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
|
||||
// -> execute the request
|
||||
ModifyInstanceAttributeResponse EC2response =
|
||||
EC2SoapServiceImpl.toModifyInstanceAttributeResponse(ServiceProvider.getInstance().getEC2Engine().modifyInstanceAttribute(ec2Request));
|
||||
EC2SoapServiceImpl.toModifyInstanceAttributeResponse(ServiceProvider.getInstance().getEC2Engine().modifyInstanceAttribute(ec2Request));
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1766,7 +1770,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
// -> execute the request
|
||||
EC2Engine engine = ServiceProvider.getInstance().getEC2Engine();
|
||||
DescribeVolumesResponse EC2response =
|
||||
EC2SoapServiceImpl.toDescribeVolumesResponse(ServiceProvider.getInstance().getEC2Engine().describeVolumes(EC2request), engine);
|
||||
EC2SoapServiceImpl.toDescribeVolumesResponse(ServiceProvider.getInstance().getEC2Engine().describeVolumes(EC2request), engine);
|
||||
serializeResponse(response, EC2response);
|
||||
}
|
||||
|
||||
|
|
@ -1988,7 +1992,7 @@ public class EC2RestServlet extends HttpServlet {
|
|||
* parameter to see if the signature has expired and if so the request fails.
|
||||
*/
|
||||
private boolean authenticateRequest(HttpServletRequest request, HttpServletResponse response) throws SignatureException, IOException, InstantiationException,
|
||||
IllegalAccessException, ClassNotFoundException, SQLException, ParseException {
|
||||
IllegalAccessException, ClassNotFoundException, SQLException, ParseException {
|
||||
String cloudSecretKey = null;
|
||||
String cloudAccessKey = null;
|
||||
String signature = null;
|
||||
|
|
|
|||
|
|
@ -34,15 +34,14 @@ import javax.annotation.PostConstruct;
|
|||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.axis2.AxisFault;
|
||||
import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.log4j.xml.DOMConfigurator;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.amazon.ec2.AmazonEC2SkeletonInterface;
|
||||
import com.amazon.s3.AmazonS3SkeletonInterface;
|
||||
|
||||
import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
|
||||
|
||||
import com.cloud.bridge.model.MHostVO;
|
||||
import com.cloud.bridge.model.SHost;
|
||||
import com.cloud.bridge.model.SHostVO;
|
||||
|
|
@ -111,8 +110,8 @@ public class ServiceProvider extends ManagerBase {
|
|||
instance = this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||
|
||||
initialize();
|
||||
return true;
|
||||
}
|
||||
|
|
@ -122,7 +121,7 @@ public class ServiceProvider extends ManagerBase {
|
|||
long mhostId = 0;
|
||||
if (mhost != null)
|
||||
mhostId = mhost.getId() != null ? mhost.getId().longValue() : 0L;
|
||||
return mhostId;
|
||||
return mhostId;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -268,12 +267,16 @@ public class ServiceProvider extends ManagerBase {
|
|||
File propertiesFile = ConfigurationHelper.findConfigurationFile("cloud-bridge.properties");
|
||||
properties = new Properties();
|
||||
if (propertiesFile != null) {
|
||||
FileInputStream startProps = null;
|
||||
try {
|
||||
properties.load(new FileInputStream(propertiesFile));
|
||||
startProps = new FileInputStream(propertiesFile);
|
||||
properties.load(startProps);
|
||||
} catch (FileNotFoundException e) {
|
||||
logger.warn("Unable to open properties file: " + propertiesFile.getAbsolutePath(), e);
|
||||
} catch (IOException e) {
|
||||
logger.warn("Unable to read properties file: " + propertiesFile.getAbsolutePath(), e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(startProps);
|
||||
}
|
||||
|
||||
logger.info("Use startup properties file: " + propertiesFile.getAbsolutePath());
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ import javax.inject.Inject;
|
|||
import javax.naming.ConfigurationException;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.xml.sax.SAXException;
|
||||
|
|
@ -122,12 +123,18 @@ public class EC2Engine extends ManagerBase {
|
|||
if (null != propertiesFile) {
|
||||
logger.info("Use EC2 properties file: " + propertiesFile.getAbsolutePath());
|
||||
Properties EC2Prop = new Properties();
|
||||
FileInputStream ec2PropFile = null;
|
||||
try {
|
||||
EC2Prop.load(new FileInputStream(propertiesFile));
|
||||
ec2PropFile = new FileInputStream( propertiesFile );
|
||||
EC2Prop.load(ec2PropFile);
|
||||
|
||||
} catch (FileNotFoundException e) {
|
||||
logger.warn("Unable to open properties file: " + propertiesFile.getAbsolutePath(), e);
|
||||
} catch (IOException e) {
|
||||
logger.warn("Unable to read properties file: " + propertiesFile.getAbsolutePath(), e);
|
||||
} finally {
|
||||
IOUtils.closeQuietly(ec2PropFile);
|
||||
}
|
||||
managementServer = EC2Prop.getProperty("managementServer");
|
||||
cloudAPIPort = EC2Prop.getProperty("cloudAPIPort", null);
|
||||
|
|
@ -364,12 +371,12 @@ public class EC2Engine extends ManagerBase {
|
|||
CloudStackSecurityGroup resp = null;
|
||||
if (ipPerm.getProtocol().equalsIgnoreCase("icmp")) {
|
||||
resp =
|
||||
getApi().authorizeSecurityGroupIngress(null, constructList(ipPerm.getIpRangeSet()), null, null, ipPerm.getIcmpCode(), ipPerm.getIcmpType(),
|
||||
ipPerm.getProtocol(), null, request.getName(), null, secGroupList);
|
||||
getApi().authorizeSecurityGroupIngress(null, constructList(ipPerm.getIpRangeSet()), null, null, ipPerm.getIcmpCode(), ipPerm.getIcmpType(),
|
||||
ipPerm.getProtocol(), null, request.getName(), null, secGroupList);
|
||||
} else {
|
||||
resp =
|
||||
getApi().authorizeSecurityGroupIngress(null, constructList(ipPerm.getIpRangeSet()), null, ipPerm.getToPort().longValue(), null, null,
|
||||
ipPerm.getProtocol(), null, request.getName(), ipPerm.getFromPort().longValue(), secGroupList);
|
||||
getApi().authorizeSecurityGroupIngress(null, constructList(ipPerm.getIpRangeSet()), null, ipPerm.getToPort().longValue(), null, null,
|
||||
ipPerm.getProtocol(), null, request.getName(), ipPerm.getFromPort().longValue(), secGroupList);
|
||||
}
|
||||
if (resp != null) {
|
||||
List<CloudStackIngressRule> ingressRules = resp.getIngressRules();
|
||||
|
|
@ -808,7 +815,7 @@ public class EC2Engine extends ManagerBase {
|
|||
CloudStackIpAddress cloudIp = cloudIps.get(0);
|
||||
|
||||
List<CloudStackUserVm> vmList =
|
||||
getApi().listVirtualMachines(null, null, true, null, null, null, null, request.getInstanceId(), null, null, null, null, null, null, null, null, null);
|
||||
getApi().listVirtualMachines(null, null, true, null, null, null, null, request.getInstanceId(), null, null, null, null, null, null, null, null, null);
|
||||
if (vmList == null || vmList.size() == 0) {
|
||||
throw new Exception("Instance not found");
|
||||
}
|
||||
|
|
@ -863,7 +870,7 @@ public class EC2Engine extends ManagerBase {
|
|||
|
||||
CloudStackZone zone = findZone();
|
||||
//CloudStackNetwork net = findNetwork(zone);
|
||||
// CloudStackIpAddress resp = getApi().associateIpAddress(null, null, null, "0036952d-48df-4422-9fd0-94b0885e18cb");
|
||||
//CloudStackIpAddress resp = getApi().associateIpAddress(null, null, null, "0036952d-48df-4422-9fd0-94b0885e18cb");
|
||||
CloudStackIpAddress resp = getApi().associateIpAddress(zone.getId(), caller.getName(), caller.getDomainId(), null);
|
||||
ec2Address.setAssociatedInstanceId(resp.getId());
|
||||
|
||||
|
|
@ -965,8 +972,8 @@ public class EC2Engine extends ManagerBase {
|
|||
String osTypeId = imageSet[0].getOsTypeId();
|
||||
|
||||
CloudStackTemplate resp =
|
||||
getApi().createTemplate((request.getDescription() == null ? "" : request.getDescription()), request.getName(), osTypeId, null, null, null, null, null,
|
||||
null, volumeId);
|
||||
getApi().createTemplate((request.getDescription() == null ? "" : request.getDescription()), request.getName(), osTypeId, null, null, null, null, null,
|
||||
null, volumeId);
|
||||
if (resp == null || resp.getId() == null) {
|
||||
throw new Exception("Image couldn't be created");
|
||||
}
|
||||
|
|
@ -996,9 +1003,9 @@ public class EC2Engine extends ManagerBase {
|
|||
EC2CreateImageResponse image = new EC2CreateImageResponse();
|
||||
try {
|
||||
List<CloudStackTemplate> templates =
|
||||
getApi().registerTemplate((request.getDescription() == null ? request.getName() : request.getDescription()), request.getFormat(),
|
||||
request.getHypervisor(), request.getName(), toOSTypeId(request.getOsTypeName()), request.getLocation(), toZoneId(request.getZoneName(), null), null,
|
||||
null, null, null, null, null, null, null, null);
|
||||
getApi().registerTemplate((request.getDescription() == null ? request.getName() : request.getDescription()), request.getFormat(),
|
||||
request.getHypervisor(), request.getName(), toOSTypeId(request.getOsTypeName()), request.getLocation(), toZoneId(request.getZoneName(), null), null,
|
||||
null, null, null, null, null, null, null, null);
|
||||
if (templates != null) {
|
||||
// technically we will only ever register a single template...
|
||||
for (CloudStackTemplate template : templates) {
|
||||
|
|
@ -1217,13 +1224,13 @@ public class EC2Engine extends ManagerBase {
|
|||
throw new EC2ServiceException(ServerError.InternalError, "No Customize Disk Offering Found");
|
||||
}
|
||||
|
||||
// // -> no volume name is given in the Amazon request but is required in the cloud API
|
||||
// -> no volume name is given in the Amazon request but is required in the cloud API
|
||||
CloudStackVolume vol =
|
||||
getApi().createVolume(UUID.randomUUID().toString(), null, diskOfferingId, null, size, snapshotId, toZoneId(request.getZoneName(), null));
|
||||
getApi().createVolume(UUID.randomUUID().toString(), null, diskOfferingId, null, size, snapshotId, toZoneId(request.getZoneName(), null));
|
||||
if (vol != null) {
|
||||
resp.setAttached(vol.getAttached());
|
||||
resp.setCreated(vol.getCreated());
|
||||
// resp.setDevice();
|
||||
//resp.setDevice();
|
||||
resp.setDeviceId(vol.getDeviceId());
|
||||
resp.setHypervisor(vol.getHypervisor());
|
||||
resp.setId(vol.getId());
|
||||
|
|
@ -1442,8 +1449,8 @@ public class EC2Engine extends ManagerBase {
|
|||
for (int i = 0; i < createInstances; i++) {
|
||||
try {
|
||||
CloudStackUserVm resp =
|
||||
getApi().deployVirtualMachine(svcOffering.getId(), request.getTemplateId(), zoneId, null, null, null, null, null, null, null,
|
||||
request.getKeyName(), null, null, groupIds, groupNames, request.getSize().longValue(), request.getUserData());
|
||||
getApi().deployVirtualMachine(svcOffering.getId(), request.getTemplateId(), zoneId, null, null, null, null, null, null, null,
|
||||
request.getKeyName(), null, null, groupIds, groupNames, request.getSize().longValue(), request.getUserData());
|
||||
EC2Instance vm = new EC2Instance();
|
||||
vm.setId(resp.getId().toString());
|
||||
vm.setName(resp.getName());
|
||||
|
|
@ -1666,7 +1673,7 @@ public class EC2Engine extends ManagerBase {
|
|||
* @param ifs - filter out unwanted instances
|
||||
*/
|
||||
private EC2DescribeInstancesResponse listVirtualMachines(String[] virtualMachineIds, EC2InstanceFilterSet ifs, List<CloudStackKeyValue> resourceTags)
|
||||
throws Exception {
|
||||
throws Exception {
|
||||
EC2DescribeInstancesResponse instances = new EC2DescribeInstancesResponse();
|
||||
|
||||
if (null == virtualMachineIds || 0 == virtualMachineIds.length) {
|
||||
|
|
@ -1690,7 +1697,7 @@ public class EC2Engine extends ManagerBase {
|
|||
* @param instanceId - if interested in volumes for a specific instance, null if instance is not important
|
||||
*/
|
||||
private EC2DescribeVolumesResponse listVolumes(String volumeId, String instanceId, EC2DescribeVolumesResponse volumes, List<CloudStackKeyValue> resourceTagSet)
|
||||
throws Exception {
|
||||
throws Exception {
|
||||
|
||||
List<CloudStackVolume> vols = getApi().listVolumes(null, null, null, volumeId, null, null, null, null, null, instanceId, null, resourceTagSet);
|
||||
if (vols != null && vols.size() > 0) {
|
||||
|
|
@ -1881,11 +1888,11 @@ public class EC2Engine extends ManagerBase {
|
|||
* EC2Instance objects loaded.
|
||||
*/
|
||||
private EC2DescribeInstancesResponse lookupInstances(String instanceId, EC2DescribeInstancesResponse instances, List<CloudStackKeyValue> resourceTagSet)
|
||||
throws Exception {
|
||||
throws Exception {
|
||||
|
||||
String instId = instanceId != null ? instanceId : null;
|
||||
List<CloudStackUserVm> vms =
|
||||
getApi().listVirtualMachines(null, null, true, null, null, null, null, instId, null, null, null, null, null, null, null, null, resourceTagSet);
|
||||
getApi().listVirtualMachines(null, null, true, null, null, null, null, instId, null, null, null, null, null, null, null, null, resourceTagSet);
|
||||
|
||||
if (vms != null && vms.size() > 0) {
|
||||
for (CloudStackUserVm cloudVm : vms) {
|
||||
|
|
@ -2301,7 +2308,7 @@ public class EC2Engine extends ManagerBase {
|
|||
*/
|
||||
private CloudStackNetwork createDefaultGuestNetwork(String zoneId, CloudStackNetworkOffering offering, CloudStackAccount owner) throws Exception {
|
||||
return getApi().createNetwork(owner.getName() + "-network", owner.getName() + "-network", offering.getId(), zoneId, owner.getName(), owner.getDomainId(), true,
|
||||
null, null, null, null, null, null, null, null);
|
||||
null, null, null, null, null, null, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -2688,8 +2695,8 @@ public class EC2Engine extends ManagerBase {
|
|||
if (errorMessage.contains("Object vm_instance(uuid:") && errorMessage.contains(") does not exist")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidInstanceID_NotFound, "Specified Instance ID does not exist");
|
||||
} else if (errorMessage.contains("Unable to find security group by name") || errorMessage.contains("Unable to find security group") ||
|
||||
(errorMessage.contains("Object security_group(uuid:") && errorMessage.contains(") does not exist")) ||
|
||||
errorMessage.contains("Unable to find group by name ")) {
|
||||
(errorMessage.contains("Object security_group(uuid:") && errorMessage.contains(") does not exist")) ||
|
||||
errorMessage.contains("Unable to find group by name ")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidGroup_NotFound, "Specified Security Group does not exist");
|
||||
} else if (errorMessage.contains("Invalid port numbers")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidPermission_Malformed, "Specified Port value is invalid");
|
||||
|
|
@ -2708,7 +2715,7 @@ public class EC2Engine extends ManagerBase {
|
|||
} else if (errorMessage.contains("Object snapshots(uuid:") && errorMessage.contains(") does not exist")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidSnapshot_NotFound, "Specified Snapshot ID doesn't exist");
|
||||
} else if ((errorMessage.contains("A key pair with name '") && errorMessage.contains("' does not exist")) ||
|
||||
(errorMessage.contains("A key pair with name '") && errorMessage.contains("' was not found"))) {
|
||||
(errorMessage.contains("A key pair with name '") && errorMessage.contains("' was not found"))) {
|
||||
throw new EC2ServiceException(ClientError.InvalidKeyPair_NotFound, "Specified Key pair name is invalid");
|
||||
} else if (errorMessage.contains("A key pair with name '") && errorMessage.contains("' already exists")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidKeyPair_Duplicate, "Specified Key pair already exists");
|
||||
|
|
@ -2735,7 +2742,7 @@ public class EC2Engine extends ManagerBase {
|
|||
} else if (errorMessage.contains("Unable to find tags by parameters specified")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidParameterValue, "Specified resourceTag for the specified resourceId doesn't exist");
|
||||
} else if (errorMessage.contains("Failed to enable static nat for the ip address with specified ipId "
|
||||
+ "as vm with specified vmId is already associated with specified currentIp")) {
|
||||
+ "as vm with specified vmId is already associated with specified currentIp")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidParameterValue, "Specified publicIp is already associated to the specified VM");
|
||||
} else if (errorMessage.contains("Specified IP address id is not associated with any vm Id")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidParameterValue, "Specified publicIp is not associated to any VM");
|
||||
|
|
@ -2783,7 +2790,7 @@ public class EC2Engine extends ManagerBase {
|
|||
throw new EC2ServiceException(ClientError.InvalidAMIID_NotFound, "Specified ImageId is unavailable");
|
||||
} else if (errorMessage.contains("cannot stop VM") && errorMessage.contains("when it is in state Starting")) {
|
||||
throw new EC2ServiceException(ClientError.IncorrectInstanceState,
|
||||
"Unable to stop. One or more of the specified instances is in an incorrect state 'pending'");
|
||||
"Unable to stop. One or more of the specified instances is in an incorrect state 'pending'");
|
||||
} else if (errorMessage.contains("Failed to authorize security group ingress rule(s)")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidParameterValue, "Specified Ip-permission is invalid" + " or the Ip-permission already exists");
|
||||
} else if (errorMessage.contains("Failed to reboot vm instance")) {
|
||||
|
|
@ -2798,7 +2805,7 @@ public class EC2Engine extends ManagerBase {
|
|||
throw new EC2ServiceException(ClientError.VolumeLimitExceeded, "You have reached the limit on the number of volumes that can be created");
|
||||
} else if (errorMessage.contains("Maximum number of resources of type 'public_ip' for account") && errorMessage.contains("has been exceeded")) {
|
||||
throw new EC2ServiceException(ClientError.AddressLimitExceeded,
|
||||
"You have reached the limit on the number of elastic ip addresses your account can have");
|
||||
"You have reached the limit on the number of elastic ip addresses your account can have");
|
||||
} else if (errorMessage.contains("Unable to apply save userdata entry on router")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidParameterValue, "The value supplied for parameter UserData is invalid");
|
||||
} else {
|
||||
|
|
@ -2846,7 +2853,7 @@ public class EC2Engine extends ManagerBase {
|
|||
throw new EC2ServiceException(ServerError.InternalError, "Unable to start the instance that was stopped during image creation");
|
||||
} else if (errorMessage.contains("One or more of instanceIds specified is in stopped state")) {
|
||||
throw new EC2ServiceException(ClientError.IncorrectInstanceState,
|
||||
"Unable to reboot. One or more of the specified instances is in an incorrect state 'stopped'");
|
||||
"Unable to reboot. One or more of the specified instances is in an incorrect state 'stopped'");
|
||||
} else if (errorMessage.contains("Specified ipAddress doesn't exist")) {
|
||||
throw new EC2ServiceException(ClientError.InvalidParameterValue, "Specified publicIp doesn't exist");
|
||||
} else if (errorMessage.contains("Min Count is greater than the number of instances left to allocate")) {
|
||||
|
|
@ -2865,7 +2872,7 @@ public class EC2Engine extends ManagerBase {
|
|||
throw new EC2ServiceException(ClientError.InvalidInstanceID_NotFound, "One or more of the specified instanceId not found");
|
||||
} else if (errorMessage.contains("Cannot modify, instance should be in stopped state")) {
|
||||
throw new EC2ServiceException(ClientError.IncorrectInstanceState,
|
||||
"Unable to modify instance attribute. Specified instance is not in the correct state 'stopped'");
|
||||
"Unable to modify instance attribute. Specified instance is not in the correct state 'stopped'");
|
||||
} else {
|
||||
throw new EC2ServiceException(ServerError.InternalError, "An unexpected error occured");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ message.action.delete.nic=Please confirm that want to remove this NIC, which wil
|
|||
changed.item.properties=Changed item properties
|
||||
confirm.enable.s3=Please fill in the following information to enable support for S3-backed Secondary Storage
|
||||
confirm.enable.swift=Please fill in the following information to enable support for Swift
|
||||
error.could.not.change.your.password.because.ldap.is.enabled=Error cloud not change your password because LDAP is enabled.
|
||||
error.could.not.change.your.password.because.ldap.is.enabled=Error could not change your password because LDAP is enabled.
|
||||
error.could.not.enable.zone=Could not enable zone
|
||||
error.installWizard.message=Something went wrong; you may go back and correct any errors
|
||||
error.invalid.username.password=Invalid username or password
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
a# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# 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
|
||||
|
|
@ -14,6 +14,12 @@ a# Licensed to the Apache Software Foundation (ASF) under one
|
|||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
label.hypervisors=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc
|
||||
label.home=\u30db\u30fc\u30e0
|
||||
label.sockets=\u30bd\u30b1\u30c3\u30c8
|
||||
label.root.disk.size=\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba
|
||||
label.s3.nfs.server=S3 NFS \u30b5\u30fc\u30d0\u30fc
|
||||
label.s3.nfs.path=S3 NFS \u30d1\u30b9
|
||||
label.delete.events=\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664
|
||||
label.delete.alerts=\u30a2\u30e9\u30fc\u30c8\u306e\u524a\u9664
|
||||
label.archive.alerts=\u30a2\u30e9\u30fc\u30c8\u306e\u30a2\u30fc\u30ab\u30a4\u30d6
|
||||
|
|
@ -33,6 +39,7 @@ label.custom.disk.iops=\u30ab\u30b9\u30bf\u30e0 IOPS
|
|||
label.disk.iops.min=\u6700\u5c0f IOPS
|
||||
label.disk.iops.max=\u6700\u5927 IOPS
|
||||
label.disk.iops.total=IOPS \u5408\u8a08
|
||||
label.hypervisor.snapshot.reserve=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u4e88\u7d04
|
||||
label.view.secondary.ips=\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306e\u8868\u793a
|
||||
message.validate.invalid.characters=\u7121\u52b9\u306a\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\u4fee\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002
|
||||
message.acquire.ip.nic=\u3053\u306e NIC \u306e\u305f\u3081\u306b\u65b0\u3057\u3044\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?<br/>\u6ce8: \u65b0\u3057\u304f\u53d6\u5f97\u3057\u305f\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306f\u4eee\u60f3\u30de\u30b7\u30f3\u5185\u3067\u624b\u52d5\u3067\u69cb\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
|
||||
|
|
@ -43,6 +50,7 @@ message.action.delete.nic=\u3053\u306e NIC \u3092\u524a\u9664\u3057\u3066\u3082\
|
|||
changed.item.properties=\u9805\u76ee\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5909\u66f4
|
||||
confirm.enable.s3=S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
|
||||
confirm.enable.swift=Swift \u306e\u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
|
||||
error.could.not.change.your.password.because.ldap.is.enabled=LDAP \u304c\u6709\u52b9\u306a\u305f\u3081\u3001\u30a8\u30e9\u30fc\u306b\u3088\u3063\u3066\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5909\u66f4\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
|
||||
error.could.not.enable.zone=\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
|
||||
error.installWizard.message=\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u623b\u3063\u3066\u30a8\u30e9\u30fc\u3092\u4fee\u6b63\u3067\u304d\u307e\u3059\u3002
|
||||
error.invalid.username.password=\u7121\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u540d\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002
|
||||
|
|
@ -75,6 +83,7 @@ label.account.specific=\u30a2\u30ab\u30a6\u30f3\u30c8\u56fa\u6709
|
|||
label.account=\u30a2\u30ab\u30a6\u30f3\u30c8
|
||||
label.accounts=\u30a2\u30ab\u30a6\u30f3\u30c8
|
||||
label.acquire.new.ip=\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97
|
||||
label.acquire.new.secondary.ip=\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97
|
||||
label.action.attach.disk.processing=\u30c7\u30a3\u30b9\u30af\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059...
|
||||
label.action.attach.disk=\u30c7\u30a3\u30b9\u30af\u306e\u30a2\u30bf\u30c3\u30c1
|
||||
label.action.attach.iso.processing=ISO \u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059...
|
||||
|
|
@ -198,6 +207,8 @@ label.action.enable.user.processing=\u30e6\u30fc\u30b6\u30fc\u3092\u6709\u52b9\u
|
|||
label.action.enable.user=\u30e6\u30fc\u30b6\u30fc\u306e\u6709\u52b9\u5316
|
||||
label.action.enable.zone.processing=\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059...
|
||||
label.action.enable.zone=\u30be\u30fc\u30f3\u306e\u6709\u52b9\u5316
|
||||
label.action.expunge.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u62b9\u6d88
|
||||
label.action.expunge.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u62b9\u6d88\u3057\u3066\u3044\u307e\u3059...
|
||||
label.action.force.reconnect.processing=\u518d\u63a5\u7d9a\u3057\u3066\u3044\u307e\u3059...
|
||||
label.action.force.reconnect=\u5f37\u5236\u518d\u63a5\u7d9a
|
||||
label.action.generate.keys.processing=\u30ad\u30fc\u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059...
|
||||
|
|
@ -247,6 +258,8 @@ label.action.stop.systemvm.processing=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u505c\u
|
|||
label.action.stop.systemvm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u505c\u6b62
|
||||
label.action.take.snapshot.processing=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059....
|
||||
label.action.take.snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210
|
||||
label.action.revert.snapshot.processing=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3057\u3066\u3044\u307e\u3059...
|
||||
label.action.revert.snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3059
|
||||
label.action.unmanage.cluster.processing=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u975e\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3044\u307e\u3059...
|
||||
label.action.unmanage.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u975e\u7ba1\u7406\u5bfe\u8c61\u5316
|
||||
label.action.update.OS.preference.processing=OS \u57fa\u672c\u8a2d\u5b9a\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059...
|
||||
|
|
@ -255,7 +268,7 @@ label.action.update.resource.count.processing=\u30ea\u30bd\u30fc\u30b9\u6570\u30
|
|||
label.action.update.resource.count=\u30ea\u30bd\u30fc\u30b9\u6570\u306e\u66f4\u65b0
|
||||
label.action.vmsnapshot.create=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210
|
||||
label.action.vmsnapshot.delete=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u524a\u9664
|
||||
label.action.vmsnapshot.revert=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u5143\u306b\u623b\u3059
|
||||
label.action.vmsnapshot.revert=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3059
|
||||
label.actions=\u64cd\u4f5c
|
||||
label.activate.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u5316
|
||||
label.active.sessions=\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u30bb\u30c3\u30b7\u30e7\u30f3
|
||||
|
|
@ -292,6 +305,7 @@ label.add.new.F5=\u65b0\u3057\u3044 F5 \u306e\u8ffd\u52a0
|
|||
label.add.new.gateway=\u65b0\u3057\u3044\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0
|
||||
label.add.new.NetScaler=\u65b0\u3057\u3044 NetScaler \u306e\u8ffd\u52a0
|
||||
label.add.new.SRX=\u65b0\u3057\u3044 SRX \u306e\u8ffd\u52a0
|
||||
label.add.new.PA=\u65b0\u3057\u3044 Palo Alto \u306e\u8ffd\u52a0
|
||||
label.add.new.tier=\u65b0\u3057\u3044\u968e\u5c64\u306e\u8ffd\u52a0
|
||||
label.add.NiciraNvp.device=NVP \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8ffd\u52a0
|
||||
label.add.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0
|
||||
|
|
@ -306,6 +320,7 @@ label.add.secondary.storage=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u3
|
|||
label.add.security.group=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0
|
||||
label.add.service.offering=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0
|
||||
label.add.SRX.device=SRX \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0
|
||||
label.add.PA.device=Palo Alto \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0
|
||||
label.add.static.nat.rule=\u9759\u7684 NAT \u898f\u5247\u306e\u8ffd\u52a0
|
||||
label.add.static.route=\u9759\u7684\u30eb\u30fc\u30c8\u306e\u8ffd\u52a0
|
||||
label.add.system.service.offering=\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0
|
||||
|
|
@ -369,6 +384,7 @@ label.back=\u623b\u308b
|
|||
label.bandwidth=\u5e2f\u57df\u5e45
|
||||
label.basic.mode=\u57fa\u672c\u30e2\u30fc\u30c9
|
||||
label.basic=\u57fa\u672c
|
||||
label.bigswitch.controller.address=Big Switch VNS \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u30a2\u30c9\u30ec\u30b9
|
||||
label.bootable=\u8d77\u52d5\u53ef\u80fd
|
||||
label.broadcast.domain.range=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306e\u7bc4\u56f2
|
||||
label.broadcast.domain.type=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306e\u7a2e\u985e
|
||||
|
|
@ -410,6 +426,11 @@ label.cluster.type=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7a2e\u985e
|
|||
label.cluster=\u30af\u30e9\u30b9\u30bf\u30fc
|
||||
label.clusters=\u30af\u30e9\u30b9\u30bf\u30fc
|
||||
label.clvm=CLVM
|
||||
label.rbd=RBD
|
||||
label.rbd.monitor=Ceph \u30e2\u30cb\u30bf\u30fc
|
||||
label.rbd.pool=Ceph \u30d7\u30fc\u30eb
|
||||
label.rbd.id=Cephx \u30e6\u30fc\u30b6\u30fc
|
||||
label.rbd.secret=Cephx \u30b7\u30fc\u30af\u30ec\u30c3\u30c8
|
||||
label.code=\u30b3\u30fc\u30c9
|
||||
label.community=\u30b3\u30df\u30e5\u30cb\u30c6\u30a3
|
||||
label.compute.and.storage=\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30b9\u30c8\u30ec\u30fc\u30b8
|
||||
|
|
@ -461,6 +482,7 @@ label.delete.NetScaler=NetScaler \u306e\u524a\u9664
|
|||
label.delete.NiciraNvp=NVP \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u524a\u9664
|
||||
label.delete.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u524a\u9664
|
||||
label.delete.SRX=SRX \u306e\u524a\u9664
|
||||
label.delete.PA=Palo Alto \u306e\u524a\u9664
|
||||
label.delete.VPN.connection=VPN \u63a5\u7d9a\u306e\u524a\u9664
|
||||
label.delete.VPN.customer.gateway=VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664
|
||||
label.delete.VPN.gateway=VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664
|
||||
|
|
@ -485,10 +507,14 @@ label.disable.vpn=VPN \u306e\u7121\u52b9\u5316
|
|||
label.disabled=\u7121\u52b9
|
||||
label.disabling.vpn.access=VPN \u30a2\u30af\u30bb\u30b9\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059
|
||||
label.disk.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30c7\u30a3\u30b9\u30af
|
||||
label.disk.bytes.read.rate=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u901f\u5ea6 (BPS)
|
||||
label.disk.bytes.write.rate=\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f\u901f\u5ea6 (BPS)
|
||||
label.disk.iops.read.rate=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u901f\u5ea6 (IOPS)
|
||||
label.disk.iops.write.rate=\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f\u901f\u5ea6 (IOPS)
|
||||
label.disk.offering=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0
|
||||
label.disk.read.bytes=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a (\u30d0\u30a4\u30c8)
|
||||
label.disk.read.io=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a (IO)
|
||||
label.disk.size.gb=\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba (GB \u5358\u4f4d)
|
||||
label.disk.size.gb=\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba (GB)
|
||||
label.disk.size=\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba
|
||||
label.disk.total=\u30c7\u30a3\u30b9\u30af\u5408\u8a08
|
||||
label.disk.volume=\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0
|
||||
|
|
@ -510,6 +536,7 @@ label.done=\u5b8c\u4e86
|
|||
label.double.quotes.are.not.allowed=\u4e8c\u91cd\u5f15\u7528\u7b26\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
|
||||
label.download.progress=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u9032\u6357\u72b6\u6cc1
|
||||
label.drag.new.position=\u65b0\u3057\u3044\u4f4d\u7f6e\u306b\u30c9\u30e9\u30c3\u30b0
|
||||
label.edit.affinity.group=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u7de8\u96c6
|
||||
label.edit.lb.rule=\u8ca0\u8377\u5206\u6563\u898f\u5247\u306e\u7de8\u96c6
|
||||
label.edit.network.details=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30\u306e\u7de8\u96c6
|
||||
label.edit.project.details=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8a73\u7d30\u306e\u7de8\u96c6
|
||||
|
|
@ -541,9 +568,12 @@ label.error.code=\u30a8\u30e9\u30fc \u30b3\u30fc\u30c9
|
|||
label.error=\u30a8\u30e9\u30fc
|
||||
label.ESP.encryption=ESP \u6697\u53f7\u5316
|
||||
label.ESP.hash=ESP \u30cf\u30c3\u30b7\u30e5
|
||||
label.ESP.lifetime=ESP \u6709\u52b9\u671f\u9593 (\u79d2)
|
||||
label.ESP.policy=ESP \u30dd\u30ea\u30b7\u30fc
|
||||
label.esx.host=ESX/ESXi \u30db\u30b9\u30c8
|
||||
label.example=\u4f8b
|
||||
label.expunge=\u62b9\u6d88
|
||||
label.external.link=\u5916\u90e8\u30ea\u30f3\u30af
|
||||
label.f5=F5
|
||||
label.failed=\u5931\u6557
|
||||
label.featured=\u304a\u3059\u3059\u3081
|
||||
|
|
@ -614,7 +644,7 @@ label.installWizard.addZoneIntro.subtitle=\u30be\u30fc\u30f3\u306b\u3064\u3044\u
|
|||
label.installWizard.addZoneIntro.title=\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046
|
||||
label.installWizard.click.launch=[\u8d77\u52d5] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002
|
||||
label.installWizard.subtitle=\u3053\u306e\u30ac\u30a4\u30c9 \u30c4\u30a2\u30fc\u306f CloudStack&\#8482; \u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306b\u5f79\u7acb\u3061\u307e\u3059
|
||||
label.installWizard.title=CloudStack&\#8482 \u3078\u3088\u3046\u3053\u305d
|
||||
label.installWizard.title=CloudStack&\#8482; \u3078\u3088\u3046\u3053\u305d
|
||||
label.instance.limits=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5236\u9650
|
||||
label.instance.name=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u540d
|
||||
label.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9
|
||||
|
|
@ -679,6 +709,7 @@ label.launch=\u8d77\u52d5
|
|||
label.LB.isolation=\u8ca0\u8377\u5206\u6563\u5206\u96e2
|
||||
label.least.connections=\u6700\u5c0f\u63a5\u7d9a
|
||||
label.level=\u30ec\u30d9\u30eb
|
||||
label.linklocal.ip=\u30ea\u30f3\u30af \u30ed\u30fc\u30ab\u30eb IP \u30a2\u30c9\u30ec\u30b9
|
||||
label.load.balancer=\u8ca0\u8377\u5206\u6563\u88c5\u7f6e
|
||||
label.load.balancing.policies=\u8ca0\u8377\u5206\u6563\u30dd\u30ea\u30b7\u30fc
|
||||
label.load.balancing=\u8ca0\u8377\u5206\u6563
|
||||
|
|
@ -699,7 +730,9 @@ label.max.cpus=\u6700\u5927 CPU \u30b3\u30a2\u6570
|
|||
label.max.guest.limit=\u6700\u5927\u30b2\u30b9\u30c8\u5236\u9650
|
||||
label.max.memory=\u6700\u5927\u30e1\u30e2\u30ea (MiB)
|
||||
label.max.networks=\u6700\u5927\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6570
|
||||
label.max.primary.storage=\u6700\u5927\u30d7\u30e9\u30a4\u30de\u30ea (GiB)
|
||||
label.max.public.ips=\u6700\u5927\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u6570
|
||||
label.max.secondary.storage=\u6700\u5927\u30bb\u30ab\u30f3\u30c0\u30ea (GiB)
|
||||
label.max.snapshots=\u6700\u5927\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u6570
|
||||
label.max.templates=\u6700\u5927\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u6570
|
||||
label.max.vms=\u6700\u5927\u30e6\u30fc\u30b6\u30fc VM \u6570
|
||||
|
|
@ -708,6 +741,7 @@ label.max.vpcs=\u6700\u5927 VPC \u6570
|
|||
label.maximum=\u6700\u5927
|
||||
label.may.continue=\u7d9a\u884c\u3067\u304d\u307e\u3059\u3002
|
||||
label.memory.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30e1\u30e2\u30ea
|
||||
label.memory.limits=\u30e1\u30e2\u30ea\u5236\u9650 (MiB)
|
||||
label.memory.mb=\u30e1\u30e2\u30ea (MB)
|
||||
label.memory.total=\u30e1\u30e2\u30ea\u5408\u8a08
|
||||
label.memory.used=\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf
|
||||
|
|
@ -787,6 +821,7 @@ label.network.domain.text=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a
|
|||
label.network.domain=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a4\u30f3
|
||||
label.network.id=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID
|
||||
label.network.label.display.for.blank.value=\u30c7\u30d5\u30a9\u30eb\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u4f7f\u7528
|
||||
label.network.limits=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5236\u9650
|
||||
label.network.name=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d
|
||||
label.network.offering.display.text=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u8868\u793a\u30c6\u30ad\u30b9\u30c8
|
||||
label.network.offering.id=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 ID
|
||||
|
|
@ -845,12 +880,15 @@ label.os.type=OS \u306e\u7a2e\u985e
|
|||
label.owned.public.ips=\u6240\u6709\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9
|
||||
label.owner.account=\u6240\u6709\u8005\u30a2\u30ab\u30a6\u30f3\u30c8
|
||||
label.owner.domain=\u6240\u6709\u8005\u30c9\u30e1\u30a4\u30f3
|
||||
label.PA.log.profile=Palo Alto \u30ed\u30b0 \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb
|
||||
label.PA.threat.profile=Palo Alto \u8105\u5a01\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb
|
||||
label.parent.domain=\u89aa\u30c9\u30e1\u30a4\u30f3
|
||||
label.password.enabled=\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406\u6709\u52b9
|
||||
label.password=\u30d1\u30b9\u30ef\u30fc\u30c9
|
||||
label.path=\u30d1\u30b9
|
||||
label.perfect.forward.secrecy=Perfect Forward Secrecy
|
||||
label.physical.network.ID=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID
|
||||
label.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af
|
||||
label.PING.CIFS.password=PING CIFS \u30d1\u30b9\u30ef\u30fc\u30c9
|
||||
label.PING.CIFS.username=PING CIFS \u30e6\u30fc\u30b6\u30fc\u540d
|
||||
label.PING.dir=PING \u30c7\u30a3\u30ec\u30af\u30c8\u30ea
|
||||
|
|
@ -871,6 +909,7 @@ label.previous=\u623b\u308b
|
|||
label.primary.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8
|
||||
label.primary.network=\u30d7\u30e9\u30a4\u30de\u30ea \u30cd\u30c3\u30c8\u30ef\u30fc\u30af
|
||||
label.primary.storage.count=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb
|
||||
label.primary.storage.limits=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u5236\u9650 (GiB)
|
||||
label.primary.storage=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8
|
||||
label.primary.used=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u4f7f\u7528\u91cf
|
||||
label.private.Gateway=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4
|
||||
|
|
@ -932,6 +971,9 @@ label.reserved.system.gateway=\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \
|
|||
label.reserved.system.ip=\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9
|
||||
label.reserved.system.netmask=\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30cd\u30c3\u30c8\u30de\u30b9\u30af
|
||||
label.reset.VPN.connection=VPN \u63a5\u7d9a\u306e\u30ea\u30bb\u30c3\u30c8
|
||||
label.resize.new.offering.id=\u65b0\u3057\u3044\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0
|
||||
label.resize.new.size=\u65b0\u3057\u3044\u30b5\u30a4\u30ba (GB)
|
||||
label.resize.shrink.ok=\u7e2e\u5c0f\u53ef\u80fd\u306b\u3059\u308b
|
||||
label.resource.limits=\u30ea\u30bd\u30fc\u30b9\u5236\u9650
|
||||
label.resource.state=\u30ea\u30bd\u30fc\u30b9\u306e\u72b6\u614b
|
||||
label.resource=\u30ea\u30bd\u30fc\u30b9
|
||||
|
|
@ -1012,6 +1054,7 @@ label.specify.vlan=VLAN \u3092\u6307\u5b9a\u3059\u308b
|
|||
label.specify.vxlan=VXLAN \u3092\u6307\u5b9a\u3059\u308b
|
||||
label.SR.name = SR \u540d\u30e9\u30d9\u30eb
|
||||
label.srx=SRX
|
||||
label.PA=Palo Alto
|
||||
label.start.IP=\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9
|
||||
label.start.port=\u958b\u59cb\u30dd\u30fc\u30c8
|
||||
label.start.reserved.system.IP=\u4e88\u7d04\u6e08\u307f\u958b\u59cb\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9
|
||||
|
|
@ -1053,6 +1096,7 @@ label.storage.tags=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30bf\u30b0
|
|||
label.storage.traffic=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af
|
||||
label.storage.type=\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u7a2e\u985e
|
||||
label.qos.type=QoS \u306e\u7a2e\u985e
|
||||
label.cache.mode=\u66f8\u304d\u8fbc\u307f\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u7a2e\u985e
|
||||
label.storage=\u30b9\u30c8\u30ec\u30fc\u30b8
|
||||
label.subdomain.access=\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3 \u30a2\u30af\u30bb\u30b9
|
||||
label.submit=\u9001\u4fe1
|
||||
|
|
@ -1140,9 +1184,11 @@ label.virtual.machines=\u4eee\u60f3\u30de\u30b7\u30f3
|
|||
label.virtual.network=\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af
|
||||
label.virtual.router=\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc
|
||||
label.virtual.routers=\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc
|
||||
label.vlan.id=VLAN ID
|
||||
label.vlan.range=VLAN \u306e\u7bc4\u56f2
|
||||
label.vlan=VLAN
|
||||
label.vlan.id=VLAN/VNI ID
|
||||
label.vlan.range=VLAN/VNI \u306e\u7bc4\u56f2
|
||||
label.vlan=VLAN/VNI
|
||||
label.vnet=VLAN/VNI
|
||||
label.vnet.id=VLAN/VNI ID
|
||||
label.vxlan.id=VXLAN ID
|
||||
label.vxlan.range=VXLAN \u306e\u7bc4\u56f2
|
||||
label.vxlan=VXLAN
|
||||
|
|
@ -1205,6 +1251,7 @@ label.zoneWizard.trafficType.guest=\u30b2\u30b9\u30c8\: \u30a8\u30f3\u30c9 \u30e
|
|||
label.zoneWizard.trafficType.management=\u7ba1\u7406\: \u30db\u30b9\u30c8\u3084 CloudStack \u30b7\u30b9\u30c6\u30e0 VM \u306a\u3069\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3059\u308b CloudStack \u306e\u5185\u90e8\u30ea\u30bd\u30fc\u30b9\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002
|
||||
label.zoneWizard.trafficType.public=\u30d1\u30d6\u30ea\u30c3\u30af\: \u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3068\u30af\u30e9\u30a6\u30c9\u5185\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002
|
||||
label.zoneWizard.trafficType.storage=\u30b9\u30c8\u30ec\u30fc\u30b8\: VM \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3084\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306a\u3069\u3001\u30d7\u30e9\u30a4\u30de\u30ea\u304a\u3088\u3073\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002
|
||||
label.ldap.group.name=LDAP \u30b0\u30eb\u30fc\u30d7
|
||||
managed.state=\u7ba1\u7406\u5bfe\u8c61\u72b6\u614b
|
||||
message.acquire.new.ip.vpc=\u3053\u306e VPC \u306e\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.acquire.new.ip=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
|
|
@ -1251,6 +1298,7 @@ message.action.enable.nexusVswitch=\u3053\u306e Nexus 1000V \u3092\u6709\u52b9\u
|
|||
message.action.enable.physical.network=\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.enable.pod=\u3053\u306e\u30dd\u30c3\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.enable.zone=\u3053\u306e\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.expunge.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u62b9\u6d88\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.force.reconnect=\u30db\u30b9\u30c8\u306f\u5f37\u5236\u7684\u306b\u518d\u63a5\u7d9a\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
|
||||
message.action.host.enable.maintenance.mode=\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\u3001\u3053\u306e\u30db\u30b9\u30c8\u3067\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u307b\u304b\u306e\u4f7f\u7528\u3067\u304d\u308b\u30db\u30b9\u30c8\u306b\u30e9\u30a4\u30d6 \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3055\u308c\u307e\u3059\u3002
|
||||
message.action.instance.reset.password=\u3053\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30eb\u30fc\u30c8 \u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
|
|
@ -1271,7 +1319,10 @@ message.action.stop.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3
|
|||
message.action.stop.router=\u3053\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.stop.systemvm=\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.take.snapshot=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.revert.snapshot=\u6240\u6709\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u3053\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.unmanage.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u975e\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.vmsnapshot.delete=\u3053\u306e VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.action.vmsnapshot.revert=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u5143\u306b\u623b\u3059
|
||||
message.activate.project=\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.add.cluster.zone=\u30be\u30fc\u30f3 <b><span id\="zone_name"></span></b> \u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u7ba1\u7406\u3055\u308c\u308b\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059
|
||||
message.add.cluster=\u30be\u30fc\u30f3 <b><span id\="zone_name"></span></b> \u306e\u30dd\u30c3\u30c9 <b><span id\="pod_name"></span></b> \u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u7ba1\u7406\u3055\u308c\u308b\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059
|
||||
|
|
@ -1324,6 +1375,7 @@ message.confirm.action.force.reconnect=\u3053\u306e\u30db\u30b9\u30c8\u3092\u5f3
|
|||
message.confirm.delete.F5=F5 \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.confirm.delete.NetScaler=NetScaler \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.confirm.delete.SRX=SRX \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.confirm.delete.PA=Palo Alto \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.confirm.destroy.router=\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.confirm.disable.provider=\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
message.confirm.enable.provider=\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
|
||||
|
|
|
|||
|
|
@ -14,6 +14,12 @@
|
|||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
label.hypervisors=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f
|
||||
label.home=\u9996\u9875
|
||||
label.sockets=\u63d2\u69fd
|
||||
label.root.disk.size=\u6839\u78c1\u76d8\u5927\u5c0f
|
||||
label.s3.nfs.server=S3 NFS \u670d\u52a1\u5668
|
||||
label.s3.nfs.path=S3 NFS \u8def\u5f84
|
||||
label.delete.events=\u5220\u9664\u4e8b\u4ef6
|
||||
label.delete.alerts=\u5220\u9664\u8b66\u62a5
|
||||
label.archive.alerts=\u5b58\u6863\u8b66\u62a5
|
||||
|
|
@ -33,6 +39,7 @@ label.custom.disk.iops=\u81ea\u5b9a\u4e49 IOPS
|
|||
label.disk.iops.min=\u6700\u5c0f IOPS
|
||||
label.disk.iops.max=\u6700\u5927 IOPS
|
||||
label.disk.iops.total=\u603b IOPS
|
||||
label.hypervisor.snapshot.reserve=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u5feb\u7167\u9884\u7559
|
||||
label.view.secondary.ips=\u67e5\u770b\u8f85\u52a9 IP
|
||||
message.validate.invalid.characters=\u67e5\u627e\u5230\u65e0\u6548\u5b57\u7b26\uff0c\u8bf7\u66f4\u6b63\u3002
|
||||
message.acquire.ip.nic=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u83b7\u53d6\u6b64 NIC \u7684\u65b0\u8f85\u52a9 IP\u3002<br/>\u6ce8\u610f: \u60a8\u9700\u8981\u5728\u865a\u62df\u673a\u5185\u90e8\u624b\u52a8\u914d\u7f6e\u65b0\u83b7\u53d6\u7684\u8f85\u52a9 IP\u3002
|
||||
|
|
@ -43,6 +50,7 @@ message.action.delete.nic=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u79fb\u9664
|
|||
changed.item.properties=\u66f4\u6539\u9879\u76ee\u5c5e\u6027
|
||||
confirm.enable.s3=\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 S3 \u652f\u6301\u7684\u8f85\u52a9\u5b58\u50a8\u7684\u652f\u6301
|
||||
confirm.enable.swift=\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 SWIFT \u7684\u652f\u6301
|
||||
error.could.not.change.your.password.because.ldap.is.enabled=\u9519\u8bef\u3002LDAP \u5904\u4e8e\u542f\u7528\u72b6\u6001\uff0c\u65e0\u6cd5\u66f4\u6539\u60a8\u7684\u5bc6\u7801\u3002
|
||||
error.could.not.enable.zone=\u65e0\u6cd5\u542f\u7528\u533a\u57df
|
||||
error.installWizard.message=\u51fa\u73b0\u95ee\u9898\uff1b\u8bf7\u8fd4\u56de\u5e76\u66f4\u6b63\u4efb\u4f55\u9519\u8bef
|
||||
error.invalid.username.password=\u7528\u6237\u540d\u6216\u5bc6\u7801\u65e0\u6548
|
||||
|
|
@ -199,6 +207,8 @@ label.action.enable.user.processing=\u6b63\u5728\u542f\u7528\u7528\u6237...
|
|||
label.action.enable.user=\u542f\u7528\u7528\u6237
|
||||
label.action.enable.zone.processing=\u6b63\u5728\u542f\u7528\u533a\u57df...
|
||||
label.action.enable.zone=\u542f\u7528\u533a\u57df
|
||||
label.action.expunge.instance=\u5220\u9664\u5b9e\u4f8b
|
||||
label.action.expunge.instance.processing=\u6b63\u5728\u5220\u9664\u5b9e\u4f8b...
|
||||
label.action.force.reconnect.processing=\u6b63\u5728\u91cd\u65b0\u8fde\u63a5...
|
||||
label.action.force.reconnect=\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5
|
||||
label.action.generate.keys.processing=\u6b63\u5728\u751f\u6210\u5bc6\u94a5...
|
||||
|
|
@ -248,6 +258,8 @@ label.action.stop.systemvm.processing=\u6b63\u5728\u505c\u6b62\u7cfb\u7edf VM...
|
|||
label.action.stop.systemvm=\u505c\u6b62\u7cfb\u7edf VM
|
||||
label.action.take.snapshot.processing=\u6b63\u5728\u521b\u5efa\u5feb\u7167...
|
||||
label.action.take.snapshot=\u521b\u5efa\u5feb\u7167
|
||||
label.action.revert.snapshot.processing=\u6b63\u5728\u8fd8\u539f\u5230\u5feb\u7167...
|
||||
label.action.revert.snapshot=\u8fd8\u539f\u5230\u5feb\u7167
|
||||
label.action.unmanage.cluster.processing=\u6b63\u5728\u53d6\u6d88\u6258\u7ba1\u7fa4\u96c6...
|
||||
label.action.unmanage.cluster=\u53d6\u6d88\u6258\u7ba1\u7fa4\u96c6
|
||||
label.action.update.OS.preference.processing=\u6b63\u5728\u66f4\u65b0\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879...
|
||||
|
|
@ -293,6 +305,7 @@ label.add.new.F5=\u6dfb\u52a0\u65b0 F5
|
|||
label.add.new.gateway=\u6dfb\u52a0\u65b0\u7f51\u5173
|
||||
label.add.new.NetScaler=\u6dfb\u52a0\u65b0 NetScaler
|
||||
label.add.new.SRX=\u6dfb\u52a0\u65b0 SRX
|
||||
label.add.new.PA=\u6dfb\u52a0\u65b0 Palo Alto
|
||||
label.add.new.tier=\u6dfb\u52a0\u65b0\u5c42
|
||||
label.add.NiciraNvp.device=\u6dfb\u52a0 Nvp \u63a7\u5236\u5668
|
||||
label.add.physical.network=\u6dfb\u52a0\u7269\u7406\u7f51\u7edc
|
||||
|
|
@ -307,6 +320,7 @@ label.add.secondary.storage=\u6dfb\u52a0\u8f85\u52a9\u5b58\u50a8
|
|||
label.add.security.group=\u6dfb\u52a0\u5b89\u5168\u7ec4
|
||||
label.add.service.offering=\u6dfb\u52a0\u670d\u52a1\u65b9\u6848
|
||||
label.add.SRX.device=\u6dfb\u52a0 SRX \u8bbe\u5907
|
||||
label.add.PA.device=\u6dfb\u52a0 Palo Alto \u8bbe\u5907
|
||||
label.add.static.nat.rule=\u6dfb\u52a0\u9759\u6001 NAT \u89c4\u5219
|
||||
label.add.static.route=\u6dfb\u52a0\u9759\u6001\u8def\u7531
|
||||
label.add.system.service.offering=\u6dfb\u52a0\u7cfb\u7edf\u670d\u52a1\u65b9\u6848
|
||||
|
|
@ -412,6 +426,11 @@ label.cluster.type=\u7fa4\u96c6\u7c7b\u578b
|
|||
label.cluster=\u7fa4\u96c6
|
||||
label.clusters=\u7fa4\u96c6
|
||||
label.clvm=CLVM
|
||||
label.rbd=RBD
|
||||
label.rbd.monitor=Ceph \u76d1\u89c6\u5668
|
||||
label.rbd.pool=Ceph \u6c60
|
||||
label.rbd.id=Cephx \u7528\u6237
|
||||
label.rbd.secret=Cephx \u5bc6\u94a5
|
||||
label.code=\u4ee3\u7801
|
||||
label.community=\u793e\u533a
|
||||
label.compute.and.storage=\u8ba1\u7b97\u4e0e\u5b58\u50a8
|
||||
|
|
@ -463,6 +482,7 @@ label.delete.NetScaler=\u5220\u9664 NetScaler
|
|||
label.delete.NiciraNvp=\u79fb\u9664 Nvp \u63a7\u5236\u5668
|
||||
label.delete.project=\u5220\u9664\u9879\u76ee
|
||||
label.delete.SRX=\u5220\u9664 SRX
|
||||
label.delete.PA=\u5220\u9664 Palo Alto
|
||||
label.delete.VPN.connection=\u5220\u9664 VPN \u8fde\u63a5
|
||||
label.delete.VPN.customer.gateway=\u5220\u9664 VPN \u5ba2\u6237\u7f51\u5173
|
||||
label.delete.VPN.gateway=\u5220\u9664 VPN \u7f51\u5173
|
||||
|
|
@ -552,6 +572,7 @@ label.ESP.lifetime=ESP \u4f7f\u7528\u671f\u9650(\u7b2c\u4e8c\u9636\u6bb5)
|
|||
label.ESP.policy=ESP \u7b56\u7565
|
||||
label.esx.host=ESX/ESXi \u4e3b\u673a
|
||||
label.example=\u793a\u4f8b
|
||||
label.expunge=\u5220\u9664
|
||||
label.external.link=\u5916\u90e8\u94fe\u63a5
|
||||
label.f5=F5
|
||||
label.failed=\u5931\u8d25
|
||||
|
|
@ -800,6 +821,7 @@ label.network.domain.text=\u7f51\u7edc\u57df
|
|||
label.network.domain=\u7f51\u7edc\u57df
|
||||
label.network.id=\u7f51\u7edc ID
|
||||
label.network.label.display.for.blank.value=\u4f7f\u7528\u9ed8\u8ba4\u7f51\u5173
|
||||
label.network.limits=\u7f51\u7edc\u9650\u5236
|
||||
label.network.name=\u7f51\u7edc\u540d\u79f0
|
||||
label.network.offering.display.text=\u7f51\u7edc\u65b9\u6848\u663e\u793a\u6587\u672c
|
||||
label.network.offering.id=\u7f51\u7edc\u65b9\u6848 ID
|
||||
|
|
@ -858,6 +880,8 @@ label.os.type=\u64cd\u4f5c\u7cfb\u7edf\u7c7b\u578b
|
|||
label.owned.public.ips=\u62e5\u6709\u7684\u516c\u7528 IP \u5730\u5740\u6570
|
||||
label.owner.account=\u6240\u6709\u8005\u5e10\u6237
|
||||
label.owner.domain=\u6240\u6709\u8005\u57df
|
||||
label.PA.log.profile=Palo Alto \u65e5\u5fd7\u914d\u7f6e\u6587\u4ef6
|
||||
label.PA.threat.profile=Palo Alto \u5a01\u80c1\u914d\u7f6e\u6587\u4ef6
|
||||
label.parent.domain=\u7236\u57df
|
||||
label.password.enabled=\u5df2\u542f\u7528\u5bc6\u7801
|
||||
label.password=\u5bc6\u7801
|
||||
|
|
@ -1030,11 +1054,12 @@ label.specify.vlan=\u6307\u5b9a VLAN
|
|||
label.specify.vxlan=\u6307\u5b9a VXLAN
|
||||
label.SR.name = SR \u540d\u79f0\u6807\u7b7e
|
||||
label.srx=SRX
|
||||
label.PA=Palo Alto
|
||||
label.start.IP=\u8d77\u59cb IP
|
||||
label.start.port=\u8d77\u59cb\u7aef\u53e3
|
||||
label.start.reserved.system.IP=\u8d77\u59cb\u9884\u7559\u7cfb\u7edf IP
|
||||
label.start.vlan=\u8d77\u59cb VLAN
|
||||
label.start.vxlan=\u8d77\u59cb VXLAN
|
||||
label.start.vxlan=\u542f\u52a8 VXLAN
|
||||
label.state=\u72b6\u6001
|
||||
label.static.nat.enabled=\u5df2\u542f\u7528\u9759\u6001 NAT
|
||||
label.static.nat.to=\u9759\u6001 NAT \u76ee\u6807
|
||||
|
|
@ -1071,6 +1096,7 @@ label.storage.tags=\u5b58\u50a8\u6807\u7b7e
|
|||
label.storage.traffic=\u5b58\u50a8\u901a\u4fe1
|
||||
label.storage.type=\u5b58\u50a8\u7c7b\u578b
|
||||
label.qos.type=QoS \u7c7b\u578b
|
||||
label.cache.mode=\u5199\u5165\u7f13\u5b58\u7c7b\u578b
|
||||
label.storage=\u5b58\u50a8
|
||||
label.subdomain.access=\u5b50\u57df\u8bbf\u95ee
|
||||
label.submit=\u63d0\u4ea4
|
||||
|
|
@ -1158,11 +1184,13 @@ label.virtual.machines=\u865a\u62df\u673a
|
|||
label.virtual.network=\u865a\u62df\u7f51\u7edc
|
||||
label.virtual.router=\u865a\u62df\u8def\u7531\u5668
|
||||
label.virtual.routers=\u865a\u62df\u8def\u7531\u5668
|
||||
label.vlan.id=VLAN ID
|
||||
label.vlan.range=VLAN \u8303\u56f4
|
||||
label.vlan=VLAN
|
||||
label.vlan.id=VLAN/VNI ID
|
||||
label.vlan.range=VLAN/VNI \u8303\u56f4
|
||||
label.vlan=VLAN/VNI
|
||||
label.vnet=VLAN/VNI
|
||||
label.vnet.id=VLAN/VNI ID
|
||||
label.vxlan.id=VXLAN ID
|
||||
label.vxlan.range=VXLAN Range
|
||||
label.vxlan.range=VXLAN \u8303\u56f4
|
||||
label.vxlan=VXLAN
|
||||
label.vm.add=\u6dfb\u52a0\u5b9e\u4f8b
|
||||
label.vm.destroy=\u9500\u6bc1
|
||||
|
|
@ -1206,7 +1234,7 @@ label.weekly=\u6bcf\u5468
|
|||
label.welcome.cloud.console=\u6b22\u8fce\u4f7f\u7528\u7ba1\u7406\u63a7\u5236\u53f0
|
||||
label.welcome=\u6b22\u8fce
|
||||
label.what.is.cloudstack=\u4ec0\u4e48\u662f CloudStack&\#8482?
|
||||
label.xen.traffic.label=XenServer \u6d41\u91cf\u6807\u7b7e
|
||||
label.xen.traffic.label=XenServer \u901a\u4fe1\u6807\u7b7e
|
||||
label.yes=\u662f
|
||||
label.zone.details=\u533a\u57df\u8be6\u60c5
|
||||
label.zone.id=\u533a\u57df ID
|
||||
|
|
@ -1223,6 +1251,7 @@ label.zoneWizard.trafficType.guest=\u6765\u5bbe\: \u6700\u7ec8\u7528\u6237\u865a
|
|||
label.zoneWizard.trafficType.management=\u7ba1\u7406\: CloudStack \u7684\u5185\u90e8\u8d44\u6e90(\u5305\u62ec\u4e0e\u7ba1\u7406\u670d\u52a1\u5668\u901a\u4fe1\u7684\u4efb\u4f55\u7ec4\u4ef6\uff0c\u4f8b\u5982\u4e3b\u673a\u548c CloudStack \u7cfb\u7edf VM)\u4e4b\u95f4\u7684\u901a\u4fe1
|
||||
label.zoneWizard.trafficType.public=\u516c\u7528\: \u4e91\u4e2d Internet \u4e0e\u865a\u62df\u673a\u4e4b\u95f4\u7684\u901a\u4fe1\u3002
|
||||
label.zoneWizard.trafficType.storage=\u5b58\u50a8\: \u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u4e0e\u8f85\u52a9\u5b58\u50a8\u670d\u52a1\u5668(\u4f8b\u5982 VM \u6a21\u677f\u4e0e\u5feb\u7167)\u4e4b\u95f4\u7684\u901a\u4fe1
|
||||
label.ldap.group.name=LDAP \u7ec4
|
||||
managed.state=\u6258\u7ba1\u72b6\u6001
|
||||
message.acquire.new.ip.vpc=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64 VPC \u83b7\u53d6\u4e00\u4e2a\u65b0 IP\u3002
|
||||
message.acquire.new.ip=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7f51\u7edc\u83b7\u53d6\u4e00\u4e2a\u65b0 IP\u3002
|
||||
|
|
@ -1269,6 +1298,7 @@ message.action.enable.nexusVswitch=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5
|
|||
message.action.enable.physical.network=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7269\u7406\u7f51\u7edc\u3002
|
||||
message.action.enable.pod=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u63d0\u4f9b\u70b9\u3002
|
||||
message.action.enable.zone=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u533a\u57df\u3002
|
||||
message.action.expunge.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5b9e\u4f8b\u3002
|
||||
message.action.force.reconnect=\u5df2\u6210\u529f\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u65f6\u95f4\u3002
|
||||
message.action.host.enable.maintenance.mode=\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f\u4f1a\u5bfc\u81f4\u5c06\u6b64\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709\u5b9e\u4f8b\u5b9e\u65f6\u8fc1\u79fb\u5230\u4efb\u4f55\u53ef\u7528\u7684\u4e3b\u673a\u3002
|
||||
message.action.instance.reset.password=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u6539\u6b64\u865a\u62df\u673a\u7684 ROOT \u7528\u6237\u5bc6\u7801\u3002
|
||||
|
|
@ -1289,6 +1319,7 @@ message.action.stop.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6
|
|||
message.action.stop.router=\u6b64\u865a\u62df\u8def\u7531\u5668\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u8def\u7531\u5668\u3002
|
||||
message.action.stop.systemvm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u7cfb\u7edf VM\u3002
|
||||
message.action.take.snapshot=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u521b\u5efa\u6b64\u5377\u7684\u5feb\u7167\u3002
|
||||
message.action.revert.snapshot=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u62e5\u6709\u7684\u5377\u8fd8\u539f\u4e3a\u6b64\u5feb\u7167\u3002
|
||||
message.action.unmanage.cluster=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u53d6\u6d88\u6258\u7ba1\u6b64\u7fa4\u96c6\u3002
|
||||
message.action.vmsnapshot.delete=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VM \u5feb\u7167\u3002
|
||||
message.action.vmsnapshot.revert=\u8fd8\u539f VM \u5feb\u7167
|
||||
|
|
@ -1344,6 +1375,7 @@ message.confirm.action.force.reconnect=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u898
|
|||
message.confirm.delete.F5=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 F5
|
||||
message.confirm.delete.NetScaler=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 NetScaler
|
||||
message.confirm.delete.SRX=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 SRX
|
||||
message.confirm.delete.PA=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Palo Alto
|
||||
message.confirm.destroy.router=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u8def\u7531\u5668
|
||||
message.confirm.disable.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u63d0\u4f9b\u7a0b\u5e8f
|
||||
message.confirm.enable.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u63d0\u4f9b\u7a0b\u5e8f
|
||||
|
|
@ -1412,7 +1444,7 @@ message.installWizard.copy.whatIsAHost=\u4e3b\u673a\u662f\u6307\u4e00\u53f0\u8ba
|
|||
message.installWizard.copy.whatIsAPod=\u4e00\u4e2a\u63d0\u4f9b\u70b9\u901a\u5e38\u4ee3\u8868\u4e00\u4e2a\u673a\u67b6\u3002\u540c\u4e00\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u4f4d\u4e8e\u540c\u4e00\u5b50\u7f51\u4e2d\u3002<br/><br/>\u63d0\u4f9b\u70b9\u662f CloudStack&\#8482; \u90e8\u7f72\u4e2d\u7684\u7b2c\u4e8c\u5927\u7ec4\u7ec7\u5355\u4f4d\u3002\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u533a\u57df\u4e2d\u3002\u6bcf\u4e2a\u533a\u57df\u4e2d\u53ef\u4ee5\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\uff1b\u5728\u57fa\u672c\u5b89\u88c5\u4e2d\uff0c\u60a8\u7684\u533a\u57df\u4e2d\u5c06\u4ec5\u5305\u542b\u4e00\u4e2a\u63d0\u4f9b\u70b9\u3002
|
||||
message.installWizard.copy.whatIsAZone=\u533a\u57df\u662f CloudStack&\#8482; \u90e8\u7f72\u4e2d\u6700\u5927\u7684\u7ec4\u7ec7\u5355\u4f4d\u3002\u867d\u7136\u5141\u8bb8\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u4e2d\u5b58\u5728\u591a\u4e2a\u533a\u57df\uff0c\u4f46\u662f\u4e00\u4e2a\u533a\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u5c06\u57fa\u7840\u67b6\u6784\u7f16\u7ec4\u5230\u533a\u57df\u4e2d\u7684\u597d\u5904\u662f\u53ef\u4ee5\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\u3002\u4f8b\u5982\uff0c\u6bcf\u4e2a\u533a\u57df\u90fd\u53ef\u4ee5\u62e5\u6709\u5404\u81ea\u7684\u7535\u6e90\u4f9b\u5e94\u548c\u7f51\u7edc\u4e0a\u884c\u65b9\u6848\uff0c\u5e76\u4e14\u5404\u533a\u57df\u53ef\u4ee5\u5728\u5730\u7406\u4f4d\u7f6e\u4e0a\u76f8\u9694\u5f88\u8fdc(\u867d\u7136\u5e76\u975e\u5fc5\u987b\u76f8\u9694\u5f88\u8fdc)\u3002
|
||||
message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 \u662f\u4e00\u4e2a\u8f6f\u4ef6\u5e73\u53f0\uff0c\u53ef\u5c06\u8ba1\u7b97\u8d44\u6e90\u96c6\u4e2d\u5728\u4e00\u8d77\u4ee5\u6784\u5efa\u516c\u5171\u3001\u79c1\u6709\u548c\u6df7\u5408\u57fa\u7840\u8bbe\u65bd\u5373\u670d\u52a1(IaaS)\u4e91\u3002CloudStack&\#8482 \u8d1f\u8d23\u7ba1\u7406\u7ec4\u6210\u4e91\u57fa\u7840\u67b6\u6784\u7684\u7f51\u7edc\u3001\u5b58\u50a8\u548c\u8ba1\u7b97\u8282\u70b9\u3002\u4f7f\u7528 CloudStack&\#8482 \u53ef\u4ee5\u90e8\u7f72\u3001\u7ba1\u7406\u548c\u914d\u7f6e\u4e91\u8ba1\u7b97\u73af\u5883\u3002<br/><br/>CloudStack&\#8482 \u901a\u8fc7\u6269\u5c55\u5546\u7528\u786c\u4ef6\u4e0a\u8fd0\u884c\u7684\u6bcf\u4e2a\u865a\u62df\u673a\u6620\u50cf\u7684\u8303\u56f4\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b9e\u65f6\u53ef\u7528\u7684\u4e91\u57fa\u7840\u67b6\u6784\u8f6f\u4ef6\u5806\u6808\u7528\u4e8e\u4ee5\u670d\u52a1\u65b9\u5f0f\u4ea4\u4ed8\u865a\u62df\u6570\u636e\u4e2d\u5fc3\uff0c\u5373\u4ea4\u4ed8\u6784\u5efa\u3001\u90e8\u7f72\u548c\u7ba1\u7406\u591a\u5c42\u6b21\u548c\u591a\u79df\u6237\u4e91\u5e94\u7528\u7a0b\u5e8f\u5fc5\u9700\u7684\u6240\u6709\u7ec4\u4ef6\u3002\u5f00\u6e90\u7248\u672c\u548c Premium \u7248\u672c\u90fd\u5df2\u53ef\u7528\uff0c\u4e14\u63d0\u4f9b\u7684\u529f\u80fd\u51e0\u4e4e\u5b8c\u5168\u76f8\u540c\u3002
|
||||
message.installWizard.copy.whatIsPrimaryStorage=CloudStack&\#8482; \u4e91\u57fa\u7840\u67b6\u6784\u4f7f\u7528\u4ee5\u4e0b\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8: \u4e3b\u5b58\u50a8\u548c\u8f85\u52a9\u5b58\u50a8\u3002\u8fd9\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u53ef\u4ee5\u662f iSCSI \u6216 NFS \u670d\u52a1\u5668\uff0c\u4e5f\u53ef\u4ee5\u662f\u672c\u5730\u78c1\u76d8\u3002<br/><br/><strong>\u4e3b\u5b58\u50a8</strong>\u4e0e\u7fa4\u96c6\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u8be5\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709 VM \u5bf9\u5e94\u7684\u6bcf\u4e2a\u6765\u5bbe VM \u7684\u78c1\u76d8\u5377\u3002\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u901a\u5e38\u4f4d\u4e8e\u9760\u8fd1\u4e3b\u673a\u7684\u4f4d\u7f6e\u3002
|
||||
message.installWizard.copy.whatIsPrimaryStorage=CloudStack&\#8482; \u4e91\u57fa\u7840\u67b6\u6784\u4f7f\u7528\u4ee5\u4e0b\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\: \u4e3b\u5b58\u50a8\u548c\u8f85\u52a9\u5b58\u50a8\u3002\u8fd9\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u53ef\u4ee5\u662f iSCSI \u6216 NFS \u670d\u52a1\u5668\uff0c\u4e5f\u53ef\u4ee5\u662f\u672c\u5730\u78c1\u76d8\u3002<br/><br/><strong>\u4e3b\u5b58\u50a8</strong>\u4e0e\u7fa4\u96c6\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u8be5\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709 VM \u5bf9\u5e94\u7684\u6bcf\u4e2a\u6765\u5bbe VM \u7684\u78c1\u76d8\u5377\u3002\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u901a\u5e38\u4f4d\u4e8e\u9760\u8fd1\u4e3b\u673a\u7684\u4f4d\u7f6e\u3002
|
||||
message.installWizard.copy.whatIsSecondaryStorage=\u8f85\u52a9\u5b58\u50a8\u4e0e\u533a\u57df\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u4ee5\u4e0b\u9879\u76ee\:<ul><li>\u6a21\u677f - \u53ef\u7528\u4e8e\u542f\u52a8 VM \u5e76\u53ef\u4ee5\u5305\u542b\u5176\u4ed6\u914d\u7f6e\u4fe1\u606f(\u4f8b\u5982\uff0c\u5df2\u5b89\u88c5\u7684\u5e94\u7528\u7a0b\u5e8f)\u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf</li><li>ISO \u6620\u50cf - \u53ef\u91cd\u65b0\u542f\u52a8\u6216\u4e0d\u53ef\u91cd\u65b0\u542f\u52a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf</li><li>\u78c1\u76d8\u5377\u5feb\u7167 - \u5df2\u4fdd\u5b58\u7684 VM \u6570\u636e\u526f\u672c\uff0c\u53ef\u7528\u4e8e\u6267\u884c\u6570\u636e\u6062\u590d\u6216\u521b\u5efa\u65b0\u6a21\u677f</ul>
|
||||
message.installWizard.now.building=\u73b0\u5728\u6b63\u5728\u6784\u5efa\u60a8\u7684\u4e91...
|
||||
message.installWizard.tooltip.addCluster.name=\u7fa4\u96c6\u7684\u540d\u79f0\u3002\u6b64\u540d\u79f0\u53ef\u4ee5\u662f\u60a8\u9009\u62e9\u7684\u6587\u672c\uff0c\u4e14\u672a\u7531 CloudStack \u4f7f\u7528\u3002
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ assignVirtualMachine=7
|
|||
migrateVirtualMachine=1
|
||||
migrateVirtualMachineWithVolume=1
|
||||
recoverVirtualMachine=7
|
||||
expungeVirtualMachine=1
|
||||
expungeVirtualMachine=7
|
||||
|
||||
#### snapshot commands
|
||||
createSnapshot=15
|
||||
|
|
@ -246,6 +246,7 @@ deleteEvents=15
|
|||
listAlerts=3
|
||||
archiveAlerts=1
|
||||
deleteAlerts=1
|
||||
generateAlert=1
|
||||
|
||||
#### system capacity commands
|
||||
listCapacity=3
|
||||
|
|
@ -502,6 +503,11 @@ createVirtualRouterElement=7
|
|||
configureVirtualRouterElement=7
|
||||
listVirtualRouterElements=7
|
||||
|
||||
#### ovs commands
|
||||
createOvsElement=7
|
||||
configureOvsElement=7
|
||||
listOvsElements=7
|
||||
|
||||
#### usage commands
|
||||
generateUsageRecords=1
|
||||
listUsageRecords=7
|
||||
|
|
|
|||
|
|
@ -24,15 +24,17 @@ public class MigrateCommand extends Command {
|
|||
String hostGuid;
|
||||
boolean isWindows;
|
||||
VirtualMachineTO vmTO;
|
||||
boolean executeInSequence = false;
|
||||
|
||||
protected MigrateCommand() {
|
||||
}
|
||||
|
||||
public MigrateCommand(String vmName, String destIp, boolean isWindows, VirtualMachineTO vmTO) {
|
||||
public MigrateCommand(String vmName, String destIp, boolean isWindows, VirtualMachineTO vmTO, boolean executeInSequence) {
|
||||
this.vmName = vmName;
|
||||
this.destIp = destIp;
|
||||
this.isWindows = isWindows;
|
||||
this.vmTO = vmTO;
|
||||
this.executeInSequence = executeInSequence;
|
||||
}
|
||||
|
||||
public boolean isWindows() {
|
||||
|
|
@ -61,6 +63,6 @@ public class MigrateCommand extends Command {
|
|||
|
||||
@Override
|
||||
public boolean executeInSequence() {
|
||||
return true;
|
||||
return executeInSequence;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,35 +18,28 @@ package com.cloud.agent.api;
|
|||
|
||||
public class StopAnswer extends RebootAnswer {
|
||||
|
||||
private String hypervisortoolsversion;
|
||||
Integer timeOffset;
|
||||
private String platform;
|
||||
|
||||
protected StopAnswer() {
|
||||
}
|
||||
|
||||
public StopAnswer(StopCommand cmd, String details, String hypervisortoolsversion, Integer timeOffset, boolean success) {
|
||||
super(cmd, details, success);
|
||||
this.hypervisortoolsversion = hypervisortoolsversion;
|
||||
this.timeOffset = timeOffset;
|
||||
public StopAnswer(StopCommand cmd, String details, String platform, boolean success) {
|
||||
super(cmd, details, success);
|
||||
this.platform = platform;
|
||||
}
|
||||
|
||||
public StopAnswer(StopCommand cmd, String details, boolean success) {
|
||||
super(cmd, details, success);
|
||||
this.hypervisortoolsversion = null;
|
||||
this.timeOffset = null;
|
||||
super(cmd, details, success);
|
||||
this.platform = null;
|
||||
}
|
||||
|
||||
public StopAnswer(StopCommand cmd, Exception e) {
|
||||
super(cmd, e);
|
||||
this.hypervisortoolsversion = null;
|
||||
this.timeOffset = null;
|
||||
this.platform = null;
|
||||
}
|
||||
|
||||
public String getHypervisorToolsVersion() {
|
||||
return hypervisortoolsversion;
|
||||
public String getPlatform() {
|
||||
return platform;
|
||||
}
|
||||
|
||||
public Integer getTimeOffset() {
|
||||
return timeOffset;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ import com.cloud.utils.fsm.NoTransitionException;
|
|||
*/
|
||||
public interface VirtualMachineManager extends Manager {
|
||||
static final ConfigKey<Boolean> ExecuteInSequence = new ConfigKey<Boolean>("Advanced", Boolean.class, "execute.in.sequence.hypervisor.commands", "false",
|
||||
"If set to true, StartCommand, StopCommand, CopyCommand will be synchronized on the agent side."
|
||||
"If set to true, StartCommand, StopCommand, CopyCommand, MigrateCommand will be synchronized on the agent side."
|
||||
+ " If set to false, these commands become asynchronous. Default value is false.", true);
|
||||
|
||||
public interface Topics {
|
||||
|
|
@ -145,9 +145,9 @@ public interface VirtualMachineManager extends Manager {
|
|||
|
||||
/**
|
||||
* @param vmInstance
|
||||
* @param newServiceOfferingId
|
||||
* @param newServiceOffering
|
||||
*/
|
||||
void checkIfCanUpgrade(VirtualMachine vmInstance, long newServiceOfferingId);
|
||||
void checkIfCanUpgrade(VirtualMachine vmInstance, ServiceOffering newServiceOffering);
|
||||
|
||||
/**
|
||||
* @param vmId
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ import com.cloud.storage.Volume;
|
|||
import com.cloud.storage.Volume.Type;
|
||||
import com.cloud.template.VirtualMachineTemplate;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.uservm.UserVm;
|
||||
import com.cloud.utils.fsm.NoTransitionException;
|
||||
import com.cloud.vm.DiskProfile;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
|
|
@ -63,7 +64,7 @@ public interface VolumeOrchestrationService {
|
|||
|
||||
String getVmNameOnVolume(Volume volume);
|
||||
|
||||
VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot) throws StorageUnavailableException;
|
||||
VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, UserVm vm) throws StorageUnavailableException;
|
||||
|
||||
Volume migrateVolume(Volume volume, StoragePool destPool) throws StorageUnavailableException;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,43 +16,13 @@
|
|||
// under the License.
|
||||
package com.cloud.alert;
|
||||
|
||||
import org.apache.cloudstack.alert.AlertService;
|
||||
import org.apache.cloudstack.framework.config.ConfigKey;
|
||||
|
||||
import com.cloud.capacity.CapacityVO;
|
||||
import com.cloud.utils.component.Manager;
|
||||
|
||||
public interface AlertManager extends Manager {
|
||||
public static final short ALERT_TYPE_MEMORY = CapacityVO.CAPACITY_TYPE_MEMORY;
|
||||
public static final short ALERT_TYPE_CPU = CapacityVO.CAPACITY_TYPE_CPU;
|
||||
public static final short ALERT_TYPE_STORAGE = CapacityVO.CAPACITY_TYPE_STORAGE;
|
||||
public static final short ALERT_TYPE_STORAGE_ALLOCATED = CapacityVO.CAPACITY_TYPE_STORAGE_ALLOCATED;
|
||||
public static final short ALERT_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP;
|
||||
public static final short ALERT_TYPE_PRIVATE_IP = CapacityVO.CAPACITY_TYPE_PRIVATE_IP;
|
||||
public static final short ALERT_TYPE_SECONDARY_STORAGE = CapacityVO.CAPACITY_TYPE_SECONDARY_STORAGE;
|
||||
public static final short ALERT_TYPE_HOST = 7;
|
||||
public static final short ALERT_TYPE_USERVM = 8;
|
||||
public static final short ALERT_TYPE_DOMAIN_ROUTER = 9;
|
||||
public static final short ALERT_TYPE_CONSOLE_PROXY = 10;
|
||||
public static final short ALERT_TYPE_ROUTING = 11; // lost connection to default route (to the gateway)
|
||||
public static final short ALERT_TYPE_STORAGE_MISC = 12; // lost connection to default route (to the gateway)
|
||||
public static final short ALERT_TYPE_USAGE_SERVER = 13; // lost connection to default route (to the gateway)
|
||||
public static final short ALERT_TYPE_MANAGMENT_NODE = 14; // lost connection to default route (to the gateway)
|
||||
public static final short ALERT_TYPE_DOMAIN_ROUTER_MIGRATE = 15;
|
||||
public static final short ALERT_TYPE_CONSOLE_PROXY_MIGRATE = 16;
|
||||
public static final short ALERT_TYPE_USERVM_MIGRATE = 17;
|
||||
public static final short ALERT_TYPE_VLAN = 18;
|
||||
public static final short ALERT_TYPE_SSVM = 19;
|
||||
public static final short ALERT_TYPE_USAGE_SERVER_RESULT = 20; // Usage job result
|
||||
public static final short ALERT_TYPE_STORAGE_DELETE = 21;
|
||||
public static final short ALERT_TYPE_UPDATE_RESOURCE_COUNT = 22; // Generated when we fail to update the resource
|
||||
// count
|
||||
public static final short ALERT_TYPE_USAGE_SANITY_RESULT = 23;
|
||||
public static final short ALERT_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 24;
|
||||
public static final short ALERT_TYPE_LOCAL_STORAGE = 25;
|
||||
public static final short ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED = 26; // Generated when the resource limit exceeds the limit. Currently used for recurring snapshots only
|
||||
|
||||
public static final short ALERT_TYPE_SYNC = 27;
|
||||
|
||||
public interface AlertManager extends Manager, AlertService{
|
||||
|
||||
static final ConfigKey<Double> StorageCapacityThreshold = new ConfigKey<Double>(Double.class, "cluster.storage.capacity.notificationthreshold", "Alert", "0.75",
|
||||
"Percentage (as a value between 0 and 1) of storage utilization above which alerts will be sent about low storage available.", true, ConfigKey.Scope.Cluster,
|
||||
null);
|
||||
|
|
@ -65,9 +35,10 @@ public interface AlertManager extends Manager {
|
|||
"Alert", "0.75", "Percentage (as a value between 0 and 1) of allocated storage utilization above which alerts will be sent about low storage available.", true,
|
||||
ConfigKey.Scope.Cluster, null);
|
||||
|
||||
void clearAlert(short alertType, long dataCenterId, long podId);
|
||||
|
||||
void sendAlert(short alertType, long dataCenterId, Long podId, String subject, String body);
|
||||
void clearAlert(AlertType alertType, long dataCenterId, long podId);
|
||||
|
||||
void recalculateCapacity();
|
||||
|
||||
void sendAlert(AlertType alertType, long dataCenterId, Long podId, String subject, String body);
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,4 +82,13 @@ public interface CapacityManager {
|
|||
* @return true if the count of host's running VMs >= hypervisor limit
|
||||
*/
|
||||
boolean checkIfHostReachMaxGuestLimit(Host host);
|
||||
|
||||
/**
|
||||
* Check if specified host has capability to support cpu cores and speed freq
|
||||
* @param hostId the host to be checked
|
||||
* @param cpuNum cpu number to check
|
||||
* @param cpuSpeed cpu Speed to check
|
||||
* @return true if the count of host's running VMs >= hypervisor limit
|
||||
*/
|
||||
boolean checkIfHostHasCpuCapability(long hostId, Integer cpuNum, Integer cpuSpeed);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,11 +153,16 @@ public class UsageEventUtils {
|
|||
if (account == null)
|
||||
return;
|
||||
|
||||
// if an invalid zone is passed in, create event without zone UUID
|
||||
String zoneUuid = null;
|
||||
if (dc != null)
|
||||
zoneUuid = dc.getUuid();
|
||||
|
||||
Event event = new Event(Name, EventCategory.USAGE_EVENT.getName(), usageEventType, resourceType, resourceUUID);
|
||||
|
||||
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||
eventDescription.put("account", account.getUuid());
|
||||
eventDescription.put("zone", dc.getUuid());
|
||||
eventDescription.put("zone", zoneUuid);
|
||||
eventDescription.put("event", usageEventType);
|
||||
eventDescription.put("resource", resourceType);
|
||||
eventDescription.put("id", resourceUUID);
|
||||
|
|
|
|||
|
|
@ -20,11 +20,16 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xmlns:util="http://www.springframework.org/schema/util"
|
||||
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
|
||||
http://www.springframework.org/schema/aop
|
||||
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
|
||||
http://www.springframework.org/schema/context
|
||||
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
|
||||
http://www.springframework.org/schema/context/spring-context-3.0.xsd
|
||||
http://www.springframework.org/schema/util
|
||||
http://www.springframework.org/schema/util/spring-util-3.0.xsd"
|
||||
>
|
||||
|
||||
<bean id="clusterBasedAgentLoadBalancerPlanner"
|
||||
|
|
@ -68,5 +73,10 @@
|
|||
<bean id="virtualMachineEntityImpl" class="org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl" />
|
||||
|
||||
<bean id="virtualMachinePowerStateSyncImpl" class="com.cloud.vm.VirtualMachinePowerStateSyncImpl" />
|
||||
<bean id= "vmWorkJobDispatcher" class="com.cloud.vm.VmWorkJobDispatcher">
|
||||
<property name="name">
|
||||
<util:constant static-field="com.cloud.vm.VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER"/>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
|
|
|
|||
|
|
@ -818,7 +818,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
|
|||
HostPodVO podVO = _podDao.findById(host.getPodId());
|
||||
String hostDesc = "name: " + host.getName() + " (id:" + host.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName();
|
||||
if ((host.getType() != Host.Type.SecondaryStorage) && (host.getType() != Host.Type.ConsoleProxy)) {
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Host disconnected, " + hostDesc,
|
||||
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Host disconnected, " + hostDesc,
|
||||
"If the agent for host [" + hostDesc + "] is not restarted within " + AlertWait + " seconds, HA will begin on the VMs");
|
||||
}
|
||||
event = Status.Event.AgentDisconnected;
|
||||
|
|
@ -828,8 +828,8 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
|
|||
DataCenterVO dcVO = _dcDao.findById(host.getDataCenterId());
|
||||
HostPodVO podVO = _podDao.findById(host.getPodId());
|
||||
String hostDesc = "name: " + host.getName() + " (id:" + host.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName();
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Host in ALERT state, " + hostDesc,
|
||||
"In availability zone " + host.getDataCenterId() + ", host is in alert state: " + host.getId() + "-" + host.getName());
|
||||
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, host.getDataCenterId(), host.getPodId(), "Host in ALERT state, " + hostDesc, "In availability zone " + host.getDataCenterId()
|
||||
+ ", host is in alert state: " + host.getId() + "-" + host.getName());
|
||||
}
|
||||
} else {
|
||||
s_logger.debug("The next status of Agent " + host.getId() + " is not Alert, no need to investigate what happened");
|
||||
|
|
@ -1201,11 +1201,11 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
|
|||
String hostDesc =
|
||||
"name: " + host.getName() + " (id:" + host.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName();
|
||||
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_ROUTING, host.getDataCenterId(), host.getPodId(),
|
||||
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_ROUTING, host.getDataCenterId(), host.getPodId(),
|
||||
"Host lost connection to gateway, " + hostDesc, "Host [" + hostDesc +
|
||||
"] lost connection to gateway (default route) and is possibly having network connection issues.");
|
||||
} else {
|
||||
_alertMgr.clearAlert(AlertManager.ALERT_TYPE_ROUTING, host.getDataCenterId(), host.getPodId());
|
||||
_alertMgr.clearAlert(AlertManager.AlertType.ALERT_TYPE_ROUTING, host.getDataCenterId(), host.getPodId());
|
||||
}
|
||||
} else {
|
||||
s_logger.debug("Not processing " + PingRoutingCommand.class.getSimpleName() + " for agent id=" + cmdHostId +
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
|||
import com.cloud.utils.nio.Link;
|
||||
import com.cloud.utils.nio.Task;
|
||||
|
||||
@Local(value = {AgentManager.class, ClusteredAgentRebalanceService.class})
|
||||
@Local(value = { AgentManager.class, ClusteredAgentRebalanceService.class })
|
||||
public class ClusteredAgentManagerImpl extends AgentManagerImpl implements ClusterManagerListener, ClusteredAgentRebalanceService {
|
||||
final static Logger s_logger = Logger.getLogger(ClusteredAgentManagerImpl.class);
|
||||
private static final ScheduledExecutorService s_transferExecutor = Executors.newScheduledThreadPool(2, new NamedThreadFactory("Cluster-AgentRebalancingExecutor"));
|
||||
|
|
@ -108,7 +108,6 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
protected HashMap<String, SocketChannel> _peers;
|
||||
protected HashMap<String, SSLEngine> _sslEngines;
|
||||
private final Timer _timer = new Timer("ClusteredAgentManager Timer");
|
||||
private final Timer _agentLbTimer = new Timer("ClusteredAgentManager AgentRebalancing Timer");
|
||||
boolean _agentLbHappened = false;
|
||||
|
||||
@Inject
|
||||
|
|
@ -129,13 +128,13 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
}
|
||||
|
||||
protected final ConfigKey<Boolean> EnableLB = new ConfigKey<Boolean>(Boolean.class, "agent.lb.enabled", "Advanced", "false",
|
||||
"Enable agent load balancing between management server nodes", true);
|
||||
"Enable agent load balancing between management server nodes", true);
|
||||
protected final ConfigKey<Double> ConnectedAgentThreshold = new ConfigKey<Double>(Double.class, "agent.load.threshold", "Advanced", "0.7",
|
||||
"What percentage of the agents can be held by one management server before load balancing happens", true);
|
||||
"What percentage of the agents can be held by one management server before load balancing happens", true);
|
||||
protected final ConfigKey<Integer> LoadSize = new ConfigKey<Integer>(Integer.class, "direct.agent.load.size", "Advanced", "16",
|
||||
"How many agents to connect to in each round", true);
|
||||
"How many agents to connect to in each round", true);
|
||||
protected final ConfigKey<Integer> ScanInterval = new ConfigKey<Integer>(Integer.class, "direct.agent.scan.interval", "Advanced", "90",
|
||||
"Interval between scans to load agents", false, ConfigKey.Scope.Global, 1000);
|
||||
"Interval between scans to load agents", false, ConfigKey.Scope.Global, 1000);
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> xmlParams) throws ConfigurationException {
|
||||
|
|
@ -277,9 +276,9 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
|
||||
@Override
|
||||
protected AgentAttache createAttacheForDirectConnect(Host host, ServerResource resource) {
|
||||
// if (resource instanceof DummySecondaryStorageResource) {
|
||||
// return new DummyAttache(this, host.getId(), false);
|
||||
// }
|
||||
// if (resource instanceof DummySecondaryStorageResource) {
|
||||
// return new DummyAttache(this, host.getId(), false);
|
||||
// }
|
||||
s_logger.debug("create ClusteredDirectAgentAttache for " + host.getId());
|
||||
final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, host.getId(), host.getName(), _nodeId, resource, host.isInMaintenanceStates(), this);
|
||||
AgentAttache old = null;
|
||||
|
|
@ -329,23 +328,23 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
}
|
||||
AgentAttache attache = findAttache(hostId);
|
||||
if (attache != null) {
|
||||
//don't process disconnect if the host is being rebalanced
|
||||
// don't process disconnect if the host is being rebalanced
|
||||
if (isAgentRebalanceEnabled()) {
|
||||
HostTransferMapVO transferVO = _hostTransferDao.findById(hostId);
|
||||
if (transferVO != null) {
|
||||
if (transferVO.getFutureOwner() == _nodeId && transferVO.getState() == HostTransferState.TransferStarted) {
|
||||
s_logger.debug("Not processing " + Event.AgentDisconnected + " event for the host id=" + hostId + " as the host is being connected to " +
|
||||
_nodeId);
|
||||
_nodeId);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//don't process disconnect if the disconnect came for the host via delayed cluster notification,
|
||||
//but the host has already reconnected to the current management server
|
||||
// don't process disconnect if the disconnect came for the host via delayed cluster notification,
|
||||
// but the host has already reconnected to the current management server
|
||||
if (!attache.forForward()) {
|
||||
s_logger.debug("Not processing " + Event.AgentDisconnected + " event for the host id=" + hostId +
|
||||
" as the host is directly connected to the current management server " + _nodeId);
|
||||
" as the host is directly connected to the current management server " + _nodeId);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -376,7 +375,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
|
||||
public void notifyNodesInCluster(AgentAttache attache) {
|
||||
s_logger.debug("Notifying other nodes of to disconnect");
|
||||
Command[] cmds = new Command[] {new ChangeAgentCommand(attache.getId(), Event.AgentDisconnected)};
|
||||
Command[] cmds = new Command[] { new ChangeAgentCommand(attache.getId(), Event.AgentDisconnected) };
|
||||
_clusterMgr.broadcast(attache.getId(), _gson.toJson(cmds));
|
||||
}
|
||||
|
||||
|
|
@ -385,23 +384,23 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Notifying other MS nodes to run host scan task");
|
||||
}
|
||||
Command[] cmds = new Command[] {new ScheduleHostScanTaskCommand()};
|
||||
Command[] cmds = new Command[] { new ScheduleHostScanTaskCommand() };
|
||||
_clusterMgr.broadcast(0, _gson.toJson(cmds));
|
||||
}
|
||||
|
||||
protected static void logT(byte[] bytes, final String msg) {
|
||||
s_logger.trace("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": " +
|
||||
(Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
|
||||
(Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
|
||||
}
|
||||
|
||||
protected static void logD(byte[] bytes, final String msg) {
|
||||
s_logger.debug("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": " +
|
||||
(Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
|
||||
(Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
|
||||
}
|
||||
|
||||
protected static void logI(byte[] bytes, final String msg) {
|
||||
s_logger.info("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": " +
|
||||
(Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
|
||||
(Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
|
||||
}
|
||||
|
||||
public boolean routeToPeer(String peer, byte[] bytes) {
|
||||
|
|
@ -426,7 +425,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
if (s_logger.isDebugEnabled()) {
|
||||
logD(bytes, "Routing to peer");
|
||||
}
|
||||
Link.write(ch, new ByteBuffer[] {ByteBuffer.wrap(bytes)}, sslEngine);
|
||||
Link.write(ch, new ByteBuffer[] { ByteBuffer.wrap(bytes) }, sslEngine);
|
||||
return true;
|
||||
} catch (IOException e) {
|
||||
try {
|
||||
|
|
@ -568,9 +567,8 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
}
|
||||
}
|
||||
_timer.cancel();
|
||||
_agentLbTimer.cancel();
|
||||
|
||||
//cancel all transfer tasks
|
||||
// cancel all transfer tasks
|
||||
s_transferExecutor.shutdownNow();
|
||||
cleanupTransferMap(_nodeId);
|
||||
|
||||
|
|
@ -620,14 +618,15 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
}
|
||||
Request req = Request.parse(data);
|
||||
Command[] cmds = req.getCommands();
|
||||
CancelCommand cancel = (CancelCommand)cmds[0];
|
||||
CancelCommand cancel = (CancelCommand) cmds[0];
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
logD(data, "Cancel request received");
|
||||
}
|
||||
agent.cancel(cancel.getSequence());
|
||||
final Long current = agent._currentSequence;
|
||||
//if the request is the current request, always have to trigger sending next request in sequence,
|
||||
//otherwise the agent queue will be blocked
|
||||
// if the request is the current request, always have to trigger sending next request in
|
||||
// sequence,
|
||||
// otherwise the agent queue will be blocked
|
||||
if (req.executeInSequence() && (current != null && current == Request.getSequence(data))) {
|
||||
agent.sendNext(Request.getSequence(data));
|
||||
}
|
||||
|
|
@ -648,7 +647,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
return;
|
||||
} else {
|
||||
if (agent instanceof Routable) {
|
||||
Routable cluster = (Routable)agent;
|
||||
Routable cluster = (Routable) agent;
|
||||
cluster.routeToAgent(data);
|
||||
} else {
|
||||
agent.send(Request.parse(data));
|
||||
|
|
@ -665,7 +664,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
if (mgmtId != -1 && mgmtId != _nodeId) {
|
||||
routeToPeer(Long.toString(mgmtId), data);
|
||||
if (Request.requiresSequentialExecution(data)) {
|
||||
AgentAttache attache = (AgentAttache)link.attachment();
|
||||
AgentAttache attache = (AgentAttache) link.attachment();
|
||||
if (attache != null) {
|
||||
attache.sendNext(Request.getSequence(data));
|
||||
} else if (s_logger.isDebugEnabled()) {
|
||||
|
|
@ -727,7 +726,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
|
||||
@Override
|
||||
public boolean executeRebalanceRequest(long agentId, long currentOwnerId, long futureOwnerId, Event event) throws AgentUnavailableException,
|
||||
OperationTimedoutException {
|
||||
OperationTimedoutException {
|
||||
boolean result = false;
|
||||
if (event == Event.RequestAgentRebalance) {
|
||||
return setToWaitForRebalance(agentId, currentOwnerId, futureOwnerId);
|
||||
|
|
@ -794,7 +793,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
} else {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("There are no hosts to rebalance in the system. Current number of active management server nodes in the system is " + allMS.size() +
|
||||
"; number of managed agents is " + allManagedAgents.size());
|
||||
"; number of managed agents is " + allManagedAgents.size());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -849,7 +848,8 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Removing mapping from op_host_transfer as it failed to be set to transfer mode");
|
||||
}
|
||||
//just remove the mapping (if exists) as nothing was done on the peer management server yet
|
||||
// just remove the mapping (if exists) as nothing was done on the peer management
|
||||
// server yet
|
||||
_hostTransferDao.remove(transfer.getId());
|
||||
}
|
||||
}
|
||||
|
|
@ -934,7 +934,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
synchronized (_agentToTransferIds) {
|
||||
if (_agentToTransferIds.size() > 0) {
|
||||
s_logger.debug("Found " + _agentToTransferIds.size() + " agents to transfer");
|
||||
//for (Long hostId : _agentToTransferIds) {
|
||||
// for (Long hostId : _agentToTransferIds) {
|
||||
for (Iterator<Long> iterator = _agentToTransferIds.iterator(); iterator.hasNext();) {
|
||||
Long hostId = iterator.next();
|
||||
AgentAttache attache = findAttache(hostId);
|
||||
|
|
@ -947,7 +947,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
// no need to do anything with the real attache as we haven't modified it yet
|
||||
Date cutTime = DateUtil.currentGMTTime();
|
||||
HostTransferMapVO transferMap =
|
||||
_hostTransferDao.findActiveHostTransferMapByHostId(hostId, new Date(cutTime.getTime() - rebalanceTimeOut));
|
||||
_hostTransferDao.findActiveHostTransferMapByHostId(hostId, new Date(cutTime.getTime() - rebalanceTimeOut));
|
||||
|
||||
if (transferMap == null) {
|
||||
s_logger.debug("Timed out waiting for the host id=" + hostId + " to be ready to transfer, skipping rebalance for the host");
|
||||
|
|
@ -966,7 +966,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
ManagementServerHostVO ms = _mshostDao.findByMsid(transferMap.getFutureOwner());
|
||||
if (ms != null && ms.getState() != ManagementServerHost.State.Up) {
|
||||
s_logger.debug("Can't transfer host " + hostId + " as it's future owner is not in UP state: " + ms +
|
||||
", skipping rebalance for the host");
|
||||
", skipping rebalance for the host");
|
||||
iterator.remove();
|
||||
_hostTransferDao.completeAgentTransfer(hostId);
|
||||
continue;
|
||||
|
|
@ -983,7 +983,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
|
||||
} else {
|
||||
s_logger.debug("Agent " + hostId + " can't be transfered yet as its request queue size is " + attache.getQueueSize() +
|
||||
" and listener queue size is " + attache.getNonRecurringListenersSize());
|
||||
" and listener queue size is " + attache.getNonRecurringListenersSize());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -1050,7 +1050,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
if (result) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Loading directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId +
|
||||
" as a part of rebalance process");
|
||||
" as a part of rebalance process");
|
||||
}
|
||||
result = loadDirectlyConnectedHost(host, true);
|
||||
} else {
|
||||
|
|
@ -1059,16 +1059,16 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
|
||||
} catch (Exception ex) {
|
||||
s_logger.warn("Failed to load directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId +
|
||||
" as a part of rebalance process due to:", ex);
|
||||
" as a part of rebalance process due to:", ex);
|
||||
result = false;
|
||||
}
|
||||
|
||||
if (result) {
|
||||
s_logger.debug("Successfully loaded directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId +
|
||||
" as a part of rebalance process");
|
||||
" as a part of rebalance process");
|
||||
} else {
|
||||
s_logger.warn("Failed to load directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId +
|
||||
" as a part of rebalance process");
|
||||
" as a part of rebalance process");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1089,18 +1089,18 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
return;
|
||||
}
|
||||
|
||||
ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache)attache;
|
||||
ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache) attache;
|
||||
|
||||
if (success) {
|
||||
|
||||
//1) Set transfer mode to false - so the agent can start processing requests normally
|
||||
// 1) Set transfer mode to false - so the agent can start processing requests normally
|
||||
forwardAttache.setTransferMode(false);
|
||||
|
||||
//2) Get all transfer requests and route them to peer
|
||||
// 2) Get all transfer requests and route them to peer
|
||||
Request requestToTransfer = forwardAttache.getRequestToTransfer();
|
||||
while (requestToTransfer != null) {
|
||||
s_logger.debug("Forwarding request " + requestToTransfer.getSequence() + " held in transfer attache " + hostId + " from the management server " +
|
||||
_nodeId + " to " + futureOwnerId);
|
||||
_nodeId + " to " + futureOwnerId);
|
||||
boolean routeResult = routeToPeer(Long.toString(futureOwnerId), requestToTransfer.getBytes());
|
||||
if (!routeResult) {
|
||||
logD(requestToTransfer.getBytes(), "Failed to route request to peer");
|
||||
|
|
@ -1138,10 +1138,10 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
}
|
||||
|
||||
synchronized (_agents) {
|
||||
ClusteredDirectAgentAttache attache = (ClusteredDirectAgentAttache)_agents.get(hostId);
|
||||
ClusteredDirectAgentAttache attache = (ClusteredDirectAgentAttache) _agents.get(hostId);
|
||||
if (attache != null && attache.getQueueSize() == 0 && attache.getNonRecurringListenersSize() == 0) {
|
||||
handleDisconnectWithoutInvestigation(attache, Event.StartAgentRebalance, true, true);
|
||||
ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache)createAttache(hostId);
|
||||
ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache) createAttache(hostId);
|
||||
if (forwardAttache == null) {
|
||||
s_logger.warn("Unable to create a forward attache for the host " + hostId + " as a part of rebalance process");
|
||||
return false;
|
||||
|
|
@ -1154,7 +1154,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
s_logger.warn("Attache for the agent " + hostId + " no longer exists on management server " + _nodeId + ", can't start host rebalancing");
|
||||
} else {
|
||||
s_logger.warn("Attache for the agent " + hostId + " has request queue size= " + attache.getQueueSize() + " and listener queue size " +
|
||||
attache.getNonRecurringListenersSize() + ", can't start host rebalancing");
|
||||
attache.getNonRecurringListenersSize() + ", can't start host rebalancing");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1211,7 +1211,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
// Scheduling host scan task in peer MS is a best effort operation during host add, regular host scan
|
||||
// happens at fixed intervals anyways. So handling any exceptions that may be thrown
|
||||
s_logger.warn("Exception happened while trying to schedule host scan task on mgmt server " + _clusterMgr.getSelfPeerName() +
|
||||
", ignoring as regular host scan happens at fixed interval anyways", e);
|
||||
", ignoring as regular host scan happens at fixed interval anyways", e);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
@ -1249,8 +1249,8 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
s_logger.error("Excection in gson decoding : ", e);
|
||||
}
|
||||
|
||||
if (cmds.length == 1 && cmds[0] instanceof ChangeAgentCommand) { //intercepted
|
||||
ChangeAgentCommand cmd = (ChangeAgentCommand)cmds[0];
|
||||
if (cmds.length == 1 && cmds[0] instanceof ChangeAgentCommand) { // intercepted
|
||||
ChangeAgentCommand cmd = (ChangeAgentCommand) cmds[0];
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Intercepting command for agent change: agent " + cmd.getAgentId() + " event: " + cmd.getEvent());
|
||||
|
|
@ -1271,7 +1271,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
answers[0] = new ChangeAgentAnswer(cmd, result);
|
||||
return _gson.toJson(answers);
|
||||
} else if (cmds.length == 1 && cmds[0] instanceof TransferAgentCommand) {
|
||||
TransferAgentCommand cmd = (TransferAgentCommand)cmds[0];
|
||||
TransferAgentCommand cmd = (TransferAgentCommand) cmds[0];
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Intercepting command for agent rebalancing: agent " + cmd.getAgentId() + " event: " + cmd.getEvent());
|
||||
|
|
@ -1294,7 +1294,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
answers[0] = new Answer(cmd, result, null);
|
||||
return _gson.toJson(answers);
|
||||
} else if (cmds.length == 1 && cmds[0] instanceof PropagateResourceEventCommand) {
|
||||
PropagateResourceEventCommand cmd = (PropagateResourceEventCommand)cmds[0];
|
||||
PropagateResourceEventCommand cmd = (PropagateResourceEventCommand) cmds[0];
|
||||
|
||||
s_logger.debug("Intercepting command to propagate event " + cmd.getEvent().name() + " for host " + cmd.getHostId());
|
||||
|
||||
|
|
@ -1311,7 +1311,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
answers[0] = new Answer(cmd, result, null);
|
||||
return _gson.toJson(answers);
|
||||
} else if (cmds.length == 1 && cmds[0] instanceof ScheduleHostScanTaskCommand) {
|
||||
ScheduleHostScanTaskCommand cmd = (ScheduleHostScanTaskCommand)cmds[0];
|
||||
ScheduleHostScanTaskCommand cmd = (ScheduleHostScanTaskCommand) cmds[0];
|
||||
String response = handleScheduleHostScanTaskCommand(cmd);
|
||||
return response;
|
||||
}
|
||||
|
|
@ -1328,14 +1328,14 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Completed dispatching -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage() + " in " +
|
||||
(System.currentTimeMillis() - startTick) + " ms, return result: " + jsonReturn);
|
||||
(System.currentTimeMillis() - startTick) + " ms, return result: " + jsonReturn);
|
||||
}
|
||||
|
||||
return jsonReturn;
|
||||
} else {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Completed dispatching -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage() + " in " +
|
||||
(System.currentTimeMillis() - startTick) + " ms, return null result");
|
||||
(System.currentTimeMillis() - startTick) + " ms, return null result");
|
||||
}
|
||||
}
|
||||
} catch (AgentUnavailableException e) {
|
||||
|
|
@ -1369,7 +1369,8 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
if (s_logger.isTraceEnabled()) {
|
||||
s_logger.trace("Agent rebalance task check, management server id:" + _nodeId);
|
||||
}
|
||||
//initiate agent lb task will be scheduled and executed only once, and only when number of agents loaded exceeds _connectedAgentsThreshold
|
||||
// initiate agent lb task will be scheduled and executed only once, and only when number of agents
|
||||
// loaded exceeds _connectedAgentsThreshold
|
||||
if (!_agentLbHappened) {
|
||||
QueryBuilder<HostVO> sc = QueryBuilder.create(HostVO.class);
|
||||
sc.and(sc.entity().getManagementServerId(), Op.NNULL);
|
||||
|
|
@ -1385,12 +1386,12 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
|
|||
double load = managedHostsCount / allHostsCount;
|
||||
if (load >= ConnectedAgentThreshold.value()) {
|
||||
s_logger.debug("Scheduling agent rebalancing task as the average agent load " + load + " is more than the threshold " +
|
||||
ConnectedAgentThreshold.value());
|
||||
ConnectedAgentThreshold.value());
|
||||
scheduleRebalanceAgents();
|
||||
_agentLbHappened = true;
|
||||
} else {
|
||||
s_logger.debug("Not scheduling agent rebalancing task as the averages load " + load + " is less than the threshold " +
|
||||
ConnectedAgentThreshold.value());
|
||||
ConnectedAgentThreshold.value());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -146,6 +146,7 @@ public class VMEntityManagerImpl implements VMEntityManager {
|
|||
//FIXME: profile should work on VirtualMachineEntity
|
||||
VMInstanceVO vm = _vmDao.findByUuid(vmEntityVO.getUuid());
|
||||
VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm);
|
||||
vmProfile.setServiceOffering(_serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()));
|
||||
DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterId(), vm.getPodIdToDeployIn(), null, null, null, null);
|
||||
if (planToDeploy != null && planToDeploy.getDataCenterId() != 0) {
|
||||
plan =
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ import org.apache.cloudstack.framework.config.Configurable;
|
|||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
|
||||
import org.apache.cloudstack.region.PortableIpDao;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.Listener;
|
||||
|
|
@ -147,6 +148,7 @@ import com.cloud.network.rules.StaticNatRule;
|
|||
import com.cloud.network.rules.StaticNatRuleImpl;
|
||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||
import com.cloud.network.vpc.NetworkACLManager;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpc.dao.PrivateIpDao;
|
||||
import com.cloud.network.vpn.RemoteAccessVpnService;
|
||||
|
|
@ -1031,22 +1033,22 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
|||
(network.getGuestType() == Network.GuestType.Isolated || (network.getGuestType() == Network.GuestType.Shared && zone.getNetworkType() == NetworkType.Advanced))) {
|
||||
|
||||
List<IPAddressVO> ips = null;
|
||||
Account owner = _entityMgr.findById(Account.class, network.getAccountId());
|
||||
if (network.getVpcId() != null) {
|
||||
ips = _ipAddressDao.listByAssociatedVpc(network.getVpcId(), true);
|
||||
if (ips.isEmpty()) {
|
||||
throw new CloudRuntimeException("Vpc is not implemented; there is no source nat ip");
|
||||
Vpc vpc = _vpcMgr.getActiveVpc(network.getVpcId());
|
||||
s_logger.debug("Creating a source nat ip for vpc " + vpc);
|
||||
_vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
|
||||
}
|
||||
} else {
|
||||
ips = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
|
||||
}
|
||||
|
||||
if (ips.isEmpty()) {
|
||||
s_logger.debug("Creating a source nat ip for network " + network);
|
||||
Account owner = _entityMgr.findById(Account.class, network.getAccountId());
|
||||
_ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
|
||||
if (ips.isEmpty()) {
|
||||
s_logger.debug("Creating a source nat ip for network " + network);
|
||||
_ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, network);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// get providers to implement
|
||||
List<Provider> providersToImplement = getNetworkProviders(network.getId());
|
||||
for (NetworkElement element : _networkElements) {
|
||||
|
|
@ -2839,7 +2841,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
|
|||
if (!answer.getResult()) {
|
||||
s_logger.warn("Unable to setup agent " + hostId + " due to " + ((answer != null) ? answer.getDetails() : "return null"));
|
||||
String msg = "Incorrect Network setup on agent, Reinitialize agent after network names are setup, details : " + answer.getDetails();
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, host.getPodId(), msg, msg);
|
||||
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, dcId, host.getPodId(), msg, msg);
|
||||
throw new ConnectionException(true, msg);
|
||||
} else {
|
||||
if (answer.needReconnect()) {
|
||||
|
|
|
|||
|
|
@ -253,7 +253,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
|
||||
@DB
|
||||
@Override
|
||||
public VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot) throws StorageUnavailableException {
|
||||
public VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, UserVm vm)
|
||||
throws StorageUnavailableException {
|
||||
Account account = _entityMgr.findById(Account.class, volume.getAccountId());
|
||||
|
||||
final HashSet<StoragePool> poolsToAvoid = new HashSet<StoragePool>();
|
||||
|
|
@ -266,17 +267,62 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
DataCenter dc = _entityMgr.findById(DataCenter.class, volume.getDataCenterId());
|
||||
DiskProfile dskCh = new DiskProfile(volume, diskOffering, snapshot.getHypervisorType());
|
||||
|
||||
// Determine what pod to store the volume in
|
||||
while ((pod = findPod(null, null, dc, account.getId(), podsToAvoid)) != null) {
|
||||
podsToAvoid.add(pod.first().getId());
|
||||
String msg = "There are no available storage pools to store the volume in";
|
||||
|
||||
if(vm != null){
|
||||
Pod podofVM = _entityMgr.findById(Pod.class, vm.getPodIdToDeployIn());
|
||||
if(podofVM != null){
|
||||
pod = new Pair<Pod, Long>(podofVM, podofVM.getId());
|
||||
}
|
||||
}
|
||||
|
||||
if(vm != null && pod != null){
|
||||
//if VM is running use the hostId to find the clusterID. If it is stopped, refer the cluster where the ROOT volume of the VM exists.
|
||||
Long hostId = null;
|
||||
Long clusterId = null;
|
||||
if(vm.getState() == State.Running){
|
||||
hostId = vm.getHostId();
|
||||
if(hostId != null){
|
||||
Host vmHost = _entityMgr.findById(Host.class, hostId);
|
||||
clusterId = vmHost.getClusterId();
|
||||
}
|
||||
}else{
|
||||
List<VolumeVO> rootVolumesOfVm = _volsDao.findByInstanceAndType(vm.getId(), Volume.Type.ROOT);
|
||||
if (rootVolumesOfVm.size() != 1) {
|
||||
throw new CloudRuntimeException("The VM " + vm.getHostName() + " has more than one ROOT volume and is in an invalid state. Please contact Cloud Support.");
|
||||
} else {
|
||||
VolumeVO rootVolumeOfVm = rootVolumesOfVm.get(0);
|
||||
StoragePoolVO rootDiskPool = _storagePoolDao.findById(rootVolumeOfVm.getPoolId());
|
||||
clusterId = (rootDiskPool == null ? null : rootDiskPool.getClusterId());
|
||||
}
|
||||
}
|
||||
// Determine what storage pool to store the volume in
|
||||
while ((pool = findStoragePool(dskCh, dc, pod.first(), null, null, null, poolsToAvoid)) != null) {
|
||||
while ((pool = findStoragePool(dskCh, dc, pod.first(), clusterId, hostId, vm, poolsToAvoid)) != null) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (pool == null) {
|
||||
//pool could not be found in the VM's pod/cluster.
|
||||
if(s_logger.isDebugEnabled()){
|
||||
s_logger.debug("Could not find any storage pool to create Volume in the pod/cluster of the provided VM "+vm.getUuid());
|
||||
}
|
||||
StringBuilder addDetails = new StringBuilder(msg);
|
||||
addDetails.append(", Could not find any storage pool to create Volume in the pod/cluster of the VM ");
|
||||
addDetails.append(vm.getUuid());
|
||||
msg = addDetails.toString();
|
||||
}
|
||||
}else{
|
||||
// Determine what pod to store the volume in
|
||||
while ((pod = findPod(null, null, dc, account.getId(), podsToAvoid)) != null) {
|
||||
podsToAvoid.add(pod.first().getId());
|
||||
// Determine what storage pool to store the volume in
|
||||
while ((pool = findStoragePool(dskCh, dc, pod.first(), null, null, null, poolsToAvoid)) != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pool == null) {
|
||||
String msg = "There are no available storage pools to store the volume in";
|
||||
s_logger.info(msg);
|
||||
throw new StorageUnavailableException(msg, -1);
|
||||
}
|
||||
|
|
@ -524,10 +570,17 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
vol = _volsDao.persist(vol);
|
||||
|
||||
// Save usage event and update resource count for user vm volumes
|
||||
if (vm instanceof UserVm) {
|
||||
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offering.getId(),
|
||||
null, size, Volume.class.getName(), vol.getUuid());
|
||||
if (vm.getType() == VirtualMachine.Type.User) {
|
||||
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE,
|
||||
vol.getAccountId(),
|
||||
vol.getDataCenterId(),
|
||||
vol.getId(),
|
||||
vol.getName(),
|
||||
offering.getId(),
|
||||
null,
|
||||
size,
|
||||
Volume.class.getName(),
|
||||
vol.getUuid());
|
||||
|
||||
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
|
||||
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.primary_storage, new Long(vol.getSize()));
|
||||
|
|
@ -564,7 +617,7 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
|
|||
vol = _volsDao.persist(vol);
|
||||
|
||||
// Create event and update resource count for volumes if vm is a user vm
|
||||
if (vm instanceof UserVm) {
|
||||
if (vm.getType() == VirtualMachine.Type.User) {
|
||||
|
||||
Long offeringId = null;
|
||||
|
||||
|
|
|
|||
|
|
@ -209,8 +209,7 @@
|
|||
<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" />
|
||||
<bean id="ovsTunnelInterfaceDaoImpl" class="com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl" />
|
||||
<bean id="ovsTunnelNetworkDaoImpl" class="com.cloud.network.ovs.dao.OvsTunnelNetworkDaoImpl" />
|
||||
<bean id="ovsProviderDaoImpl" class="com.cloud.network.dao.OvsProviderDaoImpl" />
|
||||
<bean id="physicalNetworkDaoImpl" class="com.cloud.network.dao.PhysicalNetworkDaoImpl" />
|
||||
<bean id="physicalNetworkIsolationMethodDaoImpl" class="com.cloud.network.dao.PhysicalNetworkIsolationMethodDaoImpl" />
|
||||
<bean id="physicalNetworkServiceProviderDaoImpl" class="com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl" />
|
||||
|
|
@ -323,7 +322,11 @@
|
|||
<bean id="FirewallRuleDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.FirewallRuleDetailsDaoImpl" />
|
||||
<bean id="UserIpAddressDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.UserIpAddressDetailsDaoImpl" />
|
||||
<bean id="RemoteAccessVpnDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.RemoteAccessVpnDetailsDaoImpl" />
|
||||
|
||||
<bean id="VpcDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.VpcDetailsDaoImpl" />
|
||||
<bean id="VpcGatewayDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.VpcGatewayDetailsDaoImpl" />
|
||||
<bean id="NetworkACLListDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.NetworkACLListDetailsDaoImpl" />
|
||||
<bean id="NetworkACLItemDetailsDaoImpl" class="org.apache.cloudstack.resourcedetail.dao.NetworkACLItemDetailsDaoImpl" />
|
||||
|
||||
<bean id="databaseIntegrityChecker" class="com.cloud.upgrade.DatabaseIntegrityChecker" />
|
||||
|
||||
</beans>
|
||||
|
|
|
|||
|
|
@ -72,16 +72,14 @@ public class AlertVO implements Alert {
|
|||
|
||||
@Column(name = "archived")
|
||||
private boolean archived;
|
||||
|
||||
@Column(name="name")
|
||||
private String name;
|
||||
|
||||
public AlertVO() {
|
||||
this.uuid = UUID.randomUUID().toString();
|
||||
}
|
||||
|
||||
public AlertVO(Long id) {
|
||||
this.id = id;
|
||||
this.uuid = UUID.randomUUID().toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
|
|
@ -184,4 +182,14 @@ public class AlertVO implements Alert {
|
|||
public void setArchived(Boolean archived) {
|
||||
this.archived = archived;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,10 @@ import com.cloud.utils.db.GenericDao;
|
|||
@Entity
|
||||
@Table(name = "usage_event")
|
||||
public class UsageEventVO implements UsageEvent {
|
||||
public enum DynamicParameters {
|
||||
cpuSpeed, cpuNumber, memory
|
||||
};
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
|
|
|
|||
|
|
@ -16,12 +16,17 @@
|
|||
// under the License.
|
||||
package com.cloud.event.dao;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
|
|
@ -36,6 +41,8 @@ import com.cloud.utils.db.TransactionLegacy;
|
|||
public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO, Long> implements UsageEventDetailsDao {
|
||||
public static final Logger s_logger = Logger.getLogger(UsageEventDetailsDaoImpl.class.getName());
|
||||
|
||||
private static final String EVENT_DETAILS_QUERY = "SELECT details.id, details.usage_event_id, details.name, details.value FROM `cloud`.`usage_event_details` details WHERE details.usage_event_id = ?";
|
||||
|
||||
protected final SearchBuilder<UsageEventDetailsVO> EventDetailsSearch;
|
||||
protected final SearchBuilder<UsageEventDetailsVO> DetailSearch;
|
||||
|
||||
|
|
@ -74,13 +81,38 @@ public class UsageEventDetailsDaoImpl extends GenericDaoBase<UsageEventDetailsVO
|
|||
|
||||
@Override
|
||||
public Map<String, String> findDetails(long eventId) {
|
||||
SearchCriteria<UsageEventDetailsVO> sc = EventDetailsSearch.create();
|
||||
sc.setParameters("eventId", eventId);
|
||||
Connection conn = null;
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet resultSet = null;
|
||||
Map<String, String> details = new HashMap<String, String>();
|
||||
try {
|
||||
conn = TransactionLegacy.getStandaloneConnection();
|
||||
|
||||
List<UsageEventDetailsVO> results = search(sc, null);
|
||||
Map<String, String> details = new HashMap<String, String>(results.size());
|
||||
for (UsageEventDetailsVO result : results) {
|
||||
details.put(result.getKey(), result.getValue());
|
||||
pstmt = conn.prepareStatement(EVENT_DETAILS_QUERY);
|
||||
pstmt.setLong(1, eventId);
|
||||
resultSet = pstmt.executeQuery();
|
||||
|
||||
while (resultSet.next()) {
|
||||
details.put(resultSet.getString(3), resultSet.getString(4));
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
throw new CloudRuntimeException("Error while executing SQL prepared statement", e);
|
||||
} catch (Throwable e) {
|
||||
throw new CloudRuntimeException("Caught: " + e);
|
||||
} finally {
|
||||
if (pstmt != null) {
|
||||
try {
|
||||
pstmt.close();
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
}
|
||||
if (conn != null) {
|
||||
try {
|
||||
conn.close();
|
||||
} catch (SQLException e) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return details;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
package com.cloud.network.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.cloud.network.element.OvsProviderVO;
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
public interface OvsProviderDao extends GenericDao<OvsProviderVO, Long> {
|
||||
public OvsProviderVO findByNspId(long nspId);
|
||||
|
||||
public List<OvsProviderVO> listByEnabled(boolean enabled);
|
||||
|
||||
public OvsProviderVO findByIdAndEnabled(long id, boolean enabled);
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
package com.cloud.network.dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.network.element.OvsProviderVO;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.db.GenericDaoBase;
|
||||
import com.cloud.utils.db.SearchBuilder;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
|
||||
@Component
|
||||
@Local(value = OvsProviderDao.class)
|
||||
@DB()
|
||||
public class OvsProviderDaoImpl extends GenericDaoBase<OvsProviderVO, Long>
|
||||
implements OvsProviderDao {
|
||||
final SearchBuilder<OvsProviderVO> AllFieldsSearch;
|
||||
|
||||
public OvsProviderDaoImpl() {
|
||||
super();
|
||||
AllFieldsSearch = createSearchBuilder();
|
||||
AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(),
|
||||
SearchCriteria.Op.EQ);
|
||||
AllFieldsSearch.and("nsp_id", AllFieldsSearch.entity().getNspId(),
|
||||
SearchCriteria.Op.EQ);
|
||||
AllFieldsSearch.and("uuid", AllFieldsSearch.entity().getUuid(),
|
||||
SearchCriteria.Op.EQ);
|
||||
AllFieldsSearch.and("enabled", AllFieldsSearch.entity().isEnabled(),
|
||||
SearchCriteria.Op.EQ);
|
||||
AllFieldsSearch.done();
|
||||
}
|
||||
|
||||
@Override
|
||||
public OvsProviderVO findByNspId(long nspId) {
|
||||
SearchCriteria<OvsProviderVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("nsp_id", nspId);
|
||||
return findOneBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OvsProviderVO> listByEnabled(boolean enabled) {
|
||||
SearchCriteria<OvsProviderVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("enabled", enabled);
|
||||
return listBy(sc);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OvsProviderVO findByIdAndEnabled(long id, boolean enabled) {
|
||||
SearchCriteria<OvsProviderVO> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("id", id);
|
||||
sc.setParameters("enabled", enabled);
|
||||
return findOneBy(sc);
|
||||
}
|
||||
}
|
||||
|
|
@ -33,7 +33,7 @@ public class SslCertDaoImpl extends GenericDaoBase<SslCertVO, Long> implements S
|
|||
listByAccountId = createSearchBuilder();
|
||||
listByAccountId.and("accountId", listByAccountId.entity().getAccountId(), SearchCriteria.Op.EQ);
|
||||
listByAccountId.done();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SslCertVO> listByAccountId(Long accountId) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,83 @@
|
|||
package com.cloud.network.element;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
|
||||
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 com.cloud.network.OvsProvider;
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
@Entity
|
||||
@Table(name = ("ovs_providers"))
|
||||
public class OvsProviderVO implements OvsProvider {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
long id;
|
||||
|
||||
@Column(name = "nsp_id")
|
||||
private long nspId;
|
||||
|
||||
@Column(name = "uuid")
|
||||
private String uuid;
|
||||
|
||||
@Column(name = "enabled")
|
||||
private boolean enabled;
|
||||
|
||||
@Column(name = GenericDao.REMOVED_COLUMN)
|
||||
Date removed;
|
||||
|
||||
public OvsProviderVO() {
|
||||
this.uuid = UUID.randomUUID().toString();
|
||||
}
|
||||
|
||||
public OvsProviderVO(long nspId) {
|
||||
this.nspId = nspId;
|
||||
this.uuid = UUID.randomUUID().toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getNspId() {
|
||||
return nspId;
|
||||
}
|
||||
|
||||
public String getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Date getRemoved() {
|
||||
return removed;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return this.enabled;
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setNspId(long nspId) {
|
||||
this.nspId = nspId;
|
||||
}
|
||||
|
||||
public void setUuid(String uuid) {
|
||||
this.uuid = uuid;
|
||||
}
|
||||
}
|
||||
|
|
@ -34,10 +34,6 @@ import com.cloud.vm.VirtualMachine;
|
|||
@DiscriminatorValue(value = "Service")
|
||||
@PrimaryKeyJoinColumn(name = "id")
|
||||
public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering {
|
||||
public enum DynamicParameters {
|
||||
cpuSpeed, cpuNumber, memory
|
||||
};
|
||||
|
||||
@Column(name = "cpu")
|
||||
private Integer cpu;
|
||||
|
||||
|
|
@ -83,6 +79,11 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering
|
|||
@Transient
|
||||
Map<String, String> details;
|
||||
|
||||
// This flag is required to tell if the offering is dynamic once the cpu, memory and speed are set.
|
||||
// In some cases cpu, memory and speed are set to non-null values even if the offering is dynamic.
|
||||
@Transient
|
||||
boolean isDynamic;
|
||||
|
||||
protected ServiceOfferingVO() {
|
||||
super();
|
||||
}
|
||||
|
|
@ -162,6 +163,20 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering
|
|||
this.deploymentPlanner = deploymentPlanner;
|
||||
}
|
||||
|
||||
public ServiceOfferingVO(ServiceOfferingVO offering) {
|
||||
super(offering.getId(), offering.getName(), offering.getDisplayText(), false, offering.getTags(), offering.isRecreatable(), offering.getUseLocalStorage(), offering.getSystemUse(), true, offering.getDomainId());
|
||||
this.cpu = offering.getCpu();
|
||||
this.ramSize = offering.getRamSize();
|
||||
this.speed = offering.getSpeed();
|
||||
this.rateMbps = offering.getRateMbps();
|
||||
this.multicastRateMbps = offering.getMulticastRateMbps();
|
||||
this.offerHA = offering.getOfferHA();
|
||||
this.limitCpuUse = offering.getLimitCpuUse();
|
||||
this.volatileVm = offering.getVolatileVm();
|
||||
this.hostTag = offering.getHostTag();
|
||||
this.vm_type = offering.getSystemVmType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getOfferHA() {
|
||||
return offerHA;
|
||||
|
|
@ -297,7 +312,10 @@ public class ServiceOfferingVO extends DiskOfferingVO implements ServiceOffering
|
|||
|
||||
@Override
|
||||
public boolean isDynamic() {
|
||||
return cpu == null || speed == null || ramSize == null;
|
||||
return cpu == null || speed == null || ramSize == null || isDynamic;
|
||||
}
|
||||
|
||||
public void setDynamicFlag(boolean isdynamic) {
|
||||
this.isDynamic = isdynamic;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
package com.cloud.service.dao;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
|
@ -47,5 +48,5 @@ public interface ServiceOfferingDao extends GenericDao<ServiceOfferingVO, Long>
|
|||
|
||||
boolean isDynamic(long serviceOfferingId);
|
||||
|
||||
ServiceOfferingVO getcomputeOffering(long serviceOfferingId, Integer cpuCores, Integer cpuSpeed, Integer memory);
|
||||
ServiceOfferingVO getcomputeOffering(ServiceOfferingVO serviceOffering, Map<String, String> customParameters);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import javax.ejb.Local;
|
|||
import javax.inject.Inject;
|
||||
import javax.persistence.EntityExistsException;
|
||||
|
||||
import com.cloud.event.UsageEventVO;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
|
|
@ -191,14 +192,12 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase<ServiceOfferingVO, Lo
|
|||
public ServiceOfferingVO findById(Long vmId, long serviceOfferingId) {
|
||||
ServiceOfferingVO offering = super.findById(serviceOfferingId);
|
||||
if (offering.isDynamic()) {
|
||||
offering.setDynamicFlag(true);
|
||||
if (vmId == null) {
|
||||
throw new CloudRuntimeException("missing argument vmId");
|
||||
}
|
||||
Map<String, String> dynamicOffering = userVmDetailsDao.listDetailsKeyPairs(vmId);
|
||||
offering.setCpu(Integer.parseInt(dynamicOffering.get(ServiceOfferingVO.DynamicParameters.cpuNumber.name())));
|
||||
offering.setSpeed(Integer.parseInt(dynamicOffering.get(ServiceOfferingVO.DynamicParameters.cpuSpeed.name())));
|
||||
offering.setRamSize(Integer.parseInt(dynamicOffering.get(ServiceOfferingVO.DynamicParameters.memory.name())));
|
||||
return offering;
|
||||
return getcomputeOffering(offering, dynamicOffering);
|
||||
}
|
||||
return offering;
|
||||
}
|
||||
|
|
@ -207,15 +206,12 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase<ServiceOfferingVO, Lo
|
|||
public ServiceOfferingVO findByIdIncludingRemoved(Long vmId, long serviceOfferingId) {
|
||||
ServiceOfferingVO offering = super.findByIdIncludingRemoved(serviceOfferingId);
|
||||
if (offering.isDynamic()) {
|
||||
offering.setDynamicFlag(true);
|
||||
if (vmId == null) {
|
||||
throw new CloudRuntimeException("missing argument vmId");
|
||||
}
|
||||
Map<String, String> dynamicOffering = userVmDetailsDao.listDetailsKeyPairs(vmId);
|
||||
offering.setCpu(Integer.parseInt(dynamicOffering.get(ServiceOfferingVO.DynamicParameters.cpuNumber.name())));
|
||||
offering.setSpeed(Integer.parseInt(dynamicOffering.get(ServiceOfferingVO.DynamicParameters.cpuSpeed.name())));
|
||||
offering.setRamSize(Integer.parseInt(dynamicOffering.get(ServiceOfferingVO.DynamicParameters.memory.name())));
|
||||
return offering;
|
||||
|
||||
return getcomputeOffering(offering, dynamicOffering);
|
||||
}
|
||||
return offering;
|
||||
}
|
||||
|
|
@ -227,11 +223,19 @@ public class ServiceOfferingDaoImpl extends GenericDaoBase<ServiceOfferingVO, Lo
|
|||
}
|
||||
|
||||
@Override
|
||||
public ServiceOfferingVO getcomputeOffering(long serviceOfferingId, Integer cpuCores, Integer cpuSpeed, Integer memory) {
|
||||
ServiceOfferingVO offering = super.findById(serviceOfferingId);
|
||||
offering.setCpu(cpuCores);
|
||||
offering.setSpeed(cpuSpeed);
|
||||
offering.setRamSize(memory);
|
||||
return offering;
|
||||
public ServiceOfferingVO getcomputeOffering(ServiceOfferingVO serviceOffering, Map<String, String> customParameters) {
|
||||
ServiceOfferingVO dummyoffering = new ServiceOfferingVO(serviceOffering);
|
||||
dummyoffering.setDynamicFlag(true);
|
||||
if (customParameters.containsKey(UsageEventVO.DynamicParameters.cpuNumber.name())) {
|
||||
dummyoffering.setCpu(Integer.parseInt(customParameters.get(UsageEventVO.DynamicParameters.cpuNumber.name())));
|
||||
}
|
||||
if (customParameters.containsKey(UsageEventVO.DynamicParameters.cpuSpeed.name())) {
|
||||
dummyoffering.setSpeed(Integer.parseInt(customParameters.get(UsageEventVO.DynamicParameters.cpuSpeed.name())));
|
||||
}
|
||||
if (customParameters.containsKey(UsageEventVO.DynamicParameters.memory.name())) {
|
||||
dummyoffering.setRamSize(Integer.parseInt(customParameters.get(UsageEventVO.DynamicParameters.memory.name())));
|
||||
}
|
||||
|
||||
return dummyoffering;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -206,6 +206,22 @@ public class DiskOfferingVO implements DiskOffering {
|
|||
state = State.Active;
|
||||
}
|
||||
|
||||
public DiskOfferingVO(long id, String name, String displayText, boolean mirrored, String tags, boolean recreatable,
|
||||
boolean useLocalStorage, boolean systemUse, boolean customized, Long domainId) {
|
||||
this.id = id;
|
||||
type = Type.Service;
|
||||
this.name = name;
|
||||
this.displayText = displayText;
|
||||
this.tags = tags;
|
||||
this.recreatable = recreatable;
|
||||
this.useLocalStorage = useLocalStorage;
|
||||
this.systemUse = systemUse;
|
||||
this.customized = customized;
|
||||
this.domainId = domainId;
|
||||
uuid = UUID.randomUUID().toString();
|
||||
state = State.Active;
|
||||
}
|
||||
|
||||
@Override
|
||||
public State getState() {
|
||||
return state;
|
||||
|
|
|
|||
|
|
@ -346,6 +346,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
|
|||
CountByAccount.select(null, Func.COUNT, null);
|
||||
CountByAccount.and("account", CountByAccount.entity().getAccountId(), SearchCriteria.Op.EQ);
|
||||
CountByAccount.and("state", CountByAccount.entity().getState(), SearchCriteria.Op.NIN);
|
||||
CountByAccount.and("displayVolume", CountByAccount.entity().isDisplayVolume(), Op.EQ);
|
||||
CountByAccount.done();
|
||||
|
||||
primaryStorageSearch = createSearchBuilder(SumCount.class);
|
||||
|
|
@ -355,6 +356,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
|
|||
primaryStorageSearch.and().op("path", primaryStorageSearch.entity().getPath(), Op.NNULL);
|
||||
primaryStorageSearch.or("states", primaryStorageSearch.entity().getState(), Op.IN);
|
||||
primaryStorageSearch.cp();
|
||||
primaryStorageSearch.and("displayVolume", primaryStorageSearch.entity().isDisplayVolume(), Op.EQ);
|
||||
primaryStorageSearch.and("isRemoved", primaryStorageSearch.entity().getRemoved(), Op.NULL);
|
||||
primaryStorageSearch.done();
|
||||
|
||||
|
|
@ -382,6 +384,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
|
|||
SearchCriteria<Long> sc = CountByAccount.create();
|
||||
sc.setParameters("account", accountId);
|
||||
sc.setParameters("state", Volume.State.Destroy);
|
||||
sc.setParameters("displayVolume", 1);
|
||||
return customSearch(sc, null).get(0);
|
||||
}
|
||||
|
||||
|
|
@ -393,6 +396,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
|
|||
sc.setParameters("virtualRouterVmIds", virtualRouters.toArray(new Object[virtualRouters.size()]));
|
||||
}
|
||||
sc.setParameters("states", State.Allocated);
|
||||
sc.setParameters("displayVolume", 1);
|
||||
List<SumCount> storageSpace = customSearch(sc, null);
|
||||
if (storageSpace != null) {
|
||||
return storageSpace.get(0).sum;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ import javax.persistence.TemporalType;
|
|||
@Entity
|
||||
@Table(name = "usage_vm_instance")
|
||||
public class UsageVMInstanceVO {
|
||||
|
||||
@Column(name = "usage_type")
|
||||
private int usageType;
|
||||
|
||||
|
|
@ -45,6 +46,15 @@ public class UsageVMInstanceVO {
|
|||
@Column(name = "service_offering_id")
|
||||
private long serviceOfferingId;
|
||||
|
||||
@Column(name="cpu_cores")
|
||||
private Long cpuCores;
|
||||
|
||||
@Column(name="memory")
|
||||
private Long memory;
|
||||
|
||||
@Column(name="cpu_speed")
|
||||
private Long cpuSpeed;
|
||||
|
||||
@Column(name = "template_id")
|
||||
private long templateId;
|
||||
|
||||
|
|
@ -127,4 +137,28 @@ public class UsageVMInstanceVO {
|
|||
public void setEndDate(Date endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public Long getMemory() {
|
||||
return memory;
|
||||
}
|
||||
|
||||
public void setMemory(Long memory) {
|
||||
this.memory = memory;
|
||||
}
|
||||
|
||||
public Long getCpuCores() {
|
||||
return cpuCores;
|
||||
}
|
||||
|
||||
public void setCpuCores(Long cpuCores) {
|
||||
this.cpuCores = cpuCores;
|
||||
}
|
||||
|
||||
public Long getCpuSpeed() {
|
||||
return cpuSpeed;
|
||||
}
|
||||
|
||||
public void setCpuSpeed(Long cpuSpeed) {
|
||||
this.cpuSpeed = cpuSpeed;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,11 +40,11 @@ public interface UserVmDao extends GenericDao<UserVmVO, Long> {
|
|||
/**
|
||||
* Updates display name and group for vm; enables/disables ha
|
||||
* @param id vm id.
|
||||
* @param displan name and enable for ha
|
||||
* @param userData updates the userData of the vm
|
||||
* @param displayVm updates the displayvm attribute signifying whether it has to be displayed to the end user or not.
|
||||
* @param customId
|
||||
*/
|
||||
void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable);
|
||||
void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable, String customId);
|
||||
|
||||
List<UserVmVO> findDestroyedVms(Date date);
|
||||
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
|
|||
}
|
||||
|
||||
@Override
|
||||
public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable) {
|
||||
public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable, String customId) {
|
||||
UserVmVO vo = createForUpdate();
|
||||
vo.setDisplayName(displayName);
|
||||
vo.setHaEnabled(enable);
|
||||
|
|
@ -223,6 +223,10 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
|
|||
vo.setUserData(userData);
|
||||
vo.setDisplayVm(displayVm);
|
||||
vo.setDynamicallyScalable(isDynamicallyScalable);
|
||||
if (customId != null){
|
||||
vo.setUuid(customId);
|
||||
}
|
||||
|
||||
update(id, vo);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 org.apache.cloudstack.resourcedetail;
|
||||
|
||||
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 org.apache.cloudstack.api.ResourceDetail;
|
||||
|
||||
@Entity
|
||||
@Table(name = "network_acl_item_details")
|
||||
public class NetworkACLItemDetailVO implements ResourceDetail {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private long id;
|
||||
|
||||
@Column(name = "network_acl_item_id")
|
||||
private long resourceId;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
@Column(name = "value", length = 1024)
|
||||
private String value;
|
||||
|
||||
@Column(name = "display")
|
||||
private boolean display;
|
||||
|
||||
public NetworkACLItemDetailVO() {
|
||||
}
|
||||
|
||||
public NetworkACLItemDetailVO(long id, String name, String value) {
|
||||
this.resourceId = id;
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getResourceId() {
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisplay() {
|
||||
return display;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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 org.apache.cloudstack.resourcedetail;
|
||||
|
||||
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 org.apache.cloudstack.api.ResourceDetail;
|
||||
|
||||
@Entity
|
||||
@Table(name = "network_acl_details")
|
||||
public class NetworkACLListDetailVO implements ResourceDetail {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private long id;
|
||||
|
||||
@Column(name = "network_acl_id")
|
||||
private long resourceId;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
@Column(name = "value", length = 1024)
|
||||
private String value;
|
||||
|
||||
@Column(name = "display")
|
||||
private boolean display;
|
||||
|
||||
public NetworkACLListDetailVO() {
|
||||
}
|
||||
|
||||
public NetworkACLListDetailVO(long id, String name, String value) {
|
||||
this.resourceId = id;
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getResourceId() {
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisplay() {
|
||||
return display;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -75,6 +75,7 @@ public abstract class ResourceDetailsDaoBase<R extends ResourceDetail> extends G
|
|||
public void removeDetail(long resourceId, String key) {
|
||||
if (key != null) {
|
||||
SearchCriteria<R> sc = AllFieldsSearch.create();
|
||||
sc.setParameters("resourceId", resourceId);
|
||||
sc.setParameters("name", key);
|
||||
remove(sc);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,81 @@
|
|||
// 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.resourcedetail;
|
||||
|
||||
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 org.apache.cloudstack.api.ResourceDetail;
|
||||
|
||||
@Entity
|
||||
@Table(name = "vpc_details")
|
||||
public class VpcDetailVO implements ResourceDetail {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private long id;
|
||||
|
||||
@Column(name = "vpc_id")
|
||||
private long resourceId;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
@Column(name = "value", length = 1024)
|
||||
private String value;
|
||||
|
||||
@Column(name = "display")
|
||||
private boolean display;
|
||||
|
||||
public VpcDetailVO() {
|
||||
}
|
||||
|
||||
public VpcDetailVO(long id, String name, String value) {
|
||||
this.resourceId = id;
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getResourceId() {
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisplay() {
|
||||
return display;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
// 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.resourcedetail;
|
||||
|
||||
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 org.apache.cloudstack.api.ResourceDetail;
|
||||
|
||||
@Entity
|
||||
@Table(name = "vpc_gateway_details")
|
||||
public class VpcGatewayDetailVO implements ResourceDetail {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@Column(name = "id")
|
||||
private long id;
|
||||
|
||||
@Column(name = "vpc_gateway_id")
|
||||
private long resourceId;
|
||||
|
||||
@Column(name = "name")
|
||||
private String name;
|
||||
|
||||
@Column(name = "value", length = 1024)
|
||||
private String value;
|
||||
|
||||
@Column(name = "display")
|
||||
private boolean display;
|
||||
|
||||
public VpcGatewayDetailVO() {
|
||||
}
|
||||
|
||||
public VpcGatewayDetailVO(long id, String name, String value) {
|
||||
this.resourceId = id;
|
||||
this.name = name;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getResourceId() {
|
||||
return resourceId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDisplay() {
|
||||
return display;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.NetworkACLItemDetailVO;
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
public interface NetworkACLItemDetailsDao extends GenericDao<NetworkACLItemDetailVO, Long>, ResourceDetailsDao<NetworkACLItemDetailVO> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.NetworkACLItemDetailVO;
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Local(value = { NetworkACLItemDetailsDao.class })
|
||||
public class NetworkACLItemDetailsDaoImpl extends ResourceDetailsDaoBase<NetworkACLItemDetailVO> implements NetworkACLItemDetailsDao {
|
||||
|
||||
@Override
|
||||
public void addDetail(long resourceId, String key, String value) {
|
||||
super.addDetail(new NetworkACLItemDetailVO(resourceId, key, value));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.NetworkACLListDetailVO;
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
public interface NetworkACLListDetailsDao extends GenericDao<NetworkACLListDetailVO, Long>, ResourceDetailsDao<NetworkACLListDetailVO> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
|
||||
import org.apache.cloudstack.resourcedetail.NetworkACLListDetailVO;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Local(value = { NetworkACLListDetailsDao.class })
|
||||
public class NetworkACLListDetailsDaoImpl extends ResourceDetailsDaoBase<NetworkACLListDetailVO> implements NetworkACLListDetailsDao {
|
||||
|
||||
@Override
|
||||
public void addDetail(long resourceId, String key, String value) {
|
||||
super.addDetail(new NetworkACLListDetailVO(resourceId, key, value));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
|
||||
import org.apache.cloudstack.resourcedetail.VpcDetailVO;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
public interface VpcDetailsDao extends GenericDao<VpcDetailVO, Long>, ResourceDetailsDao<VpcDetailVO> {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
|
||||
import org.apache.cloudstack.resourcedetail.VpcDetailVO;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Local(value = { VpcDetailsDao.class })
|
||||
public class VpcDetailsDaoImpl extends ResourceDetailsDaoBase<VpcDetailVO> implements VpcDetailsDao {
|
||||
|
||||
@Override
|
||||
public void addDetail(long resourceId, String key, String value) {
|
||||
super.addDetail(new VpcDetailVO(resourceId, key, value));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDao;
|
||||
import org.apache.cloudstack.resourcedetail.VpcGatewayDetailVO;
|
||||
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
|
||||
public interface VpcGatewayDetailsDao extends GenericDao<VpcGatewayDetailVO, Long>, ResourceDetailsDao<VpcGatewayDetailVO> {
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
// 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.resourcedetail.dao;
|
||||
|
||||
import javax.ejb.Local;
|
||||
|
||||
import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase;
|
||||
import org.apache.cloudstack.resourcedetail.VpcGatewayDetailVO;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@Local(value = { VpcGatewayDetailsDao.class })
|
||||
public class VpcGatewayDetailsDaoImpl extends ResourceDetailsDaoBase<VpcGatewayDetailVO> implements VpcGatewayDetailsDao {
|
||||
|
||||
@Override
|
||||
public void addDetail(long resourceId, String key, String value) {
|
||||
super.addDetail(new VpcGatewayDetailVO(resourceId, key, value));
|
||||
}
|
||||
}
|
||||
|
|
@ -364,7 +364,7 @@ public class TemplateServiceImpl implements TemplateService {
|
|||
tmpltInfo.getSize() - UriUtils.getRemoteSize(tmplt.getUrl()));
|
||||
} catch (ResourceAllocationException e) {
|
||||
s_logger.warn(e.getMessage());
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, zoneId, null, e.getMessage(), e.getMessage());
|
||||
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, zoneId, null, e.getMessage(), e.getMessage());
|
||||
} finally {
|
||||
_resourceLimitMgr.recalculateResourceCount(accountId, _accountMgr.getAccount(accountId).getDomainId(),
|
||||
com.cloud.configuration.Resource.ResourceType.secondary_storage.getOrdinal());
|
||||
|
|
|
|||
|
|
@ -201,7 +201,7 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase {
|
|||
return true;
|
||||
}
|
||||
|
||||
if (!Snapshot.State.BackedUp.equals(snapshotVO.getState())) {
|
||||
if (!Snapshot.State.BackedUp.equals(snapshotVO.getState()) && !Snapshot.State.Error.equals(snapshotVO.getState())) {
|
||||
throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is in " + snapshotVO.getState() + " Status");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ public class DefaultHostListener implements HypervisorHostListener {
|
|||
|
||||
if (!answer.getResult()) {
|
||||
String msg = "Unable to attach storage pool" + poolId + " to the host" + hostId;
|
||||
alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, pool.getDataCenterId(), pool.getPodId(), msg, msg);
|
||||
alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_HOST, pool.getDataCenterId(), pool.getPodId(), msg, msg);
|
||||
throw new CloudRuntimeException("Unable establish connection from storage head to storage pool " + pool.getId() + " due to " + answer.getDetails() +
|
||||
pool.getId());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,9 +25,6 @@ import java.util.Map;
|
|||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo;
|
||||
import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
|
||||
|
|
@ -60,6 +57,8 @@ import org.apache.cloudstack.storage.datastore.PrimaryDataStoreProviderManager;
|
|||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
||||
import org.apache.cloudstack.storage.to.VolumeObjectTO;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.agent.api.Answer;
|
||||
import com.cloud.agent.api.storage.ListVolumeAnswer;
|
||||
|
|
@ -1204,7 +1203,7 @@ public class VolumeServiceImpl implements VolumeService {
|
|||
com.cloud.configuration.Resource.ResourceType.secondary_storage, volInfo.getSize() - volInfo.getPhysicalSize());
|
||||
} catch (ResourceAllocationException e) {
|
||||
s_logger.warn(e.getMessage());
|
||||
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, volume.getDataCenterId(), volume.getPodId(), e.getMessage(),
|
||||
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, volume.getDataCenterId(), volume.getPodId(), e.getMessage(),
|
||||
e.getMessage());
|
||||
} finally {
|
||||
_resourceLimitMgr.recalculateResourceCount(volume.getAccountId(), volume.getDomainId(),
|
||||
|
|
|
|||
|
|
@ -40,13 +40,12 @@ import javax.ejb.Local;
|
|||
import javax.inject.Inject;
|
||||
import javax.naming.ConfigurationException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.framework.config.ConfigDepot;
|
||||
import org.apache.cloudstack.framework.config.ConfigKey;
|
||||
import org.apache.cloudstack.framework.config.Configurable;
|
||||
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
|
||||
import org.apache.cloudstack.utils.identity.ManagementServerNode;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.cluster.dao.ManagementServerHostDao;
|
||||
import com.cloud.cluster.dao.ManagementServerHostPeerDao;
|
||||
|
|
@ -256,15 +255,15 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
try {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Cluster PDU " + getSelfPeerName() + " -> " + pdu.getDestPeer() + ". agent: " + pdu.getAgentId() + ", pdu seq: " +
|
||||
pdu.getSequenceId() + ", pdu ack seq: " + pdu.getAckSequenceId() + ", json: " + pdu.getJsonPackage());
|
||||
pdu.getSequenceId() + ", pdu ack seq: " + pdu.getAckSequenceId() + ", json: " + pdu.getJsonPackage());
|
||||
}
|
||||
|
||||
long startTick = System.currentTimeMillis();
|
||||
String strResult = peerService.execute(pdu);
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Cluster PDU " + getSelfPeerName() + " -> " + pdu.getDestPeer() + " completed. time: " +
|
||||
(System.currentTimeMillis() - startTick) + "ms. agent: " + pdu.getAgentId() + ", pdu seq: " + pdu.getSequenceId() +
|
||||
", pdu ack seq: " + pdu.getAckSequenceId() + ", json: " + pdu.getJsonPackage());
|
||||
(System.currentTimeMillis() - startTick) + "ms. agent: " + pdu.getAgentId() + ", pdu seq: " + pdu.getSequenceId() +
|
||||
", pdu ack seq: " + pdu.getAckSequenceId() + ", json: " + pdu.getJsonPackage());
|
||||
}
|
||||
|
||||
if ("true".equals(strResult))
|
||||
|
|
@ -274,7 +273,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
invalidatePeerService(pdu.getDestPeer());
|
||||
if (s_logger.isInfoEnabled()) {
|
||||
s_logger.info("Exception on remote execution, peer: " + pdu.getDestPeer() + ", iteration: " + i + ", exception message :" +
|
||||
e.getMessage());
|
||||
e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -564,7 +563,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
if (profiler.getDuration() >= HeartbeatInterval.value()) {
|
||||
if (s_logger.isDebugEnabled())
|
||||
s_logger.debug("Management server heartbeat takes too long to finish. profiler: " + profiler.toString() + ", profilerHeartbeatUpdate: " +
|
||||
profilerHeartbeatUpdate.toString() + ", profilerPeerScan: " + profilerPeerScan.toString());
|
||||
profilerHeartbeatUpdate.toString() + ", profilerPeerScan: " + profilerPeerScan.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -625,8 +624,10 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
if (_heartbeatConnection != null) {
|
||||
Connection conn = TransactionLegacy.getStandaloneConnection();
|
||||
if (conn != null) {
|
||||
_heartbeatConnection.reset(TransactionLegacy.getStandaloneConnection());
|
||||
_heartbeatConnection.reset(conn);
|
||||
}
|
||||
// The stand-alone connection does not have to be closed here because there will be another reference to it.
|
||||
// As a matter of fact, it will be assigned to the connection instance variable in the ConnectionConcierge class.
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -720,7 +721,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
case nodeRemoved: {
|
||||
List<ManagementServerHostVO> l = msg.getNodes();
|
||||
|
|
@ -730,11 +731,10 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -772,7 +772,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
s_logger.info("Found " + inactiveList.size() + " inactive management server node based on timestamp");
|
||||
for (ManagementServerHostVO host : inactiveList)
|
||||
s_logger.info("management server node msid: " + host.getMsid() + ", name: " + host.getName() + ", service ip: " + host.getServiceIP() +
|
||||
", version: " + host.getVersion());
|
||||
", version: " + host.getVersion());
|
||||
}
|
||||
|
||||
List<ManagementServerHostVO> downHostList = new ArrayList<ManagementServerHostVO>();
|
||||
|
|
@ -810,7 +810,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
|
||||
if (_mshostPeerDao.countStateSeenInPeers(_mshostId, _runId, ManagementServerHost.State.Down) > 0) {
|
||||
String msg =
|
||||
"We have detected that at least one management server peer reports that this management server is down, perform active fencing to avoid split-brain situation";
|
||||
"We have detected that at least one management server peer reports that this management server is down, perform active fencing to avoid split-brain situation";
|
||||
s_logger.error(msg);
|
||||
throw new ActiveFencingException(msg);
|
||||
}
|
||||
|
|
@ -831,7 +831,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
if (entry.getKey().longValue() != _mshostId.longValue()) {
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug("Detected management node left because of invalidated session, id:" + entry.getKey() + ", nodeIP:" +
|
||||
entry.getValue().getServiceIP());
|
||||
entry.getValue().getServiceIP());
|
||||
}
|
||||
invalidatedNodeList.add(entry.getValue());
|
||||
}
|
||||
|
|
@ -918,8 +918,8 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
if (profiler.getDuration() >= HeartbeatInterval.value()) {
|
||||
if (s_logger.isDebugEnabled())
|
||||
s_logger.debug("Peer scan takes too long to finish. profiler: " + profiler.toString() + ", profilerQueryActiveList: " +
|
||||
profilerQueryActiveList.toString() + ", profilerSyncClusterInfo: " + profilerSyncClusterInfo.toString() + ", profilerInvalidatedNodeList: " +
|
||||
profilerInvalidatedNodeList.toString() + ", profilerRemovedList: " + profilerRemovedList.toString());
|
||||
profilerQueryActiveList.toString() + ", profilerSyncClusterInfo: " + profilerSyncClusterInfo.toString() + ", profilerInvalidatedNodeList: " +
|
||||
profilerInvalidatedNodeList.toString() + ", profilerRemovedList: " + profilerRemovedList.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -970,7 +970,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
}
|
||||
|
||||
_mshostDao.update(mshost.getId(), getCurrentRunId(), NetUtils.getHostName(), version, _clusterNodeIP, _currentServiceAdapter.getServicePort(),
|
||||
DateUtil.currentGMTTime());
|
||||
DateUtil.currentGMTTime());
|
||||
}
|
||||
|
||||
return mshost;
|
||||
|
|
@ -1165,19 +1165,19 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
|
|||
throw new ConfigurationException(msg);
|
||||
} else {
|
||||
String msg =
|
||||
"Detected another management node with localhost IP is considered as running in DB, however it is not pingable, we will continue cluster initialization with this management server node";
|
||||
"Detected another management node with localhost IP is considered as running in DB, however it is not pingable, we will continue cluster initialization with this management server node";
|
||||
s_logger.info(msg);
|
||||
}
|
||||
} else {
|
||||
if (pingManagementNode(peer.getMsid())) {
|
||||
String msg =
|
||||
"Detected that another management node with the same IP " + peer.getServiceIP() +
|
||||
"Detected that another management node with the same IP " + peer.getServiceIP() +
|
||||
" is already running, please check your cluster configuration";
|
||||
s_logger.error(msg);
|
||||
throw new ConfigurationException(msg);
|
||||
} else {
|
||||
String msg =
|
||||
"Detected that another management node with the same IP " + peer.getServiceIP() +
|
||||
"Detected that another management node with the same IP " + peer.getServiceIP() +
|
||||
" is considered as running in DB, however it is not pingable, we will continue cluster initialization with this management server node";
|
||||
s_logger.info(msg);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@ import java.util.Set;
|
|||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarInputStream;
|
||||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
|
||||
//
|
||||
// Finding classes in a given package code is taken and modified from
|
||||
// Credit: http://internna.blogspot.com/2007/11/java-5-retrieving-all-classes-from.html
|
||||
|
|
@ -39,7 +41,7 @@ import java.util.jar.JarInputStream;
|
|||
public class OnwireClassRegistry {
|
||||
|
||||
private List<String> packages = new ArrayList<String>();
|
||||
private Map<String, Class<?>> registry = new HashMap<String, Class<?>>();
|
||||
private final Map<String, Class<?>> registry = new HashMap<String, Class<?>>();
|
||||
|
||||
public OnwireClassRegistry() {
|
||||
registry.put("Object", Object.class);
|
||||
|
|
@ -166,13 +168,15 @@ public class OnwireClassRegistry {
|
|||
}
|
||||
}
|
||||
}
|
||||
IOUtils.closeQuietly(jarFile);
|
||||
}
|
||||
} while (jarEntry != null);
|
||||
|
||||
IOUtils.closeQuietly(jarFile);
|
||||
return classes;
|
||||
}
|
||||
|
||||
static String stripFilenameExtension(String file) {
|
||||
return file.substring(0, file.lastIndexOf('.'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
/target
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">$(MSBuildProjectDirectory)\..\</SolutionDir>
|
||||
|
||||
|
||||
<!-- Enable the restore command to run before builds -->
|
||||
<RestorePackages Condition=" '$(RestorePackages)' == '' ">false</RestorePackages>
|
||||
|
||||
|
|
@ -11,11 +11,10 @@
|
|||
|
||||
<!-- Determines if package restore consent is required to restore packages -->
|
||||
<RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>
|
||||
|
||||
|
||||
<!-- Download NuGet.exe if it does not already exist -->
|
||||
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup Condition=" '$(PackageSources)' == '' ">
|
||||
<!-- Package sources used to restore packages. By default, registered sources under %APPDATA%\NuGet\NuGet.Config will be used -->
|
||||
<!-- The official NuGet package source (https://www.nuget.org/api/v2/) will be excluded if package sources are specified and it does not appear in the list -->
|
||||
|
|
@ -25,37 +24,34 @@
|
|||
-->
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
|
||||
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' And '$(BuildWithMono)' != 'true'">
|
||||
<!-- Windows specific commands -->
|
||||
<NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
|
||||
<PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
|
||||
|
||||
<PropertyGroup Condition=" '$(OS)' != 'Windows_NT' Or '$(BuildWithMono)' == 'true'">
|
||||
<!-- We need to launch nuget.exe with the mono command if we're not on windows -->
|
||||
<NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
|
||||
<PackagesConfig>packages.config</PackagesConfig>
|
||||
<PackagesConfig>$(ProjectDir)packages.config</PackagesConfig>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- NuGet command -->
|
||||
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\NuGet.exe</NuGetExePath>
|
||||
<PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>
|
||||
|
||||
<NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
|
||||
<NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
|
||||
|
||||
<NuGetCommand Condition=" '$(OS)' == 'Windows_NT' And '$(BuildWithMono)' != 'true' ">"$(NuGetExePath)"</NuGetCommand>
|
||||
<NuGetCommand Condition=" '$(OS)' != 'Windows_NT' Or '$(BuildWithMono)' == 'true' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>
|
||||
|
||||
<PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>
|
||||
|
||||
|
||||
<RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
|
||||
<NonInteractiveSwitch Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' ">-NonInteractive</NonInteractiveSwitch>
|
||||
|
||||
<PaddedSolutionDir Condition=" '$(OS)' == 'Windows_NT'">"$(SolutionDir) "</PaddedSolutionDir>
|
||||
<PaddedSolutionDir Condition=" '$(OS)' != 'Windows_NT' ">"$(SolutionDir)"</PaddedSolutionDir>
|
||||
|
||||
<!-- Commands -->
|
||||
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir)</RestoreCommand>
|
||||
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
|
||||
<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir "$(SolutionDir)\" </RestoreCommand>
|
||||
<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties Configuration=$(Configuration) $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols</BuildCommand>
|
||||
|
||||
<!-- We need to ensure packages are restored prior to assembly resolve -->
|
||||
<BuildDependsOn Condition="$(RestorePackages) == 'true'">
|
||||
|
|
@ -87,22 +83,22 @@
|
|||
|
||||
<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
|
||||
<Exec Command="$(RestoreCommand)"
|
||||
Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />
|
||||
|
||||
Condition="( '$(OS)' != 'Windows_NT' Or '$(BuildWithMono)' == 'true' ) And Exists('$(PackagesConfig)')" />
|
||||
|
||||
<Exec Command="$(RestoreCommand)"
|
||||
LogStandardErrorAsError="true"
|
||||
Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
|
||||
Condition="'$(OS)' == 'Windows_NT' And '$(BuildWithMono)' != 'true' And Exists('$(PackagesConfig)')" />
|
||||
</Target>
|
||||
|
||||
<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
|
||||
<Exec Command="$(BuildCommand)"
|
||||
Condition=" '$(OS)' != 'Windows_NT' " />
|
||||
|
||||
<Exec Command="$(BuildCommand)"
|
||||
Condition=" '$(OS)' != 'Windows_NT' Or '$(BuildWithMono)' " />
|
||||
|
||||
<Exec Command="$(BuildCommand)"
|
||||
LogStandardErrorAsError="true"
|
||||
Condition=" '$(OS)' == 'Windows_NT' " />
|
||||
Condition=" '$(OS)' == 'Windows_NT' And '$(BuildWithMono)' != 'true' " />
|
||||
</Target>
|
||||
|
||||
|
||||
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
|
||||
<ParameterGroup>
|
||||
<OutputFilename ParameterType="System.String" Required="true" />
|
||||
|
|
@ -133,4 +129,4 @@
|
|||
</Code>
|
||||
</Task>
|
||||
</UsingTask>
|
||||
</Project>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@
|
|||
<HintPath>..\packages\NSubstitute.1.6.1.0\lib\NET40\NSubstitute.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration.Install" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
|
|
@ -101,6 +102,12 @@
|
|||
</Compile>
|
||||
<Compile Include="AgentShellException.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="ProjectInstaller.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ProjectInstaller.Designer.cs">
|
||||
<DependentUpon>ProjectInstaller.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="AgentSettings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
|
|
@ -137,4 +144,4 @@
|
|||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
</Project>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue