mirror of https://github.com/apache/cloudstack.git
Merge branch 'master' into ui-add-remove-nics
Conflicts: client/WEB-INF/classes/resources/messages.properties ui/dictionary.jsp
This commit is contained in:
commit
eacbb4cb2d
|
|
@ -20,6 +20,11 @@ import java.util.List;
|
|||
|
||||
import javax.naming.NamingException;
|
||||
|
||||
import com.cloud.exception.InvalidParameterValueException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
|
||||
import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd;
|
||||
import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd;
|
||||
|
|
@ -46,10 +51,6 @@ import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd;
|
|||
import com.cloud.dc.DataCenter;
|
||||
import com.cloud.dc.Pod;
|
||||
import com.cloud.dc.Vlan;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
import com.cloud.exception.ResourceAllocationException;
|
||||
import com.cloud.exception.ResourceUnavailableException;
|
||||
import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.offering.DiskOffering;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
|
|
@ -65,7 +66,7 @@ public interface ConfigurationService {
|
|||
* - the command wrapping name and value parameters
|
||||
* @return updated configuration object if successful
|
||||
*/
|
||||
Configuration updateConfiguration(UpdateCfgCmd cmd);
|
||||
Configuration updateConfiguration(UpdateCfgCmd cmd) throws InvalidParameterValueException;
|
||||
|
||||
/**
|
||||
* Create a service offering through the API
|
||||
|
|
@ -250,7 +251,7 @@ public interface ConfigurationService {
|
|||
|
||||
NetworkOffering getNetworkOffering(long id);
|
||||
|
||||
Integer getNetworkOfferingNetworkRate(long networkOfferingId);
|
||||
Integer getNetworkOfferingNetworkRate(long networkOfferingId, Long dataCenterId);
|
||||
|
||||
Account getVlanAccount(long vlanId);
|
||||
|
||||
|
|
@ -262,7 +263,7 @@ public interface ConfigurationService {
|
|||
|
||||
Long getDefaultPageSize();
|
||||
|
||||
Integer getServiceOfferingNetworkRate(long serviceOfferingId);
|
||||
Integer getServiceOfferingNetworkRate(long serviceOfferingId, Long dataCenterId);
|
||||
|
||||
DiskOffering getDiskOffering(long diskOfferingId);
|
||||
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ public interface NetworkModel {
|
|||
/**
|
||||
* @return
|
||||
*/
|
||||
String getDefaultNetworkDomain();
|
||||
String getDefaultNetworkDomain(long zoneId);
|
||||
|
||||
/**
|
||||
* @param ntwkOffId
|
||||
|
|
|
|||
|
|
@ -70,6 +70,9 @@ public class ListClustersCmd extends BaseListCmd {
|
|||
@Parameter(name=ApiConstants.MANAGED_STATE, type=CommandType.STRING, description="whether this cluster is managed by cloudstack")
|
||||
private String managedState;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
|
||||
private String zoneType;
|
||||
|
||||
@Parameter(name=ApiConstants.SHOW_CAPACITIES, type=CommandType.BOOLEAN, description="flag to display the capacity of the clusters")
|
||||
private Boolean showCapacities;
|
||||
|
||||
|
|
@ -114,7 +117,10 @@ public class ListClustersCmd extends BaseListCmd {
|
|||
this.managedState = managedstate;
|
||||
}
|
||||
|
||||
|
||||
public String getZoneType() {
|
||||
return zoneType;
|
||||
}
|
||||
|
||||
public Boolean getShowCapacities() {
|
||||
return showCapacities;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,11 +45,17 @@ public class ListCfgsByCmd extends BaseListCmd {
|
|||
@Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "lists configuration by name")
|
||||
private String configName;
|
||||
|
||||
@Parameter(name=ApiConstants.SCOPE, type = CommandType.STRING, description = "scope(zone/cluster/pool/account) of the parameter that needs to be updated")
|
||||
private String scope;
|
||||
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class, description="the ID of the Zone to update the parameter value for corresponding zone")
|
||||
private Long zone_id;
|
||||
|
||||
@Parameter(name=ApiConstants.ID, type = CommandType.UUID, entityType = {ZoneResponse.class, ClusterResponse.class, StoragePoolResponse.class, AccountResponse.class}, description = "corresponding ID of the scope")
|
||||
private Long id;
|
||||
@Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.UUID, entityType=ClusterResponse.class, description="the ID of the Cluster to update the parameter value for corresponding cluster")
|
||||
private Long cluster_id;
|
||||
|
||||
@Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.UUID, entityType=StoragePoolResponse.class, description="the ID of the Storage pool to update the parameter value for corresponding storage pool")
|
||||
private Long storagepool_id;
|
||||
|
||||
@Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.UUID, entityType=AccountResponse.class, description="the ID of the Account to update the parameter value for corresponding account")
|
||||
private Long account_id;
|
||||
|
||||
|
||||
// ///////////////////////////////////////////////////
|
||||
|
|
@ -64,14 +70,21 @@ public class ListCfgsByCmd extends BaseListCmd {
|
|||
return configName;
|
||||
}
|
||||
|
||||
public String getScope() {
|
||||
return scope;
|
||||
public Long getZoneId() {
|
||||
return zone_id;
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
public Long getClusterId() {
|
||||
return cluster_id;
|
||||
}
|
||||
|
||||
public Long getStoragepoolId() {
|
||||
return storagepool_id;
|
||||
}
|
||||
|
||||
public Long getAccountId() {
|
||||
return account_id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getPageSizeVal() {
|
||||
|
|
@ -100,10 +113,17 @@ public class ListCfgsByCmd extends BaseListCmd {
|
|||
for (Configuration cfg : result.first()) {
|
||||
ConfigurationResponse cfgResponse = _responseGenerator.createConfigurationResponse(cfg);
|
||||
cfgResponse.setObjectName("configuration");
|
||||
if (scope != null) {
|
||||
cfgResponse.setScope(scope);
|
||||
} else {
|
||||
cfgResponse.setScope("global");
|
||||
if(getZoneId() != null) {
|
||||
cfgResponse.setScope("zone");
|
||||
}
|
||||
if(getClusterId() != null) {
|
||||
cfgResponse.setScope("cluster");
|
||||
}
|
||||
if(getStoragepoolId() != null) {
|
||||
cfgResponse.setScope("storagepool");
|
||||
}
|
||||
if(getAccountId() != null) {
|
||||
cfgResponse.setScope("account");
|
||||
}
|
||||
configResponses.add(cfgResponse);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,11 +43,17 @@ public class UpdateCfgCmd extends BaseCmd {
|
|||
@Parameter(name=ApiConstants.VALUE, type=CommandType.STRING, description="the value of the configuration", length=4095)
|
||||
private String value;
|
||||
|
||||
@Parameter(name=ApiConstants.SCOPE, type = CommandType.STRING, description = "scope(zone/cluster/pool/account) of the parameter that needs to be updated")
|
||||
private String scope;
|
||||
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class, description="the ID of the Zone to update the parameter value for corresponding zone")
|
||||
private Long zone_id;
|
||||
|
||||
@Parameter(name=ApiConstants.ID, type = CommandType.UUID, entityType = {ZoneResponse.class, ClusterResponse.class, StoragePoolResponse.class, AccountResponse.class}, description = "corresponding ID of the scope")
|
||||
private Long id;
|
||||
@Parameter(name=ApiConstants.CLUSTER_ID, type=CommandType.UUID, entityType=ClusterResponse.class, description="the ID of the Cluster to update the parameter value for corresponding cluster")
|
||||
private Long cluster_id;
|
||||
|
||||
@Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.UUID, entityType=StoragePoolResponse.class, description="the ID of the Storage pool to update the parameter value for corresponding storage pool")
|
||||
private Long storagepool_id;
|
||||
|
||||
@Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.UUID, entityType=AccountResponse.class, description="the ID of the Account to update the parameter value for corresponding account")
|
||||
private Long account_id;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
|
|
@ -61,12 +67,20 @@ public class UpdateCfgCmd extends BaseCmd {
|
|||
return value;
|
||||
}
|
||||
|
||||
public String getScope() {
|
||||
return scope;
|
||||
public Long getZoneId() {
|
||||
return zone_id;
|
||||
}
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
public Long getClusterId() {
|
||||
return cluster_id;
|
||||
}
|
||||
|
||||
public Long getStoragepoolId() {
|
||||
return storagepool_id;
|
||||
}
|
||||
|
||||
public Long getAccountId() {
|
||||
return account_id;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -89,12 +103,19 @@ public class UpdateCfgCmd extends BaseCmd {
|
|||
if (cfg != null) {
|
||||
ConfigurationResponse response = _responseGenerator.createConfigurationResponse(cfg);
|
||||
response.setResponseName(getCommandName());
|
||||
if (scope != null) {
|
||||
response.setScope(scope);
|
||||
response.setValue(value);
|
||||
} else {
|
||||
response.setScope("global");
|
||||
if(getZoneId() != null) {
|
||||
response.setScope("zone");
|
||||
}
|
||||
if(getClusterId() != null) {
|
||||
response.setScope("cluster");
|
||||
}
|
||||
if(getStoragepoolId() != null) {
|
||||
response.setScope("storagepool");
|
||||
}
|
||||
if(getAccountId() != null) {
|
||||
response.setScope("account");
|
||||
}
|
||||
response.setValue(value);
|
||||
this.setResponseObject(response);
|
||||
} else {
|
||||
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update config");
|
||||
|
|
|
|||
|
|
@ -55,6 +55,9 @@ public class ListPodsByCmd extends BaseListCmd {
|
|||
@Parameter(name=ApiConstants.ALLOCATION_STATE, type=CommandType.STRING, description="list pods by allocation state")
|
||||
private String allocationState;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
|
||||
private String zoneType;
|
||||
|
||||
@Parameter(name=ApiConstants.SHOW_CAPACITIES, type=CommandType.BOOLEAN, description="flag to display the capacity of the pods")
|
||||
private Boolean showCapacities;
|
||||
|
||||
|
|
@ -78,6 +81,10 @@ public class ListPodsByCmd extends BaseListCmd {
|
|||
return allocationState;
|
||||
}
|
||||
|
||||
public String getZoneType() {
|
||||
return zoneType;
|
||||
}
|
||||
|
||||
public Boolean getShowCapacities() {
|
||||
return showCapacities;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,6 +74,9 @@ public class ListSystemVMsCmd extends BaseListCmd {
|
|||
description="the storage ID where vm's volumes belong to", since="3.0.1")
|
||||
private Long storageId;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
|
||||
private String zoneType;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -110,6 +113,10 @@ public class ListSystemVMsCmd extends BaseListCmd {
|
|||
return storageId;
|
||||
}
|
||||
|
||||
public String getZoneType() {
|
||||
return zoneType;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////// API Implementation///////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ public class ListIsosCmd extends BaseListTaggedResourcesCmd {
|
|||
description="the ID of the zone")
|
||||
private Long zoneId;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
|
||||
private String zoneType;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -115,6 +118,10 @@ public class ListIsosCmd extends BaseListTaggedResourcesCmd {
|
|||
return zoneId;
|
||||
}
|
||||
|
||||
public String getZoneType() {
|
||||
return zoneType;
|
||||
}
|
||||
|
||||
public boolean listInReadyState() {
|
||||
Account account = UserContext.current().getCaller();
|
||||
// It is account specific if account is admin type and domainId and accountName are not null
|
||||
|
|
|
|||
|
|
@ -48,6 +48,9 @@ public class ListNetworksCmd extends BaseListTaggedResourcesCmd {
|
|||
description="the Zone ID of the network")
|
||||
private Long zoneId;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
|
||||
private String zoneType;
|
||||
|
||||
@Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, description="the type of the network. Supported values are: Isolated and Shared")
|
||||
private String guestIpType;
|
||||
|
||||
|
|
@ -96,6 +99,10 @@ public class ListNetworksCmd extends BaseListTaggedResourcesCmd {
|
|||
return zoneId;
|
||||
}
|
||||
|
||||
public String getZoneType() {
|
||||
return zoneType;
|
||||
}
|
||||
|
||||
public String getGuestIpType() {
|
||||
return guestIpType;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,6 +68,10 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd {
|
|||
@Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class,
|
||||
description="list templates by zoneId")
|
||||
private Long zoneId;
|
||||
|
||||
@Parameter(name=ApiConstants.ZONE_TYPE, type=CommandType.STRING, description="the network type of the zone that the virtual machine belongs to")
|
||||
private String zoneType;
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
/////////////////// Accessors ///////////////////////
|
||||
/////////////////////////////////////////////////////
|
||||
|
|
@ -92,6 +96,10 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd {
|
|||
return zoneId;
|
||||
}
|
||||
|
||||
public String getZoneType() {
|
||||
return zoneType;
|
||||
}
|
||||
|
||||
public boolean listInReadyState() {
|
||||
|
||||
Account account = UserContext.current().getCaller();
|
||||
|
|
|
|||
|
|
@ -35,6 +35,9 @@ public class ConfigurationResponse extends BaseResponse {
|
|||
@SerializedName(ApiConstants.SCOPE) @Param(description="scope(zone/cluster/pool/account) of the parameter that needs to be updated")
|
||||
private String scope;
|
||||
|
||||
@SerializedName(ApiConstants.ID) @Param(description="the value of the configuration")
|
||||
private Long id;
|
||||
|
||||
@SerializedName(ApiConstants.DESCRIPTION) @Param(description="the description of the configuration")
|
||||
private String description;
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,285 @@
|
|||
# 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.
|
||||
|
||||
|
||||
changed.item.properties=\u062a\u063a\u064a\u0631 \u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0639\u0646\u0635\u0631
|
||||
confirm.enable.s3=\u0641\u0636\u0644\u0627 \u0642\u0645 \u0628\u062a\u0639\u0628\u0626\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0642\u0627\u062f\u0645\u0629 \u0644\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 S3 \u0644\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629.
|
||||
instances.actions.reboot.label=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
|
||||
label.accept.project.invitation=\u0642\u0628\u0648\u0644 \u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.action.delete.system.service.offering=\u062d\u0630\u0641 \u0646\u0638\u0627\u0645 \u062a\u0642\u062f\u064a\u0645 \u0627\u0644\u062e\u062f\u0645\u0629
|
||||
label.action.disable.physical.network=\u062a\u0639\u0637\u064a\u0644 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629
|
||||
label.action.enable.physical.network=\u062a\u0645\u0643\u064a\u0646 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629
|
||||
label.activate.project=\u062a\u0641\u0639\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.add.accounts.to=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a \u0625\u0644\u0649
|
||||
label.add.accounts=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a
|
||||
label.add.account.to.project=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628 \u0644\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.add.ACL=\u0625\u0636\u0627\u0641\u0629 ACL
|
||||
label.add.network.ACL=\u0625\u0636\u0627\u0641\u0629 \u0634\u0628\u0643\u0629 ACL
|
||||
label.add.new.gateway=\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u062c\u062f\u064a\u062f\u0629
|
||||
label.add.new.tier=\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629 \u062c\u062f\u064a\u062f\u0629
|
||||
label.add.port.forwarding.rule=\u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0639\u062f\u0629 \u0645\u0646\u0641\u0630 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647
|
||||
label.add.route=\u0625\u0636\u0627\u0641\u0629 \u0645\u0633\u0627\u0631
|
||||
label.add.rule=\u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0639\u062f\u0629
|
||||
label.add.static.route=\u0625\u0636\u0627\u0641\u0629 \u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a
|
||||
label.add.to.group=\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0629
|
||||
label.add.VM.to.tier=\u0625\u0636\u0627\u0641\u0629 \u062c\u0647\u0627\u0632 \u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0641\u064a \u0637\u0628\u0642\u0629
|
||||
label.add.vpc=\u0625\u0636\u0627\u0641\u0629 \u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629
|
||||
label.add.VPN.gateway=\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.allocated=\u062a\u062e\u0635\u064a\u0635
|
||||
label.apply=\u062a\u0637\u0628\u064a\u0642
|
||||
label.associated.network=\u0634\u0628\u0643\u0629 \u0645\u0631\u062a\u0628\u0637\u0629
|
||||
label.broadcast.uri=\u0628\u062b \u0627\u0644\u0631\u0627\u0628\u0637
|
||||
label.change.value=\u062a\u063a\u064a\u0631 \u0627\u0644\u0642\u064a\u0645\u0629
|
||||
label.CIDR.list=\u0642\u0627\u0626\u0645\u0629 CIDR
|
||||
label.CIDR.of.destination.network=CIDR \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0648\u062c\u0647\u0629.
|
||||
label.clean.up=\u062a\u0646\u0638\u064a\u0641
|
||||
label.clear.list=\u0645\u0633\u062d \u0627\u0644\u0642\u0627\u0626\u0645\u0629
|
||||
label.configuration=\u0627\u0644\u062a\u0643\u0648\u064a\u0646
|
||||
label.configure.network.ACLs=\u0636\u0628\u0637 \u0634\u0628\u0643\u0629 ACLs
|
||||
label.configure=\u0642\u0645 \u0628\u062a\u0643\u0648\u064a\u0646
|
||||
label.configure.vpc=\u062a\u0643\u0648\u064a\u0646 VPC
|
||||
label.corrections.saved=\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0635\u062d\u064a\u062d\u0627\u062a
|
||||
label.cpu.mhz=\u0648\u062d\u062f\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0645\u0631\u0643\u0632\u064a\u0629 (\u0628\u0627\u0644\u0645\u064a\u063a\u0627\u0647\u064a\u0631\u062a\u0632)
|
||||
label.cpu=\u00d9\u0088\u00d8\u00ad\u00d8\u00af\u00d8\u00a9 \u00d8\u00a7\u00d9\u0084\u00d9
|
||||
label.create.project=\u0623\u0646\u0634\u0626 \u0645\u0634\u0631\u0648\u0639
|
||||
label.create.VPN.connection=\u0625\u0646\u0634\u0627\u0621 \u0627\u062a\u0635\u0627\u0644 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.dead.peer.detection=\u0643\u0634\u0641 \u0627\u0644\u0642\u0631\u064a\u0646 \u0627\u0644\u0645\u0641\u0642\u0648\u062f
|
||||
label.decline.invitation=\u0631\u0641\u0636 \u0627\u0644\u062f\u0639\u0648\u0629
|
||||
label.default=\u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a
|
||||
label.default.view=\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629
|
||||
label.delete.gateway=\u0627\u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629
|
||||
label.delete.project=\u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.delete.VPN.connection=\u0627\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.delete.VPN.customer.gateway=\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 VPN \u0627\u0644\u0645\u062e\u0635\u0635\u0629
|
||||
label.delete.VPN.gateway=\u0627\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.destroy=\u0647\u062f\u0645
|
||||
label.devices=\u0627\u0644\u0623\u062c\u0647\u0632\u0629
|
||||
label.direct.ips=\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u0629 IPs
|
||||
label.display.name=\u0639\u0631\u0636 \u0627\u0644\u0627\u0633\u0645
|
||||
label.DNS.domain.for.guest.networks=\u0645\u062c\u0627\u0644 DNS \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0632\u0627\u0626\u0631
|
||||
label.dns=\u0646\u0638\u0627\u0645 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062c\u0627\u0644 DNS
|
||||
label.drag.new.position=\u0627\u0633\u062d\u0628 \u0644\u0645\u0648\u0642\u0641 \u062c\u062f\u064a\u062f
|
||||
label.edit.network.details=\u062a\u062d\u0631\u064a\u0631 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629
|
||||
label.edit.project.details=\u0627\u0636\u0627\u0641\u0629 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.edit.tags=\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a
|
||||
label.edit.vpc=\u062a\u0639\u062f\u064a\u0644 VPC
|
||||
label.egress.rules=\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062e\u0631\u0648\u062c
|
||||
label.elastic=\u0645\u0631\u0646
|
||||
label.enable.s3=\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u0648\u064a S3
|
||||
label.endpoint=\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629
|
||||
label.error=\u062e\u0637\u0623
|
||||
label.ESP.lifetime=\u0639\u0645\u0631 ESP (\u062b\u0627\u0646\u064a\u0629)
|
||||
label.ESP.policy=\u0633\u064a\u0627\u0633\u0629 ESP
|
||||
label.filterBy=\u062a\u0635\u0641\u064a\u0629 \u062d\u0633\u0628
|
||||
label.full.path=\u0645\u0633\u0627\u0631 \u0643\u0627\u0645\u0644
|
||||
label.guest.type=\u0646\u0648\u0639 \u0627\u0644\u0636\u064a\u0641
|
||||
label.IKE.lifetime=\u0639\u0645\u0631 IKE (\u062b\u0627\u0646\u064a\u0629)
|
||||
label.IKE.policy=\u0633\u064a\u0627\u0633\u0629 IKE
|
||||
label.instances=\u0627\u0644\u062d\u0627\u0644\u0627\u062a
|
||||
label.invitations=\u062f\u0639\u0648\u0627\u062a
|
||||
label.invited.accounts=\u062f\u0639\u0648\u0629 \u062d\u0633\u0627\u0628\u0627\u062a
|
||||
label.invite.to=\u062f\u0639\u0648\u0629 \u0644\u0640
|
||||
label.IPsec.preshared.key=\u0645\u0641\u062a\u0627\u062d \u0623\u0645\u0646 \u0628\u0631\u0648\u062a\u0648\u0643\u0648\u0644 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u062a\u0645\u062a \u0645\u0634\u0627\u0631\u0643\u062a\u0647 \u0645\u0633\u0628\u0642\u0627
|
||||
label.isolation.uri=\u0639\u0632\u0644 \u0627\u0644\u0631\u0627\u0628\u0637
|
||||
label.keyboard.type=\u0646\u0648\u0639 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d
|
||||
label.least.connections=\u0623\u0642\u0644 \u0627\u0644\u0625\u062a\u0635\u0627\u0644\u0627\u062a
|
||||
label.local.storage.enabled=\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0645\u062d\u0644\u064a
|
||||
label.make.project.owner=\u062c\u0639\u0644 \u0627\u0644\u062d\u0633\u0627\u0628 \u0645\u0627\u0644\u0643 \u0644\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.max.guest.limit=\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0627\u0621 \u0644\u0636\u064a\u0641
|
||||
label.memory.mb=\u0627\u0644\u0630\u0627\u0643\u0631\u0629 ( \u0628\u0627\u0644\u0645\u064a\u062c\u0627\u0628\u0627\u064a\u0628\u062a)
|
||||
label.memory=\u0627\u0644\u0630\u0627\u0643\u0631\u0629
|
||||
label.menu.alerts=\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a
|
||||
label.menu.all.accounts=\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a
|
||||
label.menu.all.instances=\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0627\u0644\u0627\u062a
|
||||
label.menu.community.isos=\u0627\u0644\u062a\u0636\u0627\u0645\u0646 \u0627\u0644\u062f\u0648\u0644\u064a \u0627\u0644\u0645\u062c\u062a\u0645\u0639\u064a
|
||||
label.menu.community.templates=\u0642\u0648\u0627\u0644\u0628 \u0627\u0644\u0645\u062c\u062a\u0645\u0639
|
||||
label.menu.configuration=\u062a\u0631\u062a\u064a\u0628
|
||||
label.menu.dashboard=\u0644\u0648\u062d\u0629 \u0627\u0644\u0642\u064a\u0627\u062f\u0629
|
||||
label.menu.destroyed.instances=\u062d\u0627\u0644\u0627\u062a \u0627\u0644\u062a\u062f\u0645\u064a\u0631
|
||||
label.menu.disk.offerings=\u0639\u0631\u0648\u0636 \u0627\u0644\u0642\u0631\u0635
|
||||
label.menu.domains=\u0627\u0644\u0645\u062c\u0627\u0644\u0627\u062a
|
||||
label.menu.events=\u0623\u062d\u062f\u0627\u062b
|
||||
label.menu.featured.isos=\u0645\u0645\u064a\u0632\u0627\u062a \u0627\u0644\u062a\u0636\u0627\u0645\u0646 \u0627\u0644\u062f\u0648\u0644\u064a
|
||||
label.menu.featured.templates=\u0642\u0648\u0627\u0644\u0628 \u0645\u0645\u064a\u0632\u0629
|
||||
label.menu.global.settings=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0639\u0645\u0648\u0645\u064a\u0629
|
||||
label.menu.instances=\u0627\u0644\u062d\u0627\u0644\u0627\u062a
|
||||
label.migrate.instance.to.host=\u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0645\u0636\u064a\u0641 \u0622\u062e\u0631
|
||||
label.migrate.instance.to.ps=\u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629
|
||||
label.migrate.to.host=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u0636\u064a\u0641
|
||||
label.migrate.to.storage=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062a\u062e\u0632\u064a\u0646
|
||||
label.move.down.row=\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 \u0628\u0635\u0641 \u0648\u0627\u062d\u062f
|
||||
label.move.to.bottom=\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644
|
||||
label.move.to.top=\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0623\u0639\u0644\u0649
|
||||
label.move.up.row=\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0639\u0644\u0649 \u0628\u0635\u0641 \u0648\u0627\u062d\u062f
|
||||
label.my.network=\u0634\u0628\u0643\u062a\u064a
|
||||
label.my.templates=\u0642\u0648\u0627\u0644\u0628\u064a
|
||||
label.network.ACLs=\u0634\u0628\u0643\u0629 ACLs
|
||||
label.network.ACL.total=\u0625\u062c\u0645\u0627\u0644 \u0634\u0628\u0643\u0629 ACL
|
||||
label.network.ACL=\u0634\u0628\u0643\u0629 ACL
|
||||
label.networks=\u0627\u0644\u0634\u0628\u0643\u0627\u062a
|
||||
label.new.project=\u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f
|
||||
label.new=\u062c\u062f\u064a\u062f
|
||||
label.no.data=\u0644\u0627 \u064a\u0648\u062c\u062f \u0628\u064a\u0627\u0646\u0627\u062a \u0644\u0644\u0639\u0631\u0636
|
||||
label.no.thanks=\u0644\u0627\u061b \u0634\u0643\u0631\u0627\u064b
|
||||
label.notifications=\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a
|
||||
label.ok=\u0645\u0648\u0627\u0641\u0642
|
||||
label.order=\u062a\u0631\u062a\u064a\u0628
|
||||
label.previous=\u0627\u0644\u0633\u0627\u0628\u0642
|
||||
label.private.Gateway=\u0645\u0646\u0641\u0630\\Gateway \u062e\u0627\u0635
|
||||
label.project.invite=\u062f\u0639\u0648\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.project.name=\u0627\u0633\u0645 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.projects=\u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639
|
||||
label.project=\u0645\u0634\u0631\u0648\u0639
|
||||
label.project.view=\u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.quickview=\u0646\u0638\u0631\u0629 \u0633\u0631\u064a\u0639\u0629
|
||||
label.reboot=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644
|
||||
label.remind.later=\u0630\u0643\u0631\u0646\u064a \u0644\u0627\u062d\u0642\u0627\u064b
|
||||
label.remove.ACL=\u0625\u0632\u0627\u0644\u0629 ACL
|
||||
label.remove.static.route=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a
|
||||
label.remove.tier=\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629
|
||||
label.remove.vpc=\u0625\u0632\u0627\u0644\u0629 VPC
|
||||
label.reset.VPN.connection=\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.restart.network=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629
|
||||
label.restart.required=\u0645\u0637\u0644\u0648\u0628 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644
|
||||
label.restart.vpc=\u0625\u0639\u062f\u0627\u0629 \u062a\u0634\u063a\u064a\u0644 VPC
|
||||
label.restore=\u0625\u0633\u062a\u0639\u0627\u062f\u0629
|
||||
label.review=\u0645\u0631\u0627\u062c\u0639\u0629
|
||||
label.revoke.project.invite=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062f\u0639\u0648\u0629
|
||||
label.s3.access_key=\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0648\u0635\u0648\u0644
|
||||
label.s3.bucket=\u062f\u0644\u0648
|
||||
label.s3.connection_timeout=\u0645\u0647\u0644\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644
|
||||
label.s3.endpoint=\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629
|
||||
label.s3.max_error_retry=\u0623\u0642\u0635\u0649 \u062e\u0637\u0623 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629
|
||||
label.s3.secret_key=\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a
|
||||
label.s3.socket_timeout=\u0645\u0647\u0644\u0629 \u0627\u0644\u0645\u0642\u0628\u0633
|
||||
label.s3.use_https=\u0627\u0633\u062a\u062e\u062f\u0645 HTTPS
|
||||
label.scope=\u0627\u0644\u0645\u062c\u0627\u0644
|
||||
label.search=\u0628\u062d\u062b
|
||||
label.secret.key=\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a
|
||||
label.select.a.template=\u0627\u062e\u062a\u0631 \u0642\u0627\u0644\u0628
|
||||
label.select.project=\u062d\u062f\u062f \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.select.tier=\u062d\u062f\u062f \u0637\u0628\u0642\u0629
|
||||
label.select-view=\u062d\u062f\u062f \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636
|
||||
label.service.capabilities=\u0642\u062f\u0631\u0627\u062a \u0627\u0644\u062e\u062f\u0645\u0629
|
||||
label.setup=\u0627\u0644\u062a\u062b\u0628\u064a\u062a
|
||||
label.site.to.site.VPN=\u0645\u0648\u0642\u0639 \u0625\u0644\u0649 \u0645\u0648\u0642\u0639-\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u064a\u0629 VPN
|
||||
label.source=\u0645\u0635\u062f\u0631
|
||||
label.specify.IP.ranges=\u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642\u0627\u062a IP
|
||||
label.sticky.tablesize=\u062d\u062c\u0645 \u0627\u0644\u062c\u062f\u0648\u0644
|
||||
label.stop=\u062a\u0648\u0642\u0641
|
||||
label.super.cidr.for.guest.networks=CIDR \u0645\u0645\u062a\u0627\u0632 \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0636\u064a\u0641.
|
||||
label.supported.services=\t\u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0645\u062f\u0639\u0648\u0645\u0629
|
||||
label.suspend.project=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
label.tier.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0637\u0628\u0642\u0629
|
||||
label.tier=\u0637\u0628\u0642\u0629
|
||||
label.upload=\u0631\u0641\u0639
|
||||
label.view.all=\u0639\u0631\u0636 \u0627\u0644\u0643\u0644
|
||||
label.viewing=\u0639\u0631\u0636
|
||||
label.view=\u0639\u0631\u0636
|
||||
label.vm.destroy=\u0647\u062f\u0645
|
||||
label.vm.reboot=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644
|
||||
label.VMs.in.tier=\u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0641\u064a \u0637\u0628\u0642\u0629
|
||||
label.vm.stop=\u062a\u0648\u0642\u0641
|
||||
label.volume.limits=\u062d\u062f\u0648\u062f \u0627\u0644\u0645\u0646\u0637\u0642\u0629
|
||||
label.vpc.id=\u0647\u0648\u064a\u0629 \u062e\u0627\u0635\u0629 \u0628\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629
|
||||
label.VPC.router.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u062c\u0647\u0627\u0632 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 VPC
|
||||
label.vpc=\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC
|
||||
label.VPN.connection=\u0625\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.vpn.customer.gateway=\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0644\u0644\u0639\u0645\u064a\u0644
|
||||
label.VPN.customer.gateway=\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0644\u0644\u0639\u0645\u064a\u0644
|
||||
label.VPN.gateway=\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
label.waiting=\u0642\u064a\u062f \u0627\u0644\u0625\u0646\u062a\u0638\u0627\u0631
|
||||
label.warn=\u062a\u062d\u0630\u064a\u0631
|
||||
label.wednesday=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
|
||||
label.weekly=\u0625\u0633\u0628\u0648\u0639\u064a
|
||||
label.welcome.cloud.console=\u0645\u0631\u062d\u0628\u0627 \u0628\u0643\u0645 \u0641\u064a \u0648\u062d\u062f\u0629 \u0627\u0644\u062a\u062d\u0643\u0645 \u0627\u0644\u0625\u0631\u0627\u062f\u064a\u0629
|
||||
label.welcome=\u0645\u0631\u062d\u0628\u0627
|
||||
label.yes=\u0646\u0639\u0645
|
||||
label.zone.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0646\u0637\u0642\u0629
|
||||
label.zone.name=\u0627\u0633\u0645 \u0627\u0644\u0645\u0646\u0637\u0642\u0629
|
||||
label.zone.step.1.title=\u0627\u0644\u062e\u0637\u0648\u0629 1 \\\: \u0639\u0644\u0649 .<\u0642\u0648\u064a> \u0627\u062e\u062a\u0631 \u0634\u0628\u0643\u0629 </ \u0642\u0648\u064a>
|
||||
label.zone.step.2.title=\u0627\u0644\u062e\u0637\u0648\u0629 2 \\\: <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0645\u0646\u0637\u0642\u0629 </ \u0642\u0648\u064a>
|
||||
label.zone.step.3.title=\u0627\u0644\u062e\u0637\u0648\u0629 3 \\\: \u0639\u0644\u0649 <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u062f </ \u0642\u0648\u064a>
|
||||
label.zone.step.4.title=\u0627\u0644\u062e\u0637\u0648\u0629 4 \\\: <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0645\u062c\u0645\u0648\u0639\u0629 IP <\\\u0642\u0648\u064a>
|
||||
label.zone.wide=\u0645\u0646\u0637\u0642\u0629 \u0648\u0627\u0633\u0639\u0629
|
||||
label.zoneWizard.trafficType.guest=\u0627\u0644\u0636\u064a\u0641 \\\: \u0627\u0644\u062d\u0631\u0643\u0629 \u0628\u064a\u0646 \u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0646\u0647\u0627\u0626\u064a.
|
||||
label.zoneWizard.trafficType.public=\u0627\u0644\u0639\u0627\u0645\u0629 \\\: \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u064a\u0646 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u064a\u0629 \u0641\u064a \u0627\u0644\u0633\u062d\u0627\u0628\u0629.
|
||||
label.zoneWizard.trafficType.storage=\u0627\u0644\u062a\u062e\u0632\u064a\u0646 \\\: \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u064a\u0646 \u0645\u0644\u0642\u0645\u0627\u062a \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0627\u0628\u062a\u062f\u0627\u0626\u064a\u0629 \u0648\u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629\u060c \u0645\u062b\u0644 \u0642\u0648\u0627\u0644\u0628 VM \u0648\u0627\u0644\u0644\u0642\u0637\u0627\u062a
|
||||
message.acquire.new.ip.vpc=\u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0628\u0648\u0631\u062a\u0648\u0643\u0648\u0644 \u0625\u0646\u062a\u0631\u0646\u062a \u062c\u062f\u064a\u062f \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0627\u0633\u0648\u0628 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a.
|
||||
message.action.delete.system.service.offering=\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u062e\u062f\u0645\u0629 \u0627\u0644\u0646\u0638\u0627\u0645 \u0627\u0644\u0645\u0642\u062f\u0645\u0629.
|
||||
message.action.disable.physical.network=\u0641\u0636\u0644\u0627 \u060c \u0623\u0643\u0651\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0647 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629
|
||||
message.action.enable.physical.network=\u0641\u0636\u0644\u0627 \u060c \u0623\u0643\u0651\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0645\u0643\u064a\u0646 \u0647\u0630\u0647 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629
|
||||
message.activate.project=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0641\u0639\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f
|
||||
message.add.domain=\u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u062c\u0627\u0644 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0625\u0646\u0634\u0627\u0621 \u062a\u062d\u062a \u0647\u0630\u0627 \u0627\u0644\u0646\u0637\u0627\u0642
|
||||
message.add.new.gateway.to.vpc=\u0641\u0636\u0644\u0627 \u062d\u062f\u062f \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0644\u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u0627\u0628\u0629 gateway \u0644\u0647\u0630\u0647 \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 VPC
|
||||
message.add.system.service.offering=\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0639\u0628\u0626\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0644\u0625\u0636\u0627\u0641\u0629 \u0646\u0638\u0627\u0645 \u062c\u062f\u064a\u062f \u0644\u0637\u0631\u062d
|
||||
message.add.VPN.gateway=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN
|
||||
message.after.enable.s3=\u062a\u0645 \u0625\u0639\u062f\u0627\u062f \u0627\u0644\u062a\u062e\u0632\u064a\u0646 S3 \u0644\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629. \u062a\u0646\u0648\u064a\u0647 \: \u0639\u0646\u062f \u0645\u063a\u0627\u062f\u0631\u062a\u0643 \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629 \u0644\u0646 \u064a\u0643\u0648\u0646 \u0628\u0625\u0645\u0643\u0627\u0646\u0643 \u0625\u0639\u0627\u062f\u0629 \u0636\u0628\u0637 S3 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649.
|
||||
message.confirm.join.project=\u0646\u0631\u062c\u0648 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0641\u064a \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
message.decline.invitation=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0631\u0641\u0636 \u0647\u0630\u0647 \u0627\u0644\u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639\u061f
|
||||
message.delete.gateway=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629
|
||||
message.delete.project=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f
|
||||
message.delete.user=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062d\u0630\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645
|
||||
message.delete.VPN.connection=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN
|
||||
message.delete.VPN.gateway=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629
|
||||
message.detach.disk=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0641\u0635\u0644 \u0647\u0630\u0627 \u0627\u0644\u0642\u0631\u0635\u061f
|
||||
message.disable.user=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645
|
||||
message.enable.account=\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0645\u0643\u064a\u0646 \u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628.
|
||||
message.enable.user=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u0641\u0639\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645
|
||||
message.generate.keys=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u0625\u0646\u0634\u0627\u0621 \u0645\u0641\u0627\u062a\u064a\u062d \u062c\u062f\u064a\u062f\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645
|
||||
message.instanceWizard.noTemplates=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0642\u0648\u0627\u0644\u0628 \u0645\u062a\u0627\u062d\u0629\u061b \u064a\u0631\u062c\u0649 \u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0644\u0628 \u0645\u062a\u0648\u0627\u0641\u0642\u060c \u0648\u0625\u0639\u0627\u062f\u0629 \u0625\u0637\u0644\u0627\u0642 \u0627\u0644\u0645\u0639\u0627\u0644\u062c .
|
||||
message.join.project=\u0644\u0642\u062f \u0627\u0646\u0636\u0645\u0645\u062a \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0628\u062f\u064a\u0644 \u0625\u0644\u0649 \u0637\u0631\u064a\u0642\u0629 \u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0644\u0631\u0624\u064a\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
|
||||
message.migrate.instance.to.host=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0645\u0636\u064a\u0641 \u0622\u062e\u0631.
|
||||
message.migrate.instance.to.ps=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629.
|
||||
message.no.projects.adminOnly=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0645\u0634\u0627\u0631\u064a\u0639. <br/> \u0627\u0644\u0631\u062c\u0627\u0621 \u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0645\u0633\u0624\u0648\u0644 \u0625\u0646\u0634\u0627\u0621 \u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f.
|
||||
message.no.projects=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0645\u0634\u0627\u0631\u064a\u0639. <br/> \u064a\u0631\u062c\u0649 \u0625\u0646\u0634\u0627\u0621 \u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f \u0645\u0646 \u0642\u0633\u0645 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639.
|
||||
message.pending.projects.1=\u0644\u062f\u064a\u0643 \u062f\u0639\u0648\u0627\u062a \u0645\u0634\u0631\u0648\u0639 \u0645\u0639\u0644\u0642\u0629/\:
|
||||
message.pending.projects.2=\u0644\u0639\u0631\u0636\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0630\u0647\u0627\u0628 \u0625\u0644\u0649 \u0642\u0633\u0645 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639\u060c \u062b\u0645 \u062d\u062f\u062f \u062f\u0639\u0648\u0627\u062a \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0646\u0633\u062f\u0644\u0629.
|
||||
message.please.select.networks=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0634\u0628\u0643\u0627\u062a \u0644\u062c\u0647\u0627\u0632\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a
|
||||
message.project.invite.sent=\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062f\u0639\u0648\u0629 ; \u0633\u064a\u062a\u0645 \u0625\u0636\u0627\u0641\u062a\u0647\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0628\u0645\u062c\u0631\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062f\u0639\u0648\u0629
|
||||
message.remove.vpc=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0627\u0644\u0640VPC
|
||||
message.reset.password.warning.notPasswordEnabled=\u0627\u0644\u0642\u0627\u0644\u0628 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u062a\u0645 \u0627\u0646\u0634\u0627\u0626\u0647 \u0645\u0646 \u062f\u0648\u0646 \u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u0645\u0645\u0643\u0646\u0629
|
||||
message.reset.password.warning.notStopped=\u064a\u062c\u0628 \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0642\u0628\u0644 \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u063a\u064a\u064a\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629
|
||||
message.reset.VPN.connection=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0625\u0639\u0627\u062f\u0629-\u0636\u0628\u0637 \u0625\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN
|
||||
message.restart.vpc=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0640VPN
|
||||
message.select.template=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0642\u0627\u0644\u0628 \u0644\u0645\u062b\u0627\u0644\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0627\u0644\u062c\u062f\u064a\u062f
|
||||
message.step.2.desc=
|
||||
message.step.3.desc=
|
||||
message.suspend.project=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0625\u064a\u0642\u0627\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f
|
||||
message.update.resource.count=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u062d\u062f\u064a\u062b \u0645\u0635\u0627\u062f\u0631 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628
|
||||
message.vm.review.launch=\u064a\u0631\u062c\u0649 \u0645\u0631\u0627\u062c\u0639\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0648\u062a\u0623\u0643\u062f \u0623\u0646 \u0645\u062b\u0627\u0644\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0635\u062d\u064a\u062d \u0642\u0628\u0644 \u0627\u0644\u0625\u0646\u0637\u0644\u0627\u0642
|
||||
message.zoneWizard.enable.local.storage=\u062a\u062d\u0630\u064a\u0631\\\: \u0625\u0630\u0627 \u0642\u0645\u062a \u0628\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0645\u062d\u0644\u064a\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0637\u0627\u0642 \u064a\u062c\u0628 \u0639\u0644\u064a\u0643 \u0639\u0645\u0644 \u0627\u0644\u0622\u062a\u064a \u060c \u0625\u0639\u062a\u0645\u0627\u062f\u0627 \u0639\u0644\u0649 \u0627\u0644\u0645\u0643\u0627\u0646 \u0627\u0644\u0630\u064a \u062a\u0631\u063a\u0628 \u0623\u0646 \u064a\u0646\u0637\u0644\u0642 \u0645\u0646\u0647 \u0646\u0638\u0627\u0645\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \\\: </br><br/> 1.\u0625\u0630\u0627 \u0643\u0627\u0646 \u0646\u0638\u0627\u0645\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u064a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0625\u0628\u062a\u062f\u0627\u0626\u064a\u0629
|
||||
notification.reboot.instance=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
|
||||
notification.start.instance=\u0628\u062f\u0621 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
|
||||
notification.stop.instance=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
|
||||
state.Accepted=\u062a\u0645 \u0627\u0644\u0642\u0628\u0648\u0644
|
||||
state.Active=\u0646\u0634\u0637
|
||||
state.Allocated=\u062a\u062e\u0635\u064a\u0635
|
||||
state.Completed=\u062a\u0645 \u0627\u0644\u0627\u0643\u0645\u0627\u0644
|
||||
state.Creating=\u0625\u0646\u0634\u0627\u0621
|
||||
state.Declined=\u062a\u0645 \u0627\u0644\u0631\u0641\u0636
|
||||
state.Destroyed=\u062f\u0645\u0631
|
||||
state.enabled=\u062a\u0645\u0643\u064a\u0646
|
||||
state.Enabled=\u062a\u0645\u0643\u064a\u0646
|
||||
state.Error=\u062e\u0637\u0623
|
||||
state.Expunging=\u0645\u062d\u0648
|
||||
state.Pending=\u0641\u064a \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631
|
||||
state.ready=\u062c\u0627\u0647\u0632
|
||||
state.Ready=\u062c\u0627\u0647\u0632
|
||||
state.Stopped=\u062a\u0648\u0642\u0641
|
||||
state.Suspended=\u062a\u0645 \u0627\u0644\u0625\u064a\u0642\u0627\u0641
|
||||
ui.listView.filters.all=\u0627\u0644\u0643\u0644
|
||||
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
confirm.enable.swift=Si us plau ompliu la seg\u00fcent informaci\u00f3 per habilitar el suport per a Swift
|
||||
error.installWizard.message=Quelcom ha fallat, vost\u00e8 pot tornar enrere i corregir els errors detalls suggerime
|
||||
error.password.not.match=Els camps de contrasenya no coincideixen
|
||||
|
|
|
|||
|
|
@ -15,13 +15,14 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
error.installWizard.message=Ein Fehler ist aufgetreten; Sie k\u00f6nnen zur\u00fcckgehen und den Fehler korregieren
|
||||
error.login=Ihr Benutzername / Passwort stimmt nicht mit uneren unseren Aufzeichnungen \u00fcberein.
|
||||
error.session.expired=Ihre Sitzung ist abgelaufen.
|
||||
force.delete.domain.warning=Achtung\: Diese Auswahl f\u00fchrt zu einer L\u00f6schung aller untergeordneten Domains und aller angeschlossenen Konten sowie ihrer Quellen.
|
||||
force.delete=Erzwinge L\u00f6schung
|
||||
force.remove=Erzwinge Entfernung
|
||||
force.remove.host.warning=Achtung\: Diese Auswahl wird CloudStack zum sofortigen Anhalten der virtuellen Maschine f\u00fchren, bevor der Host vom Cluster entfernt wurde.
|
||||
force.remove.host.warning=Achtung\: Diese Auswahl wird CloudStack zum sofortigen Anhalten der virtuellen Maschine f\u00fchren, bevor der Host vom Cluster entfernt wurde.
|
||||
force.stop=Erzwinge Abbruch
|
||||
ICMP.code=ICMP Code
|
||||
ICMP.type=ICMP-Typ
|
||||
|
|
@ -159,7 +160,7 @@ label.action.migrate.instance.processing=Umziehen einer Instanz
|
|||
label.action.reboot.instance=Instanz neustarten
|
||||
label.action.reboot.instance.processing=Neustarten der Instanz...
|
||||
label.action.reboot.router.processing=Neustart vom Router ....
|
||||
label.action.reboot.router=Router neu starten
|
||||
label.action.reboot.router=Router neu starten
|
||||
label.action.reboot.systemvm.processing=Neustart-System VM ....
|
||||
label.action.reboot.systemvm=System VM neu starten
|
||||
label.action.release.ip=IP ver\u00f6ffentlichen
|
||||
|
|
@ -271,7 +272,7 @@ label.cidr=CIDR
|
|||
label.cidr.list=Quelle CIDR
|
||||
label.close=Schliessen
|
||||
label.cloud.console=Cloud Management Konsole
|
||||
label.cloud.managed=Geleitet von cloud.com
|
||||
label.cloud.managed=Geleitet von cloud.com
|
||||
label.cluster=Cluster
|
||||
label.cluster.type=Cluster-Typ
|
||||
label.code=Code
|
||||
|
|
@ -279,7 +280,7 @@ label.configuration=Konfiguration
|
|||
label.confirmation=Best\u00e4tigung
|
||||
label.congratulations=Herzlichen Gl\u00fcckwunsch
|
||||
label.corrections.saved=Korrekturen gespeichert
|
||||
label.cpu.allocated=Zugeteilte CPU
|
||||
label.cpu.allocated=Zugeteilte CPU
|
||||
label.CPU.cap=CPU Obergrenze
|
||||
label.cpu=CPU
|
||||
label.cpu.mhz=CPU (in MHz)
|
||||
|
|
@ -708,7 +709,7 @@ message.enable.account=Bitte best\u00e4tigen Sie, dass Sie dieses Konto aktivier
|
|||
message.enabled.vpn=Ihr VPN Zugriff ist zurzeit aktiv und via IP k\u00f6nnen Sie darauf zugreifen
|
||||
message.enable.vpn.access=VPN ist zurzeit nicht f\u00fcr diese IP Addresse aktiviert. M\u00f6chten Sie den VPN Zugriff aktivieren?
|
||||
message.installWizard.click.retry=Bitte den Start Button f\u00fcr einen neuen Versuch dr\u00fccken
|
||||
message.installWizard.tooltip.addCluster.name=Der Name des Clusters. Der Name kann frei gew\u00e4hlt werden und wird von Cloudstack nicht genutzt.
|
||||
message.installWizard.tooltip.addCluster.name=Der Name des Clusters. Der Name kann frei gew\u00e4hlt werden und wird von Cloudstack nicht genutzt.
|
||||
message.installWizard.tooltip.addHost.hostname=Der DNS-Name oder die IP-Adresse des hosts
|
||||
message.installWizard.tooltip.addHost.password=Dies ist das Passwort des o.a. Users (von der XenServer Installation)
|
||||
message.installWizard.tooltip.addHost.username=\u00fcberlicherweise root
|
||||
|
|
@ -717,16 +718,16 @@ message.installWizard.tooltip.addPod.reservedSystemGateway=Das Gateways f\u00fcr
|
|||
message.installWizard.tooltip.addPod.reservedSystemNetmask=Die Subnetzmaske des Gast-Netzwerks
|
||||
message.installWizard.tooltip.addPrimaryStorage.name=Der Name der Storage Devices
|
||||
message.installWizard.tooltip.addPrimaryStorage.path=(f\u00fcr NFS) Bei NFS wird hier der exportierte Pfad (Shared Mount Point) angegeben. F\u00fcr KVM wird hier der Pfad angegeben, wo auf jedem Host das primary storage gemountet wurde. Z.B. "/mnt/primary"
|
||||
message.installWizard.tooltip.addPrimaryStorage.server=(f\u00fcr NFS, iSCSI oder PreSetup) Die IP-Adresse oder der DNS-Name des storage devices.
|
||||
message.installWizard.tooltip.addSecondaryStorage.nfsServer=Die IP-Adresse des NFS-Servers, der den Secondary Storage bereitstellt.
|
||||
message.installWizard.tooltip.addSecondaryStorage.path=Der exportierte Pfad, der auf dem o.a. Server liegt.
|
||||
message.installWizard.tooltip.addPrimaryStorage.server=(f\u00fcr NFS, iSCSI oder PreSetup) Die IP-Adresse oder der DNS-Name des storage devices.
|
||||
message.installWizard.tooltip.addSecondaryStorage.nfsServer=Die IP-Adresse des NFS-Servers, der den Secondary Storage bereitstellt.
|
||||
message.installWizard.tooltip.addSecondaryStorage.path=Der exportierte Pfad, der auf dem o.a. Server liegt.
|
||||
message.installWizard.tooltip.addZone.name=Der Name f\u00fcr die zone
|
||||
message.installWizard.tooltip.configureGuestTraffic.description=Eine Beschreibung des Netzwerkes.
|
||||
message.installWizard.tooltip.configureGuestTraffic.guestGateway=Das gateway, welches der Gast benutzen soll.
|
||||
message.installWizard.tooltip.configureGuestTraffic.description=Eine Beschreibung des Netzwerkes.
|
||||
message.installWizard.tooltip.configureGuestTraffic.guestGateway=Das gateway, welches der Gast benutzen soll.
|
||||
message.installWizard.tooltip.configureGuestTraffic.guestNetmask=Die Subnetzmaske des Gast-Netzwerks
|
||||
message.installWizard.tooltip.configureGuestTraffic.name=Der Name f\u00fcr das Netzwerk
|
||||
message.migrate.instance.to.host=Bitte best\u00e4tigen sie, dass die Instanz auf einen anderen Host migriert werden soll
|
||||
message.migrate.instance.to.ps=Bitte best\u00e4tigen sie, dass sie die Instanz auf einen anderen prim\u00e4ren Speicher migrieren wollen.
|
||||
message.migrate.instance.to.ps=Bitte best\u00e4tigen sie, dass sie die Instanz auf einen anderen prim\u00e4ren Speicher migrieren wollen.
|
||||
message.new.user=Spezifieren Sie das folgende um einen neuen Nutzer dem Benutzerkonto hinzuzuf\u00fcgen
|
||||
message.remove.vpn.access=Bitte best\u00e4tigen Sie, dass Sie den VPN-Zugriff vom folgenden Benutzer entfernen m\u00f6chten.
|
||||
message.setup.successful=Cloud setup erfolgreich
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
changed.item.properties=Elementi delle propriet\u00e0 modificati
|
||||
confirm.enable.s3=Si prega di inserire i valori richiesti per abilitare il supporto per il Secondary Storage di tipo S3
|
||||
confirm.enable.swift=Si prega di inserire i valori richiesti per abilitare il supporto per Swift
|
||||
|
|
@ -432,7 +433,6 @@ label.zone.name=Nome Zona
|
|||
label.zones=Zone
|
||||
label.zone.type=Tipo di Zona
|
||||
label.zoneWizard.trafficType.guest=Guest\: Traffico di rete tra le virtual machine dell\\'utente finale
|
||||
label.zoneWizard.trafficType.management=Management\: Traffico di rete tra le risorse interne di CloudStack, incluso qualsiasi componente che comunichi con il Management Server, come ad esempio gli host e le VM di Sistema di CloudStack
|
||||
label.zoneWizard.trafficType.public=Public\: Traffico di rete tra la rete internet e le virtual machine nell\\'infrastruttura cloud.
|
||||
label.zoneWizard.trafficType.storage=Storage\: Traffico di rete tra i server di primary e secondary storage, come ad esempio i template delle VM e le operazioni di snapshot
|
||||
message.acquire.new.ip=Si prega di confermare di voler acquisire un nuovo indirizzo IP per questa rete.
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
changed.item.properties=\ud56d\ubaa9 \uc18d\uc131 \ubcc0\uacbd
|
||||
confirm.enable.swift=Swift \uae30\uc220 \uc9c0\uc6d0\ub97c \uc0ac\uc6a9 \ud558\ub824\uba74 \ub2e4\uc74c \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
error.could.not.enable.zone=Zone\uc744 \uc0ac\uc6a9 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.
|
||||
|
|
@ -1193,7 +1194,6 @@ message.add.load.balancer.under.ip=\ub2e4\uc74c IP \uc8fc\uc18c\uc5d0 \ub300\ud5
|
|||
message.add.load.balancer=Zone\uc5d0 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.
|
||||
message.add.network=Zone <b><span id\="zone_name"></span></b>\uc5d0 \uc0c8\ub85c\uc6b4 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.
|
||||
message.add.new.gateway.to.vpc=\ud604\uc7ac VPC\uc5d0 \uc0c8\ub85c\uc6b4 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud55c \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.add.pod.during.zone.creation=\uac01 Zone\uc5d0\ub294 \ud55c \uac1c \uc774\uc0c1 Pod\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 Pod\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. Pod\ub294 \ud638\uc2a4\ud2b8\uc640 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131\ud569\ub2c8\ub2e4\ub9cc \uc774\ub294 \ub2e4\uc74c \uc21c\uc11c\ub85c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub9e8 \ucc98\uc74c CloudStack \ub0b4\ubd80 \uad00\ub9ac \ud2b8\ub798\ud53d\uc744 \uc704\ud574\uc11c IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc608\uc57d\ud569\ub2c8\ub2e4. IP \uc8fc\uc18c \ubc94\uc704\ub294 \ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 \uac01 Zone\uc5d0\uc11c \uc911\ubcf5 \ud558\uc9c0 \uc54a\uac8c \uc608\uc57d\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.
|
||||
message.add.pod=Zone <b><span id\="add_pod_zone_name"></span></b>\uc5d0 \uc0c8\ub85c\uc6b4 Pod\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.
|
||||
message.add.primary.storage=Zone <b><span id\="zone_name"></span></b> Pod <b><span id\="pod_name"></span></b>\uc5d0 \uc0c8\ub85c\uc6b4 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.
|
||||
message.add.primary=\uc0c8\ub85c\uc6b4 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
|
|
@ -1253,7 +1253,6 @@ message.delete.VPN.gateway=\ud604\uc7ac VPN \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c
|
|||
message.desc.advanced.zone=\ubcf4\ub2e4 \uc138\ub828\ub41c \ub124\ud2b8\uc6cc\ud06c \uae30\uc220\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud558\uba74, \ubcf4\ub2e4 \uc720\uc5f0\ud558\uac8c \uac8c\uc2a4\ud2b8 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc815\ud558\uace0 \ubc29\ud654\ubcbd(fire wall), VPN, \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \uae30\uc220 \uc9c0\uc6d0\uc640 \uac19\uc740 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ud55c \ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
|
||||
message.desc.basic.zone=\uac01 VM \uc778\uc2a4\ud134\uc2a4\uc5d0 IP \uc8fc\uc18c\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc9c1\uc811 \ud560\ub2f9\ud560 \uc218 \uc788\ub294 \ub2e8\uc77c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubcf4\uc548 \uadf8\ub8f9 (\uc804\uc1a1\uc6d0 IP \uc8fc\uc18c \ud544\ud130)\uacfc \uac19\uc740 \uce35 \uc138 \uac00\uc9c0 \ub808\ubca8 \ubc29\ubc95\uc73c\ub85c \uac8c\uc2a4\ud2b8\ub97c \ubd84\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
|
||||
message.desc.cluster=\uac01 Pod\uc5d0\ub294 \ud55c \uac1c \uc774\uc0c1 \ud074\ub7ec\uc2a4\ud130\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \ucd5c\ucd08 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 \ud638\uc2a4\ud2b8\ub97c \uadf8\ub8f9\ud654 \ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ud55c \ud074\ub7ec\uc2a4\ud130 \ub0b4\ubd80 \ud638\uc2a4\ud2b8\ub294 \ubaa8\ub450 \ub3d9\uc77c\ud55c \ud558\ub4dc\uc6e8\uc5b4\uc5d0\uc11c \uad6c\uc131\ub418\uc5b4 \uac19\uc740 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc2e4\ud589\ud558\uace0 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0 \uc788\uc5b4 \uac19\uc740 \uacf5\uc720 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc811\uadfc \ud569\ub2c8\ub2e4. \uac01 \ud074\ub7ec\uc2a4\ud130\ub294 \ud55c \uac1c \uc774\uc0c1 \ud638\uc2a4\ud2b8\uc640 \ud55c \uac1c \uc774\uc0c1 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131\ub429\ub2c8\ub2e4.
|
||||
message.desc.host=\uac01 \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \uac8c\uc2a4\ud2b8 VM\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \ud638\uc2a4\ud2b8 (\ucef4\ud4e8\ud130)\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. CloudStack\uc73c\ub85c \ud638\uc2a4\ud2b8\ub97c \ub3d9\uc791\ud558\ub824\uba74 \ud638\uc2a4\ud2b8\uc5d0\uac8c \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc124\uce58\ud558\uace0 IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud574 \ud638\uc2a4\ud2b8\uac00 CloudStack \uad00\ub9ac \uc11c\ubc84\uc5d0 \uc811\uc18d\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4. <br/><br/>\ud638\uc2a4\ud2b8 DNS \uba85 \ub610\ub294 IP \uc8fc\uc18c, \uc0ac\uc6a9\uc790\uba85(\uc6d0\ub798 root)\uacfc \uc554\ud638 \ubc0f \ud638\uc2a4\ud2b8 \ubd84\ub958\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ub77c\ubca8\uc744 \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.desc.primary.storage=\uac01 \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \uc11c\ubc84\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 \ud074\ub7ec\uc2a4\ud130 \ub0b4 \ubd80 \ud638\uc2a4\ud2b8\uc0c1\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ubaa8\ub4e0 VM \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ud37c \ubc14\uc774\uc800\uc5d0\uc11c \uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \ud45c\uc900\uc5d0 \uc900\uac70\ud55c \ud504\ub85c\ud1a0\ucf5c\uc744 \uc0ac\uc6a9\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.desc.secondary.storage=\uac01 Zone\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1\uc758 NFS \uc989 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \uc11c\ubc84\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 VM \ud15c\ud50c\ub9bf, ISO \uc774\ubbf8\uc9c0 \ubc0f VM \ub514\uc2a4\ud06c \ubcfc\ub968 \uc2a4\ub0c5\uc0f7\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uc774 \uc11c\ubc84\ub294 Zone\ub0b4 \ubaa8\ub4e0 \ud638\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. <br/><br/>IP \uc8fc\uc18c\uc640 \ub0b4\ubcf4\ub0b4\ub0bc \uacbd\ub85c\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.desc.zone=Zone\uc740 CloudStack \ud658\uacbd\ub0b4 \ucd5c\ub300 \uc870\uc9c1 \ub2e8\uc704\ub85c \uc6d0\ub798 \ub2e8\uc77c \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4. Zone\uc5d0 \ud574\uc11c \ubb3c\ub9ac\uc801\uc778 \ubd84\ub9ac\uc640 \uc911\ubcf5\uc131\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Zone\uc740 \ud55c \uac1c \uc774\uc0c1 Pod( \uac01 Pod\ub294 \ud638\uc2a4\ud2b8\uc640 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131)\uc640 Zone\ub0b4 \ubaa8\ub4e0 Pod\ub85c \uacf5\uc720\ub418\ub294 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4.
|
||||
|
|
@ -1381,7 +1380,6 @@ message.step.3.continue=\uc2e4\ud589\ud558\ub824\uba74 \ub514\uc2a4\ud06c\uc81c\
|
|||
message.step.3.desc=
|
||||
message.step.4.continue=\uc2e4\ud589\ud558\ub824\uba74 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.step.4.desc=\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uac00 \uc811\uc18d\ud558\ub294 \uae30\ubcf8 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.storage.traffic=\ud638\uc2a4\ud2b8\ub098 CloudStack \uc2dc\uc2a4\ud15c VM \ub4f1 \uad00\ub9ac \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud558\ub294 CloudStack \ub0b4\ubd80 \uc790\uc6d0\uac04 \ud2b8\ub798\ud53d\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c \uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc8fc\uc2ed\uc2dc\uc624.
|
||||
message.suspend.project=\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \uc77c\uc2dc\uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?
|
||||
message.template.desc=VM\uc758 \uc2dc\uc791\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 OS \uc774\ubbf8\uc9c0
|
||||
message.tooltip.dns.1=Zone\ub0b4 VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Zone \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
changed.item.properties=Endrede egenskaper
|
||||
error.could.not.enable.zone=Kunne ikke aktivere sonen
|
||||
error.installWizard.message=Noe gikk galt. G\u00e5 tilbake og korriger feilene.
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
changed.item.properties=Alteradas propriedades do item
|
||||
confirm.enable.s3=Por favor preencha as informa\u00e7\u00f5es abaixo para habilitar suporte a storage secund\u00e1ria fornecida por S3
|
||||
confirm.enable.swift=Por favor preencha as informa\u00e7\u00f5es abaixo para habilitar suporte ao Swift
|
||||
|
|
@ -1112,7 +1113,6 @@ label.zones=Zonas
|
|||
label.zone.type=Tipo de Zona
|
||||
label.zone.wide=Zone-Wide
|
||||
label.zoneWizard.trafficType.guest=H\u00f3spede\: tr\u00e1fego entre m\u00e1quinas virtuais de usu\u00e1rios finais
|
||||
label.zoneWizard.trafficType.management=Ger\u00eancia\: tr\u00e1fego entre recursos internos do CloudStack, incluindo quaisquer componentes que se comunicam com o servidor de gerenciamento, tais como hosts e m\u00e1quinas virtuais de sistema do CloudStack
|
||||
label.zoneWizard.trafficType.public=P\u00fablico\: tr\u00e1fego entre a internet e m\u00e1quinas virtuais na nuvem.
|
||||
label.zoneWizard.trafficType.storage=Storage\: tr\u00e1fego entre servidores de storage prim\u00e1ria e secund\u00e1ria, tais como templates de m\u00e1quinas virtuais e snapshots
|
||||
label.zone=Zona
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
changed.item.properties=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b
|
||||
confirm.enable.swift=\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438 Swift
|
||||
error.could.not.enable.zone=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443
|
||||
|
|
@ -1130,7 +1131,6 @@ message.additional.networks.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u044
|
|||
message.add.load.balancer=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u0437\u043e\u043d\u0443
|
||||
message.add.load.balancer.under.ip=\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 IP\:
|
||||
message.add.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043d\u044b\: <b><span id\="zone_name"></span></b>
|
||||
message.add.pod.during.zone.creation=\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u044b\u043c. \u0421\u0442\u0435\u043d\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0437\u043b\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0448\u0430\u0433\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 IP \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0435\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 IP \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u043e\u043d\u044b \u043e\u0431\u043b\u0430\u043a\u0430.
|
||||
message.add.pod=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0434\u043b\u044f \u0437\u043e\u043d\u044b <b><span id\="add_pod_zone_name"></span></b>
|
||||
message.add.primary.storage=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u0437\u043e\u043d\u044b <b><span id\="zone_name"></span></b>, \u0441\u0442\u0435\u043d\u0434\u0430 <b><span id\="pod_name"></span></b>
|
||||
message.add.primary=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430
|
||||
|
|
@ -1185,7 +1185,6 @@ message.delete.user=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442
|
|||
message.desc.advanced.zone=\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0439. \u042d\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043c\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d, VPN, \u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.
|
||||
message.desc.basic.zone=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0412\u041c \u0438\u043c\u0435\u0435\u0442 \u00ab\u0431\u0435\u043b\u044b\u0439\u00bb IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0442\u0438. \u0418\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u0438 3-\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f IP-\u0432\u0434\u0440\u0435\u0441\u043e\u0432)
|
||||
message.desc.cluster=\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u0443\u0437\u043b\u043e\u0432. \u0423\u0437\u043b\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449.
|
||||
message.desc.host=\u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b (\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440) \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0412\u041c, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0437\u043b\u0430 \u0432 CloudStack \u0432\u0430\u0436\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 IP \u043a \u0443\u0437\u043b\u0443 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f CloudStack.<br/><br/>\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0438\u043c\u044f DNS \u0438\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 IP, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043a \u041e\u0421 (\u043e\u0431\u044b\u0447\u043d\u043e root), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432.
|
||||
message.desc.primary.storage=\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441. \u041f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0443\u0437\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430.
|
||||
message.desc.secondary.storage=\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c NFS \u0438\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0438 \u0438\u0445 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0412\u041c, \u043e\u0431\u0440\u0430\u0437\u043e\u0432 ISO \u0438 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0412\u041c. \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432 \u0437\u043e\u043d\u044b.<br/><br/>\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c IP-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0443\u0442\u044c.
|
||||
message.desc.zone=layer 3
|
||||
|
|
@ -1310,7 +1309,6 @@ message.step.3.continue=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\
|
|||
message.step.3.desc=
|
||||
message.step.4.continue=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0443 \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f.
|
||||
message.step.4.desc=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430.
|
||||
message.storage.traffic=\u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 CloudStack, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0445\u043e\u0441\u0442\u044b \u0438 CloudStack \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0442\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c.
|
||||
message.suspend.project=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442?
|
||||
message.template.desc=\u041e\u0431\u0440\u0430\u0437 \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u043e\u0439 \u0432 \u0412\u041c
|
||||
message.tooltip.dns.1=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
|
||||
changed.item.properties=\u66f4\u6539\u9879\u76ee\u5c5e\u6027
|
||||
confirm.enable.s3=\u8bf7\u586b\u5199\u4e0b\u5217\u4fe1\u606f\u4ee5\u542f\u7528\u652f\u6301S3\u7684\u4e8c\u7ea7\u5b58\u50a8
|
||||
confirm.enable.swift=\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 SWIFT \u7684\u652f\u6301
|
||||
|
|
@ -1164,7 +1165,6 @@ label.zone.type=\u533a\u57df\u7c7b\u578b
|
|||
label.zone=\u533a\u57df
|
||||
label.zone.wide=\u6574\u4e2a\u533a\u57df
|
||||
label.zoneWizard.trafficType.guest=\u6765\u5bbe\u7f51\u7edc\: \u5ba2\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u7f51\u7edc\u6d41\u91cf
|
||||
label.zoneWizard.trafficType.management=\u7ba1\u7406\u7f51\: CloudStack\u5185\u90e8\u8d44\u6e90\u4e4b\u95f4\u7684\u7f51\u7edc\u6d41\u91cf, \u5305\u62ec\u4e0e\u7ba1\u7406\u670d\u52a1\u5668\u4ea4\u4e92\u7684\u4efb\u4f55\u7ec4\u4ef6, \u6bd4\u5982\u4e3b\u673a\u548cCloudStack\u7cfb\u7edf\u865a\u62df\u673a
|
||||
label.zoneWizard.trafficType.public=\u516c\u5171\u7f51\u7edc\: \u4e91\u73af\u5883\u4e2d\u865a\u62df\u673a\u4e0e\u56e0\u7279\u7f51\u4e4b\u95f4\u7684\u7f51\u7edc\u6d41\u91cf.
|
||||
label.zoneWizard.trafficType.storage=\u5b58\u50a8\u7f51\: \u4e3b\u5b58\u50a8\u4e0e\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\u4e4b\u95f4\u7684\u6d41\u91cf, \u6bd4\u5982\u865a\u673a\u6a21\u677f\u548c\u5feb\u7167
|
||||
managed.state=\u6258\u7ba1\u72b6\u6001
|
||||
|
|
@ -1255,7 +1255,6 @@ message.add.load.balancer=\u5411\u533a\u57df\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u8d1f
|
|||
message.add.load.balancer.under.ip=\u5df2\u5728\u4ee5\u4e0b IP \u4e0b\u6dfb\u52a0\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219\:
|
||||
message.add.network=\u4e3a\u533a\u57df\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7f51\u7edc\: <b><span id\="zone_name"></span></b>
|
||||
message.add.new.gateway.to.vpc=\u8bf7\u6307\u5b9a\u5c06\u65b0\u7f51\u5173\u6dfb\u52a0\u5230\u6b64 VPC \u6240\u9700\u7684\u4fe1\u606f\u3002
|
||||
message.add.pod.during.zone.creation=\u6bcf\u4e2a\u533a\u57df\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u63d0\u4f9b\u70b9\u3002\u63d0\u4f9b\u70b9\u4e2d\u5305\u542b\u4e3b\u673a\u548c\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u60a8\u5c06\u5728\u968f\u540e\u7684\u67d0\u4e2a\u6b65\u9aa4\u4e2d\u6dfb\u52a0\u8fd9\u4e9b\u4e3b\u673a\u548c\u670d\u52a1\u5668\u3002\u9996\u5148\uff0c\u8bf7\u4e3a CloudStack \u7684\u5185\u90e8\u7ba1\u7406\u6d41\u91cf\u914d\u7f6e\u4e00\u4e2a\u9884\u7559 IP \u5730\u5740\u8303\u56f4\u3002\u9884\u7559\u7684 IP \u8303\u56f4\u5bf9\u4e91\u4e2d\u7684\u6bcf\u4e2a\u533a\u57df\u6765\u8bf4\u5fc5\u987b\u552f\u4e00\u3002
|
||||
message.add.pod=\u4e3a\u533a\u57df <b><span id\="add_pod_zone_name"></span></b> \u6dfb\u52a0\u4e00\u4e2a\u65b0\u63d0\u4f9b\u70b9
|
||||
message.add.primary.storage=\u4e3a\u533a\u57df <b><span id\="zone_name"></span></b>\u3001\u63d0\u4f9b\u70b9 <b><span id\="pod_name"></span></b> \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u4e3b\u5b58\u50a8
|
||||
message.add.primary=\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u4e3b\u5b58\u50a8
|
||||
|
|
@ -1317,7 +1316,6 @@ message.delete.VPN.gateway=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u966
|
|||
message.desc.advanced.zone=\u9002\u7528\u4e8e\u66f4\u52a0\u590d\u6742\u7684\u7f51\u7edc\u62d3\u6251\u3002\u6b64\u7f51\u7edc\u6a21\u5f0f\u5728\u5b9a\u4e49\u6765\u5bbe\u7f51\u7edc\u5e76\u63d0\u4f9b\u9632\u706b\u5899\u3001VPN \u6216\u8d1f\u8f7d\u5e73\u8861\u5668\u652f\u6301\u7b49\u81ea\u5b9a\u4e49\u7f51\u7edc\u65b9\u6848\u65b9\u9762\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u3002
|
||||
message.desc.basic.zone=\u63d0\u4f9b\u4e00\u4e2a\u7f51\u7edc\uff0c\u5c06\u76f4\u63a5\u4ece\u6b64\u7f51\u7edc\u4e2d\u4e3a\u6bcf\u4e2a VM \u5b9e\u4f8b\u5206\u914d\u4e00\u4e2a IP\u3002\u53ef\u4ee5\u901a\u8fc7\u5b89\u5168\u7ec4\u7b49\u7b2c 3 \u5c42\u65b9\u5f0f\u63d0\u4f9b\u6765\u5bbe\u9694\u79bb(IP \u5730\u5740\u6e90\u8fc7\u6ee4)\u3002
|
||||
message.desc.cluster=\u6bcf\u4e2a\u63d0\u4f9b\u70b9\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7fa4\u96c6\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u7fa4\u96c6\u3002\u7fa4\u96c6\u63d0\u4f9b\u4e86\u4e00\u79cd\u7f16\u7ec4\u4e3b\u673a\u7684\u65b9\u6cd5\u3002\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u4e3b\u673a\u90fd\u5177\u6709\u76f8\u540c\u7684\u786c\u4ef6\uff0c\u8fd0\u884c\u76f8\u540c\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\uff0c\u4f4d\u4e8e\u76f8\u540c\u7684\u5b50\u7f51\u4e2d\uff0c\u5e76\u8bbf\u95ee\u76f8\u540c\u7684\u5171\u4eab\u5b58\u50a8\u3002\u6bcf\u4e2a\u7fa4\u96c6\u7531\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u673a\u4ee5\u53ca\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u7ec4\u6210\u3002
|
||||
message.desc.host=\u6bcf\u4e2a\u7fa4\u96c6\u4e2d\u5fc5\u987b\u81f3\u5c11\u5305\u542b\u4e00\u4e2a\u4e3b\u673a\u4ee5\u4f9b\u6765\u5bbe VM \u5728\u4e0a\u9762\u8fd0\u884c\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u4e3b\u673a\u3002\u8981\u4f7f\u4e3b\u673a\u5728 CloudStack \u4e2d\u8fd0\u884c\uff0c\u5fc5\u987b\u5728\u6b64\u4e3b\u673a\u4e0a\u5b89\u88c5\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u8f6f\u4ef6\uff0c\u4e3a\u5176\u5206\u914d\u4e00\u4e2a IP \u5730\u5740\uff0c\u5e76\u786e\u4fdd\u5c06\u5176\u8fde\u63a5\u5230 CloudStack \u7ba1\u7406\u670d\u52a1\u5668\u3002<br/><br/>\u8bf7\u63d0\u4f9b\u4e3b\u673a\u7684 DNS \u6216 IP \u5730\u5740\u3001\u7528\u6237\u540d(\u901a\u5e38\u4e3a root)\u548c\u5bc6\u7801\uff0c\u4ee5\u53ca\u7528\u4e8e\u5bf9\u4e3b\u673a\u8fdb\u884c\u5206\u7c7b\u7684\u4efb\u4f55\u6807\u7b7e\u3002
|
||||
message.desc.primary.storage=\u6bcf\u4e2a\u7fa4\u96c6\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u3002\u4e3b\u5b58\u50a8\u4e2d\u5305\u542b\u5728\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u8fd0\u884c\u7684\u6240\u6709 VM \u7684\u78c1\u76d8\u5377\u3002\u8bf7\u4f7f\u7528\u5e95\u5c42\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u652f\u6301\u7684\u7b26\u5408\u6807\u51c6\u7684\u534f\u8bae\u3002
|
||||
message.desc.secondary.storage=\u6bcf\u4e2a\u533a\u57df\u4e2d\u5fc5\u987b\u81f3\u5c11\u5305\u542b\u4e00\u4e2a NFS \u6216\u8f85\u52a9\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a NFS \u6216\u8f85\u52a9\u5b58\u50a8\u670d\u52a1\u5668\u3002\u8f85\u52a9\u5b58\u50a8\u7528\u4e8e\u5b58\u50a8 VM \u6a21\u677f\u3001ISO \u6620\u50cf\u548c VM \u78c1\u76d8\u5377\u5feb\u7167\u3002\u6b64\u670d\u52a1\u5668\u5fc5\u987b\u5bf9\u533a\u57df\u4e2d\u7684\u6240\u6709\u670d\u52a1\u5668\u53ef\u7528\u3002<br/><br/>\u8bf7\u63d0\u4f9b IP \u5730\u5740\u548c\u5bfc\u51fa\u8def\u5f84\u3002
|
||||
message.desc.zone=\u533a\u57df\u662f CloudStack \u4e2d\u6700\u5927\u7684\u7ec4\u7ec7\u5355\u4f4d\uff0c\u4e00\u4e2a\u533a\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u533a\u57df\u53ef\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\u3002\u4e00\u4e2a\u533a\u57df\u7531\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\u4ee5\u53ca\u7531\u533a\u57df\u4e2d\u7684\u6240\u6709\u63d0\u4f9b\u70b9\u5171\u4eab\u7684\u4e00\u4e2a\u8f85\u52a9\u5b58\u50a8\u670d\u52a1\u5668\u7ec4\u6210\uff0c\u5176\u4e2d\u6bcf\u4e2a\u63d0\u4f9b\u70b9\u4e2d\u5305\u542b\u591a\u4e2a\u4e3b\u673a\u548c\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u3002
|
||||
|
|
@ -1447,7 +1445,6 @@ message.step.3.continue=\u8bf7\u9009\u62e9\u4e00\u79cd\u78c1\u76d8\u65b9\u6848\u
|
|||
message.step.3.desc=
|
||||
message.step.4.continue=\u8bf7\u81f3\u5c11\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc\u4ee5\u7ee7\u7eed
|
||||
message.step.4.desc=\u8bf7\u9009\u62e9\u865a\u62df\u5b9e\u4f8b\u8981\u8fde\u63a5\u5230\u7684\u4e3b\u7f51\u7edc\u3002
|
||||
message.storage.traffic=CloudStack \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\u6d41\u91cf\u3002\u8bf7\u5728\u6b64\u5904\u914d\u7f6e\u5b58\u50a8\u6d41\u91cf\u3002
|
||||
message.suspend.project=\u662f\u5426\u786e\u5b9e\u8981\u6682\u505c\u6b64\u9879\u76ee?
|
||||
message.template.desc=\u53ef\u7528\u4e8e\u542f\u52a8 VM \u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf
|
||||
message.tooltip.dns.1=\u4f9b\u533a\u57df\u4e2d\u7684 VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u533a\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@
|
|||
<property name="messageSerializer" ref="messageSerializer" />
|
||||
</bean>
|
||||
|
||||
<bean id="eventBus" class = "org.apache.cloudstack.framework.eventbus.EventBusBase" />
|
||||
<bean id="messageBus" class = "org.apache.cloudstack.framework.messagebus.MessageBusBase" />
|
||||
|
||||
<!--
|
||||
DAO with customized configuration
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
independent configuration
|
||||
|
||||
-->
|
||||
<bean id="premiumDatabaseUpgradeChecker" class="com.cloud.upgrade.PremiumDatabaseUpgradeChecker"/>
|
||||
<bean id="DatabaseUpgradeChecker" class="com.cloud.upgrade.DatabaseUpgradeChecker"/>
|
||||
<bean id="GlobalLoadBalancingRulesServiceImpl" class ="org.apache.cloudstack.region.gslb.GlobalLoadBalancingRulesServiceImpl" >
|
||||
<property name="GslbServiceProvider">
|
||||
<ref bean="Netscaler"/>
|
||||
|
|
|
|||
|
|
@ -153,7 +153,6 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi
|
|||
|
||||
@Column(name="uuid")
|
||||
protected String uuid = UUID.randomUUID().toString();
|
||||
;
|
||||
|
||||
@Column(name="disk_offering_id")
|
||||
protected Long diskOfferingId;
|
||||
|
|
|
|||
|
|
@ -29,6 +29,15 @@
|
|||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><para>createVlanIpRange</para></entry>
|
||||
<entry>
|
||||
<para>No new parameter has been added. However, the current functionality has been
|
||||
extended to add guest IPs from a different subnet in shared networks in a Basic zone.
|
||||
Ensure that you provide netmask and gateway if you are adding guest IPs from a
|
||||
different subnet. </para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><para>updateResourceLimit</para></entry>
|
||||
<entry>
|
||||
|
|
@ -113,8 +122,10 @@
|
|||
<para>removelan (removes the specified VLAN range)</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<note><para>The removevlan and vlan parameters can be used together. If the VLAN range that you are trying
|
||||
to remove is in use, the operation will not succeed.</para></note>
|
||||
<note>
|
||||
<para>The removevlan and vlan parameters can be used together. If the VLAN range that
|
||||
you are trying to remove is in use, the operation will not succeed.</para>
|
||||
</note>
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
|
|
|
|||
|
|
@ -21,8 +21,12 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
|
||||
<section id="guest-ip-ranges">
|
||||
<title>Guest IP Ranges</title>
|
||||
<para>The IP ranges for guest network traffic are set on a per-account basis by the user. This allows the users to configure their network in a fashion that will enable VPN linking between their guest network and their clients.</para>
|
||||
<title>Guest IP Ranges</title>
|
||||
<para>The IP ranges for guest network traffic are set on a per-account basis by the user. This
|
||||
allows the users to configure their network in a fashion that will enable VPN linking between
|
||||
their guest network and their clients.</para>
|
||||
<para>In shared networks in Basic zone and Security Group-enabled Advanced networks, you will have
|
||||
the flexibility to add multiple guest IP ranges from different subnets. You can add or remove
|
||||
one IP range at a time.</para>
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -18,10 +18,10 @@
|
|||
*/
|
||||
package org.apache.cloudstack.framework.client;
|
||||
|
||||
import org.apache.cloudstack.framework.eventbus.EventBusBase;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageBusBase;
|
||||
import org.apache.cloudstack.framework.transport.TransportMultiplexier;
|
||||
|
||||
public class ClientEventBus extends EventBusBase implements TransportMultiplexier {
|
||||
public class ClientEventBus extends MessageBusBase implements TransportMultiplexier {
|
||||
|
||||
@Override
|
||||
public void onTransportMessage(String senderEndpointAddress,
|
||||
|
|
|
|||
|
|
@ -17,16 +17,18 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
import org.apache.cloudstack.framework.serializer.MessageSerializer;
|
||||
|
||||
public interface EventBus {
|
||||
public interface MessageBus {
|
||||
void setMessageSerializer(MessageSerializer messageSerializer);
|
||||
MessageSerializer getMessageSerializer();
|
||||
|
||||
void subscribe(String subject, Subscriber subscriber);
|
||||
void unsubscribe(String subject, Subscriber subscriber);
|
||||
void subscribe(String subject, MessageSubscriber subscriber);
|
||||
void unsubscribe(String subject, MessageSubscriber subscriber);
|
||||
void clearAll();
|
||||
void prune();
|
||||
|
||||
void publish(String senderAddress, String subject, PublishScope scope, Object args);
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
|
@ -28,7 +28,7 @@ import java.util.Map;
|
|||
|
||||
import org.apache.cloudstack.framework.serializer.MessageSerializer;
|
||||
|
||||
public class EventBusBase implements EventBus {
|
||||
public class MessageBusBase implements MessageBus {
|
||||
|
||||
private Gate _gate;
|
||||
private List<ActionRecord> _pendingActions;
|
||||
|
|
@ -36,11 +36,11 @@ public class EventBusBase implements EventBus {
|
|||
private SubscriptionNode _subscriberRoot;
|
||||
private MessageSerializer _messageSerializer;
|
||||
|
||||
public EventBusBase() {
|
||||
public MessageBusBase() {
|
||||
_gate = new Gate();
|
||||
_pendingActions = new ArrayList<ActionRecord>();
|
||||
|
||||
_subscriberRoot = new SubscriptionNode("/", null);
|
||||
_subscriberRoot = new SubscriptionNode(null, "/", null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -54,7 +54,7 @@ public class EventBusBase implements EventBus {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void subscribe(String subject, Subscriber subscriber) {
|
||||
public void subscribe(String subject, MessageSubscriber subscriber) {
|
||||
assert(subject != null);
|
||||
assert(subscriber != null);
|
||||
if(_gate.enter()) {
|
||||
|
|
@ -70,12 +70,15 @@ public class EventBusBase implements EventBus {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void unsubscribe(String subject, Subscriber subscriber) {
|
||||
public void unsubscribe(String subject, MessageSubscriber subscriber) {
|
||||
if(_gate.enter()) {
|
||||
SubscriptionNode current = locate(subject, null, false);
|
||||
if(current != null)
|
||||
current.removeSubscriber(subscriber);
|
||||
|
||||
if(subject != null) {
|
||||
SubscriptionNode current = locate(subject, null, false);
|
||||
if(current != null)
|
||||
current.removeSubscriber(subscriber, false);
|
||||
} else {
|
||||
this._subscriberRoot.removeSubscriber(subscriber, true);
|
||||
}
|
||||
_gate.leave();
|
||||
} else {
|
||||
synchronized(_pendingActions) {
|
||||
|
|
@ -83,7 +86,48 @@ public class EventBusBase implements EventBus {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void clearAll() {
|
||||
if(_gate.enter()) {
|
||||
_subscriberRoot.clearAll();
|
||||
doPrune();
|
||||
_gate.leave();
|
||||
} else {
|
||||
synchronized(_pendingActions) {
|
||||
_pendingActions.add(new ActionRecord(ActionType.ClearAll, null, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prune() {
|
||||
if(_gate.enter()) {
|
||||
doPrune();
|
||||
_gate.leave();
|
||||
} else {
|
||||
synchronized(_pendingActions) {
|
||||
_pendingActions.add(new ActionRecord(ActionType.Prune, null, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void doPrune() {
|
||||
List<SubscriptionNode> trimNodes = new ArrayList<SubscriptionNode>();
|
||||
_subscriberRoot.prune(trimNodes);
|
||||
|
||||
while(trimNodes.size() > 0) {
|
||||
SubscriptionNode node = trimNodes.remove(0);
|
||||
SubscriptionNode parent = node.getParent();
|
||||
if(parent != null) {
|
||||
parent.removeChild(node.getNodeKey());
|
||||
if(parent.isTrimmable()) {
|
||||
trimNodes.add(parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void publish(String senderAddress, String subject, PublishScope scope,
|
||||
Object args) {
|
||||
|
|
@ -119,12 +163,22 @@ public class EventBusBase implements EventBus {
|
|||
break;
|
||||
|
||||
case Unsubscribe :
|
||||
{
|
||||
if(record.getSubject() != null) {
|
||||
SubscriptionNode current = locate(record.getSubject(), null, false);
|
||||
if(current != null)
|
||||
current.removeSubscriber(record.getSubscriber());
|
||||
current.removeSubscriber(record.getSubscriber(), false);
|
||||
} else {
|
||||
this._subscriberRoot.removeSubscriber(record.getSubscriber(), true);
|
||||
}
|
||||
break;
|
||||
|
||||
case ClearAll :
|
||||
_subscriberRoot.clearAll();
|
||||
break;
|
||||
|
||||
case Prune :
|
||||
doPrune();
|
||||
break;
|
||||
|
||||
default :
|
||||
assert(false);
|
||||
|
|
@ -136,11 +190,13 @@ public class EventBusBase implements EventBus {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
private SubscriptionNode locate(String subject, List<SubscriptionNode> chainFromTop,
|
||||
boolean createPath) {
|
||||
|
||||
assert(subject != null);
|
||||
// "/" is special name for root node
|
||||
if(subject.equals("/"))
|
||||
return _subscriberRoot;
|
||||
|
||||
String[] subjectPathTokens = subject.split("\\.");
|
||||
return locate(subjectPathTokens, _subscriberRoot, chainFromTop, createPath);
|
||||
|
|
@ -159,7 +215,7 @@ public class EventBusBase implements EventBus {
|
|||
SubscriptionNode next = current.getChild(subjectPathTokens[0]);
|
||||
if(next == null) {
|
||||
if(createPath) {
|
||||
next = new SubscriptionNode(subjectPathTokens[0], null);
|
||||
next = new SubscriptionNode(current, subjectPathTokens[0], null);
|
||||
current.addChild(subjectPathTokens[0], next);
|
||||
} else {
|
||||
return null;
|
||||
|
|
@ -180,15 +236,17 @@ public class EventBusBase implements EventBus {
|
|||
//
|
||||
private static enum ActionType {
|
||||
Subscribe,
|
||||
Unsubscribe
|
||||
Unsubscribe,
|
||||
ClearAll,
|
||||
Prune
|
||||
}
|
||||
|
||||
private static class ActionRecord {
|
||||
private ActionType _type;
|
||||
private String _subject;
|
||||
private Subscriber _subscriber;
|
||||
private MessageSubscriber _subscriber;
|
||||
|
||||
public ActionRecord(ActionType type, String subject, Subscriber subscriber) {
|
||||
public ActionRecord(ActionType type, String subject, MessageSubscriber subscriber) {
|
||||
_type = type;
|
||||
_subject = subject;
|
||||
_subscriber = subscriber;
|
||||
|
|
@ -202,7 +260,7 @@ public class EventBusBase implements EventBus {
|
|||
return _subject;
|
||||
}
|
||||
|
||||
public Subscriber getSubscriber() {
|
||||
public MessageSubscriber getSubscriber() {
|
||||
return _subscriber;
|
||||
}
|
||||
}
|
||||
|
|
@ -262,15 +320,16 @@ public class EventBusBase implements EventBus {
|
|||
}
|
||||
|
||||
private static class SubscriptionNode {
|
||||
@SuppressWarnings("unused")
|
||||
private String _nodeKey;
|
||||
private List<Subscriber> _subscribers;
|
||||
private List<MessageSubscriber> _subscribers;
|
||||
private Map<String, SubscriptionNode> _children;
|
||||
private SubscriptionNode _parent;
|
||||
|
||||
public SubscriptionNode(String nodeKey, Subscriber subscriber) {
|
||||
public SubscriptionNode(SubscriptionNode parent, String nodeKey, MessageSubscriber subscriber) {
|
||||
assert(nodeKey != null);
|
||||
_parent = parent;
|
||||
_nodeKey = nodeKey;
|
||||
_subscribers = new ArrayList<Subscriber>();
|
||||
_subscribers = new ArrayList<MessageSubscriber>();
|
||||
|
||||
if(subscriber != null)
|
||||
_subscribers.add(subscriber);
|
||||
|
|
@ -278,16 +337,30 @@ public class EventBusBase implements EventBus {
|
|||
_children = new HashMap<String, SubscriptionNode>();
|
||||
}
|
||||
|
||||
public SubscriptionNode getParent() {
|
||||
return _parent;
|
||||
}
|
||||
|
||||
public String getNodeKey() {
|
||||
return _nodeKey;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public List<Subscriber> getSubscriber() {
|
||||
public List<MessageSubscriber> getSubscriber() {
|
||||
return _subscribers;
|
||||
}
|
||||
|
||||
public void addSubscriber(Subscriber subscriber) {
|
||||
_subscribers.add(subscriber);
|
||||
public void addSubscriber(MessageSubscriber subscriber) {
|
||||
if(!_subscribers.contains(subscriber))
|
||||
_subscribers.add(subscriber);
|
||||
}
|
||||
|
||||
public void removeSubscriber(Subscriber subscriber) {
|
||||
public void removeSubscriber(MessageSubscriber subscriber, boolean recursively) {
|
||||
if(recursively) {
|
||||
for(Map.Entry<String, SubscriptionNode> entry : _children.entrySet()) {
|
||||
entry.getValue().removeSubscriber(subscriber, true);
|
||||
}
|
||||
}
|
||||
_subscribers.remove(subscriber);
|
||||
}
|
||||
|
||||
|
|
@ -299,10 +372,37 @@ public class EventBusBase implements EventBus {
|
|||
_children.put(key, childNode);
|
||||
}
|
||||
|
||||
public void notifySubscribers(String senderAddress, String subject, Object args) {
|
||||
for(Subscriber subscriber : _subscribers) {
|
||||
subscriber.onPublishEvent(senderAddress, subject, args);
|
||||
public void removeChild(String key) {
|
||||
_children.remove(key);
|
||||
}
|
||||
|
||||
public void clearAll() {
|
||||
// depth-first
|
||||
for(Map.Entry<String, SubscriptionNode> entry : _children.entrySet()) {
|
||||
entry.getValue().clearAll();
|
||||
}
|
||||
_subscribers.clear();
|
||||
}
|
||||
|
||||
public void prune(List<SubscriptionNode> trimNodes) {
|
||||
assert(trimNodes != null);
|
||||
|
||||
for(Map.Entry<String, SubscriptionNode> entry : _children.entrySet()) {
|
||||
entry.getValue().prune(trimNodes);
|
||||
}
|
||||
|
||||
if(isTrimmable())
|
||||
trimNodes.add(this);
|
||||
}
|
||||
|
||||
public void notifySubscribers(String senderAddress, String subject, Object args) {
|
||||
for(MessageSubscriber subscriber : _subscribers) {
|
||||
subscriber.onPublishMessage(senderAddress, subject, args);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isTrimmable() {
|
||||
return _children.size() == 0 && _subscribers.size() == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,26 +17,26 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
|
||||
public class EventBusEndpoint {
|
||||
private EventBus _eventBus;
|
||||
public class MessageBusEndpoint {
|
||||
private MessageBus _eventBus;
|
||||
private String _sender;
|
||||
private PublishScope _scope;
|
||||
|
||||
public EventBusEndpoint(EventBus eventBus, String sender, PublishScope scope) {
|
||||
public MessageBusEndpoint(MessageBus eventBus, String sender, PublishScope scope) {
|
||||
_eventBus = eventBus;
|
||||
_sender = sender;
|
||||
_scope = scope;
|
||||
}
|
||||
|
||||
public EventBusEndpoint setEventBus(EventBus eventBus) {
|
||||
public MessageBusEndpoint setEventBus(MessageBus eventBus) {
|
||||
_eventBus = eventBus;
|
||||
return this;
|
||||
}
|
||||
|
||||
public EventBusEndpoint setScope(PublishScope scope) {
|
||||
public MessageBusEndpoint setScope(PublishScope scope) {
|
||||
_scope = scope;
|
||||
return this;
|
||||
}
|
||||
|
|
@ -45,7 +45,7 @@ public class EventBusEndpoint {
|
|||
return _scope;
|
||||
}
|
||||
|
||||
public EventBusEndpoint setSender(String sender) {
|
||||
public MessageBusEndpoint setSender(String sender) {
|
||||
_sender = sender;
|
||||
return this;
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
|
@ -24,27 +24,27 @@ import java.util.HashMap;
|
|||
import java.util.Map;
|
||||
|
||||
|
||||
public class EventDispatcher implements Subscriber {
|
||||
public class MessageDispatcher implements MessageSubscriber {
|
||||
private static Map<Class<?>, Method> s_handlerCache = new HashMap<Class<?>, Method>();
|
||||
|
||||
private static Map<Object, EventDispatcher> s_targetMap = new HashMap<Object, EventDispatcher>();
|
||||
private static Map<Object, MessageDispatcher> s_targetMap = new HashMap<Object, MessageDispatcher>();
|
||||
private Object _targetObject;
|
||||
|
||||
public EventDispatcher(Object targetObject) {
|
||||
public MessageDispatcher(Object targetObject) {
|
||||
_targetObject = targetObject;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPublishEvent(String senderAddress, String subject, Object args) {
|
||||
public void onPublishMessage(String senderAddress, String subject, Object args) {
|
||||
dispatch(_targetObject, subject, senderAddress, args);
|
||||
}
|
||||
|
||||
public static EventDispatcher getDispatcher(Object targetObject) {
|
||||
EventDispatcher dispatcher;
|
||||
public static MessageDispatcher getDispatcher(Object targetObject) {
|
||||
MessageDispatcher dispatcher;
|
||||
synchronized(s_targetMap) {
|
||||
dispatcher = s_targetMap.get(targetObject);
|
||||
if(dispatcher == null) {
|
||||
dispatcher = new EventDispatcher(targetObject);
|
||||
dispatcher = new MessageDispatcher(targetObject);
|
||||
s_targetMap.put(targetObject, dispatcher);
|
||||
}
|
||||
}
|
||||
|
|
@ -85,7 +85,7 @@ public class EventDispatcher implements Subscriber {
|
|||
return handler;
|
||||
|
||||
for(Method method : handlerClz.getMethods()) {
|
||||
EventHandler annotation = method.getAnnotation(EventHandler.class);
|
||||
MessageHandler annotation = method.getAnnotation(MessageHandler.class);
|
||||
if(annotation != null) {
|
||||
if(match(annotation.topic(), subject)) {
|
||||
s_handlerCache.put(handlerClz, method);
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
|
|
@ -25,6 +25,6 @@ import java.lang.annotation.Target;
|
|||
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface EventHandler {
|
||||
public @interface MessageHandler {
|
||||
public String topic();
|
||||
}
|
||||
|
|
@ -17,8 +17,8 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
public interface Subscriber {
|
||||
void onPublishEvent(String senderAddress, String subject, Object args);
|
||||
public interface MessageSubscriber {
|
||||
void onPublishMessage(String senderAddress, String subject, Object args);
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.cloudstack.framework.eventbus;
|
||||
package org.apache.cloudstack.framework.messagebus;
|
||||
|
||||
public enum PublishScope {
|
||||
LOCAL, GLOBAL
|
||||
|
|
@ -18,10 +18,10 @@
|
|||
*/
|
||||
package org.apache.cloudstack.framework.server;
|
||||
|
||||
import org.apache.cloudstack.framework.eventbus.EventBusBase;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageBusBase;
|
||||
import org.apache.cloudstack.framework.transport.TransportMultiplexier;
|
||||
|
||||
public class ServerEventBus extends EventBusBase implements TransportMultiplexier {
|
||||
public class ServerEventBus extends MessageBusBase implements TransportMultiplexier {
|
||||
|
||||
@Override
|
||||
public void onTransportMessage(String senderEndpointAddress,
|
||||
|
|
|
|||
|
|
@ -24,9 +24,9 @@ import java.util.TimerTask;
|
|||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.framework.eventbus.EventBus;
|
||||
import org.apache.cloudstack.framework.eventbus.EventDispatcher;
|
||||
import org.apache.cloudstack.framework.eventbus.EventHandler;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageBus;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageDispatcher;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageHandler;
|
||||
import org.apache.cloudstack.framework.rpc.RpcCallbackListener;
|
||||
import org.apache.cloudstack.framework.rpc.RpcException;
|
||||
import org.apache.cloudstack.framework.rpc.RpcProvider;
|
||||
|
|
@ -41,7 +41,7 @@ public class SampleManagerComponent {
|
|||
private static final Logger s_logger = Logger.getLogger(SampleManagerComponent.class);
|
||||
|
||||
@Inject
|
||||
private EventBus _eventBus;
|
||||
private MessageBus _eventBus;
|
||||
|
||||
@Inject
|
||||
private RpcProvider _rpcProvider;
|
||||
|
|
@ -58,7 +58,7 @@ public class SampleManagerComponent {
|
|||
|
||||
// subscribe to all network events (for example)
|
||||
_eventBus.subscribe("network",
|
||||
EventDispatcher.getDispatcher(this));
|
||||
MessageDispatcher.getDispatcher(this));
|
||||
|
||||
_timer.schedule(new TimerTask() {
|
||||
public void run() {
|
||||
|
|
@ -72,7 +72,7 @@ public class SampleManagerComponent {
|
|||
call.completeCall("NetworkPrepare completed");
|
||||
}
|
||||
|
||||
@EventHandler(topic="network.prepare")
|
||||
@MessageHandler(topic="network.prepare")
|
||||
void onPrepareNetwork(String sender, String topic, Object args) {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,9 +21,9 @@ package org.apache.cloudstack.framework.sampleserver;
|
|||
import javax.annotation.PostConstruct;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.framework.eventbus.EventBus;
|
||||
import org.apache.cloudstack.framework.eventbus.EventDispatcher;
|
||||
import org.apache.cloudstack.framework.eventbus.EventHandler;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageBus;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageDispatcher;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageHandler;
|
||||
import org.apache.cloudstack.framework.rpc.RpcProvider;
|
||||
import org.apache.cloudstack.framework.rpc.RpcServerCall;
|
||||
import org.apache.cloudstack.framework.rpc.RpcServiceDispatcher;
|
||||
|
|
@ -36,7 +36,7 @@ public class SampleManagerComponent2 {
|
|||
private static final Logger s_logger = Logger.getLogger(SampleManagerComponent2.class);
|
||||
|
||||
@Inject
|
||||
private EventBus _eventBus;
|
||||
private MessageBus _eventBus;
|
||||
|
||||
@Inject
|
||||
private RpcProvider _rpcProvider;
|
||||
|
|
@ -51,7 +51,7 @@ public class SampleManagerComponent2 {
|
|||
|
||||
// subscribe to all network events (for example)
|
||||
_eventBus.subscribe("storage",
|
||||
EventDispatcher.getDispatcher(this));
|
||||
MessageDispatcher.getDispatcher(this));
|
||||
}
|
||||
|
||||
@RpcServiceHandler(command="StoragePrepare")
|
||||
|
|
@ -66,7 +66,7 @@ public class SampleManagerComponent2 {
|
|||
call.completeCall(answer);
|
||||
}
|
||||
|
||||
@EventHandler(topic="storage.prepare")
|
||||
@MessageHandler(topic="storage.prepare")
|
||||
void onPrepareNetwork(String sender, String topic, Object args) {
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
* 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.messagebus;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.cloudstack.framework.messagebus.MessageBus;
|
||||
import org.apache.cloudstack.framework.messagebus.MessageSubscriber;
|
||||
import org.apache.cloudstack.framework.messagebus.PublishScope;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(locations="classpath:/MessageBusTestContext.xml")
|
||||
public class TestMessageBus extends TestCase {
|
||||
|
||||
@Inject MessageBus _messageBus;
|
||||
|
||||
@Test
|
||||
public void testExactSubjectMatch() {
|
||||
_messageBus.subscribe("Host", new MessageSubscriber() {
|
||||
|
||||
@Override
|
||||
public void onPublishMessage(String senderAddress, String subject, Object args) {
|
||||
Assert.assertEquals(subject, "Host");
|
||||
}
|
||||
});
|
||||
|
||||
_messageBus.publish(null, "Host", PublishScope.LOCAL, null);
|
||||
_messageBus.publish(null, "VM", PublishScope.LOCAL, null);
|
||||
_messageBus.clearAll();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRootSubjectMatch() {
|
||||
_messageBus.subscribe("/", new MessageSubscriber() {
|
||||
|
||||
@Override
|
||||
public void onPublishMessage(String senderAddress, String subject, Object args) {
|
||||
Assert.assertTrue(subject.equals("Host") || subject.equals("VM"));
|
||||
}
|
||||
});
|
||||
|
||||
_messageBus.publish(null, "Host", PublishScope.LOCAL, null);
|
||||
_messageBus.publish(null, "VM", PublishScope.LOCAL, null);
|
||||
_messageBus.clearAll();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMiscMatch() {
|
||||
MessageSubscriber subscriberAtParentLevel = new MessageSubscriber() {
|
||||
@Override
|
||||
public void onPublishMessage(String senderAddress, String subject, Object args) {
|
||||
Assert.assertTrue(subject.startsWith(("Host")) || subject.startsWith("VM"));
|
||||
}
|
||||
};
|
||||
|
||||
MessageSubscriber subscriberAtChildLevel = new MessageSubscriber() {
|
||||
@Override
|
||||
public void onPublishMessage(String senderAddress, String subject, Object args) {
|
||||
Assert.assertTrue(subject.equals("Host.123"));
|
||||
}
|
||||
};
|
||||
|
||||
subscriberAtParentLevel = Mockito.spy(subscriberAtParentLevel);
|
||||
subscriberAtChildLevel = Mockito.spy(subscriberAtChildLevel);
|
||||
|
||||
_messageBus.subscribe("Host", subscriberAtParentLevel);
|
||||
_messageBus.subscribe("VM", subscriberAtParentLevel);
|
||||
_messageBus.subscribe("Host.123", subscriberAtChildLevel);
|
||||
|
||||
_messageBus.publish(null, "Host.123", PublishScope.LOCAL, null);
|
||||
_messageBus.publish(null, "Host.321", PublishScope.LOCAL, null);
|
||||
_messageBus.publish(null, "VM.123", PublishScope.LOCAL, null);
|
||||
|
||||
Mockito.verify(subscriberAtParentLevel).onPublishMessage(null, "Host.123", null);
|
||||
Mockito.verify(subscriberAtParentLevel).onPublishMessage(null, "Host.321", null);
|
||||
Mockito.verify(subscriberAtParentLevel).onPublishMessage(null, "VM.123", null);
|
||||
Mockito.verify(subscriberAtChildLevel).onPublishMessage(null, "Host.123", null);
|
||||
|
||||
Mockito.reset(subscriberAtParentLevel);
|
||||
Mockito.reset(subscriberAtChildLevel);
|
||||
|
||||
_messageBus.unsubscribe(null, subscriberAtParentLevel);
|
||||
_messageBus.publish(null, "Host.123", PublishScope.LOCAL, null);
|
||||
_messageBus.publish(null, "VM.123", PublishScope.LOCAL, null);
|
||||
|
||||
Mockito.verify(subscriberAtChildLevel).onPublishMessage(null, "Host.123", null);
|
||||
Mockito.verify(subscriberAtParentLevel, Mockito.times(0)).onPublishMessage(null, "Host.123", null);
|
||||
Mockito.verify(subscriberAtParentLevel, Mockito.times(0)).onPublishMessage(null, "VM.123", null);
|
||||
|
||||
_messageBus.clearAll();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<!--
|
||||
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.
|
||||
-->
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:tx="http://www.springframework.org/schema/tx"
|
||||
xmlns:aop="http://www.springframework.org/schema/aop"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/tx
|
||||
http://www.springframework.org/schema/tx/spring-tx-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">
|
||||
<context:annotation-config />
|
||||
|
||||
<bean id="onwireRegistry" class="org.apache.cloudstack.framework.serializer.OnwireClassRegistry"
|
||||
init-method="scan" >
|
||||
<property name="packages">
|
||||
<list>
|
||||
<value>org.apache.cloudstack.framework</value>
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="messageSerializer" class="org.apache.cloudstack.framework.serializer.JsonMessageSerializer">
|
||||
<property name="onwireClassRegistry" ref="onwireRegistry" />
|
||||
</bean>
|
||||
|
||||
<bean id="messageBus" class = "org.apache.cloudstack.framework.messagebus.MessageBusBase">
|
||||
<property name="messageSerializer" ref="messageSerializer" />
|
||||
</bean>
|
||||
|
||||
</beans>
|
||||
|
|
@ -494,7 +494,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
|
|||
s_logger.info("Inject SSH key pairs before copying systemvm.iso into secondary storage");
|
||||
_configServer.updateKeyPairs();
|
||||
|
||||
|
||||
s_logger.info("Copy System VM patch ISO file to secondary storage. source ISO: " + srcIso.getAbsolutePath() +
|
||||
", destination: " + destIso.getAbsolutePath());
|
||||
try {
|
||||
FileUtil.copyfile(srcIso, destIso);
|
||||
} catch(IOException e) {
|
||||
|
|
|
|||
|
|
@ -648,7 +648,7 @@ public class CitrixHelper {
|
|||
_xenServer610GuestOsMap.put("Windows 7 (32-bit)", "Windows 7 (32-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows 7 (64-bit)", "Windows 7 (64-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows 8 (32-bit)", "Windows 8 (32-bit) (experimental)");
|
||||
_xenServer610GuestOsMap.put("Windows 8 (64-bit)", "Windows 7 (64-bit) (experimental)");
|
||||
_xenServer610GuestOsMap.put("Windows 8 (64-bit)", "Windows 8 (64-bit) (experimental)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 2003 (32-bit)", "Windows Server 2003 (32-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 2003 (64-bit)", "Windows Server 2003 (64-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 2003 PAE (32-bit)", "Windows Server 2003 PAE (32-bit)");
|
||||
|
|
@ -661,6 +661,7 @@ public class CitrixHelper {
|
|||
_xenServer610GuestOsMap.put("Windows Server 2008 (32-bit)", "Windows Server 2008 (32-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 2008 (64-bit)", "Windows Server 2008 (64-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 2008 R2 (64-bit)", "Windows Server 2008 R2 (64-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 2012 (64-bit)", "Windows Server 2012 (64-bit) (experimental)");
|
||||
_xenServer610GuestOsMap.put("Windows Server 8 (64-bit)", "Windows Server 2012 (64-bit) (experimental)");
|
||||
_xenServer610GuestOsMap.put("Windows Vista (32-bit)", "Windows Vista (32-bit)");
|
||||
_xenServer610GuestOsMap.put("Windows XP SP3 (32-bit)", "Windows XP SP3 (32-bit)");
|
||||
|
|
|
|||
|
|
@ -1211,6 +1211,18 @@ public class NetscalerResource implements ServerResource {
|
|||
try {
|
||||
gslbservice service;
|
||||
service = getServiceObject(client, serviceName);
|
||||
String gslbServerName = generateGslbServerName(serviceIp);
|
||||
|
||||
if (!gslbServerExists(client, gslbServerName)) {
|
||||
base_response apiCallResult;
|
||||
com.citrix.netscaler.nitro.resource.config.basic.server nsServer = new com.citrix.netscaler.nitro.resource.config.basic.server();
|
||||
nsServer.set_name(gslbServerName);
|
||||
nsServer.set_ipaddress(serviceIp);
|
||||
apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.add(client, nsServer);
|
||||
if ((apiCallResult.errorcode != 0) && (apiCallResult.errorcode != NitroError.NS_RESOURCE_EXISTS)) {
|
||||
throw new ExecutionException("Failed to add server " + gslbServerName + " due to" + apiCallResult.message);
|
||||
}
|
||||
}
|
||||
|
||||
boolean isUpdateSite = false;
|
||||
if (service == null) {
|
||||
|
|
@ -1220,7 +1232,7 @@ public class NetscalerResource implements ServerResource {
|
|||
}
|
||||
|
||||
service.set_sitename(siteName);
|
||||
service.set_servername(serviceIp);
|
||||
service.set_servername(gslbServerName);
|
||||
int port = Integer.parseInt(servicePort);
|
||||
service.set_port(port);
|
||||
service.set_servicename(serviceName);
|
||||
|
|
@ -1236,7 +1248,7 @@ public class NetscalerResource implements ServerResource {
|
|||
s_logger.debug("Successfully created service: " + serviceName + " at site: " + siteName);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
String errMsg = "Failed to created service: " + serviceName + " at site: " + siteName;
|
||||
String errMsg = "Failed to created service: " + serviceName + " at site: " + siteName + " due to " + e.getMessage();
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug(errMsg);
|
||||
}
|
||||
|
|
@ -1284,7 +1296,7 @@ public class NetscalerResource implements ServerResource {
|
|||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
String errMsg = "Failed to update service: " + serviceName + " at site: " + siteName;
|
||||
String errMsg = "Failed to update service: " + serviceName + " at site: " + siteName + "due to " + e.getMessage();
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug(errMsg);
|
||||
}
|
||||
|
|
@ -1294,6 +1306,7 @@ public class NetscalerResource implements ServerResource {
|
|||
|
||||
private static void createVserverServiceBinding(nitro_service client, String serviceName, String vserverName)
|
||||
throws ExecutionException {
|
||||
String errMsg;
|
||||
try {
|
||||
gslbvserver_gslbservice_binding binding = new gslbvserver_gslbservice_binding();
|
||||
binding.set_name(vserverName);
|
||||
|
|
@ -1303,8 +1316,18 @@ public class NetscalerResource implements ServerResource {
|
|||
s_logger.debug("Successfully created service: " + serviceName + " and virtual server: "
|
||||
+ vserverName + " binding");
|
||||
}
|
||||
} catch (nitro_exception ne) {
|
||||
if (ne.getErrorCode() == 273) {
|
||||
return;
|
||||
}
|
||||
errMsg = "Failed to create service: " + serviceName + " and virtual server: "
|
||||
+ vserverName + " binding due to " + ne.getMessage();
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug(errMsg);
|
||||
}
|
||||
throw new ExecutionException(errMsg);
|
||||
} catch (Exception e) {
|
||||
String errMsg = "Failed to create service: " + serviceName + " and virtual server: "
|
||||
errMsg = "Failed to create service: " + serviceName + " and virtual server: "
|
||||
+ vserverName + " binding due to " + e.getMessage();
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
s_logger.debug(errMsg);
|
||||
|
|
@ -1437,6 +1460,39 @@ public class NetscalerResource implements ServerResource {
|
|||
private static String generateUniqueServiceName(String siteName, String publicIp, String publicPort) {
|
||||
return "cloud-gslb-service-" + siteName + "-" + publicIp + "-" + publicPort;
|
||||
}
|
||||
|
||||
private static boolean gslbServerExists(nitro_service client, String serverName) throws ExecutionException {
|
||||
try {
|
||||
if (com.citrix.netscaler.nitro.resource.config.basic.server.get(client, serverName) != null) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} catch (nitro_exception e) {
|
||||
if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) {
|
||||
return false;
|
||||
} else {
|
||||
throw new ExecutionException("Failed to verify Server " + serverName + " exists on the NetScaler device due to " + e.getMessage());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new ExecutionException("Failed to verify Server " + serverName + " exists on the NetScaler device due to " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static String generateGslbServerName(String serverIP) {
|
||||
return genGslbObjectName("Cloud-Server-", serverIP);
|
||||
}
|
||||
|
||||
private static String genGslbObjectName(Object... args) {
|
||||
String objectName = "";
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
objectName += args[i];
|
||||
if (i != args.length -1) {
|
||||
objectName += "-";
|
||||
}
|
||||
}
|
||||
return objectName;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
1
pom.xml
1
pom.xml
|
|
@ -398,6 +398,7 @@
|
|||
<exclude>patches/systemvm/debian/config/var/www/html/userdata/.htaccess</exclude>
|
||||
<exclude>patches/systemvm/debian/config/var/www/html/latest/.htaccess</exclude>
|
||||
<exclude>patches/systemvm/debian/vpn/etc/ipsec.d/l2tp.conf</exclude>
|
||||
<exclude>tools/transifex/.tx/config</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ import com.cloud.host.dao.HostDao;
|
|||
import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.org.Grouping.AllocationState;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.storage.StorageManager;
|
||||
import com.cloud.storage.dao.VolumeDao;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
|
|
@ -106,7 +107,8 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager {
|
|||
@Inject private PrimaryDataStoreDao _storagePoolDao;
|
||||
@Inject private ConfigurationDao _configDao;
|
||||
@Inject private ResourceManager _resourceMgr;
|
||||
@Inject private ConfigurationManager _configMgr;
|
||||
@Inject private ConfigurationManager _configMgr;
|
||||
@Inject ConfigurationServer _configServer;
|
||||
private Timer _timer = null;
|
||||
private float _cpuOverProvisioningFactor = 1;
|
||||
private long _capacityCheckPeriod = 60L * 60L * 1000L; // one hour by default
|
||||
|
|
@ -562,19 +564,30 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager {
|
|||
float overProvFactor = 1f;
|
||||
capacity = _capacityDao.findCapacityBy(capacityType.intValue(), cluster.getDataCenterId(), null, cluster.getId());
|
||||
|
||||
if (capacityType == Capacity.CAPACITY_TYPE_STORAGE){
|
||||
capacity.add(getUsedStats(capacityType, cluster.getDataCenterId(), cluster.getPodId(), cluster.getId()));
|
||||
// cpu and memory allocated capacity notification threshold can be defined at cluster level, so getting the value if they are defined at cluster level
|
||||
double capacityValue = 0;
|
||||
switch (capacityType) {
|
||||
case Capacity.CAPACITY_TYPE_STORAGE:
|
||||
capacity.add(getUsedStats(capacityType, cluster.getDataCenterId(), cluster.getPodId(), cluster.getId()));
|
||||
capacityValue = _capacityTypeThresholdMap.get(capacityType);
|
||||
break;
|
||||
case Capacity.CAPACITY_TYPE_CPU:
|
||||
overProvFactor = ApiDBUtils.getCpuOverprovisioningFactor();
|
||||
capacityValue = Double.parseDouble(_configServer.getConfigValue(Config.CPUCapacityThreshold.key(), Config.ConfigurationParameterScope.cluster.toString(), cluster.getId()));
|
||||
break;
|
||||
case Capacity.CAPACITY_TYPE_MEMORY:
|
||||
capacityValue = Double.parseDouble(_configServer.getConfigValue(Config.MemoryCapacityThreshold.key(), Config.ConfigurationParameterScope.cluster.toString(), cluster.getId()));
|
||||
break;
|
||||
default:
|
||||
capacityValue = _capacityTypeThresholdMap.get(capacityType);
|
||||
}
|
||||
if (capacity == null || capacity.size() == 0){
|
||||
continue;
|
||||
}
|
||||
if (capacityType == Capacity.CAPACITY_TYPE_CPU){
|
||||
overProvFactor = ApiDBUtils.getCpuOverprovisioningFactor();
|
||||
}
|
||||
|
||||
double totalCapacity = capacity.get(0).getTotalCapacity() * overProvFactor;
|
||||
double usedCapacity = capacity.get(0).getUsedCapacity() + capacity.get(0).getReservedCapacity();
|
||||
if (totalCapacity != 0 && usedCapacity/totalCapacity > _capacityTypeThresholdMap.get(capacityType)){
|
||||
if (totalCapacity != 0 && usedCapacity/totalCapacity > capacityValue){
|
||||
generateEmailAlert(ApiDBUtils.findZoneById(cluster.getDataCenterId()), ApiDBUtils.findPodById(cluster.getPodId()), cluster,
|
||||
totalCapacity, usedCapacity, capacityType);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1034,7 +1034,7 @@ public class ApiDBUtils {
|
|||
}
|
||||
|
||||
public static Integer getNetworkRate(long networkOfferingId) {
|
||||
return _configMgr.getNetworkOfferingNetworkRate(networkOfferingId);
|
||||
return _configMgr.getNetworkOfferingNetworkRate(networkOfferingId, null);
|
||||
}
|
||||
|
||||
public static Account getVlanAccount(long vlanId) {
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ import javax.annotation.PostConstruct;
|
|||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import javax.inject.Inject;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.naming.ConfigurationException;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.servlet.http.HttpSession;
|
||||
|
||||
|
|
@ -65,6 +65,7 @@ import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
|
|||
import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
|
||||
import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
|
||||
import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
|
||||
import com.cloud.event.ActionEventUtils;
|
||||
import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
|
||||
import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
|
||||
import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
|
||||
|
|
@ -122,7 +123,6 @@ import com.cloud.configuration.ConfigurationVO;
|
|||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.domain.Domain;
|
||||
import com.cloud.domain.DomainVO;
|
||||
import com.cloud.event.ActionEventUtils;
|
||||
import com.cloud.exception.AccountLimitException;
|
||||
import com.cloud.exception.CloudAuthenticationException;
|
||||
import com.cloud.exception.InsufficientCapacityException;
|
||||
|
|
@ -142,6 +142,7 @@ import com.cloud.utils.NumbersUtil;
|
|||
import com.cloud.utils.Pair;
|
||||
import com.cloud.utils.StringUtils;
|
||||
import com.cloud.utils.component.ComponentContext;
|
||||
import com.cloud.utils.component.ManagerBase;
|
||||
import com.cloud.utils.component.PluggableService;
|
||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||
import com.cloud.utils.db.SearchCriteria;
|
||||
|
|
@ -149,7 +150,7 @@ import com.cloud.utils.db.Transaction;
|
|||
import com.cloud.utils.exception.CloudRuntimeException;
|
||||
|
||||
@Component
|
||||
public class ApiServer implements HttpRequestHandler, ApiServerService {
|
||||
public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiServerService {
|
||||
private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName());
|
||||
private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName());
|
||||
|
||||
|
|
@ -180,13 +181,19 @@ public class ApiServer implements HttpRequestHandler, ApiServerService {
|
|||
@PostConstruct
|
||||
void initComponent() {
|
||||
s_instance = this;
|
||||
init();
|
||||
}
|
||||
|
||||
public static ApiServer getInstance() {
|
||||
return s_instance;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean configure(String name, Map<String, Object> params)
|
||||
throws ConfigurationException {
|
||||
init();
|
||||
return true;
|
||||
}
|
||||
|
||||
public void init() {
|
||||
Integer apiPort = null; // api port, null by default
|
||||
SearchCriteria<ConfigurationVO> sc = _configDao.createSearchCriteria();
|
||||
|
|
|
|||
|
|
@ -41,5 +41,5 @@ public interface CapacityDao extends GenericDao<CapacityVO, Long> {
|
|||
List<SummedCapacity> listCapacitiesGroupedByLevelAndType(Integer capacityType, Long zoneId, Long podId, Long clusterId, int level, Long limit);
|
||||
void updateCapacityState(Long dcId, Long podId, Long clusterId,
|
||||
Long hostId, String capacityState);
|
||||
List<Long> listClustersCrossingThreshold(short capacityType, Long zoneId, Float disableThreshold, long computeRequested);
|
||||
List<Long> listClustersCrossingThreshold(short capacityType, Long zoneId, String ConfigName, long computeRequested);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ import java.util.Map;
|
|||
import javax.ejb.Local;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import com.cloud.configuration.Config;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||
import org.apache.log4j.Logger;
|
||||
|
|
@ -115,12 +116,20 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
|
|||
|
||||
private static final String LIST_CAPACITY_GROUP_BY_CLUSTER_TYPE_PART2 = " GROUP BY cluster_id, capacity_type order by percent desc limit ";
|
||||
private static final String UPDATE_CAPACITY_STATE = "UPDATE `cloud`.`op_host_capacity` SET capacity_state = ? WHERE ";
|
||||
private static final String LIST_CLUSTERS_CROSSING_THRESHOLD = "SELECT cluster_id " +
|
||||
"FROM (SELECT cluster_id, ( (sum(capacity.used_capacity) + sum(capacity.reserved_capacity) + ?)/sum(total_capacity) ) ratio "+
|
||||
"FROM `cloud`.`op_host_capacity` capacity "+
|
||||
"WHERE capacity.data_center_id = ? AND capacity.capacity_type = ? AND capacity.total_capacity > 0 "+
|
||||
"GROUP BY cluster_id) tmp " +
|
||||
"WHERE tmp.ratio > ? ";
|
||||
|
||||
private static final String LIST_CLUSTERS_CROSSING_THRESHOLD = "SELECT clusterList.cluster_id " +
|
||||
"FROM ( SELECT cluster.cluster_id cluster_id, ( (sum(cluster.used) + sum(cluster.reserved) + ?)/sum(cluster.total) ) ratio, cluster.configValue value " +
|
||||
"FROM ( SELECT capacity.cluster_id cluster_id, capacity.used_capacity used, capacity.reserved_capacity reserved, capacity.total_capacity total, " +
|
||||
"CASE (SELECT count(*) FROM `cloud`.`cluster_details` details WHERE details.cluster_id = capacity.cluster_id AND details.name = ? ) " +
|
||||
"WHEN 1 THEN ( SELECT details.value FROM `cloud`.`cluster_details` details WHERE details.cluster_id = capacity.cluster_id AND details.name = ? ) " +
|
||||
"ELSE ( SELECT config.value FROM `cloud`.`configuration` config WHERE config.name = ?) " +
|
||||
"END configValue " +
|
||||
"FROM `cloud`.`op_host_capacity` capacity " +
|
||||
"WHERE capacity.data_center_id = ? AND capacity.capacity_type = ? AND capacity.total_capacity > 0) cluster " +
|
||||
|
||||
"GROUP BY cluster.cluster_id) clusterList " +
|
||||
"WHERE clusterList.ratio > clusterList.value; ";
|
||||
|
||||
|
||||
|
||||
public CapacityDaoImpl() {
|
||||
|
|
@ -146,20 +155,22 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<Long> listClustersCrossingThreshold(short capacityType, Long zoneId, Float disableThreshold, long compute_requested){
|
||||
public List<Long> listClustersCrossingThreshold(short capacityType, Long zoneId, String configName, long compute_requested){
|
||||
|
||||
Transaction txn = Transaction.currentTxn();
|
||||
PreparedStatement pstmt = null;
|
||||
List<Long> result = new ArrayList<Long>();
|
||||
StringBuilder sql = new StringBuilder(LIST_CLUSTERS_CROSSING_THRESHOLD);
|
||||
|
||||
|
||||
// during listing the clusters that cross the threshold
|
||||
// we need to check with disabled thresholds of each cluster if not defined at cluster consider the global value
|
||||
try {
|
||||
pstmt = txn.prepareAutoCloseStatement(sql.toString());
|
||||
pstmt.setLong(1,compute_requested);
|
||||
pstmt.setShort(2,capacityType);
|
||||
pstmt.setFloat(3,disableThreshold);
|
||||
pstmt.setLong(4,zoneId);
|
||||
pstmt.setString(2, configName);
|
||||
pstmt.setString(3, configName);
|
||||
pstmt.setString(4, configName);
|
||||
pstmt.setLong(5,zoneId);
|
||||
pstmt.setShort(6,capacityType);
|
||||
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
while (rs.next()) {
|
||||
|
|
|
|||
|
|
@ -53,8 +53,8 @@ public enum Config {
|
|||
CapacityCheckPeriod("Alert", ManagementServer.class, Integer.class, "capacity.check.period", "300000", "The interval in milliseconds between capacity checks", null),
|
||||
StorageAllocatedCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.storage.allocated.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of allocated storage utilization above which alerts will be sent about low storage available.", null),
|
||||
StorageCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.storage.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of storage utilization above which alerts will be sent about low storage available.", null),
|
||||
CPUCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.cpu.allocated.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of cpu utilization above which alerts will be sent about low cpu available.", null),
|
||||
MemoryCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.memory.allocated.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of memory utilization above which alerts will be sent about low memory available.", null),
|
||||
CPUCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.cpu.allocated.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of cpu utilization above which alerts will be sent about low cpu available.", null, ConfigurationParameterScope.cluster.toString()),
|
||||
MemoryCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.memory.allocated.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of memory utilization above which alerts will be sent about low memory available.", null, ConfigurationParameterScope.cluster.toString()),
|
||||
PublicIpCapacityThreshold("Alert", ManagementServer.class, Float.class, "zone.virtualnetwork.publicip.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of public IP address space utilization above which alerts will be sent.", null),
|
||||
PrivateIpCapacityThreshold("Alert", ManagementServer.class, Float.class, "pod.privateip.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of private IP address space utilization above which alerts will be sent.", null),
|
||||
SecondaryStorageCapacityThreshold("Alert", ManagementServer.class, Float.class, "zone.secstorage.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of secondary storage utilization above which alerts will be sent about low storage available.", null),
|
||||
|
|
@ -63,8 +63,8 @@ public enum Config {
|
|||
LocalStorageCapacityThreshold("Alert", ManagementServer.class, Float.class, "cluster.localStorage.capacity.notificationthreshold", "0.75", "Percentage (as a value between 0 and 1) of local storage utilization above which alerts will be sent about low local storage available.", null),
|
||||
StorageAllocatedCapacityDisableThreshold("Alert", ManagementServer.class, Float.class, "pool.storage.allocated.capacity.disablethreshold", "0.85", "Percentage (as a value between 0 and 1) of allocated storage utilization above which allocators will disable using the pool for low allocated storage available.", null),
|
||||
StorageCapacityDisableThreshold("Alert", ManagementServer.class, Float.class, "pool.storage.capacity.disablethreshold", "0.85", "Percentage (as a value between 0 and 1) of storage utilization above which allocators will disable using the pool for low storage available.", null),
|
||||
CPUCapacityDisableThreshold("Alert", ManagementServer.class, Float.class, "cluster.cpu.allocated.capacity.disablethreshold", "0.85", "Percentage (as a value between 0 and 1) of cpu utilization above which allocators will disable using the cluster for low cpu available. Keep the corresponding notification threshold lower than this to be notified beforehand.", null),
|
||||
MemoryCapacityDisableThreshold("Alert", ManagementServer.class, Float.class, "cluster.memory.allocated.capacity.disablethreshold", "0.85", "Percentage (as a value between 0 and 1) of memory utilization above which allocators will disable using the cluster for low memory available. Keep the corresponding notification threshold lower than this to be notified beforehand.", null),
|
||||
CPUCapacityDisableThreshold("Alert", ManagementServer.class, Float.class, "cluster.cpu.allocated.capacity.disablethreshold", "0.85", "Percentage (as a value between 0 and 1) of cpu utilization above which allocators will disable using the cluster for low cpu available. Keep the corresponding notification threshold lower than this to be notified beforehand.", null, ConfigurationParameterScope.cluster.toString()),
|
||||
MemoryCapacityDisableThreshold("Alert", ManagementServer.class, Float.class, "cluster.memory.allocated.capacity.disablethreshold", "0.85", "Percentage (as a value between 0 and 1) of memory utilization above which allocators will disable using the cluster for low memory available. Keep the corresponding notification threshold lower than this to be notified beforehand.", null, ConfigurationParameterScope.cluster.toString()),
|
||||
|
||||
|
||||
// Storage
|
||||
|
|
@ -93,8 +93,8 @@ public enum Config {
|
|||
|
||||
GuestVlanBits("Network", ManagementServer.class, Integer.class, "guest.vlan.bits", "12", "The number of bits to reserve for the VLAN identifier in the guest subnet.", null),
|
||||
//MulticastThrottlingRate("Network", ManagementServer.class, Integer.class, "multicast.throttling.rate", "10", "Default multicast rate in megabits per second allowed.", null),
|
||||
NetworkThrottlingRate("Network", ManagementServer.class, Integer.class, "network.throttling.rate", "200", "Default data transfer rate in megabits per second allowed in network.", null),
|
||||
GuestDomainSuffix("Network", AgentManager.class, String.class, "guest.domain.suffix", "cloud.internal", "Default domain name for vms inside virtualized networks fronted by router", null),
|
||||
NetworkThrottlingRate("Network", ManagementServer.class, Integer.class, "network.throttling.rate", "200", "Default data transfer rate in megabits per second allowed in network.", null, ConfigurationParameterScope.zone.toString()),
|
||||
GuestDomainSuffix("Network", AgentManager.class, String.class, "guest.domain.suffix", "cloud.internal", "Default domain name for vms inside virtualized networks fronted by router", null, ConfigurationParameterScope.zone.toString()),
|
||||
DirectNetworkNoDefaultRoute("Network", ManagementServer.class, Boolean.class, "direct.network.no.default.route", "false", "Direct Network Dhcp Server should not send a default route", "true/false"),
|
||||
OvsTunnelNetwork("Network", ManagementServer.class, Boolean.class, "sdn.ovs.controller", "false", "Enable/Disable Open vSwitch SDN controller for L2-in-L3 overlay networks", null),
|
||||
OvsTunnelNetworkDefaultLabel("Network", ManagementServer.class, String.class, "sdn.ovs.controller.default.label", "cloud-public", "Default network label to be used when fetching interface for GRE endpoints", null),
|
||||
|
|
@ -112,7 +112,7 @@ public enum Config {
|
|||
|
||||
//VPN
|
||||
RemoteAccessVpnPskLength("Network", AgentManager.class, Integer.class, "remote.access.vpn.psk.length", "24", "The length of the ipsec preshared key (minimum 8, maximum 256)", null),
|
||||
RemoteAccessVpnClientIpRange("Network", AgentManager.class, String.class, "remote.access.vpn.client.iprange", "10.1.2.1-10.1.2.8", "The range of ips to be allocated to remote access vpn clients. The first ip in the range is used by the VPN server", null),
|
||||
RemoteAccessVpnClientIpRange("Network", AgentManager.class, String.class, "remote.access.vpn.client.iprange", "10.1.2.1-10.1.2.8", "The range of ips to be allocated to remote access vpn clients. The first ip in the range is used by the VPN server", null, ConfigurationParameterScope.account.toString()),
|
||||
RemoteAccessVpnUserLimit("Network", AgentManager.class, String.class, "remote.access.vpn.user.limit", "8", "The maximum number of VPN users that can be created per account", null),
|
||||
Site2SiteVpnConnectionPerVpnGatewayLimit("Network", ManagementServer.class, Integer.class, "site2site.vpn.vpngateway.connection.limit", "4", "The maximum number of VPN connection per VPN gateway", null),
|
||||
Site2SiteVpnSubnetsPerCustomerGatewayLimit("Network", ManagementServer.class, Integer.class, "site2site.vpn.customergateway.subnets.limit", "10", "The maximum number of subnets per customer gateway", null),
|
||||
|
|
@ -149,7 +149,7 @@ public enum Config {
|
|||
S3Enable("Advanced", ManagementServer.class, Boolean.class, "s3.enable", "false", "enable s3 ", null),
|
||||
EventPurgeInterval("Advanced", ManagementServer.class, Integer.class, "event.purge.interval", "86400", "The interval (in seconds) to wait before running the event purge thread", null),
|
||||
AccountCleanupInterval("Advanced", ManagementServer.class, Integer.class, "account.cleanup.interval", "86400", "The interval (in seconds) between cleanup for removed accounts", null),
|
||||
AllowPublicUserTemplates("Advanced", ManagementServer.class, Integer.class, "allow.public.user.templates", "true", "If false, users will not be able to create public templates.", null),
|
||||
AllowPublicUserTemplates("Advanced", ManagementServer.class, Integer.class, "allow.public.user.templates", "true", "If false, users will not be able to create public templates.", null, ConfigurationParameterScope.account.toString()),
|
||||
InstanceName("Advanced", AgentManager.class, String.class, "instance.name", "VM", "Name of the deployment instance.", "instanceName"),
|
||||
ExpungeDelay("Advanced", UserVmManager.class, Integer.class, "expunge.delay", "86400", "Determines how long (in seconds) to wait before actually expunging destroyed vm. The default value = the default value of expunge.interval", null),
|
||||
ExpungeInterval("Advanced", UserVmManager.class, Integer.class, "expunge.interval", "86400", "The interval (in seconds) to wait before running the expunge thread.", null),
|
||||
|
|
@ -419,7 +419,7 @@ public enum Config {
|
|||
global,
|
||||
zone,
|
||||
cluster,
|
||||
pool,
|
||||
storagepool,
|
||||
account
|
||||
}
|
||||
|
||||
|
|
@ -427,7 +427,7 @@ public enum Config {
|
|||
static {
|
||||
_scopeLevelConfigsMap.put(ConfigurationParameterScope.zone.toString(), new ArrayList<Config>());
|
||||
_scopeLevelConfigsMap.put(ConfigurationParameterScope.cluster.toString(), new ArrayList<Config>());
|
||||
_scopeLevelConfigsMap.put(ConfigurationParameterScope.pool.toString(), new ArrayList<Config>());
|
||||
_scopeLevelConfigsMap.put(ConfigurationParameterScope.storagepool.toString(), new ArrayList<Config>());
|
||||
_scopeLevelConfigsMap.put(ConfigurationParameterScope.account.toString(), new ArrayList<Config>());
|
||||
_scopeLevelConfigsMap.put(ConfigurationParameterScope.global.toString(), new ArrayList<Config>());
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ public interface ConfigurationManager extends ConfigurationService, Manager {
|
|||
* @param name
|
||||
* @param value
|
||||
*/
|
||||
void updateConfiguration(long userId, String name, String category, String value, String scope, Long id);
|
||||
String updateConfiguration(long userId, String name, String category, String value, String scope, Long id);
|
||||
|
||||
/**
|
||||
* Creates a new service offering
|
||||
|
|
|
|||
|
|
@ -39,7 +39,9 @@ import javax.naming.NamingException;
|
|||
import javax.naming.directory.DirContext;
|
||||
import javax.naming.directory.InitialDirContext;
|
||||
|
||||
import com.cloud.dc.*;
|
||||
import com.cloud.dc.dao.*;
|
||||
import com.cloud.user.*;
|
||||
import org.apache.cloudstack.acl.SecurityChecker;
|
||||
import org.apache.cloudstack.api.ApiConstants.LDAPParams;
|
||||
import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
|
||||
|
|
@ -64,6 +66,10 @@ import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd;
|
|||
import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd;
|
||||
import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd;
|
||||
import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
|
|
@ -72,20 +78,8 @@ import com.cloud.api.ApiDBUtils;
|
|||
import com.cloud.capacity.dao.CapacityDao;
|
||||
import com.cloud.configuration.Resource.ResourceType;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.dc.AccountVlanMapVO;
|
||||
import com.cloud.dc.ClusterVO;
|
||||
import com.cloud.dc.DataCenter;
|
||||
import com.cloud.dc.DataCenter.NetworkType;
|
||||
import com.cloud.dc.DataCenterIpAddressVO;
|
||||
import com.cloud.dc.DataCenterLinkLocalIpAddressVO;
|
||||
import com.cloud.dc.DataCenterVO;
|
||||
import com.cloud.dc.DcDetailVO;
|
||||
import com.cloud.dc.HostPodVO;
|
||||
import com.cloud.dc.Pod;
|
||||
import com.cloud.dc.PodVlanMapVO;
|
||||
import com.cloud.dc.Vlan;
|
||||
import com.cloud.dc.Vlan.VlanType;
|
||||
import com.cloud.dc.VlanVO;
|
||||
import com.cloud.deploy.DataCenterDeployment;
|
||||
import com.cloud.domain.Domain;
|
||||
import com.cloud.domain.DomainVO;
|
||||
|
|
@ -133,6 +127,7 @@ import com.cloud.org.Grouping;
|
|||
import com.cloud.org.Grouping.AllocationState;
|
||||
import com.cloud.projects.Project;
|
||||
import com.cloud.projects.ProjectManager;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.service.ServiceOfferingVO;
|
||||
import com.cloud.service.dao.ServiceOfferingDao;
|
||||
import com.cloud.storage.DiskOfferingVO;
|
||||
|
|
@ -144,12 +139,6 @@ import com.cloud.storage.s3.S3Manager;
|
|||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.storage.swift.SwiftManager;
|
||||
import com.cloud.test.IPRangeConfig;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.AccountManager;
|
||||
import com.cloud.user.AccountVO;
|
||||
import com.cloud.user.ResourceLimitService;
|
||||
import com.cloud.user.User;
|
||||
import com.cloud.user.UserContext;
|
||||
import com.cloud.user.dao.AccountDao;
|
||||
import com.cloud.utils.NumbersUtil;
|
||||
import com.cloud.utils.StringUtils;
|
||||
|
|
@ -182,8 +171,6 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
@Inject
|
||||
DataCenterDao _zoneDao;
|
||||
@Inject
|
||||
DcDetailsDao _zoneDetailsDao;
|
||||
@Inject
|
||||
DomainDao _domainDao;
|
||||
@Inject
|
||||
SwiftDao _swiftDao;
|
||||
|
|
@ -245,6 +232,18 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
FirewallRulesDao _firewallDao;
|
||||
@Inject
|
||||
VpcManager _vpcMgr;
|
||||
@Inject
|
||||
ConfigurationServer _configServer;
|
||||
@Inject
|
||||
DcDetailsDao _dcDetailsDao;
|
||||
@Inject
|
||||
ClusterDetailsDao _clusterDetailsDao;
|
||||
@Inject
|
||||
StoragePoolDetailsDao _storagePoolDetailsDao;
|
||||
@Inject
|
||||
AccountDetailsDao _accountDetailsDao;
|
||||
@Inject
|
||||
PrimaryDataStoreDao _storagePoolDao;
|
||||
|
||||
// FIXME - why don't we have interface for DataCenterLinkLocalIpAddressDao?
|
||||
@Inject protected DataCenterLinkLocalIpAddressDao _LinkLocalIpAllocDao;
|
||||
|
|
@ -323,9 +322,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
|
||||
@Override
|
||||
@DB
|
||||
public void updateConfiguration(long userId, String name, String category, String value, String scope, Long resourceId) {
|
||||
public String updateConfiguration(long userId, String name, String category, String value, String scope, Long resourceId) {
|
||||
|
||||
String validationMsg = validateConfigurationValue(name, value, scope);
|
||||
String validationMsg = validateConfigurationValue(name, value);
|
||||
|
||||
if (validationMsg != null) {
|
||||
s_logger.error("Invalid configuration option, name: " + name + ", value:" + value);
|
||||
|
|
@ -335,23 +334,61 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
// If scope of the parameter is given then it needs to be updated in the corresponding details table,
|
||||
// if scope is mentioned as global or not mentioned then it is normal global parameter updation
|
||||
if (scope != null && !scope.isEmpty() && !Config.ConfigurationParameterScope.global.toString().equalsIgnoreCase(scope)) {
|
||||
if (Config.ConfigurationParameterScope.zone.toString().equalsIgnoreCase(scope)) {
|
||||
DataCenterVO zone = _zoneDao.findById(resourceId);
|
||||
if (zone == null) {
|
||||
throw new InvalidParameterValueException("unable to find zone by id " + resourceId);
|
||||
}
|
||||
DcDetailVO dcDetailVO = _zoneDetailsDao.findDetail(resourceId, name.toLowerCase());
|
||||
if (dcDetailVO == null) {
|
||||
dcDetailVO = new DcDetailVO(zone.getId(), name, value);
|
||||
_zoneDetailsDao.persist(dcDetailVO);
|
||||
} else {
|
||||
dcDetailVO.setValue(value);
|
||||
_zoneDetailsDao.update(resourceId, dcDetailVO);
|
||||
}
|
||||
} else {
|
||||
s_logger.error("TO Do for the remaining levels (cluster/pool/account)");
|
||||
throw new InvalidParameterValueException("The scope "+ scope +" yet to be implemented");
|
||||
switch (Config.ConfigurationParameterScope.valueOf(scope)) {
|
||||
case zone: DataCenterVO zone = _zoneDao.findById(resourceId);
|
||||
if (zone == null) {
|
||||
throw new InvalidParameterValueException("unable to find zone by id " + resourceId);
|
||||
}
|
||||
DcDetailVO dcDetailVO = _dcDetailsDao.findDetail(resourceId, name.toLowerCase());
|
||||
if (dcDetailVO == null) {
|
||||
dcDetailVO = new DcDetailVO(resourceId, name, value);
|
||||
_dcDetailsDao.persist(dcDetailVO);
|
||||
} else {
|
||||
dcDetailVO.setValue(value);
|
||||
_dcDetailsDao.update(dcDetailVO.getId(), dcDetailVO);
|
||||
} break;
|
||||
case cluster: ClusterVO cluster = _clusterDao.findById(resourceId);
|
||||
if (cluster == null) {
|
||||
throw new InvalidParameterValueException("unable to find cluster by id " + resourceId);
|
||||
}
|
||||
ClusterDetailsVO clusterDetailsVO = _clusterDetailsDao.findDetail(resourceId, name);
|
||||
if (clusterDetailsVO == null) {
|
||||
clusterDetailsVO = new ClusterDetailsVO(resourceId, name, value);
|
||||
_clusterDetailsDao.persist(clusterDetailsVO);
|
||||
} else {
|
||||
clusterDetailsVO.setValue(value);
|
||||
_clusterDetailsDao.update(clusterDetailsVO.getId(), clusterDetailsVO);
|
||||
} break;
|
||||
|
||||
case storagepool: StoragePoolVO pool = _storagePoolDao.findById(resourceId);
|
||||
if (pool == null) {
|
||||
throw new InvalidParameterValueException("unable to find storage pool by id " + resourceId);
|
||||
}
|
||||
StoragePoolDetailVO storagePoolDetailVO = _storagePoolDetailsDao.findDetail(resourceId, name);
|
||||
if (storagePoolDetailVO == null) {
|
||||
storagePoolDetailVO = new StoragePoolDetailVO(resourceId, name, value);
|
||||
_storagePoolDetailsDao.persist(storagePoolDetailVO);
|
||||
|
||||
} else {
|
||||
storagePoolDetailVO.setValue(value);
|
||||
_storagePoolDetailsDao.update(storagePoolDetailVO.getId(), storagePoolDetailVO);
|
||||
} break;
|
||||
|
||||
case account: AccountVO account = _accountDao.findById(resourceId);
|
||||
if (account == null) {
|
||||
throw new InvalidParameterValueException("unable to find account by id " + resourceId);
|
||||
}
|
||||
AccountDetailVO accountDetailVO = _accountDetailsDao.findDetail(resourceId, name);
|
||||
if (accountDetailVO == null) {
|
||||
accountDetailVO = new AccountDetailVO(resourceId, name, value);
|
||||
_accountDetailsDao.persist(accountDetailVO);
|
||||
} else {
|
||||
accountDetailVO.setValue(value);
|
||||
_accountDetailsDao.update(accountDetailVO.getId(), accountDetailVO);
|
||||
} break;
|
||||
default: throw new InvalidParameterValueException("Scope provided is invalid");
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
// Execute all updates in a single transaction
|
||||
|
|
@ -450,16 +487,19 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
}
|
||||
|
||||
txn.commit();
|
||||
return _configDao.getValue(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ActionEvent(eventType = EventTypes.EVENT_CONFIGURATION_VALUE_EDIT, eventDescription = "updating configuration")
|
||||
public Configuration updateConfiguration(UpdateCfgCmd cmd) {
|
||||
public Configuration updateConfiguration(UpdateCfgCmd cmd) throws InvalidParameterValueException {
|
||||
Long userId = UserContext.current().getCallerUserId();
|
||||
String name = cmd.getCfgName();
|
||||
String value = cmd.getValue();
|
||||
String scope = cmd.getScope();
|
||||
Long id = cmd.getId();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Long clusterId = cmd.getClusterId();
|
||||
Long storagepoolId = cmd.getStoragepoolId();
|
||||
Long accountId = cmd.getAccountId();
|
||||
UserContext.current().setEventDetails(" Name: " + name + " New Value: " + (((name.toLowerCase()).contains("password")) ? "*****" :
|
||||
(((value == null) ? "" : value))));
|
||||
// check if config value exists
|
||||
|
|
@ -476,17 +516,44 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
value = null;
|
||||
}
|
||||
|
||||
updateConfiguration(userId, name, config.getCategory(), value, scope, id);
|
||||
String updatedValue = _configDao.getValue(name);
|
||||
String scope = null;
|
||||
Long id = null;
|
||||
int paramCountCheck = 0;
|
||||
|
||||
if (zoneId != null) {
|
||||
scope = Config.ConfigurationParameterScope.zone.toString();
|
||||
id = zoneId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
if (clusterId != null) {
|
||||
scope = Config.ConfigurationParameterScope.cluster.toString();
|
||||
id = clusterId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
if (accountId != null) {
|
||||
scope = Config.ConfigurationParameterScope.account.toString();
|
||||
id = accountId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
if (storagepoolId != null) {
|
||||
scope = Config.ConfigurationParameterScope.storagepool.toString();
|
||||
id = storagepoolId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
|
||||
if (paramCountCheck > 1) {
|
||||
throw new InvalidParameterValueException("cannot handle multiple IDs, provide only one ID corresponding to the scope");
|
||||
}
|
||||
|
||||
String updatedValue = updateConfiguration(userId, name, config.getCategory(), value, scope, id);
|
||||
if ((value == null && updatedValue == null) || updatedValue.equalsIgnoreCase(value)) {
|
||||
return _configDao.findByName(name);
|
||||
|
||||
} else {
|
||||
throw new CloudRuntimeException("Unable to update configuration parameter " + name);
|
||||
}
|
||||
}
|
||||
|
||||
private String validateConfigurationValue(String name, String value, String scope) {
|
||||
private String validateConfigurationValue(String name, String value) {
|
||||
|
||||
Config c = Config.getConfig(name);
|
||||
if (c == null) {
|
||||
|
|
@ -494,12 +561,6 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
return "Invalid configuration variable.";
|
||||
}
|
||||
String configScope = c.getScope();
|
||||
if (scope != null && !scope.isEmpty()) {
|
||||
if (!configScope.contains(scope)) {
|
||||
s_logger.error("Invalid scope " + scope + " for the parameter " + name);
|
||||
return "Invalid scope for the parameter.";
|
||||
}
|
||||
}
|
||||
|
||||
Class<?> type = c.getType();
|
||||
|
||||
|
|
@ -4077,7 +4138,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
}
|
||||
|
||||
@Override
|
||||
public Integer getNetworkOfferingNetworkRate(long networkOfferingId) {
|
||||
public Integer getNetworkOfferingNetworkRate(long networkOfferingId, Long dataCenterId) {
|
||||
|
||||
// validate network offering information
|
||||
NetworkOffering no = getNetworkOffering(networkOfferingId);
|
||||
|
|
@ -4089,7 +4150,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
if (no.getRateMbps() != null) {
|
||||
networkRate = no.getRateMbps();
|
||||
} else {
|
||||
networkRate = Integer.parseInt(_configDao.getValue(Config.NetworkThrottlingRate.key()));
|
||||
networkRate = Integer.parseInt(_configServer.getConfigValue(Config.NetworkThrottlingRate.key(), Config.ConfigurationParameterScope.zone.toString(), dataCenterId));
|
||||
}
|
||||
|
||||
// networkRate is unsigned int in netowrkOfferings table, and can't be
|
||||
|
|
@ -4225,7 +4286,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
}
|
||||
|
||||
@Override
|
||||
public Integer getServiceOfferingNetworkRate(long serviceOfferingId) {
|
||||
public Integer getServiceOfferingNetworkRate(long serviceOfferingId, Long dataCenterId) {
|
||||
|
||||
// validate network offering information
|
||||
ServiceOffering offering = _serviceOfferingDao.findById(serviceOfferingId);
|
||||
|
|
@ -4239,7 +4300,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
|
|||
} else {
|
||||
// for domain router service offering, get network rate from
|
||||
if (offering.getSystemVmType() != null && offering.getSystemVmType().equalsIgnoreCase(VirtualMachine.Type.DomainRouter.toString())) {
|
||||
networkRate = Integer.parseInt(_configDao.getValue(Config.NetworkThrottlingRate.key()));
|
||||
networkRate = Integer.parseInt(_configServer.getConfigValue(Config.NetworkThrottlingRate.key(), Config.ConfigurationParameterScope.zone.toString(), dataCenterId));
|
||||
} else {
|
||||
networkRate = Integer.parseInt(_configDao.getValue(Config.VmNetworkThrottlingRate.key()));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -452,21 +452,6 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
|
|||
return disabledPods;
|
||||
}
|
||||
|
||||
private Map<Short,Float> getCapacityThresholdMap(){
|
||||
// Lets build this real time so that the admin wont have to restart MS if he changes these values
|
||||
Map<Short,Float> disableThresholdMap = new HashMap<Short, Float>();
|
||||
|
||||
String cpuDisableThresholdString = _configDao.getValue(Config.CPUCapacityDisableThreshold.key());
|
||||
float cpuDisableThreshold = NumbersUtil.parseFloat(cpuDisableThresholdString, 0.85F);
|
||||
disableThresholdMap.put(Capacity.CAPACITY_TYPE_CPU, cpuDisableThreshold);
|
||||
|
||||
String memoryDisableThresholdString = _configDao.getValue(Config.MemoryCapacityDisableThreshold.key());
|
||||
float memoryDisableThreshold = NumbersUtil.parseFloat(memoryDisableThresholdString, 0.85F);
|
||||
disableThresholdMap.put(Capacity.CAPACITY_TYPE_MEMORY, memoryDisableThreshold);
|
||||
|
||||
return disableThresholdMap;
|
||||
}
|
||||
|
||||
private List<Short> getCapacitiesForCheckingThreshold(){
|
||||
List<Short> capacityList = new ArrayList<Short>();
|
||||
capacityList.add(Capacity.CAPACITY_TYPE_CPU);
|
||||
|
|
@ -476,7 +461,6 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
|
|||
|
||||
private void removeClustersCrossingThreshold(List<Long> clusterListForVmAllocation, ExcludeList avoid, VirtualMachineProfile<? extends VirtualMachine> vmProfile, DeploymentPlan plan){
|
||||
|
||||
Map<Short,Float> capacityThresholdMap = getCapacityThresholdMap();
|
||||
List<Short> capacityList = getCapacitiesForCheckingThreshold();
|
||||
List<Long> clustersCrossingThreshold = new ArrayList<Long>();
|
||||
|
||||
|
|
@ -491,12 +475,11 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
|
|||
return;
|
||||
}
|
||||
if (capacity == Capacity.CAPACITY_TYPE_CPU) {
|
||||
clustersCrossingThreshold = _capacityDao.listClustersCrossingThreshold(capacity, plan.getDataCenterId(),
|
||||
capacityThresholdMap.get(capacity), cpu_requested);
|
||||
clustersCrossingThreshold = _capacityDao.listClustersCrossingThreshold(capacity, plan.getDataCenterId(), Config.CPUCapacityDisableThreshold.key(), cpu_requested);
|
||||
}
|
||||
else if (capacity == Capacity.CAPACITY_TYPE_MEMORY ) {
|
||||
clustersCrossingThreshold = _capacityDao.listClustersCrossingThreshold(capacity, plan.getDataCenterId(),
|
||||
capacityThresholdMap.get(capacity), ram_requested );
|
||||
Config.MemoryCapacityDisableThreshold.key(), ram_requested );
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -506,8 +489,8 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
|
|||
// Remove clusters crossing disabled threshold
|
||||
clusterListForVmAllocation.removeAll(clustersCrossingThreshold);
|
||||
|
||||
s_logger.debug("Cannot allocate cluster list " + clustersCrossingThreshold.toString() + " for vm creation since their allocated percentage" +
|
||||
" crosses the disable capacity threshold: " + capacityThresholdMap.get(capacity) + " for capacity Type : " + capacity + ", skipping these clusters");
|
||||
s_logger.debug("Cannot allocate cluster list " + clustersCrossingThreshold.toString() + " for vm creation since their allocated percentage" +
|
||||
" crosses the disable capacity threshold defined at each cluster/ at global value for capacity Type : " + capacity + ", skipping these clusters");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -748,37 +731,43 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
|
|||
//If the plan specifies a poolId, it means that this VM's ROOT volume is ready and the pool should be reused.
|
||||
//In this case, also check if rest of the volumes are ready and can be reused.
|
||||
if(plan.getPoolId() != null){
|
||||
s_logger.debug("Volume has pool already allocated, checking if pool can be reused, poolId: "+toBeCreated.getPoolId());
|
||||
s_logger.debug("Volume has pool(" + plan.getPoolId() + ") already allocated, checking if pool can be reused, poolId: "+toBeCreated.getPoolId());
|
||||
List<StoragePool> suitablePools = new ArrayList<StoragePool>();
|
||||
StoragePool pool = null;
|
||||
if(toBeCreated.getPoolId() != null){
|
||||
s_logger.debug("finding pool by id '" + toBeCreated.getPoolId() + "'");
|
||||
pool = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(toBeCreated.getPoolId());
|
||||
}else{
|
||||
s_logger.debug("finding pool by id '" + plan.getPoolId() + "'");
|
||||
pool = (StoragePool)this.dataStoreMgr.getPrimaryDataStore(plan.getPoolId());
|
||||
}
|
||||
|
||||
if(!pool.isInMaintenance()){
|
||||
if(!avoid.shouldAvoid(pool)){
|
||||
long exstPoolDcId = pool.getDataCenterId();
|
||||
if(pool != null){
|
||||
if(!pool.isInMaintenance()){
|
||||
if(!avoid.shouldAvoid(pool)){
|
||||
long exstPoolDcId = pool.getDataCenterId();
|
||||
|
||||
long exstPoolPodId = pool.getPodId() != null ? pool.getPodId() : -1;
|
||||
long exstPoolClusterId = pool.getClusterId() != null ? pool.getClusterId() : -1;
|
||||
if(plan.getDataCenterId() == exstPoolDcId && plan.getPodId() == exstPoolPodId && plan.getClusterId() == exstPoolClusterId){
|
||||
s_logger.debug("Planner need not allocate a pool for this volume since its READY");
|
||||
suitablePools.add(pool);
|
||||
suitableVolumeStoragePools.put(toBeCreated, suitablePools);
|
||||
if (!(toBeCreated.getState() == Volume.State.Allocated || toBeCreated.getState() == Volume.State.Creating)) {
|
||||
readyAndReusedVolumes.add(toBeCreated);
|
||||
long exstPoolPodId = pool.getPodId() != null ? pool.getPodId() : -1;
|
||||
long exstPoolClusterId = pool.getClusterId() != null ? pool.getClusterId() : -1;
|
||||
if(plan.getDataCenterId() == exstPoolDcId && plan.getPodId() == exstPoolPodId && plan.getClusterId() == exstPoolClusterId){
|
||||
s_logger.debug("Planner need not allocate a pool for this volume since its READY");
|
||||
suitablePools.add(pool);
|
||||
suitableVolumeStoragePools.put(toBeCreated, suitablePools);
|
||||
if (!(toBeCreated.getState() == Volume.State.Allocated || toBeCreated.getState() == Volume.State.Creating)) {
|
||||
readyAndReusedVolumes.add(toBeCreated);
|
||||
}
|
||||
continue;
|
||||
}else{
|
||||
s_logger.debug("Pool of the volume does not fit the specified plan, need to reallocate a pool for this volume");
|
||||
}
|
||||
continue;
|
||||
}else{
|
||||
s_logger.debug("Pool of the volume does not fit the specified plan, need to reallocate a pool for this volume");
|
||||
s_logger.debug("Pool of the volume is in avoid set, need to reallocate a pool for this volume");
|
||||
}
|
||||
}else{
|
||||
s_logger.debug("Pool of the volume is in avoid set, need to reallocate a pool for this volume");
|
||||
s_logger.debug("Pool of the volume is in maintenance, need to reallocate a pool for this volume");
|
||||
}
|
||||
}else{
|
||||
s_logger.debug("Pool of the volume is in maintenance, need to reallocate a pool for this volume");
|
||||
s_logger.debug("Unable to find pool by provided id");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ import com.cloud.host.Host;
|
|||
import com.cloud.host.HostVO;
|
||||
import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.IpAddress.State;
|
||||
import com.cloud.network.Network.*;
|
||||
|
|
@ -153,6 +154,8 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
RemoteAccessVpnService _vpnMgr;
|
||||
@Inject
|
||||
PodVlanMapDao _podVlanMapDao;
|
||||
@Inject
|
||||
ConfigurationServer _configServer;
|
||||
|
||||
List<NetworkGuru> _networkGurus;
|
||||
public List<NetworkGuru> getNetworkGurus() {
|
||||
|
|
@ -245,7 +248,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
|
||||
int _networkGcWait;
|
||||
int _networkGcInterval;
|
||||
String _networkDomain;
|
||||
int _networkLockTimeout;
|
||||
|
||||
private Map<String, String> _configs;
|
||||
|
|
@ -866,7 +868,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
_networkGcInterval = NumbersUtil.parseInt(_configs.get(Config.NetworkGcInterval.key()), 600);
|
||||
|
||||
_configs = _configDao.getConfiguration("Network", params);
|
||||
_networkDomain = _configs.get(Config.GuestDomainSuffix.key());
|
||||
|
||||
_networkLockTimeout = NumbersUtil.parseInt(_configs.get(Config.NetworkLockTimeout.key()), 600);
|
||||
|
||||
|
|
@ -2023,7 +2024,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
|
||||
// 2) If null, generate networkDomain using domain suffix from the global config variables
|
||||
if (networkDomain == null) {
|
||||
networkDomain = "cs" + Long.toHexString(owner.getId()) + _networkDomain;
|
||||
networkDomain = "cs" + Long.toHexString(owner.getId()) + _configServer.getConfigValue(Config.GuestDomainSuffix.key(), Config.ConfigurationParameterScope.zone.toString(), zoneId);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
|
@ -2885,7 +2886,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
}
|
||||
|
||||
// Save usage event
|
||||
if (ip.getAllocatedToAccountId() != Account.ACCOUNT_ID_SYSTEM) {
|
||||
if (ip.getAllocatedToAccountId() != null && ip.getAllocatedToAccountId() != Account.ACCOUNT_ID_SYSTEM) {
|
||||
VlanVO vlan = _vlanDao.findById(ip.getVlanId());
|
||||
|
||||
String guestType = vlan.getVlanType().toString();
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ import com.cloud.exception.InvalidParameterValueException;
|
|||
import com.cloud.exception.PermissionDeniedException;
|
||||
import com.cloud.exception.UnsupportedServiceException;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.network.IpAddress.State;
|
||||
import com.cloud.network.Network.Capability;
|
||||
import com.cloud.network.Network.GuestType;
|
||||
|
|
@ -143,6 +144,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
|
||||
@Inject
|
||||
PodVlanMapDao _podVlanMapDao;
|
||||
@Inject
|
||||
ConfigurationServer _configServer;
|
||||
|
||||
List<NetworkElement> _networkElements;
|
||||
public List<NetworkElement> getNetworkElements() {
|
||||
|
|
@ -921,9 +924,9 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
}
|
||||
}
|
||||
if (isUserVmsDefaultNetwork || isDomRGuestOrPublicNetwork) {
|
||||
return _configMgr.getServiceOfferingNetworkRate(vm.getServiceOfferingId());
|
||||
return _configMgr.getServiceOfferingNetworkRate(vm.getServiceOfferingId(), vm.getDataCenterId());
|
||||
} else {
|
||||
return _configMgr.getNetworkOfferingNetworkRate(ntwkOff.getId());
|
||||
return _configMgr.getNetworkOfferingNetworkRate(ntwkOff.getId(), vm.getDataCenterId());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1564,8 +1567,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultNetworkDomain() {
|
||||
return _networkDomain;
|
||||
public String getDefaultNetworkDomain(long zoneId) {
|
||||
return _configServer.getConfigValue(Config.GuestDomainSuffix.key(), Config.ConfigurationParameterScope.zone.toString(), zoneId);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1158,6 +1158,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
Long id = cmd.getId();
|
||||
String keyword = cmd.getKeyword();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
String zoneType = cmd.getZoneType();
|
||||
Account caller = UserContext.current().getCaller();
|
||||
Long domainId = cmd.getDomainId();
|
||||
String accountName = cmd.getAccountName();
|
||||
|
|
@ -1306,39 +1307,39 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
//get account level networks
|
||||
networksToReturn.addAll(listAccountSpecificNetworks(
|
||||
buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
|
||||
physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags), searchFilter,
|
||||
physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter,
|
||||
permittedAccounts));
|
||||
//get domain level networks
|
||||
if (domainId != null) {
|
||||
networksToReturn
|
||||
.addAll(listDomainLevelNetworks(
|
||||
buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
|
||||
physicalNetworkId, aclType, true, restartRequired, specifyIpRanges, vpcId, tags), searchFilter,
|
||||
physicalNetworkId, aclType, true, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter,
|
||||
domainId, false));
|
||||
}
|
||||
} else {
|
||||
//add account specific networks
|
||||
networksToReturn.addAll(listAccountSpecificNetworksByDomainPath(
|
||||
buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
|
||||
physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags), searchFilter, path,
|
||||
physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter, path,
|
||||
isRecursive));
|
||||
//add domain specific networks of domain + parent domains
|
||||
networksToReturn.addAll(listDomainSpecificNetworksByDomainPath(
|
||||
buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
|
||||
physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags), searchFilter, path,
|
||||
physicalNetworkId, aclType, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter, path,
|
||||
isRecursive));
|
||||
//add networks of subdomains
|
||||
if (domainId == null) {
|
||||
networksToReturn
|
||||
.addAll(listDomainLevelNetworks(
|
||||
buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId, guestIpType, trafficType,
|
||||
physicalNetworkId, aclType, true, restartRequired, specifyIpRanges, vpcId, tags), searchFilter,
|
||||
physicalNetworkId, aclType, true, restartRequired, specifyIpRanges, vpcId, tags, zoneType), searchFilter,
|
||||
caller.getDomainId(), true));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
networksToReturn = _networksDao.search(buildNetworkSearchCriteria(sb, keyword, id, isSystem, zoneId,
|
||||
guestIpType, trafficType, physicalNetworkId, null, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags),
|
||||
guestIpType, trafficType, physicalNetworkId, null, skipProjectNetworks, restartRequired, specifyIpRanges, vpcId, tags, zoneType),
|
||||
searchFilter);
|
||||
}
|
||||
|
||||
|
|
@ -1383,7 +1384,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
|
||||
private SearchCriteria<NetworkVO> buildNetworkSearchCriteria(SearchBuilder<NetworkVO> sb, String keyword, Long id,
|
||||
Boolean isSystem, Long zoneId, String guestIpType, String trafficType, Long physicalNetworkId,
|
||||
String aclType, boolean skipProjectNetworks, Boolean restartRequired, Boolean specifyIpRanges, Long vpcId, Map<String, String> tags) {
|
||||
String aclType, boolean skipProjectNetworks, Boolean restartRequired, Boolean specifyIpRanges, Long vpcId, Map<String, String> tags, String zoneType) {
|
||||
|
||||
SearchCriteria<NetworkVO> sc = sb.create();
|
||||
|
||||
|
|
@ -1405,6 +1406,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId);
|
||||
}
|
||||
|
||||
if(zoneType != null) {
|
||||
sc.setJoinParameters("zoneSearch", "networkType", zoneType);
|
||||
}
|
||||
|
||||
if (guestIpType != null) {
|
||||
sc.addAnd("guestType", SearchCriteria.Op.EQ, guestIpType);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -582,7 +582,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
|
|||
|
||||
// 2) If null, generate networkDomain using domain suffix from the global config variables
|
||||
if (networkDomain == null) {
|
||||
networkDomain = "cs" + Long.toHexString(owner.getId()) + _ntwkModel.getDefaultNetworkDomain();
|
||||
networkDomain = "cs" + Long.toHexString(owner.getId()) + _ntwkModel.getDefaultNetworkDomain(zoneId);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ import com.cloud.network.rules.FirewallRule.Purpose;
|
|||
import com.cloud.network.rules.FirewallRuleVO;
|
||||
import com.cloud.network.rules.RulesManager;
|
||||
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.AccountManager;
|
||||
import com.cloud.user.DomainManager;
|
||||
|
|
@ -100,6 +101,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||
@Inject UsageEventDao _usageEventDao;
|
||||
@Inject ConfigurationDao _configDao;
|
||||
@Inject List<RemoteAccessVPNServiceProvider> _vpnServiceProviders;
|
||||
@Inject ConfigurationServer _configServer;
|
||||
|
||||
|
||||
int _userLimit;
|
||||
|
|
@ -156,7 +158,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||
}
|
||||
|
||||
if (ipRange == null) {
|
||||
ipRange = _clientIpRange;
|
||||
ipRange = _configServer.getConfigValue(Config.RemoteAccessVpnClientIpRange.key(), Config.ConfigurationParameterScope.account.toString(), ipAddr.getAccountId());
|
||||
}
|
||||
String[] range = ipRange.split("-");
|
||||
if (range.length != 2) {
|
||||
|
|
@ -200,7 +202,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||
private void validateRemoteAccessVpnConfiguration() throws ConfigurationException {
|
||||
String ipRange = _clientIpRange;
|
||||
if (ipRange == null) {
|
||||
s_logger.warn("Remote Access VPN configuration missing client ip range -- ignoring");
|
||||
s_logger.warn("Remote Access VPN global configuration missing client ip range -- ignoring");
|
||||
return;
|
||||
}
|
||||
Integer pskLength = _pskLength;
|
||||
|
|
|
|||
|
|
@ -48,8 +48,10 @@ import com.cloud.dc.*;
|
|||
import com.cloud.dc.dao.DcDetailsDao;
|
||||
import com.cloud.user.*;
|
||||
import com.cloud.utils.db.GenericDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
|
||||
import org.apache.commons.codec.binary.Base64;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
|
@ -59,6 +61,7 @@ import com.cloud.configuration.Resource.ResourceType;
|
|||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.configuration.dao.ResourceCountDao;
|
||||
import com.cloud.dc.DataCenter.NetworkType;
|
||||
import com.cloud.dc.dao.ClusterDao;
|
||||
import com.cloud.dc.dao.DataCenterDao;
|
||||
import com.cloud.dc.dao.HostPodDao;
|
||||
import com.cloud.dc.dao.VlanDao;
|
||||
|
|
@ -112,6 +115,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||
|
||||
@Inject private ConfigurationDao _configDao;
|
||||
@Inject private DataCenterDao _zoneDao;
|
||||
@Inject private ClusterDao _clusterDao;
|
||||
@Inject private PrimaryDataStoreDao _storagePoolDao;
|
||||
@Inject private HostPodDao _podDao;
|
||||
@Inject private DiskOfferingDao _diskOfferingDao;
|
||||
@Inject private ServiceOfferingDao _serviceOfferingDao;
|
||||
|
|
@ -698,7 +703,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||
return dcDetailVO.getValue();
|
||||
} break;
|
||||
|
||||
case cluster: ClusterDetailsVO cluster = _clusterDetailsDao.findById(resourceId);
|
||||
case cluster: ClusterVO cluster = _clusterDao.findById(resourceId);
|
||||
if (cluster == null) {
|
||||
throw new InvalidParameterValueException("unable to find cluster by id " + resourceId);
|
||||
}
|
||||
|
|
@ -707,7 +712,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||
return clusterDetailsVO.getValue();
|
||||
} break;
|
||||
|
||||
case pool: StoragePoolDetailVO pool = _storagePoolDetailsDao.findById(resourceId);
|
||||
case storagepool: StoragePoolVO pool = _storagePoolDao.findById(resourceId);
|
||||
if (pool == null) {
|
||||
throw new InvalidParameterValueException("unable to find storage pool by id " + resourceId);
|
||||
}
|
||||
|
|
@ -716,7 +721,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||
return storagePoolDetailVO.getValue();
|
||||
} break;
|
||||
|
||||
case account: AccountDetailVO account = _accountDetailsDao.findById(resourceId);
|
||||
case account: AccountVO account = _accountDao.findById(resourceId);
|
||||
if (account == null) {
|
||||
throw new InvalidParameterValueException("unable to find account by id " + resourceId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -616,48 +616,69 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
|
||||
@Override
|
||||
public Pair<List<? extends Cluster>, Integer> searchForClusters(ListClustersCmd cmd) {
|
||||
Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
||||
SearchCriteria<ClusterVO> sc = _clusterDao.createSearchCriteria();
|
||||
|
||||
Object id = cmd.getId();
|
||||
Object id = cmd.getId();
|
||||
Object name = cmd.getClusterName();
|
||||
Object podId = cmd.getPodId();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Object hypervisorType = cmd.getHypervisorType();
|
||||
Object clusterType = cmd.getClusterType();
|
||||
Object allocationState = cmd.getAllocationState();
|
||||
String zoneType = cmd.getZoneType();
|
||||
String keyword = cmd.getKeyword();
|
||||
|
||||
zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
|
||||
|
||||
|
||||
|
||||
Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
||||
|
||||
SearchBuilder<ClusterVO> sb = _clusterDao.createSearchBuilder();
|
||||
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
|
||||
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
|
||||
sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ);
|
||||
sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
sb.and("hypervisorType", sb.entity().getHypervisorType(), SearchCriteria.Op.EQ);
|
||||
sb.and("clusterType", sb.entity().getClusterType(), SearchCriteria.Op.EQ);
|
||||
sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
|
||||
|
||||
if(zoneType != null) {
|
||||
SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
|
||||
zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
|
||||
sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
|
||||
SearchCriteria<ClusterVO> sc = sb.create();
|
||||
if (id != null) {
|
||||
sc.addAnd("id", SearchCriteria.Op.EQ, id);
|
||||
sc.setParameters("id", id);
|
||||
}
|
||||
|
||||
if (name != null) {
|
||||
sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + name + "%");
|
||||
sc.setParameters("name", "%" + name + "%");
|
||||
}
|
||||
|
||||
if (podId != null) {
|
||||
sc.addAnd("podId", SearchCriteria.Op.EQ, podId);
|
||||
sc.setParameters("podId", podId);
|
||||
}
|
||||
|
||||
if (zoneId != null) {
|
||||
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId);
|
||||
sc.setParameters("dataCenterId", zoneId);
|
||||
}
|
||||
|
||||
if (hypervisorType != null) {
|
||||
sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, hypervisorType);
|
||||
sc.setParameters("hypervisorType", hypervisorType);
|
||||
}
|
||||
|
||||
if (clusterType != null) {
|
||||
sc.addAnd("clusterType", SearchCriteria.Op.EQ, clusterType);
|
||||
sc.setParameters("clusterType", clusterType);
|
||||
}
|
||||
|
||||
if (allocationState != null) {
|
||||
sc.addAnd("allocationState", SearchCriteria.Op.EQ, allocationState);
|
||||
sc.setParameters("allocationState", allocationState);
|
||||
}
|
||||
|
||||
if(zoneType != null) {
|
||||
sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
|
||||
}
|
||||
|
||||
if (keyword != null) {
|
||||
SearchCriteria<ClusterVO> ssc = _clusterDao.createSearchCriteria();
|
||||
ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
|
||||
|
|
@ -1068,17 +1089,29 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
|
||||
@Override
|
||||
public Pair<List<? extends Pod>, Integer> searchForPods(ListPodsByCmd cmd) {
|
||||
Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
||||
SearchCriteria<HostPodVO> sc = _hostPodDao.createSearchCriteria();
|
||||
|
||||
String podName = cmd.getPodName();
|
||||
Long id = cmd.getId();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Object keyword = cmd.getKeyword();
|
||||
Object allocationState = cmd.getAllocationState();
|
||||
|
||||
String zoneType = cmd.getZoneType();
|
||||
zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), zoneId);
|
||||
|
||||
|
||||
Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal());
|
||||
SearchBuilder<HostPodVO> sb = _hostPodDao.createSearchBuilder();
|
||||
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
|
||||
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
|
||||
sb.and("dataCenterId", sb.entity().getDataCenterId(), SearchCriteria.Op.EQ);
|
||||
sb.and("allocationState", sb.entity().getAllocationState(), SearchCriteria.Op.EQ);
|
||||
|
||||
if(zoneType != null) {
|
||||
SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
|
||||
zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
|
||||
sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<HostPodVO> sc = sb.create();
|
||||
if (keyword != null) {
|
||||
SearchCriteria<HostPodVO> ssc = _hostPodDao.createSearchCriteria();
|
||||
ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%");
|
||||
|
|
@ -1088,21 +1121,25 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
}
|
||||
|
||||
if (id != null) {
|
||||
sc.addAnd("id", SearchCriteria.Op.EQ, id);
|
||||
sc.setParameters("id", id);
|
||||
}
|
||||
|
||||
|
||||
if (podName != null) {
|
||||
sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + podName + "%");
|
||||
sc.setParameters("name", "%" + podName + "%");
|
||||
}
|
||||
|
||||
|
||||
if (zoneId != null) {
|
||||
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId);
|
||||
sc.setParameters("dataCenterId", zoneId);
|
||||
}
|
||||
|
||||
|
||||
if (allocationState != null) {
|
||||
sc.addAnd("allocationState", SearchCriteria.Op.EQ, allocationState);
|
||||
sc.setParameters("allocationState", allocationState);
|
||||
}
|
||||
|
||||
if(zoneType != null) {
|
||||
sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
|
||||
}
|
||||
|
||||
|
||||
Pair<List<HostPodVO>, Integer> result = _hostPodDao.searchAndCount(sc, searchFilter);
|
||||
return new Pair<List<? extends Pod>, Integer>(result.first(), result.second());
|
||||
}
|
||||
|
|
@ -1237,16 +1274,41 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
Object name = cmd.getConfigName();
|
||||
Object category = cmd.getCategory();
|
||||
Object keyword = cmd.getKeyword();
|
||||
Long id = cmd.getId();
|
||||
String scope = cmd.getScope();
|
||||
Long zoneId = cmd.getZoneId();
|
||||
Long clusterId = cmd.getClusterId();
|
||||
Long storagepoolId = cmd.getStoragepoolId();
|
||||
Long accountId = cmd.getAccountId();
|
||||
String scope = null;
|
||||
Long id = null;
|
||||
int paramCountCheck = 0;
|
||||
|
||||
if (scope!= null && !scope.isEmpty()) {
|
||||
if (zoneId != null) {
|
||||
scope = Config.ConfigurationParameterScope.zone.toString();
|
||||
id = zoneId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
if (clusterId != null) {
|
||||
scope = Config.ConfigurationParameterScope.cluster.toString();
|
||||
id = clusterId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
if (accountId != null) {
|
||||
scope = Config.ConfigurationParameterScope.account.toString();
|
||||
id = accountId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
if (storagepoolId != null) {
|
||||
scope = Config.ConfigurationParameterScope.storagepool.toString();
|
||||
id = storagepoolId;
|
||||
paramCountCheck++;
|
||||
}
|
||||
|
||||
if (paramCountCheck > 1) {
|
||||
throw new InvalidParameterValueException("cannot handle multiple IDs, provide only one ID corresponding to the scope");
|
||||
}
|
||||
|
||||
if (scope != null && !scope.isEmpty()) {
|
||||
// getting the list of parameters at requested scope
|
||||
try {
|
||||
Config.ConfigurationParameterScope.valueOf(scope.toLowerCase());
|
||||
} catch (Exception e ) {
|
||||
throw new InvalidParameterValueException("Invalid scope " + scope + " while listing configuration parameters");
|
||||
}
|
||||
if (id == null) {
|
||||
throw new InvalidParameterValueException("Invalid id null, id is needed corresponding to the scope");
|
||||
}
|
||||
|
|
@ -1309,7 +1371,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor());
|
||||
return listTemplates(cmd.getId(), cmd.getIsoName(), cmd.getKeyword(), isoFilter, true, cmd.isBootable(), cmd.getPageSizeVal(),
|
||||
cmd.getStartIndex(), cmd.getZoneId(), hypervisorType, true, cmd.listInReadyState(), permittedAccounts, caller,
|
||||
listProjectResourcesCriteria, tags);
|
||||
listProjectResourcesCriteria, tags, cmd.getZoneType());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -1342,12 +1404,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
HypervisorType hypervisorType = HypervisorType.getType(cmd.getHypervisor());
|
||||
|
||||
return listTemplates(id, cmd.getTemplateName(), cmd.getKeyword(), templateFilter, false, null, cmd.getPageSizeVal(), cmd.getStartIndex(),
|
||||
cmd.getZoneId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags);
|
||||
cmd.getZoneId(), hypervisorType, showDomr, cmd.listInReadyState(), permittedAccounts, caller, listProjectResourcesCriteria, tags, cmd.getZoneType());
|
||||
}
|
||||
|
||||
private Set<Pair<Long, Long>> listTemplates(Long templateId, String name, String keyword, TemplateFilter templateFilter, boolean isIso,
|
||||
Boolean bootable, Long pageSize, Long startIndex, Long zoneId, HypervisorType hyperType, boolean showDomr, boolean onlyReady,
|
||||
List<Account> permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) {
|
||||
List<Account> permittedAccounts, Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags, String zoneType) {
|
||||
|
||||
VMTemplateVO template = null;
|
||||
if (templateId != null) {
|
||||
|
|
@ -1388,7 +1450,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, tags);
|
||||
Set<Pair<Long, Long>> templateZonePairSet2 = new HashSet<Pair<Long, Long>>();
|
||||
templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize,
|
||||
startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags);
|
||||
startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType);
|
||||
|
||||
for (Pair<Long, Long> tmpltPair : templateZonePairSet2) {
|
||||
if (!templateZonePairSet.contains(new Pair<Long, Long>(tmpltPair.first(), -1L))) {
|
||||
|
|
@ -1412,7 +1474,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
Set<Pair<Long, Long>> templateZonePairSet2 = new HashSet<Pair<Long, Long>>();
|
||||
templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers,
|
||||
bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr,
|
||||
permittedAccounts, caller, listProjectResourcesCriteria, tags);
|
||||
permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType);
|
||||
|
||||
for (Pair<Long, Long> tmpltPair : templateZonePairSet2) {
|
||||
if (!templateZonePairSet.contains(new Pair<Long, Long>(tmpltPair.first(), -1L))) {
|
||||
|
|
@ -1430,7 +1492,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
} else {
|
||||
if (template == null) {
|
||||
templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers, bootable, domain, pageSize,
|
||||
startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags);
|
||||
startIndex, zoneId, hyperType, onlyReady, showDomr, permittedAccounts, caller, listProjectResourcesCriteria, tags, zoneType);
|
||||
} else {
|
||||
// if template is not public, perform permission check here
|
||||
if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
|
||||
|
|
@ -2640,6 +2702,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
public Pair<List<? extends VirtualMachine>, Integer> searchForSystemVm(ListSystemVMsCmd cmd) {
|
||||
String type = cmd.getSystemVmType();
|
||||
Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(UserContext.current().getCaller(), cmd.getZoneId());
|
||||
String zoneType = cmd.getZoneType();
|
||||
Long id = cmd.getId();
|
||||
String name = cmd.getSystemVmName();
|
||||
String state = cmd.getState();
|
||||
|
|
@ -2666,6 +2729,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
sb.join("volumeSearch", volumeSearch, sb.entity().getId(), volumeSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
if(zoneType != null) {
|
||||
SearchBuilder<DataCenterVO> zoneSb = _dcDao.createSearchBuilder();
|
||||
zoneSb.and("zoneNetworkType", zoneSb.entity().getNetworkType(), SearchCriteria.Op.EQ);
|
||||
sb.join("zoneSb", zoneSb, sb.entity().getDataCenterId(), zoneSb.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||
}
|
||||
|
||||
SearchCriteria<VMInstanceVO> sc = sb.create();
|
||||
|
||||
if (keyword != null) {
|
||||
|
|
@ -2706,6 +2775,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
sc.setJoinParameters("volumeSearch", "poolId", storageId);
|
||||
}
|
||||
|
||||
if(zoneType != null) {
|
||||
sc.setJoinParameters("zoneSb", "zoneNetworkType", zoneType);
|
||||
}
|
||||
|
||||
Pair<List<VMInstanceVO>, Integer> result = _vmInstanceDao.searchAndCount(sc, searchFilter);
|
||||
return new Pair<List<? extends VirtualMachine>, Integer>(result.first(), result.second());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ public class StoragePoolDetailsDaoImpl extends GenericDaoBase<StoragePoolDetailV
|
|||
super();
|
||||
PoolSearch = createSearchBuilder();
|
||||
PoolSearch.and("pool", PoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ);
|
||||
PoolSearch.and("name", PoolSearch.entity().getName(), SearchCriteria.Op.EQ);
|
||||
PoolSearch.done();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long>, StateDao<
|
|||
public Set<Pair<Long, Long>> searchTemplates(String name, String keyword, TemplateFilter templateFilter, boolean isIso,
|
||||
List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex, Long zoneId,
|
||||
HypervisorType hyperType, boolean onlyReady, boolean showDomr, List<Account> permittedAccounts, Account caller,
|
||||
ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags);
|
||||
ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags, String zoneType);
|
||||
|
||||
public Set<Pair<Long, Long>> searchSwiftTemplates(String name, String keyword, TemplateFilter templateFilter,
|
||||
boolean isIso, List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex,
|
||||
|
|
|
|||
|
|
@ -520,7 +520,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
|
|||
public Set<Pair<Long, Long>> searchTemplates(String name, String keyword, TemplateFilter templateFilter,
|
||||
boolean isIso, List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex,
|
||||
Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr,List<Account> permittedAccounts,
|
||||
Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) {
|
||||
Account caller, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags, String zoneType) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
if (!permittedAccounts.isEmpty()) {
|
||||
for (Account permittedAccount : permittedAccounts) {
|
||||
|
|
@ -561,7 +561,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
|
|||
sql = SELECT_TEMPLATE_HOST_REF;
|
||||
groupByClause = " GROUP BY t.id, h.data_center_id ";
|
||||
}
|
||||
if ((templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.community)) {
|
||||
if (((templateFilter == TemplateFilter.featured) || (templateFilter == TemplateFilter.community)) ||(zoneType != null && zoneId != null)) {
|
||||
dataCenterJoin = " INNER JOIN data_center dc on (h.data_center_id = dc.id)";
|
||||
}
|
||||
|
||||
|
|
@ -691,7 +691,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
|
|||
}
|
||||
|
||||
sql += whereClause + getExtrasWhere(templateFilter, name, keyword, isIso, bootable, hyperType, zoneId,
|
||||
onlyReady, showDomr) + groupByClause + getOrderByLimit(pageSize, startIndex);
|
||||
onlyReady, showDomr, zoneType) + groupByClause + getOrderByLimit(pageSize, startIndex);
|
||||
|
||||
pstmt = txn.prepareStatement(sql);
|
||||
rs = pstmt.executeQuery();
|
||||
|
|
@ -752,7 +752,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
|
|||
return templateZonePairList;
|
||||
}
|
||||
|
||||
private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr) {
|
||||
private String getExtrasWhere(TemplateFilter templateFilter, String name, String keyword, boolean isIso, Boolean bootable, HypervisorType hyperType, Long zoneId, boolean onlyReady, boolean showDomr, String zoneType) {
|
||||
String sql = "";
|
||||
if (keyword != null) {
|
||||
sql += " t.name LIKE \"%" + keyword + "%\" AND";
|
||||
|
|
@ -783,6 +783,9 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
|
|||
}
|
||||
}else if (zoneId != null){
|
||||
sql += " AND tzr.zone_id = " +zoneId+ " AND tzr.removed is null" ;
|
||||
if (zoneType != null){
|
||||
sql += " AND dc.networktype = " + zoneType;
|
||||
}
|
||||
}else{
|
||||
sql += " AND tzr.removed is null ";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreRole;
|
|||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.api.ApiDBUtils;
|
||||
import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.Resource.ResourceType;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.dc.DataCenterVO;
|
||||
|
|
@ -44,6 +45,7 @@ import com.cloud.exception.ResourceAllocationException;
|
|||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.org.Grouping;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.storage.GuestOS;
|
||||
import com.cloud.storage.Storage.ImageFormat;
|
||||
import com.cloud.storage.Storage.TemplateType;
|
||||
|
|
@ -82,6 +84,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
|||
protected @Inject ResourceLimitService _resourceLimitMgr;
|
||||
protected @Inject DataStoreManager storeMgr;
|
||||
@Inject TemplateManager templateMgr;
|
||||
@Inject ConfigurationServer _configServer;
|
||||
|
||||
@Override
|
||||
public boolean stop() {
|
||||
|
|
@ -167,8 +170,8 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
|||
if (url.toLowerCase().contains("file://")) {
|
||||
throw new InvalidParameterValueException("File:// type urls are currently unsupported");
|
||||
}
|
||||
|
||||
boolean allowPublicUserTemplates = Boolean.parseBoolean(_configDao.getValue("allow.public.user.templates"));
|
||||
// check whether owner can create public templates
|
||||
boolean allowPublicUserTemplates = Boolean.parseBoolean(_configServer.getConfigValue(Config.AllowPublicUserTemplates.key(), Config.ConfigurationParameterScope.account.toString(), templateOwner.getId()));
|
||||
if (!isAdmin && !allowPublicUserTemplates && isPublic) {
|
||||
throw new InvalidParameterValueException("Only private templates/ISO can be created.");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ import com.cloud.projects.Project;
|
|||
import com.cloud.projects.ProjectManager;
|
||||
|
||||
import com.cloud.resource.ResourceManager;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.storage.GuestOSVO;
|
||||
import com.cloud.storage.LaunchPermissionVO;
|
||||
import com.cloud.storage.Snapshot;
|
||||
|
|
@ -253,6 +254,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||
protected ResourceManager _resourceMgr;
|
||||
@Inject VolumeManager volumeMgr;
|
||||
@Inject VMTemplateHostDao templateHostDao;
|
||||
@Inject
|
||||
ConfigurationServer _configServer;
|
||||
|
||||
|
||||
int _primaryStorageDownloadWait;
|
||||
|
|
@ -1609,7 +1612,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||
}
|
||||
|
||||
boolean isAdmin = _accountMgr.isAdmin(caller.getType());
|
||||
boolean allowPublicUserTemplates = Boolean.valueOf(_configDao.getValue("allow.public.user.templates"));
|
||||
// check configuration parameter(allow.public.user.templates) value for the template owner
|
||||
boolean allowPublicUserTemplates = Boolean.valueOf(_configServer.getConfigValue(Config.AllowPublicUserTemplates.key(), Config.ConfigurationParameterScope.account.toString(), template.getAccountId()));
|
||||
if (!isAdmin && !allowPublicUserTemplates && isPublic != null && isPublic) {
|
||||
throw new InvalidParameterValueException("Only private " + mediaType + "s can be created.");
|
||||
}
|
||||
|
|
@ -1842,8 +1846,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||
if (isPublic == null) {
|
||||
isPublic = Boolean.FALSE;
|
||||
}
|
||||
boolean allowPublicUserTemplates = Boolean.parseBoolean(_configDao
|
||||
.getValue("allow.public.user.templates"));
|
||||
// check whether template owner can create public templates
|
||||
boolean allowPublicUserTemplates = Boolean.parseBoolean(_configServer.getConfigValue(Config.AllowPublicUserTemplates.key(), Config.ConfigurationParameterScope.account.toString(), templateOwner.getId()));
|
||||
if (!isAdmin && !allowPublicUserTemplates && isPublic) {
|
||||
throw new PermissionDeniedException("Failed to create template "
|
||||
+ name + ", only private templates can be created.");
|
||||
|
|
|
|||
|
|
@ -566,7 +566,7 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
* @see com.cloud.network.NetworkModel#getDefaultNetworkDomain()
|
||||
*/
|
||||
@Override
|
||||
public String getDefaultNetworkDomain() {
|
||||
public String getDefaultNetworkDomain(long zoneId) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -283,7 +283,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
|
|||
* @see com.cloud.configuration.ConfigurationService#getNetworkOfferingNetworkRate(long)
|
||||
*/
|
||||
@Override
|
||||
public Integer getNetworkOfferingNetworkRate(long networkOfferingId) {
|
||||
public Integer getNetworkOfferingNetworkRate(long networkOfferingId, Long dataCenterId) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
|
@ -336,7 +336,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
|
|||
* @see com.cloud.configuration.ConfigurationService#getServiceOfferingNetworkRate(long)
|
||||
*/
|
||||
@Override
|
||||
public Integer getServiceOfferingNetworkRate(long serviceOfferingId) {
|
||||
public Integer getServiceOfferingNetworkRate(long serviceOfferingId, Long dataCenterId) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
|
@ -426,9 +426,9 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
|
|||
* @see com.cloud.configuration.ConfigurationManager#updateConfiguration(long, java.lang.String, java.lang.String, java.lang.String)
|
||||
*/
|
||||
@Override
|
||||
public void updateConfiguration(long userId, String name, String category, String value, String scope, Long resourceId) {
|
||||
public String updateConfiguration(long userId, String name, String category, String value, String scope, Long resourceId) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
|
|
|
|||
|
|
@ -581,7 +581,7 @@ public class MockNetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
* @see com.cloud.network.NetworkModel#getDefaultNetworkDomain()
|
||||
*/
|
||||
@Override
|
||||
public String getDefaultNetworkDomain() {
|
||||
public String getDefaultNetworkDomain(long zoneId) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,10 +18,17 @@ package org.apache.cloudstack.affinity;
|
|||
|
||||
import java.io.IOException;
|
||||
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.user.AccountDetailsDao;
|
||||
import com.cloud.user.AccountManager;
|
||||
import com.cloud.user.ResourceLimitService;
|
||||
import com.cloud.user.UserContextInitializer;
|
||||
import org.apache.cloudstack.acl.SecurityChecker;
|
||||
import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
|
||||
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
|
@ -38,6 +45,8 @@ import com.cloud.api.query.dao.UserAccountJoinDaoImpl;
|
|||
import com.cloud.capacity.dao.CapacityDaoImpl;
|
||||
import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.dc.ClusterDetailsDao;
|
||||
import com.cloud.dc.dao.DcDetailsDao;
|
||||
import com.cloud.dc.dao.AccountVlanMapDaoImpl;
|
||||
import com.cloud.dc.dao.ClusterDaoImpl;
|
||||
import com.cloud.dc.dao.DataCenterDaoImpl;
|
||||
|
|
@ -100,10 +109,6 @@ import com.cloud.storage.s3.S3Manager;
|
|||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.storage.swift.SwiftManager;
|
||||
import com.cloud.tags.dao.ResourceTagsDaoImpl;
|
||||
import com.cloud.user.AccountManager;
|
||||
import com.cloud.user.ResourceLimitService;
|
||||
import com.cloud.user.UserContext;
|
||||
import com.cloud.user.UserContextInitializer;
|
||||
import com.cloud.user.dao.AccountDao;
|
||||
import com.cloud.user.dao.AccountDaoImpl;
|
||||
import com.cloud.user.dao.UserDaoImpl;
|
||||
|
|
@ -330,6 +335,22 @@ public class AffinityApiTestConfiguration {
|
|||
public DataCenterLinkLocalIpAddressDao datacenterLinkLocalIpAddressDao() {
|
||||
return Mockito.mock(DataCenterLinkLocalIpAddressDao.class);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ConfigurationServer configurationServer() {
|
||||
return Mockito.mock(ConfigurationServer.class);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ClusterDetailsDao clusterDetailsDao() {
|
||||
return Mockito.mock(ClusterDetailsDao.class);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AccountDetailsDao accountDetailsDao() {
|
||||
return Mockito.mock(AccountDetailsDao.class);
|
||||
}
|
||||
|
||||
|
||||
public static class Library implements TypeFilter {
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,14 @@ package org.apache.cloudstack.networkoffering;
|
|||
|
||||
import java.io.IOException;
|
||||
|
||||
import com.cloud.dc.ClusterDetailsDao;
|
||||
import com.cloud.dc.dao.*;
|
||||
import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.user.*;
|
||||
import org.apache.cloudstack.acl.SecurityChecker;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl;
|
||||
import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
|
||||
import org.mockito.Mockito;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
|
@ -37,18 +43,6 @@ import com.cloud.api.query.dao.UserAccountJoinDaoImpl;
|
|||
import com.cloud.capacity.dao.CapacityDaoImpl;
|
||||
import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl;
|
||||
import com.cloud.configuration.dao.ConfigurationDao;
|
||||
import com.cloud.dc.dao.AccountVlanMapDaoImpl;
|
||||
import com.cloud.dc.dao.ClusterDaoImpl;
|
||||
import com.cloud.dc.dao.DataCenterDaoImpl;
|
||||
import com.cloud.dc.dao.DataCenterIpAddressDaoImpl;
|
||||
import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDao;
|
||||
import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl;
|
||||
import com.cloud.dc.dao.DataCenterVnetDaoImpl;
|
||||
import com.cloud.dc.dao.DcDetailsDaoImpl;
|
||||
import com.cloud.dc.dao.HostPodDaoImpl;
|
||||
import com.cloud.dc.dao.PodVlanDaoImpl;
|
||||
import com.cloud.dc.dao.PodVlanMapDaoImpl;
|
||||
import com.cloud.dc.dao.VlanDaoImpl;
|
||||
import com.cloud.domain.dao.DomainDaoImpl;
|
||||
import com.cloud.event.dao.UsageEventDaoImpl;
|
||||
import com.cloud.host.dao.HostDaoImpl;
|
||||
|
|
@ -97,10 +91,6 @@ import com.cloud.storage.s3.S3Manager;
|
|||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||
import com.cloud.storage.swift.SwiftManager;
|
||||
import com.cloud.tags.dao.ResourceTagsDaoImpl;
|
||||
import com.cloud.user.AccountManager;
|
||||
import com.cloud.user.ResourceLimitService;
|
||||
import com.cloud.user.UserContext;
|
||||
import com.cloud.user.UserContextInitializer;
|
||||
import com.cloud.user.dao.AccountDaoImpl;
|
||||
import com.cloud.user.dao.UserDaoImpl;
|
||||
import com.cloud.utils.component.SpringComponentScanUtils;
|
||||
|
|
@ -323,6 +313,22 @@ public class ChildTestConfiguration {
|
|||
public DataCenterLinkLocalIpAddressDao datacenterLinkLocalIpAddressDao() {
|
||||
return Mockito.mock(DataCenterLinkLocalIpAddressDao.class);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ConfigurationServer configurationServer() {
|
||||
return Mockito.mock(ConfigurationServer.class);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ClusterDetailsDao clusterDetailsDao() {
|
||||
return Mockito.mock(ClusterDetailsDao.class);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AccountDetailsDao accountDetailsDao() {
|
||||
return Mockito.mock(AccountDetailsDao.class);
|
||||
}
|
||||
|
||||
|
||||
public static class Library implements TypeFilter {
|
||||
|
||||
|
|
|
|||
|
|
@ -119,21 +119,28 @@ CREATE TABLE `cloud`.`load_balancer_healthcheck_policies` (
|
|||
|
||||
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.instancename.flag', 'false', 'Append guest VM display Name (if set) to the internal name of the VM');
|
||||
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (208, UUID(), 6, 'Windows 8');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (209, UUID(), 6, 'Windows 8 (64 bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (210, UUID(), 6, 'Windows 8 Server (64 bit)');
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8', 208);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (64 bit)', 209);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 Server (64 bit)', 210);
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (165, UUID(), 6, 'Windows 8 (32-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (166, UUID(), 6, 'Windows 8 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (167, UUID(), 6, 'Windows Server 2012 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (168, UUID(), 6, 'Windows Server 8 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (32-bit)', 165);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (64-bit)', 166);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows Server 2012 (64-bit)', 167);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows Server 8 (64-bit)', 168);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows 8 (32-bit)', 165);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows 8 (64-bit)', 166);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows Server 2012 (64-bit)', 167);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows Server 8 (64-bit)', 168);
|
||||
√
|
||||
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (211, UUID(), 7, 'Apple Mac OS X 10.6 (32 bits)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (212, UUID(), 7, 'Apple Mac OS X 10.6 (64 bits)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (213, UUID(), 7, 'Apple Mac OS X 10.7 (32 bits)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (214, UUID(), 7, 'Apple Mac OS X 10.7 (64 bits)');
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.6 (32 bits)', 211);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.6 (64 bits)', 212);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.7 (32 bits)', 213);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.7 (64 bits)', 214);
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (211, UUID(), 7, 'Apple Mac OS X 10.6 (32-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (212, UUID(), 7, 'Apple Mac OS X 10.6 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (213, UUID(), 7, 'Apple Mac OS X 10.7 (32-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (214, UUID(), 7, 'Apple Mac OS X 10.7 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.6 (32-bit)', 211);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.6 (64-bit)', 212);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.7 (32-bit)', 213);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Apple Mac OS X 10.7 (64-bit)', 214);
|
||||
|
||||
CREATE TABLE `cloud`.`user_vm_clone_setting` (
|
||||
`vm_id` bigint unsigned NOT NULL COMMENT 'guest VM id',
|
||||
|
|
@ -1110,3 +1117,7 @@ CREATE VIEW `cloud`.`account_view` AS
|
|||
and async_job.job_status = 0;
|
||||
|
||||
alter table `cloud_usage`.`usage_network_offering` add column nic_id bigint(20) unsigned NOT NULL;
|
||||
ALTER TABLE `cloud`.`data_center_details` MODIFY value varchar(1024);
|
||||
ALTER TABLE `cloud`.`cluster_details` MODIFY value varchar(255);
|
||||
ALTER TABLE `cloud`.`storage_pool_details` MODIFY value varchar(255);
|
||||
ALTER TABLE `cloud`.`account_details` MODIFY value varchar(255);
|
||||
|
|
|
|||
|
|
@ -214,6 +214,10 @@ INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (161
|
|||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (162, UUID(), 1, 'CentOS 5.7 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (163, UUID(), 10, 'Ubuntu 12.04 (32-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (164, UUID(), 10, 'Ubuntu 12.04 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (165, UUID(), 6, 'Windows 8 (32-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (166, UUID(), 6, 'Windows 8 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (167, UUID(), 6, 'Windows Server 2012 (64-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (168, UUID(), 6, 'Windows Server 8 (64-bit)');
|
||||
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (200, UUID(), 1, 'Other CentOS (32-bit)');
|
||||
INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (201, UUID(), 1, 'Other CentOS (64-bit)');
|
||||
|
|
@ -294,6 +298,10 @@ INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest
|
|||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ('XenServer', 'Other install media', 130);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ('XenServer', 'Other PV (32-bit)', 139);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ('XenServer', 'Other PV (64-bit)', 140);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows 8 (32-bit)', 165);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows 8 (64-bit)', 166);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows Server 2012 (64-bit)', 167);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows Server 8 (64-bit)', 168);
|
||||
|
||||
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Microsoft Windows 7(32-bit)', 48);
|
||||
|
|
@ -323,6 +331,10 @@ INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest
|
|||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Microsoft Windows 95', 63);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Microsoft Windows NT 4', 64);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Microsoft Windows 3.1', 65);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (32-bit)', 165);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (64-bit)', 166);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows Server 2012 (64-bit)', 167);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows Server 8 (64-bit)', 168);
|
||||
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Red Hat Enterprise Linux 5.0(32-bit)', 30);
|
||||
INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Red Hat Enterprise Linux 5.1(32-bit)', 32);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,238 @@
|
|||
# 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.
|
||||
""" Tests for Multiple IP Ranges feature
|
||||
"""
|
||||
from marvin.cloudstackTestCase import *
|
||||
from marvin.cloudstackAPI import *
|
||||
from marvin.integration.lib.utils import *
|
||||
from marvin.integration.lib.base import *
|
||||
from marvin.integration.lib.common import *
|
||||
from netaddr import *
|
||||
|
||||
from nose.plugins.attrib import attr
|
||||
|
||||
class Services:
|
||||
"""Test Multiple IP Ranges
|
||||
"""
|
||||
def __init__(self):
|
||||
self.services = {
|
||||
"account": {
|
||||
"email": "test@test.com",
|
||||
"firstname": "Test",
|
||||
"lastname": "User",
|
||||
"username": "test",
|
||||
# Random characters are appended for unique
|
||||
# username
|
||||
"password": "password",
|
||||
},
|
||||
"service_offering": {
|
||||
"name": "Tiny Instance",
|
||||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 200, # in MHz
|
||||
"memory": 256, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small Disk",
|
||||
"name": "Small Disk",
|
||||
"disksize": 1
|
||||
},
|
||||
"templates": {
|
||||
"displaytext": 'Template',
|
||||
"name": 'Template',
|
||||
"ostype": "CentOS 5.3 (64-bit)",
|
||||
"templatefilter": 'self',
|
||||
},
|
||||
"vlan_ip_range": {
|
||||
"startip": "",
|
||||
"endip": "",
|
||||
"netmask": "",
|
||||
"gateway": "",
|
||||
"forvirtualnetwork": "false",
|
||||
"vlan": "untagged",
|
||||
}
|
||||
}
|
||||
|
||||
class TestMultipleIpRanges(cloudstackTestCase):
|
||||
"""Test Multiple IP Ranges for guest network
|
||||
"""
|
||||
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.api_client = super(TestMultipleIpRanges, cls).getClsTestClient().getApiClient()
|
||||
cls.services = Services().services
|
||||
# Get Zone, Domain and templates
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.zone = get_zone(cls.api_client, cls.services)
|
||||
cls.pod = get_pod(cls.api_client, cls.zone.id, cls.services)
|
||||
cls.services['mode'] = cls.zone.networktype
|
||||
cls.services["domainid"] = cls.domain.id
|
||||
cls.services["zoneid"] = cls.zone.id
|
||||
cls.account = Account.create(
|
||||
cls.api_client,
|
||||
cls.services["account"],
|
||||
domainid=cls.domain.id
|
||||
)
|
||||
cls.services["account"] = cls.account.account.name
|
||||
cls._cleanup = [
|
||||
cls.account,
|
||||
]
|
||||
return
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
try:
|
||||
#Cleanup resources used
|
||||
cleanup_resources(cls.api_client, cls._cleanup)
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||
return
|
||||
|
||||
def setUp(self):
|
||||
self.apiclient = self.testClient.getApiClient()
|
||||
self.dbclient = self.testClient.getDbConnection()
|
||||
self.cleanup = [ ]
|
||||
return
|
||||
|
||||
def tearDown(self):
|
||||
try:
|
||||
#Clean up, terminate the resources created
|
||||
cleanup_resources(self.apiclient, self.cleanup)
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||
return
|
||||
|
||||
def increment_cidr(self):
|
||||
"""Takes CIDR as input and will increment by one and returns the new CIDR
|
||||
"""
|
||||
publicIpRange = PublicIpRange.list(self.apiclient)
|
||||
self.startIp = publicIpRange[0].startip
|
||||
self.endIp = publicIpRange[0].endip
|
||||
self.gateway = publicIpRange[0].gateway
|
||||
self.netmask = publicIpRange[0].netmask
|
||||
#Pass ip address and mask length to IPNetwork to findout the CIDR
|
||||
ip = IPNetwork(self.startIp+"/"+self.netmask)
|
||||
new_cidr = ip.__iadd__(1)
|
||||
ip2 = IPNetwork(new_cidr)
|
||||
return ip2
|
||||
|
||||
def verify_vlan_range(self,vlan,services):
|
||||
#compare vlan_list response with configured values
|
||||
self.assertEqual(
|
||||
isinstance(vlan, list),
|
||||
True,
|
||||
"Check list response returned a valid list"
|
||||
)
|
||||
self.assertNotEqual(
|
||||
len(vlan),
|
||||
0,
|
||||
"check list vlan response"
|
||||
)
|
||||
self.assertEqual(
|
||||
vlan[0].startip,
|
||||
services["startip"],
|
||||
"Start IP in vlan ip range is not matched with the configured start ip"
|
||||
)
|
||||
self.assertEqual(
|
||||
vlan[0].endip,
|
||||
services["endip"],
|
||||
"End IP in vlan ip range is not matched with the configured end ip"
|
||||
)
|
||||
self.assertEqual(
|
||||
vlan[0].gateway,
|
||||
services["gateway"],
|
||||
"gateway in vlan ip range is not matched with the configured gateway"
|
||||
)
|
||||
self.assertEqual(
|
||||
vlan[0].netmask,
|
||||
services["netmask"],
|
||||
"netmask in vlan ip range is not matched with the configured netmask"
|
||||
)
|
||||
return
|
||||
|
||||
@attr(tags=["advanced_sg", "sg"])
|
||||
def test_01_add_ip_same_cidr(self):
|
||||
"""Test add guest ip range in the existing cidr
|
||||
"""
|
||||
#call increment_cidr function to get exiting cidr from the setup and increment it
|
||||
ip2 = self.increment_cidr()
|
||||
test_nw = ip2.network
|
||||
#Add IP range(5 IPs) in the new CIDR
|
||||
test_gateway = test_nw+1
|
||||
test_startIp = test_nw+2
|
||||
test_endIp = test_startIp+5
|
||||
test_startIp2= test_endIp+5
|
||||
test_endIp2 = test_startIp2+5
|
||||
#Populating services with new IP range
|
||||
self.services["vlan_ip_range"]["startip"] = test_startIp
|
||||
self.services["vlan_ip_range"]["endip"] = test_endIp
|
||||
self.services["vlan_ip_range"]["gateway"] = test_gateway
|
||||
self.services["vlan_ip_range"]["netmask"] = self.netmask
|
||||
self.services["vlan_ip_range"]["zoneid"] = self.zone.id
|
||||
self.services["vlan_ip_range"]["podid"] = self.pod.id
|
||||
#create new vlan ip range
|
||||
new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
|
||||
self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp))
|
||||
self.cleanup.append(new_vlan)
|
||||
new_vlan_res = new_vlan.list(self.apiclient,new_vlan.id)
|
||||
#Compare list output with configured values
|
||||
self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"])
|
||||
#Add few more ips in the same CIDR
|
||||
self.services["vlan_ip_range"]["startip"] = test_startIp2
|
||||
self.services["vlan_ip_range"]["endip"] = test_endIp2
|
||||
new_vlan2 = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
|
||||
self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp2,test_endIp2))
|
||||
self.cleanup.append(new_vlan2)
|
||||
#list new vlan ip range
|
||||
new_vlan2_res = new_vlan2.list(self.apiclient,new_vlan2.id)
|
||||
#Compare list output with configured values
|
||||
self.verify_vlan_range(new_vlan2_res,self.services["vlan_ip_range"])
|
||||
return
|
||||
|
||||
@attr(tags=["advanced_sg", "sg"])
|
||||
def test_02_add_ip_diff_cidr(self):
|
||||
"""Test add ip range in a new cidr
|
||||
|
||||
Steps:
|
||||
1.Get public vlan range (guest cidr) from the setup
|
||||
2.Add IP range to a new cidr
|
||||
"""
|
||||
#call increment_cidr function to get exiting cidr from the setup and increment it
|
||||
ip2 = self.increment_cidr()
|
||||
test_nw = ip2.network
|
||||
#Add IP range(5 IPs) in the new CIDR
|
||||
test_gateway = test_nw+1
|
||||
test_startIp = test_nw+2
|
||||
test_endIp = test_startIp+5
|
||||
#Populating services with new IP range
|
||||
self.services["vlan_ip_range"]["startip"] = test_startIp
|
||||
self.services["vlan_ip_range"]["endip"] = test_endIp
|
||||
self.services["vlan_ip_range"]["gateway"] = test_gateway
|
||||
self.services["vlan_ip_range"]["netmask"] = self.netmask
|
||||
self.services["vlan_ip_range"]["zoneid"] = self.zone.id
|
||||
self.services["vlan_ip_range"]["podid"] = self.pod.id
|
||||
#create new vlan ip range
|
||||
new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
|
||||
self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp))
|
||||
self.cleanup.append(new_vlan)
|
||||
new_vlan_res = new_vlan.list(self.apiclient,new_vlan.id)
|
||||
#Compare list output with configured values
|
||||
self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"])
|
||||
return
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,447 @@
|
|||
# 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.
|
||||
|
||||
""" P1 tests for VPN users
|
||||
"""
|
||||
# Import Local Modules
|
||||
from nose.plugins.attrib import attr
|
||||
from marvin.cloudstackTestCase import cloudstackTestCase
|
||||
from marvin.integration.lib.base import (
|
||||
Account,
|
||||
ServiceOffering,
|
||||
VirtualMachine,
|
||||
PublicIPAddress,
|
||||
Vpn,
|
||||
VpnUser,
|
||||
Configurations,
|
||||
NATRule
|
||||
)
|
||||
from marvin.integration.lib.common import (get_domain,
|
||||
get_zone,
|
||||
get_template,
|
||||
cleanup_resources,
|
||||
)
|
||||
|
||||
|
||||
class Services:
|
||||
"""Test VPN users Services
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.services = {
|
||||
"account": {
|
||||
"email": "test@test.com",
|
||||
"firstname": "Test",
|
||||
"lastname": "User",
|
||||
"username": "test",
|
||||
# Random characters are appended for unique
|
||||
# username
|
||||
"password": "password",
|
||||
},
|
||||
"service_offering": {
|
||||
"name": "Tiny Instance",
|
||||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small Disk Offering",
|
||||
"name": "Small Disk Offering",
|
||||
"disksize": 1
|
||||
},
|
||||
"virtual_machine": {
|
||||
"displayname": "TestVM",
|
||||
"username": "root",
|
||||
"password": "password",
|
||||
"ssh_port": 22,
|
||||
"hypervisor": 'KVM',
|
||||
"privateport": 22,
|
||||
"publicport": 22,
|
||||
"protocol": 'TCP',
|
||||
},
|
||||
"vpn_user": {
|
||||
"username": "test",
|
||||
"password": "test",
|
||||
},
|
||||
"natrule": {
|
||||
"privateport": 1701,
|
||||
"publicport": 1701,
|
||||
"protocol": "UDP"
|
||||
},
|
||||
"ostype": 'CentOS 5.5 (64-bit)',
|
||||
"sleep": 60,
|
||||
"timeout": 10,
|
||||
# Networking mode: Advanced, Basic
|
||||
}
|
||||
|
||||
|
||||
class TestVPNUsers(cloudstackTestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.api_client = super(TestVPNUsers,
|
||||
cls).getClsTestClient().getApiClient()
|
||||
cls.services = Services().services
|
||||
# Get Zone, Domain and templates
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.zone = get_zone(cls.api_client, cls.services)
|
||||
cls.services["mode"] = cls.zone.networktype
|
||||
|
||||
cls.template = get_template(
|
||||
cls.api_client,
|
||||
cls.zone.id,
|
||||
cls.services["ostype"]
|
||||
)
|
||||
|
||||
cls.services["virtual_machine"]["zoneid"] = cls.zone.id
|
||||
cls.service_offering = ServiceOffering.create(
|
||||
cls.api_client,
|
||||
cls.services["service_offering"]
|
||||
)
|
||||
|
||||
cls._cleanup = [cls.service_offering, ]
|
||||
return
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
try:
|
||||
# Cleanup resources used
|
||||
cleanup_resources(cls.api_client, cls._cleanup)
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||
return
|
||||
|
||||
def setUp(self):
|
||||
self.apiclient = self.testClient.getApiClient()
|
||||
self.dbclient = self.testClient.getDbConnection()
|
||||
self.account = Account.create(
|
||||
self.apiclient,
|
||||
self.services["account"],
|
||||
domainid=self.domain.id
|
||||
)
|
||||
self.virtual_machine = VirtualMachine.create(
|
||||
self.apiclient,
|
||||
self.services["virtual_machine"],
|
||||
templateid=self.template.id,
|
||||
accountid=self.account.account.name,
|
||||
domainid=self.account.account.domainid,
|
||||
serviceofferingid=self.service_offering.id
|
||||
)
|
||||
self.public_ip = PublicIPAddress.create(
|
||||
self.apiclient,
|
||||
self.virtual_machine.account,
|
||||
self.virtual_machine.zoneid,
|
||||
self.virtual_machine.domainid,
|
||||
self.services["virtual_machine"]
|
||||
)
|
||||
self.cleanup = [
|
||||
self.account,
|
||||
]
|
||||
return
|
||||
|
||||
def tearDown(self):
|
||||
try:
|
||||
# Clean up, terminate the created instance, volumes and snapshots
|
||||
cleanup_resources(self.apiclient, self.cleanup)
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||
return
|
||||
|
||||
def create_VPN(self, public_ip):
|
||||
"""Creates VPN for the network"""
|
||||
|
||||
self.debug("Creating VPN with public IP: %s" % public_ip.ipaddress.id)
|
||||
try:
|
||||
# Assign VPN to Public IP
|
||||
vpn = Vpn.create(self.apiclient,
|
||||
self.public_ip.ipaddress.id,
|
||||
account=self.account.account.name,
|
||||
domainid=self.account.account.domainid)
|
||||
|
||||
self.debug("Verifying the remote VPN access")
|
||||
vpns = Vpn.list(self.apiclient,
|
||||
publicipid=public_ip.ipaddress.id,
|
||||
listall=True)
|
||||
self.assertEqual(
|
||||
isinstance(vpns, list),
|
||||
True,
|
||||
"List VPNs shall return a valid response"
|
||||
)
|
||||
return vpn
|
||||
except Exception as e:
|
||||
self.fail("Failed to create remote VPN access: %s" % e)
|
||||
|
||||
def create_VPN_Users(self, rand_name=True, api_client=None):
|
||||
"""Creates VPN users for the network"""
|
||||
|
||||
self.debug("Creating VPN users for account: %s" %
|
||||
self.account.account.name)
|
||||
if api_client is None:
|
||||
api_client = self.apiclient
|
||||
try:
|
||||
vpnuser = VpnUser.create(
|
||||
api_client,
|
||||
self.services["vpn_user"]["username"],
|
||||
self.services["vpn_user"]["password"],
|
||||
account=self.account.account.name,
|
||||
domainid=self.account.account.domainid,
|
||||
rand_name=rand_name
|
||||
)
|
||||
|
||||
self.debug("Verifying the remote VPN access")
|
||||
vpn_users = VpnUser.list(self.apiclient,
|
||||
id=vpnuser.id,
|
||||
listall=True)
|
||||
self.assertEqual(
|
||||
isinstance(vpn_users, list),
|
||||
True,
|
||||
"List VPNs shall return a valid response"
|
||||
)
|
||||
return vpnuser
|
||||
except Exception as e:
|
||||
self.fail("Failed to create remote VPN users: %s" % e)
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
@attr(configuration='remote.access.vpn.user.limit')
|
||||
def test_01_VPN_user_limit(self):
|
||||
"""VPN remote access user limit tests"""
|
||||
|
||||
# Validate the following
|
||||
# prerequisite: change management configuration setting of
|
||||
# remote.access.vpn.user.limit
|
||||
# 1. provision more users than is set in the limit
|
||||
# Provisioning of users after the limit should failProvisioning of
|
||||
# users after the limit should fail
|
||||
|
||||
self.debug("Fetching the limit for remote access VPN users")
|
||||
configs = Configurations.list(
|
||||
self.apiclient,
|
||||
name='remote.access.vpn.user.limit',
|
||||
listall=True)
|
||||
self.assertEqual(isinstance(configs, list),
|
||||
True,
|
||||
"List configs should return a valid response")
|
||||
|
||||
limit = int(configs[0].value)
|
||||
|
||||
self.debug("Enabling the VPN access for IP: %s" %
|
||||
self.public_ip.ipaddress.ipaddress)
|
||||
|
||||
self.create_VPN(self.public_ip)
|
||||
self.debug("Creating %s VPN users" % limit)
|
||||
for x in range(limit):
|
||||
self.create_VPN_Users()
|
||||
|
||||
self.debug("Adding another user exceeding limit for remote VPN users")
|
||||
with self.assertRaises(Exception):
|
||||
self.create_VPN_Users()
|
||||
self.debug("Limit exceeded exception raised!")
|
||||
return
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
def test_02_use_vpn_port(self):
|
||||
"""Test create VPN when L2TP port in use"""
|
||||
|
||||
# Validate the following
|
||||
# 1. set a port forward for UDP: 1701 and enable VPN
|
||||
# 2. set port forward rule for the udp port 1701 over which L2TP works
|
||||
# 3. port forward should prevent VPN from being enabled
|
||||
|
||||
self.debug("Creating a port forwarding rule on port 1701")
|
||||
# Create NAT rule
|
||||
nat_rule = NATRule.create(
|
||||
self.apiclient,
|
||||
self.virtual_machine,
|
||||
self.services["natrule"],
|
||||
self.public_ip.ipaddress.id)
|
||||
|
||||
self.debug("Verifying the NAT rule created")
|
||||
nat_rules = NATRule.list(self.apiclient, id=nat_rule.id, listall=True)
|
||||
|
||||
self.assertEqual(isinstance(nat_rules, list),
|
||||
True,
|
||||
"List NAT rules should return a valid response")
|
||||
|
||||
self.debug("Enabling the VPN connection for IP: %s" %
|
||||
self.public_ip.ipaddress.ipaddress)
|
||||
with self.assertRaises(Exception):
|
||||
self.create_VPN(self.public_ip)
|
||||
self.debug("Create VPN connection failed! Test successful!")
|
||||
return
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
def test_03_enable_vpn_use_port(self):
|
||||
"""Test create NAT rule when VPN when L2TP enabled"""
|
||||
|
||||
# Validate the following
|
||||
# 1. Enable a VPN connection on source NAT
|
||||
# 2. Add a VPN user
|
||||
# 3. add a port forward rule for UDP port 1701. Should result in error
|
||||
# saying that VPN is enabled over port 1701
|
||||
|
||||
self.debug("Enabling the VPN connection for IP: %s" %
|
||||
self.public_ip.ipaddress.ipaddress)
|
||||
self.create_VPN(self.public_ip)
|
||||
|
||||
self.debug("Creating a port forwarding rule on port 1701")
|
||||
# Create NAT rule
|
||||
with self.assertRaises(Exception):
|
||||
NATRule.create(
|
||||
self.apiclient,
|
||||
self.virtual_machine,
|
||||
self.services["natrule"],
|
||||
self.public_ip.ipaddress.id)
|
||||
|
||||
self.debug("Create NAT rule failed! Test successful!")
|
||||
return
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
def test_04_add_new_users(self):
|
||||
"""Test add new users to existing VPN"""
|
||||
|
||||
# Validate the following
|
||||
# 1. Enable a VPN connection on source NAT
|
||||
# 2. Add new user to VPN when there are already existing users.
|
||||
# 3. We should be able to successfully establish a VPN connection using
|
||||
# the newly added user credential.
|
||||
|
||||
self.debug("Enabling the VPN connection for IP: %s" %
|
||||
self.public_ip.ipaddress.ipaddress)
|
||||
self.create_VPN(self.public_ip)
|
||||
|
||||
try:
|
||||
self.debug("Adding new VPN user to account: %s" %
|
||||
self.account.account.name)
|
||||
self.create_VPN_Users()
|
||||
|
||||
# TODO: Verify the VPN connection
|
||||
self.debug("Adding another user to account")
|
||||
self.create_VPN_Users()
|
||||
|
||||
# TODO: Verify the VPN connection with new user
|
||||
except Exception as e:
|
||||
self.fail("Failed to create new VPN user: %s" % e)
|
||||
return
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
def test_05_add_duplicate_user(self):
|
||||
"""Test add duplicate user to existing VPN"""
|
||||
|
||||
# Validate the following
|
||||
# 1. Enable a VPN connection on source NAT
|
||||
# 2. Add a VPN user say "abc" that already an added user to the VPN.
|
||||
# 3. Adding this VPN user should fail.
|
||||
|
||||
self.debug("Enabling the VPN connection for IP: %s" %
|
||||
self.public_ip.ipaddress.ipaddress)
|
||||
self.create_VPN(self.public_ip)
|
||||
|
||||
self.debug("Adding new VPN user to account: %s" %
|
||||
self.account.account.name)
|
||||
self.create_VPN_Users(rand_name=False)
|
||||
|
||||
# TODO: Verify the VPN connection
|
||||
self.debug("Adding another user to account with same username")
|
||||
with self.assertRaises(Exception):
|
||||
self.create_VPN_Users(rand_name=False)
|
||||
return
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
def test_06_add_VPN_user_global_admin(self):
|
||||
"""Test as global admin, add a new VPN user to an existing VPN entry
|
||||
that was created by another account."""
|
||||
|
||||
# Steps for verification
|
||||
# 1. Create a new user and deploy few Vms.
|
||||
# 2. Enable VPN access. Add few VPN users.
|
||||
# 3. Make sure that VPN access works as expected.
|
||||
# 4. As global Admin , add VPN user to this user's existing VPN entry.
|
||||
# Validate the following
|
||||
# 1. The newly added VPN user should get configured to the router of
|
||||
# user account.
|
||||
# 2. We should be able to use this newly created user credential to
|
||||
# establish VPN connection that will give access all VMs of this user
|
||||
|
||||
self.debug("Enabling VPN connection to account: %s" %
|
||||
self.account.account.name)
|
||||
self.create_VPN(self.public_ip)
|
||||
self.debug("Creating VPN user for the account: %s" %
|
||||
self.account.account.name)
|
||||
self.create_VPN_Users()
|
||||
|
||||
self.debug("Creating a global admin account")
|
||||
admin = Account.create(self.apiclient,
|
||||
self.services["account"],
|
||||
admin=True,
|
||||
domainid=self.account.account.domainid)
|
||||
self.cleanup.append(admin)
|
||||
self.debug("Creating API client for newly created user")
|
||||
api_client = self.testClient.createUserApiClient(
|
||||
UserName=self.account.account.name,
|
||||
DomainName=self.account.account.domain)
|
||||
|
||||
self.debug("Adding new user to VPN as a global admin: %s" %
|
||||
admin.account.name)
|
||||
try:
|
||||
self.create_VPN_Users(api_client=api_client)
|
||||
except Exception as e:
|
||||
self.fail("Global admin should be allowed to create VPN user: %s" %
|
||||
e)
|
||||
return
|
||||
|
||||
@attr(tags=["advanced", "advancedns"])
|
||||
def test_07_add_VPN_user_domain_admin(self):
|
||||
"""Test as domain admin, add a new VPN user to an existing VPN entry
|
||||
that was created by another account."""
|
||||
|
||||
# Steps for verification
|
||||
# 1. Create a new user and deploy few Vms.
|
||||
# 2. Enable VPN access. Add few VPN users.
|
||||
# 3. Make sure that VPN access works as expected.
|
||||
# 4. As domain Admin , add VPN user to this user's existing VPN entry.
|
||||
# Validate the following
|
||||
# 1. The newly added VPN user should get configured to the router of
|
||||
# user account.
|
||||
# 2. We should be able to use this newly created user credential to
|
||||
# establish VPN connection that will give access all VMs of this user
|
||||
|
||||
self.debug("Enabling VPN connection to account: %s" %
|
||||
self.account.account.name)
|
||||
self.create_VPN(self.public_ip)
|
||||
self.debug("Creating VPN user for the account: %s" %
|
||||
self.account.account.name)
|
||||
self.create_VPN_Users()
|
||||
|
||||
self.debug("Creating a domain admin account")
|
||||
admin = Account.create(self.apiclient,
|
||||
self.services["account"],
|
||||
domainid=self.account.account.domainid)
|
||||
self.cleanup.append(admin)
|
||||
self.debug("Creating API client for newly created user")
|
||||
api_client = self.testClient.createUserApiClient(
|
||||
UserName=self.account.account.name,
|
||||
DomainName=self.account.account.domain)
|
||||
|
||||
self.debug("Adding new user to VPN as a domain admin: %s" %
|
||||
admin.account.name)
|
||||
try:
|
||||
self.create_VPN_Users(api_client=api_client)
|
||||
except Exception as e:
|
||||
self.fail("Domain admin should be allowed to create VPN user: %s" %
|
||||
e)
|
||||
return
|
||||
|
|
@ -39,22 +39,22 @@ class TestUpdateConfigWithScope(cloudstackTestCase):
|
|||
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
||||
updateConfigurationCmd.name = "use.external.dns"
|
||||
updateConfigurationCmd.value = "true"
|
||||
updateConfigurationCmd.scope = "zone"
|
||||
updateConfigurationCmd.id = 1
|
||||
updateConfigurationCmd.scopename = "zone"
|
||||
updateConfigurationCmd.scopeid = 1
|
||||
|
||||
updateConfigurationResponse = self.apiClient.updateConfiguration(updateConfigurationCmd)
|
||||
self.debug("updated the parameter %s with value %s"%(updateConfigurationResponse.name, updateConfigurationResponse.value))
|
||||
|
||||
listConfigurationsCmd = listConfigurations.listConfigurationsCmd()
|
||||
listConfigurationsCmd.cfgName = updateConfigurationResponse.name
|
||||
listConfigurationsCmd.scope = "zone"
|
||||
listConfigurationsCmd.id = 1
|
||||
listConfigurationsCmd.scopename = "zone"
|
||||
listConfigurationsCmd.scopeid = 1
|
||||
listConfigurationsResponse = self.apiClient.listConfigurations(listConfigurationsCmd)
|
||||
|
||||
self.assertNotEqual(len(listConfigurationsResponse), 0, "Check if the list API \
|
||||
returns a non-empty response")
|
||||
|
||||
configParam = listConfigurationsResponse[0]
|
||||
configParam = listConfigurationsResponse[2]
|
||||
self.assertEqual(configParam.value, updateConfigurationResponse.value, "Check if the update API returned \
|
||||
is the same as the one we got in the list API")
|
||||
|
||||
|
|
@ -67,6 +67,6 @@ class TestUpdateConfigWithScope(cloudstackTestCase):
|
|||
updateConfigurationCmd = updateConfiguration.updateConfigurationCmd()
|
||||
updateConfigurationCmd.name = "use.external.dns"
|
||||
updateConfigurationCmd.value = "false"
|
||||
updateConfigurationCmd.scope = "zone"
|
||||
updateConfigurationCmd.id = 1
|
||||
updateConfigurationCmd.scopename = "zone"
|
||||
updateConfigurationCmd.scopeid = 1
|
||||
self.apiClient.updateConfiguration(updateConfigurationCmd)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,32 @@
|
|||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[CloudStack_UI.2-2messagesproperties]
|
||||
file_filter = translations/CloudStack_UI.2-2messagesproperties/<lang>.properties
|
||||
source_lang = en
|
||||
|
||||
[CloudStack_UI.30xmessagesproperties]
|
||||
file_filter = translations/CloudStack_UI.30xmessagesproperties/<lang>.properties
|
||||
source_lang = en
|
||||
|
||||
[CloudStack_UI.41xmessageproperties]
|
||||
file_filter = translations/CloudStack_UI.41xmessageproperties/<lang>.properties
|
||||
source_lang = en
|
||||
|
||||
[CloudStack_UI.42xmessagesproperties]
|
||||
file_filter = translations/CloudStack_UI.42xmessagesproperties/<lang>.properties
|
||||
source_file = work-dir/messages.properties
|
||||
source_lang = en
|
||||
trans.ar = work-dir/messages_ar.properties
|
||||
trans.ca = work-dir/messages_ca.properties
|
||||
trans.de_DE = work-dir/messages_de_DE.properties
|
||||
trans.es = work-dir/messages_es.properties
|
||||
trans.fr_FR = work-dir/messages_fr_FR.properties
|
||||
trans.it_IT = work-dir/messages_it_IT.properties
|
||||
trans.ja = work-dir/messages_ja.properties
|
||||
trans.ko_KR = work-dir/messages_ko_KR.properties
|
||||
trans.nb_NO = work-dir/messages_nb_NO.properties
|
||||
trans.pt_BR = work-dir/messages_pt_BR.properties
|
||||
trans.ru_RU = work-dir/messages_ru_RU.properties
|
||||
trans.zh_CN = work-dir/messages_zh_CN.properties
|
||||
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
# 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.
|
||||
|
||||
sync-transifex-ui is a script to automate the synchronisation between
|
||||
Apache CloudStack L10N resource files and Transifex CloudStack project.
|
||||
|
||||
Requirements to use this script:
|
||||
* A GNU/Linux or Unix machine
|
||||
* Transifex client installed
|
||||
http://support.transifex.com/customer/portal/topics/440187-transifex-client/articles
|
||||
On Debian/Ubuntu: apt-get install transifex-client
|
||||
|
||||
Commun usage is:
|
||||
|
||||
1/ Init and configure the transifex client CLI
|
||||
(Already made on git CloudStack repo)
|
||||
|
||||
./sync-transifex-ui.sh init-transifex https://www.transifex.com/projects/p/CloudStack_UI/
|
||||
|
||||
2/ Upload to Transifex the last version of the source language (en)
|
||||
which generally have the new keys/values to translate.
|
||||
|
||||
./sync-transifex-ui.sh upload-source-language CloudStack_UI.42xmessagesproperties
|
||||
|
||||
3/ Download the last L10N resource files from Transifex to resources
|
||||
files directory in CloudStack tree to upade the L10N resource files
|
||||
with the translatons from traductors.
|
||||
|
||||
./sync-transifex-ui.sh download-l10n-languages CloudStack_UI.42xmessagesproperties
|
||||
|
||||
=====
|
||||
The sync-transifex-ui provide too the ability to :
|
||||
|
||||
* Download from Transifex the source language resource files. Be carrefully,
|
||||
with this,you can remove some transation on Transifex if some keys has
|
||||
been removed inside the source language resource files.
|
||||
|
||||
./sync-transifex-ui.sh download-source-language CloudStack_UI.42xmessagesproperties
|
||||
|
||||
* Upload the L10N resource files on Transifex.
|
||||
|
||||
./sync-transifex-ui.sh upload-l10n-languages CloudStack_UI.42xmessagesproperties
|
||||
|
||||
=====
|
||||
Note 1:
|
||||
Choose the good branch on git matching with the good resource on Transifex:
|
||||
(no branch) <--> CloudStack_UI.2-2messagesproperties
|
||||
(no branch) <--> CloudStack_UI.30xmessagesproperties
|
||||
(4.1) <--> CloudStack_UI.41xmessageproperties
|
||||
(master) <--> CloudStack_UI.42xmessagesproperties
|
||||
|
||||
Note 2:
|
||||
If you want add a new L10N language, we need edit the sync-transifex-ui.sh script
|
||||
to add his language code in LIST_LANG variable, before run the download-l10n-languages
|
||||
command.
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,160 @@
|
|||
#!/bin/sh
|
||||
# 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.
|
||||
|
||||
SRCLANG=en
|
||||
LIST_LANG="ar ca de_DE es fr_FR it_IT ja ko_KR nb_NO pt_BR ru_RU zh_CN"
|
||||
|
||||
DIRECTORY_RESOURCES="../../client/WEB-INF/classes/resources"
|
||||
WORKDIR="./work-dir"
|
||||
|
||||
AL2_STRING="# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE file\n# distributed with this work for additional information\n# regarding copyright ownership. The ASF licenses this file\n# to you under the Apache License, Version 2.0 (the\n# \"License\"); you may not use this file except in compliance\n# with the License. You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing,\n# software distributed under the License is distributed on an\n# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n# KIND, either express or implied. See the License for the\n# specific language governing permissions and limitations\n# under the License.\n"
|
||||
|
||||
doInit()
|
||||
{
|
||||
tx init
|
||||
tx set --auto-remote ${ARGUMENTS}
|
||||
}
|
||||
|
||||
doMakeWdir()
|
||||
{
|
||||
mkdir -p ${WORKDIR}
|
||||
}
|
||||
|
||||
doCheckInit()
|
||||
{
|
||||
if [ ! -f ./.tx/config ]; then
|
||||
echo "Error: Transifex project isn't init. Please run $0 init-transifex URL-transifex-project" >&2
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
doUploadL10NLangs()
|
||||
{
|
||||
# l10n languages
|
||||
for CODELANG in ${LIST_LANG} ; do
|
||||
if [ -f "${DIRECTORY_RESOURCES}/messages_${CODELANG}.properties" ]; then
|
||||
native2ascii -reverse -encoding UTF-8 ${DIRECTORY_RESOURCES}/messages_${CODELANG}.properties ${WORKDIR}/messages_${CODELANG}.properties
|
||||
sed -i"" "s/\\\\\\\'/'/g" ${WORKDIR}/messages_${CODELANG}.properties
|
||||
tx set -r ${ARGUMENTS} -l ${CODELANG} ${WORKDIR}/messages_${CODELANG}.properties
|
||||
tx push -t -r ${ARGUMENTS} -l ${CODELANG}
|
||||
else
|
||||
echo "Warning: the resource file for language ${CODELANG} doesn't exist."
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
doDownloadL10NLangs()
|
||||
{
|
||||
# prepare l10n languages
|
||||
for CODELANG in ${LIST_LANG} ; do
|
||||
if [ -f "${DIRECTORY_RESOURCES}/messages_${CODELANG}.properties" ]; then
|
||||
native2ascii -reverse -encoding UTF-8 ${DIRECTORY_RESOURCES}/messages_${CODELANG}.properties ${WORKDIR}/messages_${CODELANG}.properties
|
||||
sed -i"" "s/\\\\\\\'/'/g" ${WORKDIR}/messages_${CODELANG}.properties
|
||||
tx set -r ${ARGUMENTS} -l ${CODELANG} ${WORKDIR}/messages_${CODELANG}.properties
|
||||
else
|
||||
echo "\nWarning: the resource file for language ${CODELANG} doesn't exist."
|
||||
echo "Run this command to force get this language from transifex:"
|
||||
echo "\ntx set -r ${ARGUMENTS} -l ${CODELANG} ${WORKDIR}/messages_${CODELANG}.properties\n"
|
||||
fi
|
||||
done
|
||||
|
||||
# get all resource files from transifex
|
||||
tx pull -f -r ${ARGUMENTS}
|
||||
|
||||
# l10n languages
|
||||
for CODELANG in ${LIST_LANG} ; do
|
||||
#tx pull -r ${ARGUMENTS} -l ${CODELANG}
|
||||
if [ -f "${WORKDIR}/messages_${CODELANG}.properties" ]; then
|
||||
native2ascii -encoding UTF-8 ${WORKDIR}/messages_${CODELANG}.properties ${WORKDIR}/messages_${CODELANG}.properties.tmp1
|
||||
grep -v "^#" ${WORKDIR}/messages_${CODELANG}.properties.tmp1 | sort -f | uniq | sed "s/'/\\\\\\\\\'/g" > ${WORKDIR}/messages_${CODELANG}.properties.tmp2
|
||||
echo "$AL2_STRING" | cat - ${WORKDIR}/messages_${CODELANG}.properties.tmp2 > ${DIRECTORY_RESOURCES}/messages_${CODELANG}.properties
|
||||
else
|
||||
echo "Warning: the resource file for language ${CODELANG} doesn't exist on transifex"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
doUploadSourceLang()
|
||||
{
|
||||
# Source language
|
||||
if [ -f ${DIRECTORY_RESOURCES}/messages.properties ]; then
|
||||
native2ascii -reverse -encoding UTF-8 ${DIRECTORY_RESOURCES}/messages.properties ${WORKDIR}/messages.properties
|
||||
sed -i"" "s/\\\\\\\'/'/g" ${WORKDIR}/messages.properties
|
||||
tx set --source -r ${ARGUMENTS} -l ${SRCLANG} ${WORKDIR}/messages.properties
|
||||
tx push -s -r ${ARGUMENTS}
|
||||
else
|
||||
echo "Warning: the source language doesn't exist!"
|
||||
fi
|
||||
}
|
||||
|
||||
doDownloadSourceLang()
|
||||
{
|
||||
# get all resource files from transifex
|
||||
tx pull -s -r ${ARGUMENTS}
|
||||
# Source language
|
||||
if [ -f "${WORKDIR}/messages.properties" ]; then
|
||||
native2ascii -encoding UTF-8 ${WORKDIR}/messages.properties ${WORKDIR}/messages.properties.tmp1
|
||||
grep -v "^#" ${WORKDIR}/messages.properties.tmp1 | sort -f | uniq | sed "s/'/\\\\\\\\\'/g" > ${WORKDIR}/messages.properties.tmp2
|
||||
echo "$AL2_STRING" | cat - ${WORKDIR}/messages.properties.tmp2 > ${DIRECTORY_RESOURCES}/messages.properties
|
||||
else
|
||||
echo "Warning: the source language hasn't been retrieve!"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ $# -ne 2 ]; then
|
||||
COMMAND="error"
|
||||
else
|
||||
COMMAND="$1"
|
||||
ARGUMENTS="$2"
|
||||
doMakeWdir
|
||||
fi
|
||||
|
||||
case "$COMMAND" in
|
||||
upload-source-language)
|
||||
doCheckInit
|
||||
doUploadSourceLang
|
||||
;;
|
||||
|
||||
download-source-language)
|
||||
doCheckInit
|
||||
doDownloadSourceLang
|
||||
;;
|
||||
|
||||
upload-l10n-languages)
|
||||
doCheckInit
|
||||
doUploadL10NLangs
|
||||
;;
|
||||
|
||||
download-l10n-languages)
|
||||
doCheckInit
|
||||
doDownloadL10NLangs
|
||||
;;
|
||||
|
||||
init-transifex)
|
||||
doInit
|
||||
;;
|
||||
|
||||
*|error)
|
||||
echo "Usage: $0 [upload-source-language|download-source-language] [upload-l10n-languages|download-l10n-languages] transifex-resource" >&2
|
||||
echo "\n\tExemple: $0 download-l10n-languages CloudStack_UI-42xmessagesproperties\n" >&2
|
||||
echo "Usage: $0 init-transifex URL-transifex-project" >&2
|
||||
echo "\n\tExemple: $0 init-transifex https://www.transifex.com/projects/p/CloudStack_UI/\n" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
1754
ui/dictionary.jsp
1754
ui/dictionary.jsp
File diff suppressed because it is too large
Load Diff
|
|
@ -81,6 +81,7 @@ under the License.
|
|||
<option value="de_DE"><fmt:message key="label.lang.german"/></option>
|
||||
<option value="it_IT"><fmt:message key="label.lang.italian"/></option>
|
||||
<option value="nb_NO"><fmt:message key="label.lang.norwegian"/></option>
|
||||
<option value="ar"><fmt:message key="label.lang.arabic"/></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5424,6 +5424,83 @@
|
|||
poll: pollAsyncJobResult
|
||||
}
|
||||
},
|
||||
|
||||
scaleUp:{
|
||||
label:'scaleUp System VM',
|
||||
createForm: {
|
||||
title: 'label.change.service.offering',
|
||||
desc: '',
|
||||
fields: {
|
||||
serviceOfferingId: {
|
||||
label: 'label.compute.offering',
|
||||
select: function(args) {
|
||||
var apiCmd = "listServiceOfferings&issystem=true";
|
||||
if(args.context.systemVMs[0].systemvmtype == "secondarystoragevm")
|
||||
apiCmd += "&systemvmtype=secondarystoragevm";
|
||||
else if(args.context.systemVMs[0].systemvmtype == "consoleproxy")
|
||||
apiCmd += "&systemvmtype=consoleproxy";
|
||||
$.ajax({
|
||||
url: createURL(apiCmd),
|
||||
dataType: "json",
|
||||
async: true,
|
||||
success: function(json) {
|
||||
var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
|
||||
var items = [];
|
||||
$(serviceofferings).each(function() {
|
||||
if(this.id != args.context.systemVMs[0].serviceofferingid) {
|
||||
items.push({id: this.id, description: this.name});
|
||||
}
|
||||
});
|
||||
args.response.success({data: items});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
action: function(args) {
|
||||
$.ajax({
|
||||
url: createURL("scaleVirtualMachine&id=" + args.context.systemVMs[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
|
||||
dataType: "json",
|
||||
async: true,
|
||||
success: function(json) {
|
||||
var jid = json.scalevirtualmachineresponse.jobid;
|
||||
args.response.success(
|
||||
{_custom:
|
||||
{jobId: jid,
|
||||
getUpdatedItem: function(json) {
|
||||
return json.queryasyncjobresultresponse.jobresult.virtualmachine;
|
||||
},
|
||||
getActionFilter: function() {
|
||||
return vmActionfilter;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
error:function(json){
|
||||
args.response.error(parseXMLHttpResponse(json));
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
messages: {
|
||||
confirm: function(args) {
|
||||
return 'Do you really want to scale up the system VM ?';
|
||||
},
|
||||
notification: function(args) {
|
||||
|
||||
return 'System VM Scaled Up';
|
||||
}
|
||||
},
|
||||
notification: {
|
||||
poll: pollAsyncJobResult
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
|
||||
viewConsole: {
|
||||
label: 'label.view.console',
|
||||
|
|
@ -6658,6 +6735,83 @@
|
|||
}
|
||||
},
|
||||
|
||||
scaleUp:{
|
||||
label:'scaleUp System VM',
|
||||
createForm: {
|
||||
title: 'label.change.service.offering',
|
||||
desc: '',
|
||||
fields: {
|
||||
serviceOfferingId: {
|
||||
label: 'label.compute.offering',
|
||||
select: function(args) {
|
||||
var apiCmd = "listServiceOfferings&issystem=true";
|
||||
if(args.context.systemVMs[0].systemvmtype == "secondarystoragevm")
|
||||
apiCmd += "&systemvmtype=secondarystoragevm";
|
||||
else if(args.context.systemVMs[0].systemvmtype == "consoleproxy")
|
||||
apiCmd += "&systemvmtype=consoleproxy";
|
||||
$.ajax({
|
||||
url: createURL(apiCmd),
|
||||
dataType: "json",
|
||||
async: true,
|
||||
success: function(json) {
|
||||
var serviceofferings = json.listserviceofferingsresponse.serviceoffering;
|
||||
var items = [];
|
||||
$(serviceofferings).each(function() {
|
||||
if(this.id != args.context.systemVMs[0].serviceofferingid) {
|
||||
items.push({id: this.id, description: this.name});
|
||||
}
|
||||
});
|
||||
args.response.success({data: items});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
action: function(args) {
|
||||
$.ajax({
|
||||
url: createURL("scaleVirtualMachine&id=" + args.context.systemVMs[0].id + "&serviceofferingid=" + args.data.serviceOfferingId),
|
||||
dataType: "json",
|
||||
async: true,
|
||||
success: function(json) {
|
||||
var jid = json.scalevirtualmachineresponse.jobid;
|
||||
args.response.success(
|
||||
{_custom:
|
||||
{jobId: jid,
|
||||
getUpdatedItem: function(json) {
|
||||
return json.queryasyncjobresultresponse.jobresult.virtualmachine;
|
||||
},
|
||||
getActionFilter: function() {
|
||||
return vmActionfilter;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
error:function(json){
|
||||
args.response.error(parseXMLHttpResponse(json));
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
messages: {
|
||||
confirm: function(args) {
|
||||
return 'Do you really want to scale up the system VM ?';
|
||||
},
|
||||
notification: function(args) {
|
||||
|
||||
return 'System VM Scaled Up';
|
||||
}
|
||||
},
|
||||
notification: {
|
||||
poll: pollAsyncJobResult
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
|
||||
|
||||
viewConsole: {
|
||||
label: 'label.view.console',
|
||||
action: {
|
||||
|
|
@ -11687,14 +11841,16 @@
|
|||
if (jsonObj.state == 'Running') {
|
||||
allowedActions.push("stop");
|
||||
allowedActions.push("restart");
|
||||
allowedActions.push("remove");
|
||||
allowedActions.push("remove");
|
||||
allowedActions.push("scaleUp");
|
||||
allowedActions.push("viewConsole");
|
||||
if (isAdmin())
|
||||
allowedActions.push("migrate");
|
||||
}
|
||||
else if (jsonObj.state == 'Stopped') {
|
||||
allowedActions.push("start");
|
||||
allowedActions.push("changeService");
|
||||
allowedActions.push("scaleUp");
|
||||
allowedActions.push("changeService");
|
||||
allowedActions.push("remove");
|
||||
}
|
||||
else if (jsonObj.state == 'Error') {
|
||||
|
|
|
|||
|
|
@ -58,14 +58,14 @@ public class VmwareGuestOsMapper {
|
|||
s_mapper.put("Windows Server 2008 (32-bit)", VirtualMachineGuestOsIdentifier.WIN_LONGHORN_GUEST);
|
||||
s_mapper.put("Windows Server 2008 (64-bit)", VirtualMachineGuestOsIdentifier.WIN_LONGHORN_64_GUEST);
|
||||
|
||||
s_mapper.put("Windows 8", VirtualMachineGuestOsIdentifier.WINDOWS_8_GUEST);
|
||||
s_mapper.put("Windows 8 (64 bit)", VirtualMachineGuestOsIdentifier.WINDOWS_8_64_GUEST);
|
||||
s_mapper.put("Windows 8 Server (64 bit)", VirtualMachineGuestOsIdentifier.WINDOWS_8_SERVER_64_GUEST);
|
||||
s_mapper.put("Windows 8 (32-bit)", VirtualMachineGuestOsIdentifier.WINDOWS_8_GUEST);
|
||||
s_mapper.put("Windows 8 (64-bit)", VirtualMachineGuestOsIdentifier.WINDOWS_8_64_GUEST);
|
||||
s_mapper.put("Windows Server 8 (64-bit)", VirtualMachineGuestOsIdentifier.WINDOWS_8_SERVER_64_GUEST);
|
||||
|
||||
s_mapper.put("Apple Mac OS X 10.6 (32 bits)", VirtualMachineGuestOsIdentifier.DARWIN_10_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.6 (64 bits)", VirtualMachineGuestOsIdentifier.DARWIN_10_64_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.7 (32 bits)", VirtualMachineGuestOsIdentifier.DARWIN_11_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.7 (64 bits)", VirtualMachineGuestOsIdentifier.DARWIN_11_64_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.6 (32-bit)", VirtualMachineGuestOsIdentifier.DARWIN_10_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.6 (64-bit)", VirtualMachineGuestOsIdentifier.DARWIN_10_64_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.7 (32-bit)", VirtualMachineGuestOsIdentifier.DARWIN_11_GUEST);
|
||||
s_mapper.put("Apple Mac OS X 10.7 (64-bit)", VirtualMachineGuestOsIdentifier.DARWIN_11_64_GUEST);
|
||||
|
||||
s_mapper.put("Open Enterprise Server", VirtualMachineGuestOsIdentifier.OES_GUEST);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue