From 21e13657b4a5e63715ababaa7897202413a32254 Mon Sep 17 00:00:00 2001 From: Vijay Date: Thu, 12 Jul 2012 15:50:30 +0530 Subject: [PATCH] AutoScale. All API commands with separate service layer for AutoScale. Not tested. --- .../cloud/agent/api/to/LoadBalancerTO.java | 575 +- api/src/com/cloud/api/ApiConstants.java | 807 +- api/src/com/cloud/api/BaseCmd.java | 1053 +-- api/src/com/cloud/api/ResponseGenerator.java | 699 +- .../commands/CreateAutoScalePolicyCmd.java | 156 + .../commands/CreateAutoScaleVmGroupCmd.java | 193 + .../commands/CreateAutoScaleVmProfileCmd.java | 256 + .../api/commands/CreateConditionCmd.java | 144 + .../cloud/api/commands/CreateCounterCmd.java | 120 + .../commands/DeleteAutoScalePolicyCmd.java | 100 + .../commands/DeleteAutoScaleVmGroupCmd.java | 100 + .../commands/DeleteAutoScaleVmProfileCmd.java | 99 + .../api/commands/DeleteConditionCmd.java | 110 + .../cloud/api/commands/DeleteCounterCmd.java | 104 + .../commands/DisableAutoScaleVmGroupCmd.java | 84 + .../commands/EnableAutoScaleVmGroupCmd.java | 84 + .../commands/ListAutoScalePoliciesCmd.java | 85 + .../commands/ListAutoScaleVmGroupsCmd.java | 111 + .../commands/ListAutoScaleVmProfilesCmd.java | 91 + .../cloud/api/commands/ListConditionsCmd.java | 88 + .../cloud/api/commands/ListCountersCmd.java | 99 + .../commands/UpdateAutoScalePolicyCmd.java | 98 + .../commands/UpdateAutoScaleVmGroupCmd.java | 137 + .../commands/UpdateAutoScaleVmProfileCmd.java | 119 + .../api/response/AutoScalePolicyResponse.java | 123 + .../response/AutoScaleVmGroupResponse.java | 132 + .../response/AutoScaleVmProfileResponse.java | 145 + .../cloud/api/response/ConditionResponse.java | 115 + .../cloud/api/response/CounterResponse.java | 62 + api/src/com/cloud/async/AsyncJob.java | 187 +- api/src/com/cloud/event/EventTypes.java | 592 +- api/src/com/cloud/network/Network.java | 588 +- .../com/cloud/network/as/AutoScalePolicy.java | 32 + .../cloud/network/as/AutoScaleService.java | 80 + .../cloud/network/as/AutoScaleVmGroup.java | 53 + .../cloud/network/as/AutoScaleVmProfile.java | 38 + api/src/com/cloud/network/as/Condition.java | 37 + api/src/com/cloud/network/as/Counter.java | 36 + .../cloud/network/lb/LoadBalancingRule.java | 665 +- .../network/lb/LoadBalancingRulesService.java | 208 +- build/build-common.xml | 2 +- client/tomcatconf/commands.properties.in | 74 +- .../network/resource/NetscalerResource.java | 3671 ++++---- deps/cloud-netscaler.jar | Bin 1881606 -> 3169132 bytes server/src/com/cloud/api/ApiDBUtils.java | 1654 ++-- .../src/com/cloud/api/ApiResponseHelper.java | 7902 +++++++++-------- server/src/com/cloud/api/ApiServer.java | 2238 ++--- .../DefaultComponentLibrary.java | 935 +- ...ExternalLoadBalancerDeviceManagerImpl.java | 2056 ++--- .../cloud/network/as/AutoScaleManager.java | 16 + .../network/as/AutoScaleManagerImpl.java | 909 ++ .../as/AutoScalePolicyConditionMapVO.java | 71 + .../cloud/network/as/AutoScalePolicyVO.java | 132 + .../as/AutoScaleVmGroupPolicyMapVO.java | 70 + .../cloud/network/as/AutoScaleVmGroupVO.java | 187 + .../network/as/AutoScaleVmProfileVO.java | 212 + .../src/com/cloud/network/as/ConditionVO.java | 132 + .../src/com/cloud/network/as/CounterVO.java | 114 + .../dao/AutoScalePolicyConditionMapDao.java | 24 + .../AutoScalePolicyConditionMapDaoImpl.java | 54 + .../network/as/dao/AutoScalePolicyDao.java | 19 + .../as/dao/AutoScalePolicyDaoImpl.java | 22 + .../network/as/dao/AutoScaleVmGroupDao.java | 24 + .../as/dao/AutoScaleVmGroupDaoImpl.java | 58 + .../as/dao/AutoScaleVmGroupPolicyMapDao.java | 26 + .../dao/AutoScaleVmGroupPolicyMapDaoImpl.java | 55 + .../network/as/dao/AutoScaleVmProfileDao.java | 19 + .../as/dao/AutoScaleVmProfileDaoImpl.java | 22 + .../cloud/network/as/dao/ConditionDao.java | 27 + .../network/as/dao/ConditionDaoImpl.java | 46 + .../com/cloud/network/as/dao/CounterDao.java | 29 + .../cloud/network/as/dao/CounterDaoImpl.java | 67 + .../network/element/NetscalerElement.java | 1350 +-- .../lb/ElasticLoadBalancerManagerImpl.java | 2076 ++--- .../network/lb/LoadBalancingRulesManager.java | 12 +- .../lb/LoadBalancingRulesManagerImpl.java | 2915 +++--- .../VirtualNetworkApplianceManagerImpl.java | 6596 +++++++------- .../cloud/vm/VirtualMachineManagerImpl.java | 5120 +++++------ setup/db/create-schema.sql | 4778 +++++----- utils/src/com/cloud/utils/net/NetUtils.java | 2288 ++--- 80 files changed, 30969 insertions(+), 23638 deletions(-) create mode 100644 api/src/com/cloud/api/commands/CreateAutoScalePolicyCmd.java create mode 100644 api/src/com/cloud/api/commands/CreateAutoScaleVmGroupCmd.java create mode 100644 api/src/com/cloud/api/commands/CreateAutoScaleVmProfileCmd.java create mode 100644 api/src/com/cloud/api/commands/CreateConditionCmd.java create mode 100644 api/src/com/cloud/api/commands/CreateCounterCmd.java create mode 100644 api/src/com/cloud/api/commands/DeleteAutoScalePolicyCmd.java create mode 100644 api/src/com/cloud/api/commands/DeleteAutoScaleVmGroupCmd.java create mode 100644 api/src/com/cloud/api/commands/DeleteAutoScaleVmProfileCmd.java create mode 100644 api/src/com/cloud/api/commands/DeleteConditionCmd.java create mode 100644 api/src/com/cloud/api/commands/DeleteCounterCmd.java create mode 100644 api/src/com/cloud/api/commands/DisableAutoScaleVmGroupCmd.java create mode 100644 api/src/com/cloud/api/commands/EnableAutoScaleVmGroupCmd.java create mode 100644 api/src/com/cloud/api/commands/ListAutoScalePoliciesCmd.java create mode 100644 api/src/com/cloud/api/commands/ListAutoScaleVmGroupsCmd.java create mode 100644 api/src/com/cloud/api/commands/ListAutoScaleVmProfilesCmd.java create mode 100644 api/src/com/cloud/api/commands/ListConditionsCmd.java create mode 100644 api/src/com/cloud/api/commands/ListCountersCmd.java create mode 100644 api/src/com/cloud/api/commands/UpdateAutoScalePolicyCmd.java create mode 100644 api/src/com/cloud/api/commands/UpdateAutoScaleVmGroupCmd.java create mode 100644 api/src/com/cloud/api/commands/UpdateAutoScaleVmProfileCmd.java create mode 100644 api/src/com/cloud/api/response/AutoScalePolicyResponse.java create mode 100644 api/src/com/cloud/api/response/AutoScaleVmGroupResponse.java create mode 100644 api/src/com/cloud/api/response/AutoScaleVmProfileResponse.java create mode 100644 api/src/com/cloud/api/response/ConditionResponse.java create mode 100644 api/src/com/cloud/api/response/CounterResponse.java create mode 100644 api/src/com/cloud/network/as/AutoScalePolicy.java create mode 100644 api/src/com/cloud/network/as/AutoScaleService.java create mode 100644 api/src/com/cloud/network/as/AutoScaleVmGroup.java create mode 100644 api/src/com/cloud/network/as/AutoScaleVmProfile.java create mode 100644 api/src/com/cloud/network/as/Condition.java create mode 100644 api/src/com/cloud/network/as/Counter.java create mode 100644 server/src/com/cloud/network/as/AutoScaleManager.java create mode 100644 server/src/com/cloud/network/as/AutoScaleManagerImpl.java create mode 100644 server/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java create mode 100644 server/src/com/cloud/network/as/AutoScalePolicyVO.java create mode 100644 server/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java create mode 100644 server/src/com/cloud/network/as/AutoScaleVmGroupVO.java create mode 100644 server/src/com/cloud/network/as/AutoScaleVmProfileVO.java create mode 100644 server/src/com/cloud/network/as/ConditionVO.java create mode 100644 server/src/com/cloud/network/as/CounterVO.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScalePolicyDao.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java create mode 100644 server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java create mode 100644 server/src/com/cloud/network/as/dao/ConditionDao.java create mode 100644 server/src/com/cloud/network/as/dao/ConditionDaoImpl.java create mode 100644 server/src/com/cloud/network/as/dao/CounterDao.java create mode 100644 server/src/com/cloud/network/as/dao/CounterDaoImpl.java diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index af0ee8771e7..7e4234bd106 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -1,151 +1,424 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.agent.api.to; - - -import java.util.List; -import com.cloud.utils.Pair; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; - - -public class LoadBalancerTO { - String srcIp; - int srcPort; - String protocol; - String algorithm; - boolean revoked; - boolean alreadyAdded; - DestinationTO[] destinations; - private StickinessPolicyTO[] stickinessPolicies; - final static int MAX_STICKINESS_POLICIES = 1; - - public LoadBalancerTO (String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List destinations) { - this.srcIp = srcIp; - this.srcPort = srcPort; - this.protocol = protocol; - this.algorithm = algorithm; - this.revoked = revoked; - this.alreadyAdded = alreadyAdded; - this.destinations = new DestinationTO[destinations.size()]; - this.stickinessPolicies = null; - int i = 0; - for (LbDestination destination : destinations) { - this.destinations[i++] = new DestinationTO(destination.getIpAddress(), destination.getDestinationPortStart(), destination.isRevoked(), false); - } - } - - public LoadBalancerTO (String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List arg_destinations, List stickinessPolicies) { - this(srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, arg_destinations); - this.stickinessPolicies = null; - if (stickinessPolicies != null && stickinessPolicies.size()>0) { - this.stickinessPolicies = new StickinessPolicyTO[MAX_STICKINESS_POLICIES]; - int index = 0; - for (LbStickinessPolicy stickinesspolicy : stickinessPolicies) { - if (!stickinesspolicy.isRevoked()) { - this.stickinessPolicies[index] = new StickinessPolicyTO(stickinesspolicy.getMethodName(), stickinesspolicy.getParams()); - index++; - if (index == MAX_STICKINESS_POLICIES) break; - } - } - if (index == 0) this.stickinessPolicies = null; - } - } - - - protected LoadBalancerTO() { - } - - public String getSrcIp() { - return srcIp; - } - - public int getSrcPort() { - return srcPort; - } - - public String getAlgorithm() { - return algorithm; - } - - public String getProtocol() { - return protocol; - } - - public boolean isRevoked() { - return revoked; - } - - public boolean isAlreadyAdded() { - return alreadyAdded; - } - - public StickinessPolicyTO[] getStickinessPolicies() { - return stickinessPolicies; - } - - public DestinationTO[] getDestinations() { - return destinations; - } - - public static class StickinessPolicyTO { - private String _methodName; - private List> _paramsList; - - public String getMethodName() { - return _methodName; - } - - public List> getParams() { - return _paramsList; - } - - public StickinessPolicyTO(String methodName, List> paramsList) { - this._methodName = methodName; - this._paramsList = paramsList; - } - } - - public static class DestinationTO { - String destIp; - int destPort; - boolean revoked; - boolean alreadyAdded; - public DestinationTO(String destIp, int destPort, boolean revoked, boolean alreadyAdded) { - this.destIp = destIp; - this.destPort = destPort; - this.revoked = revoked; - this.alreadyAdded = alreadyAdded; - } - - protected DestinationTO() { - } - - public String getDestIp() { - return destIp; - } - - public int getDestPort() { - return destPort; - } - - public boolean isRevoked() { - return revoked; - } - - public boolean isAlreadyAdded() { - return alreadyAdded; - } - } - -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.agent.api.to; + + +import java.util.ArrayList; +import java.util.List; + +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.as.Condition; +import com.cloud.network.as.Counter; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScalePolicy; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmGroup; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmProfile; +import com.cloud.network.lb.LoadBalancingRule.LbCondition; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; +import com.cloud.utils.Pair; + + +public class LoadBalancerTO { + Long id; + String srcIp; + int srcPort; + String protocol; + String algorithm; + boolean revoked; + boolean alreadyAdded; + DestinationTO[] destinations; + private StickinessPolicyTO[] stickinessPolicies; + private AutoScaleVmGroupTO autoScaleVmGroupTO; + final static int MAX_STICKINESS_POLICIES = 1; + + public LoadBalancerTO (Long id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List destinations) { + this.id = id; + this.srcIp = srcIp; + this.srcPort = srcPort; + this.protocol = protocol; + this.algorithm = algorithm; + this.revoked = revoked; + this.alreadyAdded = alreadyAdded; + this.destinations = new DestinationTO[destinations.size()]; + this.stickinessPolicies = null; + int i = 0; + for (LbDestination destination : destinations) { + this.destinations[i++] = new DestinationTO(destination.getIpAddress(), destination.getDestinationPortStart(), destination.isRevoked(), false); + } + } + + public LoadBalancerTO (Long id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List arg_destinations, List stickinessPolicies) { + this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, arg_destinations); + this.stickinessPolicies = null; + if (stickinessPolicies != null && stickinessPolicies.size()>0) { + this.stickinessPolicies = new StickinessPolicyTO[MAX_STICKINESS_POLICIES]; + int index = 0; + for (LbStickinessPolicy stickinesspolicy : stickinessPolicies) { + if (!stickinesspolicy.isRevoked()) { + this.stickinessPolicies[index] = new StickinessPolicyTO(stickinesspolicy.getMethodName(), stickinesspolicy.getParams()); + index++; + if (index == MAX_STICKINESS_POLICIES) { + break; + } + } + } + if (index == 0) { + this.stickinessPolicies = null; + } + } + } + + + protected LoadBalancerTO() { + } + + public Long getId() { + return id; + } + + public String getSrcIp() { + return srcIp; + } + + public int getSrcPort() { + return srcPort; + } + + public String getAlgorithm() { + return algorithm; + } + + public String getProtocol() { + return protocol; + } + + public boolean isRevoked() { + return revoked; + } + + public boolean isAlreadyAdded() { + return alreadyAdded; + } + + public StickinessPolicyTO[] getStickinessPolicies() { + return stickinessPolicies; + } + + public DestinationTO[] getDestinations() { + return destinations; + } + + public AutoScaleVmGroupTO getAutoScaleVmGroupTO() { + return autoScaleVmGroupTO; + } + + public void setAutoScaleVmGroupTO(AutoScaleVmGroupTO autoScaleVmGroupTO) { + this.autoScaleVmGroupTO = autoScaleVmGroupTO; + } + + public boolean isAutoScaleVmGroupTO() { + return this.autoScaleVmGroupTO != null; + } + + public static class StickinessPolicyTO { + private final String _methodName; + private final List> _paramsList; + + public String getMethodName() { + return _methodName; + } + + public List> getParams() { + return _paramsList; + } + + public StickinessPolicyTO(String methodName, List> paramsList) { + this._methodName = methodName; + this._paramsList = paramsList; + } + } + + public static class DestinationTO { + String destIp; + int destPort; + boolean revoked; + boolean alreadyAdded; + public DestinationTO(String destIp, int destPort, boolean revoked, boolean alreadyAdded) { + this.destIp = destIp; + this.destPort = destPort; + this.revoked = revoked; + this.alreadyAdded = alreadyAdded; + } + + protected DestinationTO() { + } + + public String getDestIp() { + return destIp; + } + + public int getDestPort() { + return destPort; + } + + public boolean isRevoked() { + return revoked; + } + + public boolean isAlreadyAdded() { + return alreadyAdded; + } + } + + public static class CounterTO { + private final String name; + private final String source; + private final String value; + + public CounterTO(String name, String source, String value) { + this.name = name; + this.source = source; + this.value = value; + } + + public String getName() { + return name; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } + } + + public static class ConditionTO{ + private final long threshold; + private final String relationalOperator; + private final CounterTO counter; + + public ConditionTO(long threshold, String relationalOperator, CounterTO counter) + { + this.threshold = threshold; + this.relationalOperator = relationalOperator; + this.counter = counter; + } + + public long getThreshold() { + return threshold; + } + + public String getRelationalOperator() { + return relationalOperator; + } + + public CounterTO getCounter() { + return counter; + } + } + + public static class AutoScalePolicyTO { + private final long id; + private final int duration; + private final int quietTime; + private String action; + boolean revoked; + private final List conditions; + + public AutoScalePolicyTO(long id, int duration, int quietTime, String action, List conditions, boolean revoked) { + this.id = id; + this.duration = duration; + this.quietTime = quietTime; + this.conditions = conditions; + this.action = action; + this.revoked = revoked; + } + + public long getId() { + return id; + } + + public int getDuration() { + return duration; + } + + public int getQuietTime() { + return quietTime; + } + + public String getAction() { + return action; + } + + public boolean isRevoked() { + return revoked; + } + + public List getConditions() { + return conditions; + } + } + + + public static class AutoScaleVmProfileTO { + private final Long zoneId; + private final Long domainId; + private final Long serviceOfferingId; + private final Long templateId; + private final String otherDeployParams; + private final String snmpCommunity; + private final Integer snmpPort; + private final Integer destroyVmGraceperiod; + private final String cloudStackApiUrl; + private final String autoScaleUserApiKey; + private final String autoScaleUserSecretKey; + + public AutoScaleVmProfileTO(Long zoneId, Long domainId, String cloudStackApiUrl, String autoScaleUserApiKey, String autoScaleUserSecretKey,Long serviceOfferingId, Long templateId, + String otherDeployParams, String snmpCommunity, Integer snmpPort, Integer destroyVmGraceperiod) { + this.zoneId = zoneId; + this.domainId = domainId; + this.serviceOfferingId = serviceOfferingId; + this.templateId = templateId; + this.otherDeployParams = otherDeployParams; + this.snmpCommunity = snmpCommunity; + this.snmpPort = snmpPort; + this.destroyVmGraceperiod = destroyVmGraceperiod; + this.cloudStackApiUrl = cloudStackApiUrl; + this.autoScaleUserApiKey = autoScaleUserApiKey; + this.autoScaleUserSecretKey = autoScaleUserSecretKey; + } + public Long getZoneId() { + return zoneId; + } + public Long getDomainId() { + return domainId; + } + public Long getServiceOfferingId() { + return serviceOfferingId; + } + public Long getTemplateId() { + return templateId; + } + public String getOtherDeployParams() { + return otherDeployParams; + } + public String getSnmpCommunity() { + return snmpCommunity; + } + public Integer getSnmpPort() { + return snmpPort; + } + public Integer getDestroyVmGraceperiod() { + return destroyVmGraceperiod; + } + public String getCloudStackApiUrl() { + return cloudStackApiUrl; + } + public String getAutoScaleUserApiKey() { + return autoScaleUserApiKey; + } + public String getAutoScaleUserSecretKey() { + return autoScaleUserSecretKey; + } + } + + public static class AutoScaleVmGroupTO { + private final int minMembers; + private final int maxMembers; + private final int memberPort; + private final int interval; + private final List policies; + private final AutoScaleVmProfileTO profile; + private final boolean revoked; + private String state; + + AutoScaleVmGroupTO(int minMembers, int maxMembers, int memberPort, int interval, List policies, AutoScaleVmProfileTO profile, boolean revoked) + { + this.minMembers = minMembers; + this.maxMembers = maxMembers; + this.memberPort = memberPort; + this.interval = interval; + this.policies = policies; + this.profile = profile; + this.revoked = revoked; + } + + public int getMinMembers() { + return minMembers; + } + + public int getMaxMembers() { + return maxMembers; + } + + public int getMemberPort() { + return memberPort; + } + + public int getInterval() { + return interval; + } + + public List getPolicies() { + return policies; + } + + public AutoScaleVmProfileTO getProfile() { + return profile; + } + + public String getState() { + return state; + } + + public boolean isRevoked() { + return revoked; + } + } + + public void setAutoScaleVmGroup(LbAutoScaleVmGroup lbAutoScaleVmGroup) + { + List lbAutoScalePolicies = lbAutoScaleVmGroup.getPolicies(); + List autoScalePolicyTOs = new ArrayList(lbAutoScalePolicies.size()); + for (LbAutoScalePolicy lbAutoScalePolicy : lbAutoScalePolicies) { + List lbConditions = lbAutoScalePolicy.getConditions(); + List conditionTOs = new ArrayList(lbConditions.size()); + for (LbCondition lbCondition : lbConditions) { + Counter counter = lbCondition.getCounter(); + CounterTO counterTO = new CounterTO(counter.getName(), counter.getSource().toString(), "" + counter.getValue()); + Condition condition = lbCondition.getCondition(); + ConditionTO conditionTO = new ConditionTO(condition.getThreshold(), condition.getRelationalOperator().toString(), counterTO); + conditionTOs.add(conditionTO); + } + AutoScalePolicy autoScalePolicy = lbAutoScalePolicy.getPolicy(); + autoScalePolicyTOs.add(new AutoScalePolicyTO(autoScalePolicy.getId(), autoScalePolicy.getDuration(), + autoScalePolicy.getQuietTime(), autoScalePolicy.getAction(), + conditionTOs, lbAutoScalePolicy.isRevoked())); + } + LbAutoScaleVmProfile lbAutoScaleVmProfile = lbAutoScaleVmGroup.getProfile(); + AutoScaleVmProfile autoScaleVmProfile = lbAutoScaleVmProfile.getProfile(); + AutoScaleVmProfileTO autoScaleVmProfileTO = new AutoScaleVmProfileTO(autoScaleVmProfile.getZoneId(), autoScaleVmProfile.getDomainId(), + lbAutoScaleVmProfile.getAutoScaleUserApiKey(), lbAutoScaleVmProfile.getAutoScaleUserSecretKey(), lbAutoScaleVmProfile.getCloudStackApiUrl(), + autoScaleVmProfile.getServiceOfferingId(), autoScaleVmProfile.getTemplateId(), autoScaleVmProfile.getOtherDeployParams(), + autoScaleVmProfile.getSnmpCommunity(), autoScaleVmProfile.getSnmpPort(), autoScaleVmProfile.getDestroyVmGraceperiod()); + + AutoScaleVmGroup autoScaleVmGroup = lbAutoScaleVmGroup.getVmGroup(); + autoScaleVmGroupTO = new AutoScaleVmGroupTO(autoScaleVmGroup.getMinMembers(), autoScaleVmGroup.getMaxMembers(), autoScaleVmGroup.getMemberPort(), + autoScaleVmGroup.getInterval(),autoScalePolicyTOs, autoScaleVmProfileTO, autoScaleVmGroup.isRevoke()); + } + +} diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index 1f11d49cee7..12336cb988a 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -1,392 +1,415 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.api; - -public class ApiConstants { - public static final String ACCOUNT = "account"; - public static final String ACCOUNTS = "accounts"; - public static final String ACCOUNT_TYPE = "accounttype"; - public static final String ACCOUNT_ID = "accountid"; - public static final String ALGORITHM = "algorithm"; - public static final String ALLOCATED_ONLY = "allocatedonly"; - public static final String API_KEY = "userapikey"; - public static final String APPLIED = "applied"; - public static final String AVAILABLE = "available"; - public static final String BITS = "bits"; - public static final String BOOTABLE = "bootable"; - public static final String BIND_DN = "binddn"; - public static final String BIND_PASSWORD = "bindpass"; - public static final String CATEGORY = "category"; - public static final String CERTIFICATE = "certificate"; - public static final String PRIVATE_KEY = "privatekey"; - public static final String DOMAIN_SUFFIX = "domainsuffix"; - public static final String DNS_SEARCH_ORDER = "dnssearchorder"; - public static final String CIDR = "cidr"; - public static final String CIDR_LIST = "cidrlist"; - public static final String CLEANUP = "cleanup"; - public static final String CLUSTER_ID = "clusterid"; - public static final String CLUSTER_NAME = "clustername"; - public static final String CLUSTER_TYPE = "clustertype"; - public static final String COMPONENT = "component"; - public static final String CPU_NUMBER = "cpunumber"; - public static final String CPU_SPEED = "cpuspeed"; - public static final String CREATED = "created"; - public static final String CUSTOMIZED = "customized"; - public static final String DESCRIPTION = "description"; - public static final String DESTINATION_ZONE_ID = "destzoneid"; - public static final String DETAILS = "details"; - public static final String DEVICE_ID = "deviceid"; - public static final String DISK_OFFERING_ID = "diskofferingid"; - public static final String DISK_SIZE = "disksize"; - public static final String DISPLAY_NAME = "displayname"; - public static final String DISPLAY_TEXT = "displaytext"; - public static final String DNS1 = "dns1"; - public static final String DNS2 = "dns2"; - public static final String DOMAIN = "domain"; - public static final String DOMAIN_ID = "domainid"; - public static final String DURATION = "duration"; - public static final String EMAIL = "email"; - public static final String END_DATE = "enddate"; - public static final String END_IP = "endip"; - public static final String END_PORT = "endport"; - public static final String ENTRY_TIME = "entrytime"; - public static final String FETCH_LATEST = "fetchlatest"; - public static final String FIRSTNAME = "firstname"; - public static final String FORCED = "forced"; - public static final String FORCED_DESTROY_LOCAL_STORAGE = "forcedestroylocalstorage"; - public static final String FORMAT = "format"; - public static final String FOR_VIRTUAL_NETWORK = "forvirtualnetwork"; - public static final String GATEWAY = "gateway"; - public static final String GROUP = "group"; - public static final String GROUP_ID = "groupid"; - public static final String GUEST_CIDR_ADDRESS = "guestcidraddress"; - public static final String HA_ENABLE = "haenable"; - public static final String HOST_ID = "hostid"; - public static final String HOST_NAME = "hostname"; - public static final String HYPERVISOR = "hypervisor"; - public static final String INLINE = "inline"; - public static final String INSTANCE = "instance"; - public static final String ICMP_CODE = "icmpcode"; - public static final String ICMP_TYPE = "icmptype"; - public static final String ID = "id"; - public static final String IDS = "ids"; - public static final String INTERNAL_DNS1 = "internaldns1"; - public static final String INTERNAL_DNS2 = "internaldns2"; - public static final String INTERVAL_TYPE = "intervaltype"; - public static final String IP_ADDRESS = "ipaddress"; - public static final String IP_ADDRESS_ID = "ipaddressid"; - public static final String IP_AVAILABLE = "ipavailable"; - public static final String IP_LIMIT = "iplimit"; - public static final String IP_TOTAL = "iptotal"; - public static final String IS_CLEANUP_REQUIRED = "iscleanuprequired"; - public static final String IS_EXTRACTABLE = "isextractable"; - public static final String IS_FEATURED = "isfeatured"; - public static final String IS_PUBLIC = "ispublic"; - public static final String IS_READY = "isready"; - public static final String IS_RECURSIVE = "isrecursive"; - public static final String ISO_FILTER = "isofilter"; - public static final String ISO_GUEST_OS_NONE = "None"; - public static final String JOB_ID = "jobid"; - public static final String JOB_STATUS = "jobstatus"; - public static final String LASTNAME = "lastname"; - public static final String LEVEL = "level"; - public static final String LIMIT_CPU_USE = "limitcpuuse"; - public static final String LOCK = "lock"; - public static final String LUN = "lun"; - public static final String LBID = "lbruleid"; - public static final String MAX = "max"; - public static final String MAX_SNAPS = "maxsnaps"; - public static final String MEMORY = "memory"; - public static final String MODE = "mode"; - public static final String NAME = "name"; - public static final String METHOD_NAME = "methodname"; - public static final String NETWORK_DOMAIN = "networkdomain"; - public static final String NETMASK = "netmask"; - public static final String NEW_NAME = "newname"; - public static final String NUM_RETRIES = "numretries"; - public static final String OFFER_HA = "offerha"; - public static final String IS_SYSTEM_OFFERING = "issystem"; - public static final String IS_DEFAULT_USE = "defaultuse"; - public static final String OP = "op"; - public static final String OS_CATEGORY_ID = "oscategoryid"; - public static final String OS_TYPE_ID = "ostypeid"; - public static final String PARENT_DOMAIN_ID = "parentdomainid"; - public static final String PASSWORD = "password"; - public static final String NEW_PASSWORD = "new_password"; - public static final String PASSWORD_ENABLED = "passwordenabled"; - public static final String SSHKEY_ENABLED = "sshkeyenabled"; - public static final String PATH = "path"; - public static final String POD_ID = "podid"; - public static final String POLICY_ID = "policyid"; - public static final String PORT = "port"; - public static final String PORTAL = "portal"; - public static final String PORT_FORWARDING_SERVICE_ID = "portforwardingserviceid"; - public static final String PRIVATE_INTERFACE = "privateinterface"; - public static final String PRIVATE_IP = "privateip"; - public static final String PRIVATE_PORT = "privateport"; - public static final String PRIVATE_START_PORT = "privateport"; - public static final String PRIVATE_END_PORT = "privateendport"; - public static final String PRIVATE_ZONE = "privatezone"; - public static final String PROTOCOL = "protocol"; - public static final String PUBLIC_INTERFACE = "publicinterface"; - public static final String PUBLIC_IP_ID = "publicipid"; - public static final String PUBLIC_IP = "publicip"; - public static final String PUBLIC_PORT = "publicport"; - public static final String PUBLIC_START_PORT = "publicport"; - public static final String PUBLIC_END_PORT = "publicendport"; - public static final String PUBLIC_ZONE = "publiczone"; - public static final String RECEIVED_BYTES = "receivedbytes"; - public static final String REQUIRES_HVM = "requireshvm"; - public static final String RESOURCE_TYPE = "resourcetype"; - public static final String QUERY_FILTER = "queryfilter"; - public static final String SCHEDULE = "schedule"; - public static final String SCOPE = "scope"; - public static final String SECRET_KEY = "usersecretkey"; - public static final String KEY = "key"; - public static final String SEARCH_BASE = "searchbase"; - public static final String SECURITY_GROUP_IDS = "securitygroupids"; - public static final String SECURITY_GROUP_NAMES = "securitygroupnames"; - public static final String SECURITY_GROUP_NAME = "securitygroupname"; - public static final String SECURITY_GROUP_ID = "securitygroupid"; - public static final String SENT = "sent"; - public static final String SENT_BYTES = "sentbytes"; - public static final String SERVICE_OFFERING_ID = "serviceofferingid"; - public static final String SHOW_CAPACITIES = "showcapacities"; - public static final String SIZE = "size"; - public static final String SNAPSHOT_ID = "snapshotid"; - public static final String SNAPSHOT_POLICY_ID = "snapshotpolicyid"; - public static final String SNAPSHOT_TYPE = "snapshottype"; - public static final String SOURCE_ZONE_ID = "sourcezoneid"; - public static final String START_DATE = "startdate"; - public static final String START_IP = "startip"; - public static final String START_PORT = "startport"; - public static final String STATE = "state"; - public static final String STATUS = "status"; - public static final String STORAGE_TYPE = "storagetype"; - public static final String SYSTEM_VM_TYPE = "systemvmtype"; - public static final String TAGS = "tags"; - public static final String TARGET_IQN = "targetiqn"; - public static final String TEMPLATE_FILTER = "templatefilter"; - public static final String TEMPLATE_ID = "templateid"; - public static final String TIMEOUT = "timeout"; - public static final String TIMEZONE = "timezone"; - public static final String TYPE = "type"; - public static final String TRUST_STORE = "truststore"; - public static final String TRUST_STORE_PASSWORD = "truststorepass"; - public static final String URL = "url"; - public static final String USAGE_INTERFACE = "usageinterface"; - public static final String USER_DATA = "userdata"; - public static final String USER_ID = "userid"; - public static final String USE_SSL = "ssl"; - public static final String USERNAME = "username"; - public static final String USER_SECURITY_GROUP_LIST = "usersecuritygrouplist"; - public static final String USE_VIRTUAL_NETWORK = "usevirtualnetwork"; - public static final String VALUE = "value"; - public static final String VIRTUAL_MACHINE_ID = "virtualmachineid"; - public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids"; - public static final String VLAN = "vlan"; - public static final String VLAN_ID = "vlanid"; - public static final String VM_AVAILABLE = "vmavailable"; - public static final String VM_LIMIT = "vmlimit"; - public static final String VM_TOTAL = "vmtotal"; - public static final String VNET = "vnet"; - public static final String VOLUME_ID = "volumeid"; - public static final String ZONE_ID = "zoneid"; - public static final String ZONE_NAME = "zonename"; - public static final String NETWORK_TYPE = "networktype"; - public static final String PAGE = "page"; - public static final String PAGE_SIZE = "pagesize"; - public static final String COUNT = "count"; - public static final String TRAFFIC_TYPE = "traffictype"; - public static final String NETWORK_OFFERING_ID = "networkofferingid"; - public static final String NETWORK_IDS = "networkids"; - public static final String NETWORK_ID = "networkid"; - public static final String SPECIFY_VLAN = "specifyvlan"; - public static final String IS_DEFAULT = "isdefault"; - public static final String IS_SYSTEM = "issystem"; - public static final String AVAILABILITY = "availability"; - public static final String NETWORKRATE = "networkrate"; - public static final String HOST_TAGS = "hosttags"; - public static final String SSH_KEYPAIR = "keypair"; - public static final String HOST_CPU_CAPACITY = "hostcpucapacity"; - public static final String HOST_CPU_NUM = "hostcpunum"; - public static final String HOST_MEM_CAPACITY = "hostmemcapacity"; - public static final String HOST_MAC = "hostmac"; - public static final String HOST_TAG = "hosttag"; - public static final String PXE_SERVER_TYPE = "pxeservertype"; - public static final String LINMIN_USERNAME = "linminusername"; - public static final String LINMIN_PASSWORD = "linminpassword"; - public static final String LINMIN_APID = "linminapid"; - public static final String DHCP_SERVER_TYPE = "dhcpservertype"; - public static final String LINK_LOCAL_IP = "linklocalip"; - public static final String LINK_LOCAL_MAC_ADDRESS = "linklocalmacaddress"; - public static final String LINK_LOCAL_MAC_NETMASK = "linklocalnetmask"; - public static final String LINK_LOCAL_NETWORK_ID = "linklocalnetworkid"; - public static final String PRIVATE_MAC_ADDRESS = "privatemacaddress"; - public static final String PRIVATE_NETMASK = "privatenetmask"; - public static final String PRIVATE_NETWORK_ID = "privatenetworkid"; - public static final String ALLOCATION_STATE = "allocationstate"; - public static final String MANAGED_STATE = "managedstate"; - public static final String STORAGE_ID="storageid"; - public static final String PING_STORAGE_SERVER_IP = "pingstorageserverip"; - public static final String PING_DIR = "pingdir"; - public static final String TFTP_DIR = "tftpdir"; - public static final String PING_CIFS_USERNAME = "pingcifsusername"; - public static final String PING_CIFS_PASSWORD = "pingcifspassword"; - public static final String CHECKSUM="checksum"; - public static final String NETWORK_DEVICE_TYPE = "networkdevicetype"; - public static final String NETWORK_DEVICE_PARAMETER_LIST = "networkdeviceparameterlist"; - public static final String ZONE_TOKEN = "zonetoken"; - public static final String DHCP_PROVIDER = "dhcpprovider"; - public static final String RESULT = "success"; - public static final String LUN_ID = "lunId"; - public static final String IQN = "iqn"; - public static final String AGGREGATE_NAME = "aggregatename"; - public static final String POOL_NAME = "poolname"; - public static final String VOLUME_NAME = "volumename"; - public static final String SNAPSHOT_POLICY = "snapshotpolicy"; - public static final String SNAPSHOT_RESERVATION = "snapshotreservation"; - public static final String IP_NETWORK_LIST = "iptonetworklist"; - public static final String PARAM_LIST = "param"; - public static final String FOR_LOAD_BALANCING = "forloadbalancing"; - public static final String KEYBOARD="keyboard"; - public static final String OPEN_FIREWALL="openfirewall"; - public static final String TEMPLATE_TAG = "templatetag"; - public static final String HYPERVISOR_VERSION = "hypervisorversion"; - public static final String MAX_GUESTS_LIMIT = "maxguestslimit"; - public static final String PROJECT_ID = "projectid"; - public static final String PROJECT_IDS = "projectids"; - public static final String PROJECT = "project"; - public static final String ROLE = "role"; - public static final String USER = "user"; - public static final String ACTIVE_ONLY = "activeonly"; - public static final String TOKEN = "token"; - public static final String ACCEPT = "accept"; - public static final String SORT_KEY = "sortkey"; - public static final String ACCOUNT_DETAILS = "accountdetails"; - public static final String SERVICE_PROVIDER_LIST = "serviceproviderlist"; - public static final String SERVICE_CAPABILITY_LIST = "servicecapabilitylist"; - public static final String CAN_CHOOSE_SERVICE_CAPABILITY = "canchooseservicecapability"; - public static final String PROVIDER = "provider"; - public static final String NETWORK_SPEED = "networkspeed"; - public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange"; - public static final String ISOLATION_METHODS = "isolationmethods"; - public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid"; - public static final String DEST_PHYSICAL_NETWORK_ID = "destinationphysicalnetworkid"; - public static final String ENABLED = "enabled"; - public static final String SERVICE_NAME = "servicename"; - public static final String DHCP_RANGE = "dhcprange"; - public static final String UUID = "uuid"; - public static final String SECURITY_GROUP_EANBLED = "securitygroupenabled"; - public static final String GUEST_IP_TYPE = "guestiptype"; - public static final String XEN_NETWORK_LABEL = "xennetworklabel"; - public static final String KVM_NETWORK_LABEL = "kvmnetworklabel"; - public static final String VMWARE_NETWORK_LABEL = "vmwarenetworklabel"; - public static final String NETWORK_SERVICE_PROVIDER_ID = "nspid"; - public static final String SERVICE_LIST = "servicelist"; - public static final String CAN_ENABLE_INDIVIDUAL_SERVICE = "canenableindividualservice"; - public static final String SUPPORTED_SERVICES = "supportedservices"; - public static final String NSP_ID= "nspid"; - public static final String ACL_TYPE= "acltype"; - public static final String SUBDOMAIN_ACCESS = "subdomainaccess"; - public static final String LOAD_BALANCER_DEVICE_ID = "lbdeviceid"; - public static final String LOAD_BALANCER_DEVICE_NAME = "lbdevicename"; - public static final String LOAD_BALANCER_DEVICE_STATE = "lbdevicestate"; - public static final String LOAD_BALANCER_DEVICE_CAPACITY = "lbdevicecapacity"; - public static final String LOAD_BALANCER_DEVICE_DEDICATED = "lbdevicededicated"; - public static final String FIREWALL_DEVICE_ID = "fwdeviceid"; - public static final String FIREWALL_DEVICE_NAME = "fwdevicename"; - public static final String FIREWALL_DEVICE_STATE = "fwdevicestate"; - public static final String FIREWALL_DEVICE_CAPACITY = "fwdevicecapacity"; - public static final String FIREWALL_DEVICE_DEDICATED = "fwdevicededicated"; - public static final String SERVICE = "service"; - public static final String ASSOCIATED_NETWORK_ID = "associatednetworkid"; - public static final String SOURCE_NAT_SUPPORTED = "sourcenatsupported"; - public static final String RESOURCE_STATE = "resourcestate"; - public static final String PROJECT_INVITE_REQUIRED = "projectinviterequired"; - public static final String RESTART_REQUIRED = "restartrequired"; - public static final String ALLOW_USER_CREATE_PROJECTS = "allowusercreateprojects"; - public static final String CONSERVE_MODE = "conservemode"; - public static final String TRAFFIC_TYPE_IMPLEMENTOR = "traffictypeimplementor"; - public static final String KEYWORD = "keyword"; - public static final String LIST_ALL = "listall"; - public static final String SPECIFY_IP_RANGES = "specifyipranges"; - public static final String IS_SOURCE_NAT = "issourcenat"; - public static final String IS_STATIC_NAT = "isstaticnat"; - public static final String SORT_BY = "sortby"; - public static final String CHANGE_CIDR = "changecidr"; - public static final String PURPOSE = "purpose"; - public static final String IS_TAGGED = "istagged"; - public static final String INSTANCE_NAME = "instancename"; - public static final String START_VM = "startvm"; - public static final String HA_HOST = "hahost"; - public static final String CUSTOM_DISK_OFF_MAX_SIZE = "customdiskofferingmaxsize"; - public static final String DEFAULT_ZONE_ID = "defaultzoneid"; - public static final String GUID = "guid"; - - public static final String EXTERNAL_SWITCH_MGMT_DEVICE_ID = "vsmdeviceid"; - public static final String EXTERNAL_SWITCH_MGMT_DEVICE_NAME = "vsmdevicename"; - public static final String EXTERNAL_SWITCH_MGMT_DEVICE_STATE = "vsmdevicestate"; - // Would we need to have a capacity field for Cisco N1KV VSM? Max hosts managed by it perhaps? May remove this later. - public static final String EXTERNAL_SWITCH_MGMT_DEVICE_CAPACITY = "vsmdevicecapacity"; - public static final String CISCO_NEXUS_VSM_NAME = "vsmname"; - public static final String VSM_USERNAME = "vsmusername"; - public static final String VSM_PASSWORD = "vsmpassword"; - public static final String VSM_IPADDRESS = "vsmipaddress"; - public static final String VSM_MGMT_VLAN_ID = "vsmmgmtvlanid"; - public static final String VSM_PKT_VLAN_ID = "vsmpktvlanid"; - public static final String VSM_CTRL_VLAN_ID = "vsmctrlvlanid"; - public static final String VSM_STORAGE_VLAN_ID = "vsmstoragevlanid"; - public static final String VSM_DOMAIN_ID = "vsmdomainid"; - public static final String VSM_CONFIG_MODE = "vsmconfigmode"; - public static final String VSM_CONFIG_STATE = "vsmconfigstate"; - public static final String VSM_DEVICE_STATE = "vsmdevicestate"; - public static final String INCL_ZONES = "includezones"; - public static final String EXCL_ZONES = "excludezones"; - public static final String RESOURCE_IDS = "resourceids"; - public static final String RESOURCE_ID = "resourceid"; - public static final String CUSTOMER = "customer"; - public static final String VPC_OFF_ID = "vpcofferingid"; - public static final String NETWORK = "network"; - public static final String VPC_ID = "vpcid"; - public static final String CAN_USE_FOR_DEPLOY = "canusefordeploy"; - public static final String GATEWAY_ID = "gatewayid"; - public static final String S2S_VPN_GATEWAY_ID = "s2svpngatewayid"; - public static final String S2S_CUSTOMER_GATEWAY_ID = "s2scustomergatewayid"; - public static final String IPSEC_PSK = "ipsecpsk"; - public static final String GUEST_IP = "guestip"; - public static final String REMOVED = "removed"; - public static final String IKE_POLICY = "ikepolicy"; - public static final String ESP_POLICY = "esppolicy"; - public static final String LIFETIME = "lifetime"; - public static final String FOR_VPC = "forvpc"; - - public enum HostDetails { - all, capacity, events, stats, min; - } - - public enum VMDetails { - all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min; - } - - public enum LDAPParams { - hostname, port, usessl, queryfilter, searchbase, dn, passwd, truststore, truststorepass; - - @Override - public String toString(){ - return "ldap." + name(); - } - } - - -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api; + +public class ApiConstants { + public static final String ACCOUNT = "account"; + public static final String ACCOUNTS = "accounts"; + public static final String ACCOUNT_TYPE = "accounttype"; + public static final String ACCOUNT_ID = "accountid"; + public static final String ALGORITHM = "algorithm"; + public static final String ALLOCATED_ONLY = "allocatedonly"; + public static final String API_KEY = "userapikey"; + public static final String APPLIED = "applied"; + public static final String AVAILABLE = "available"; + public static final String BITS = "bits"; + public static final String BOOTABLE = "bootable"; + public static final String BIND_DN = "binddn"; + public static final String BIND_PASSWORD = "bindpass"; + public static final String CATEGORY = "category"; + public static final String CERTIFICATE = "certificate"; + public static final String PRIVATE_KEY = "privatekey"; + public static final String DOMAIN_SUFFIX = "domainsuffix"; + public static final String DNS_SEARCH_ORDER = "dnssearchorder"; + public static final String CIDR = "cidr"; + public static final String CIDR_LIST = "cidrlist"; + public static final String CLEANUP = "cleanup"; + public static final String CLUSTER_ID = "clusterid"; + public static final String CLUSTER_NAME = "clustername"; + public static final String CLUSTER_TYPE = "clustertype"; + public static final String COMPONENT = "component"; + public static final String CPU_NUMBER = "cpunumber"; + public static final String CPU_SPEED = "cpuspeed"; + public static final String CREATED = "created"; + public static final String CUSTOMIZED = "customized"; + public static final String DESCRIPTION = "description"; + public static final String DESTINATION_ZONE_ID = "destzoneid"; + public static final String DETAILS = "details"; + public static final String DEVICE_ID = "deviceid"; + public static final String DISK_OFFERING_ID = "diskofferingid"; + public static final String DISK_SIZE = "disksize"; + public static final String DISPLAY_NAME = "displayname"; + public static final String DISPLAY_TEXT = "displaytext"; + public static final String DNS1 = "dns1"; + public static final String DNS2 = "dns2"; + public static final String DOMAIN = "domain"; + public static final String DOMAIN_ID = "domainid"; + public static final String DURATION = "duration"; + public static final String EMAIL = "email"; + public static final String END_DATE = "enddate"; + public static final String END_IP = "endip"; + public static final String END_PORT = "endport"; + public static final String ENTRY_TIME = "entrytime"; + public static final String FETCH_LATEST = "fetchlatest"; + public static final String FIRSTNAME = "firstname"; + public static final String FORCED = "forced"; + public static final String FORCED_DESTROY_LOCAL_STORAGE = "forcedestroylocalstorage"; + public static final String FORMAT = "format"; + public static final String FOR_VIRTUAL_NETWORK = "forvirtualnetwork"; + public static final String GATEWAY = "gateway"; + public static final String GROUP = "group"; + public static final String GROUP_ID = "groupid"; + public static final String GUEST_CIDR_ADDRESS = "guestcidraddress"; + public static final String HA_ENABLE = "haenable"; + public static final String HOST_ID = "hostid"; + public static final String HOST_NAME = "hostname"; + public static final String HYPERVISOR = "hypervisor"; + public static final String INLINE = "inline"; + public static final String INSTANCE = "instance"; + public static final String ICMP_CODE = "icmpcode"; + public static final String ICMP_TYPE = "icmptype"; + public static final String ID = "id"; + public static final String IDS = "ids"; + public static final String INTERNAL_DNS1 = "internaldns1"; + public static final String INTERNAL_DNS2 = "internaldns2"; + public static final String INTERVAL_TYPE = "intervaltype"; + public static final String IP_ADDRESS = "ipaddress"; + public static final String IP_ADDRESS_ID = "ipaddressid"; + public static final String IP_AVAILABLE = "ipavailable"; + public static final String IP_LIMIT = "iplimit"; + public static final String IP_TOTAL = "iptotal"; + public static final String IS_CLEANUP_REQUIRED = "iscleanuprequired"; + public static final String IS_EXTRACTABLE = "isextractable"; + public static final String IS_FEATURED = "isfeatured"; + public static final String IS_PUBLIC = "ispublic"; + public static final String IS_READY = "isready"; + public static final String IS_RECURSIVE = "isrecursive"; + public static final String ISO_FILTER = "isofilter"; + public static final String ISO_GUEST_OS_NONE = "None"; + public static final String JOB_ID = "jobid"; + public static final String JOB_STATUS = "jobstatus"; + public static final String LASTNAME = "lastname"; + public static final String LEVEL = "level"; + public static final String LIMIT_CPU_USE = "limitcpuuse"; + public static final String LOCK = "lock"; + public static final String LUN = "lun"; + public static final String LBID = "lbruleid"; + public static final String MAX = "max"; + public static final String MAX_SNAPS = "maxsnaps"; + public static final String MEMORY = "memory"; + public static final String MODE = "mode"; + public static final String NAME = "name"; + public static final String METHOD_NAME = "methodname"; + public static final String NETWORK_DOMAIN = "networkdomain"; + public static final String NETMASK = "netmask"; + public static final String NEW_NAME = "newname"; + public static final String NUM_RETRIES = "numretries"; + public static final String OFFER_HA = "offerha"; + public static final String IS_SYSTEM_OFFERING = "issystem"; + public static final String IS_DEFAULT_USE = "defaultuse"; + public static final String OP = "op"; + public static final String OS_CATEGORY_ID = "oscategoryid"; + public static final String OS_TYPE_ID = "ostypeid"; + public static final String PARENT_DOMAIN_ID = "parentdomainid"; + public static final String PASSWORD = "password"; + public static final String NEW_PASSWORD = "new_password"; + public static final String PASSWORD_ENABLED = "passwordenabled"; + public static final String SSHKEY_ENABLED = "sshkeyenabled"; + public static final String PATH = "path"; + public static final String POD_ID = "podid"; + public static final String POLICY_ID = "policyid"; + public static final String PORT = "port"; + public static final String PORTAL = "portal"; + public static final String PORT_FORWARDING_SERVICE_ID = "portforwardingserviceid"; + public static final String PRIVATE_INTERFACE = "privateinterface"; + public static final String PRIVATE_IP = "privateip"; + public static final String PRIVATE_PORT = "privateport"; + public static final String PRIVATE_START_PORT = "privateport"; + public static final String PRIVATE_END_PORT = "privateendport"; + public static final String PRIVATE_ZONE = "privatezone"; + public static final String PROTOCOL = "protocol"; + public static final String PUBLIC_INTERFACE = "publicinterface"; + public static final String PUBLIC_IP_ID = "publicipid"; + public static final String PUBLIC_IP = "publicip"; + public static final String PUBLIC_PORT = "publicport"; + public static final String PUBLIC_START_PORT = "publicport"; + public static final String PUBLIC_END_PORT = "publicendport"; + public static final String PUBLIC_ZONE = "publiczone"; + public static final String RECEIVED_BYTES = "receivedbytes"; + public static final String REQUIRES_HVM = "requireshvm"; + public static final String RESOURCE_TYPE = "resourcetype"; + public static final String QUERY_FILTER = "queryfilter"; + public static final String SCHEDULE = "schedule"; + public static final String SCOPE = "scope"; + public static final String SECRET_KEY = "usersecretkey"; + public static final String KEY = "key"; + public static final String SEARCH_BASE = "searchbase"; + public static final String SECURITY_GROUP_IDS = "securitygroupids"; + public static final String SECURITY_GROUP_NAMES = "securitygroupnames"; + public static final String SECURITY_GROUP_NAME = "securitygroupname"; + public static final String SECURITY_GROUP_ID = "securitygroupid"; + public static final String SENT = "sent"; + public static final String SENT_BYTES = "sentbytes"; + public static final String SERVICE_OFFERING_ID = "serviceofferingid"; + public static final String SHOW_CAPACITIES = "showcapacities"; + public static final String SIZE = "size"; + public static final String SNAPSHOT_ID = "snapshotid"; + public static final String SNAPSHOT_POLICY_ID = "snapshotpolicyid"; + public static final String SNAPSHOT_TYPE = "snapshottype"; + public static final String SOURCE_ZONE_ID = "sourcezoneid"; + public static final String START_DATE = "startdate"; + public static final String START_IP = "startip"; + public static final String START_PORT = "startport"; + public static final String STATE = "state"; + public static final String STATUS = "status"; + public static final String STORAGE_TYPE = "storagetype"; + public static final String SYSTEM_VM_TYPE = "systemvmtype"; + public static final String TAGS = "tags"; + public static final String TARGET_IQN = "targetiqn"; + public static final String TEMPLATE_FILTER = "templatefilter"; + public static final String TEMPLATE_ID = "templateid"; + public static final String TIMEOUT = "timeout"; + public static final String TIMEZONE = "timezone"; + public static final String TYPE = "type"; + public static final String TRUST_STORE = "truststore"; + public static final String TRUST_STORE_PASSWORD = "truststorepass"; + public static final String URL = "url"; + public static final String USAGE_INTERFACE = "usageinterface"; + public static final String USER_DATA = "userdata"; + public static final String USER_ID = "userid"; + public static final String USE_SSL = "ssl"; + public static final String USERNAME = "username"; + public static final String USER_SECURITY_GROUP_LIST = "usersecuritygrouplist"; + public static final String USE_VIRTUAL_NETWORK = "usevirtualnetwork"; + public static final String VALUE = "value"; + public static final String VIRTUAL_MACHINE_ID = "virtualmachineid"; + public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids"; + public static final String VLAN = "vlan"; + public static final String VLAN_ID = "vlanid"; + public static final String VM_AVAILABLE = "vmavailable"; + public static final String VM_LIMIT = "vmlimit"; + public static final String VM_TOTAL = "vmtotal"; + public static final String VNET = "vnet"; + public static final String VOLUME_ID = "volumeid"; + public static final String ZONE_ID = "zoneid"; + public static final String ZONE_NAME = "zonename"; + public static final String NETWORK_TYPE = "networktype"; + public static final String PAGE = "page"; + public static final String PAGE_SIZE = "pagesize"; + public static final String COUNT = "count"; + public static final String TRAFFIC_TYPE = "traffictype"; + public static final String NETWORK_OFFERING_ID = "networkofferingid"; + public static final String NETWORK_IDS = "networkids"; + public static final String NETWORK_ID = "networkid"; + public static final String SPECIFY_VLAN = "specifyvlan"; + public static final String IS_DEFAULT = "isdefault"; + public static final String IS_SYSTEM = "issystem"; + public static final String AVAILABILITY = "availability"; + public static final String NETWORKRATE = "networkrate"; + public static final String HOST_TAGS = "hosttags"; + public static final String SSH_KEYPAIR = "keypair"; + public static final String HOST_CPU_CAPACITY = "hostcpucapacity"; + public static final String HOST_CPU_NUM = "hostcpunum"; + public static final String HOST_MEM_CAPACITY = "hostmemcapacity"; + public static final String HOST_MAC = "hostmac"; + public static final String HOST_TAG = "hosttag"; + public static final String PXE_SERVER_TYPE = "pxeservertype"; + public static final String LINMIN_USERNAME = "linminusername"; + public static final String LINMIN_PASSWORD = "linminpassword"; + public static final String LINMIN_APID = "linminapid"; + public static final String DHCP_SERVER_TYPE = "dhcpservertype"; + public static final String LINK_LOCAL_IP = "linklocalip"; + public static final String LINK_LOCAL_MAC_ADDRESS = "linklocalmacaddress"; + public static final String LINK_LOCAL_MAC_NETMASK = "linklocalnetmask"; + public static final String LINK_LOCAL_NETWORK_ID = "linklocalnetworkid"; + public static final String PRIVATE_MAC_ADDRESS = "privatemacaddress"; + public static final String PRIVATE_NETMASK = "privatenetmask"; + public static final String PRIVATE_NETWORK_ID = "privatenetworkid"; + public static final String ALLOCATION_STATE = "allocationstate"; + public static final String MANAGED_STATE = "managedstate"; + public static final String STORAGE_ID="storageid"; + public static final String PING_STORAGE_SERVER_IP = "pingstorageserverip"; + public static final String PING_DIR = "pingdir"; + public static final String TFTP_DIR = "tftpdir"; + public static final String PING_CIFS_USERNAME = "pingcifsusername"; + public static final String PING_CIFS_PASSWORD = "pingcifspassword"; + public static final String CHECKSUM="checksum"; + public static final String NETWORK_DEVICE_TYPE = "networkdevicetype"; + public static final String NETWORK_DEVICE_PARAMETER_LIST = "networkdeviceparameterlist"; + public static final String ZONE_TOKEN = "zonetoken"; + public static final String DHCP_PROVIDER = "dhcpprovider"; + public static final String RESULT = "success"; + public static final String LUN_ID = "lunId"; + public static final String IQN = "iqn"; + public static final String AGGREGATE_NAME = "aggregatename"; + public static final String POOL_NAME = "poolname"; + public static final String VOLUME_NAME = "volumename"; + public static final String SNAPSHOT_POLICY = "snapshotpolicy"; + public static final String SNAPSHOT_RESERVATION = "snapshotreservation"; + public static final String IP_NETWORK_LIST = "iptonetworklist"; + public static final String PARAM_LIST = "param"; + public static final String FOR_LOAD_BALANCING = "forloadbalancing"; + public static final String KEYBOARD="keyboard"; + public static final String OPEN_FIREWALL="openfirewall"; + public static final String TEMPLATE_TAG = "templatetag"; + public static final String HYPERVISOR_VERSION = "hypervisorversion"; + public static final String MAX_GUESTS_LIMIT = "maxguestslimit"; + public static final String PROJECT_ID = "projectid"; + public static final String PROJECT_IDS = "projectids"; + public static final String PROJECT = "project"; + public static final String ROLE = "role"; + public static final String USER = "user"; + public static final String ACTIVE_ONLY = "activeonly"; + public static final String TOKEN = "token"; + public static final String ACCEPT = "accept"; + public static final String SORT_KEY = "sortkey"; + public static final String ACCOUNT_DETAILS = "accountdetails"; + public static final String SERVICE_PROVIDER_LIST = "serviceproviderlist"; + public static final String SERVICE_CAPABILITY_LIST = "servicecapabilitylist"; + public static final String CAN_CHOOSE_SERVICE_CAPABILITY = "canchooseservicecapability"; + public static final String PROVIDER = "provider"; + public static final String NETWORK_SPEED = "networkspeed"; + public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange"; + public static final String ISOLATION_METHODS = "isolationmethods"; + public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid"; + public static final String DEST_PHYSICAL_NETWORK_ID = "destinationphysicalnetworkid"; + public static final String ENABLED = "enabled"; + public static final String SERVICE_NAME = "servicename"; + public static final String DHCP_RANGE = "dhcprange"; + public static final String UUID = "uuid"; + public static final String SECURITY_GROUP_EANBLED = "securitygroupenabled"; + public static final String GUEST_IP_TYPE = "guestiptype"; + public static final String XEN_NETWORK_LABEL = "xennetworklabel"; + public static final String KVM_NETWORK_LABEL = "kvmnetworklabel"; + public static final String VMWARE_NETWORK_LABEL = "vmwarenetworklabel"; + public static final String NETWORK_SERVICE_PROVIDER_ID = "nspid"; + public static final String SERVICE_LIST = "servicelist"; + public static final String CAN_ENABLE_INDIVIDUAL_SERVICE = "canenableindividualservice"; + public static final String SUPPORTED_SERVICES = "supportedservices"; + public static final String NSP_ID= "nspid"; + public static final String ACL_TYPE= "acltype"; + public static final String SUBDOMAIN_ACCESS = "subdomainaccess"; + public static final String LOAD_BALANCER_DEVICE_ID = "lbdeviceid"; + public static final String LOAD_BALANCER_DEVICE_NAME = "lbdevicename"; + public static final String LOAD_BALANCER_DEVICE_STATE = "lbdevicestate"; + public static final String LOAD_BALANCER_DEVICE_CAPACITY = "lbdevicecapacity"; + public static final String LOAD_BALANCER_DEVICE_DEDICATED = "lbdevicededicated"; + public static final String FIREWALL_DEVICE_ID = "fwdeviceid"; + public static final String FIREWALL_DEVICE_NAME = "fwdevicename"; + public static final String FIREWALL_DEVICE_STATE = "fwdevicestate"; + public static final String FIREWALL_DEVICE_CAPACITY = "fwdevicecapacity"; + public static final String FIREWALL_DEVICE_DEDICATED = "fwdevicededicated"; + public static final String SERVICE = "service"; + public static final String ASSOCIATED_NETWORK_ID = "associatednetworkid"; + public static final String SOURCE_NAT_SUPPORTED = "sourcenatsupported"; + public static final String RESOURCE_STATE = "resourcestate"; + public static final String PROJECT_INVITE_REQUIRED = "projectinviterequired"; + public static final String RESTART_REQUIRED = "restartrequired"; + public static final String ALLOW_USER_CREATE_PROJECTS = "allowusercreateprojects"; + public static final String CONSERVE_MODE = "conservemode"; + public static final String TRAFFIC_TYPE_IMPLEMENTOR = "traffictypeimplementor"; + public static final String KEYWORD = "keyword"; + public static final String LIST_ALL = "listall"; + public static final String SPECIFY_IP_RANGES = "specifyipranges"; + public static final String IS_SOURCE_NAT = "issourcenat"; + public static final String IS_STATIC_NAT = "isstaticnat"; + public static final String SORT_BY = "sortby"; + public static final String CHANGE_CIDR = "changecidr"; + public static final String PURPOSE = "purpose"; + public static final String IS_TAGGED = "istagged"; + public static final String INSTANCE_NAME = "instancename"; + public static final String START_VM = "startvm"; + public static final String HA_HOST = "hahost"; + public static final String CUSTOM_DISK_OFF_MAX_SIZE = "customdiskofferingmaxsize"; + public static final String DEFAULT_ZONE_ID = "defaultzoneid"; + public static final String GUID = "guid"; + + public static final String EXTERNAL_SWITCH_MGMT_DEVICE_ID = "vsmdeviceid"; + public static final String EXTERNAL_SWITCH_MGMT_DEVICE_NAME = "vsmdevicename"; + public static final String EXTERNAL_SWITCH_MGMT_DEVICE_STATE = "vsmdevicestate"; + // Would we need to have a capacity field for Cisco N1KV VSM? Max hosts managed by it perhaps? May remove this +// later. + public static final String EXTERNAL_SWITCH_MGMT_DEVICE_CAPACITY = "vsmdevicecapacity"; + public static final String CISCO_NEXUS_VSM_NAME = "vsmname"; + public static final String VSM_USERNAME = "vsmusername"; + public static final String VSM_PASSWORD = "vsmpassword"; + public static final String VSM_IPADDRESS = "vsmipaddress"; + public static final String VSM_MGMT_VLAN_ID = "vsmmgmtvlanid"; + public static final String VSM_PKT_VLAN_ID = "vsmpktvlanid"; + public static final String VSM_CTRL_VLAN_ID = "vsmctrlvlanid"; + public static final String VSM_STORAGE_VLAN_ID = "vsmstoragevlanid"; + public static final String VSM_DOMAIN_ID = "vsmdomainid"; + public static final String VSM_CONFIG_MODE = "vsmconfigmode"; + public static final String VSM_CONFIG_STATE = "vsmconfigstate"; + public static final String VSM_DEVICE_STATE = "vsmdevicestate"; + public static final String INCL_ZONES = "includezones"; + public static final String EXCL_ZONES = "excludezones"; + public static final String RESOURCE_IDS = "resourceids"; + public static final String RESOURCE_ID = "resourceid"; + public static final String CUSTOMER = "customer"; + public static final String VPC_OFF_ID = "vpcofferingid"; + public static final String NETWORK = "network"; + public static final String VPC_ID = "vpcid"; + public static final String CAN_USE_FOR_DEPLOY = "canusefordeploy"; + public static final String GATEWAY_ID = "gatewayid"; + public static final String S2S_VPN_GATEWAY_ID = "s2svpngatewayid"; + public static final String S2S_CUSTOMER_GATEWAY_ID = "s2scustomergatewayid"; + public static final String IPSEC_PSK = "ipsecpsk"; + public static final String GUEST_IP = "guestip"; + public static final String REMOVED = "removed"; + public static final String IKE_POLICY = "ikepolicy"; + public static final String ESP_POLICY = "esppolicy"; + public static final String LIFETIME = "lifetime"; + public static final String FOR_VPC = "forvpc"; + public static final String SOURCE = "source"; + public static final String COUNTER_ID = "counterid"; + public static final String AGGR_OPERATOR = "aggroperator"; + public static final String AGGR_FUNCTION = "aggrfunction"; + public static final String AGGR_VALUE = "aggrvalue"; + public static final String THRESHOLD = "threshold"; + public static final String RELATIONAL_OPERATOR = "relationaloperator"; + public static final String SNMP_COMMUNITY = "snmpcommunity"; + public static final String SNMP_PORT = "snmpport"; + public static final String OTHER_DEPLOY_PARAMS = "otherdeployparams"; + public static final String MIN_MEMBERS = "minmembers"; + public static final String MAX_MEMBERS = "maxmembers"; + public static final String AUTOSCALE_VM_DESTROY_TIME = "destroyvmgraceperiod"; + public static final String VMPROFILE_ID = "vmprofileid"; + public static final String VMGROUP_ID = "vmgroupid"; + public static final String SCALEUP_POLICY_IDS = "scaleuppolicyids"; + public static final String SCALEDOWN_POLICY_IDS = "scaledownpolicyids"; + public static final String INTERVAL = "interval"; + public static final String QUIETTIME = "quiettime"; + public static final String ACTION = "action"; + public static final String CONDITION_ID = "conditionid"; + public static final String CONDITION_IDS = "conditionids"; + public static final String AUTOSCALE_USER_ID = "autoscaleuserid"; + + public enum HostDetails { + all, capacity, events, stats, min; + } + + public enum VMDetails { + all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min; + } + + public enum LDAPParams { + hostname, port, usessl, queryfilter, searchbase, dn, passwd, truststore, truststorepass; + + @Override + public String toString(){ + return "ldap." + name(); + } + } + +} diff --git a/api/src/com/cloud/api/BaseCmd.java b/api/src/com/cloud/api/BaseCmd.java index 8895bf0a173..2ca70577c14 100755 --- a/api/src/com/cloud/api/BaseCmd.java +++ b/api/src/com/cloud/api/BaseCmd.java @@ -1,525 +1,528 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.api; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import org.apache.log4j.Logger; - -import com.cloud.configuration.ConfigurationService; -import com.cloud.consoleproxy.ConsoleProxyService; -import com.cloud.dao.EntityManager; -import com.cloud.domain.Domain; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.NetworkService; -import com.cloud.network.StorageNetworkService; -import com.cloud.network.VirtualNetworkApplianceService; -import com.cloud.network.firewall.FirewallService; -import com.cloud.network.firewall.NetworkACLService; -import com.cloud.network.lb.LoadBalancingRulesService; -import com.cloud.network.rules.RulesService; -import com.cloud.network.security.SecurityGroupService; -import com.cloud.network.vpc.VpcService; -import com.cloud.network.vpn.RemoteAccessVpnService; -import com.cloud.network.vpn.Site2SiteVpnService; -import com.cloud.projects.Project; -import com.cloud.projects.ProjectService; -import com.cloud.resource.ResourceService; -import com.cloud.server.ManagementService; -import com.cloud.server.TaggedResourceService; -import com.cloud.storage.StorageService; -import com.cloud.storage.snapshot.SnapshotService; -import com.cloud.template.TemplateService; -import com.cloud.user.Account; -import com.cloud.user.AccountService; -import com.cloud.user.DomainService; -import com.cloud.user.ResourceLimitService; -import com.cloud.utils.IdentityProxy; -import com.cloud.utils.Pair; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.vm.BareMetalVmService; -import com.cloud.vm.UserVmService; - -public abstract class BaseCmd { - private static final Logger s_logger = Logger.getLogger(BaseCmd.class.getName()); - - public static final String USER_ERROR_MESSAGE = "Internal error executing command, please contact your system administrator"; - public static final int PROGRESS_INSTANCE_CREATED = 1; - - public static final String RESPONSE_TYPE_XML = "xml"; - public static final String RESPONSE_TYPE_JSON = "json"; - - public enum CommandType { - BOOLEAN, DATE, FLOAT, INTEGER, SHORT, LIST, LONG, OBJECT, MAP, STRING, TZDATE - } - - // FIXME: Extract these out into a separate file - // Client error codes - public static final int MALFORMED_PARAMETER_ERROR = 430; - public static final int PARAM_ERROR = 431; - public static final int UNSUPPORTED_ACTION_ERROR = 432; - public static final int PAGE_LIMIT_EXCEED = 433; - - // Server error codes - public static final int INTERNAL_ERROR = 530; - public static final int ACCOUNT_ERROR = 531; - public static final int ACCOUNT_RESOURCE_LIMIT_ERROR = 532; - public static final int INSUFFICIENT_CAPACITY_ERROR = 533; - public static final int RESOURCE_UNAVAILABLE_ERROR = 534; - public static final int RESOURCE_ALLOCATION_ERROR = 534; - public static final int RESOURCE_IN_USE_ERROR = 536; - public static final int NETWORK_RULE_CONFLICT_ERROR = 537; - - public static final DateFormat INPUT_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); - public static final DateFormat NEW_INPUT_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - public static Pattern newInputDateFormat = Pattern.compile("[\\d]+-[\\d]+-[\\d]+ [\\d]+:[\\d]+:[\\d]+"); - private static final DateFormat _outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - - private Object _responseObject = null; - private Map fullUrlParams; - - @Parameter(name = "response", type = CommandType.STRING) - private String responseType; - - public static ComponentLocator s_locator; - public static ConfigurationService _configService; - public static AccountService _accountService; - public static UserVmService _userVmService; - public static ManagementService _mgr; - public static StorageService _storageService; - public static ResourceService _resourceService; - public static NetworkService _networkService; - public static TemplateService _templateService; - public static SecurityGroupService _securityGroupService; - public static SnapshotService _snapshotService; - public static ConsoleProxyService _consoleProxyService; - public static VirtualNetworkApplianceService _routerService; - public static ResponseGenerator _responseGenerator; - public static EntityManager _entityMgr; - public static RulesService _rulesService; - public static LoadBalancingRulesService _lbService; - public static RemoteAccessVpnService _ravService; - public static BareMetalVmService _bareMetalVmService; - public static ProjectService _projectService; - public static FirewallService _firewallService; - public static DomainService _domainService; - public static ResourceLimitService _resourceLimitService; - public static IdentityService _identityService; - public static StorageNetworkService _storageNetworkService; - public static TaggedResourceService _taggedResourceService; - public static VpcService _vpcService; - public static NetworkACLService _networkACLService; - public static Site2SiteVpnService _s2sVpnService; - - static void setComponents(ResponseGenerator generator) { - ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); - _mgr = (ManagementService) ComponentLocator.getComponent(ManagementService.Name); - _accountService = locator.getManager(AccountService.class); - _configService = locator.getManager(ConfigurationService.class); - _userVmService = locator.getManager(UserVmService.class); - _storageService = locator.getManager(StorageService.class); - _resourceService = locator.getManager(ResourceService.class); - _networkService = locator.getManager(NetworkService.class); - _templateService = locator.getManager(TemplateService.class); - _securityGroupService = locator.getManager(SecurityGroupService.class); - _snapshotService = locator.getManager(SnapshotService.class); - _consoleProxyService = locator.getManager(ConsoleProxyService.class); - _routerService = locator.getManager(VirtualNetworkApplianceService.class); - _entityMgr = locator.getManager(EntityManager.class); - _rulesService = locator.getManager(RulesService.class); - _lbService = locator.getManager(LoadBalancingRulesService.class); - _ravService = locator.getManager(RemoteAccessVpnService.class); - _responseGenerator = generator; - _bareMetalVmService = locator.getManager(BareMetalVmService.class); - _projectService = locator.getManager(ProjectService.class); - _firewallService = locator.getManager(FirewallService.class); - _domainService = locator.getManager(DomainService.class); - _resourceLimitService = locator.getManager(ResourceLimitService.class); - _identityService = locator.getManager(IdentityService.class); - _storageNetworkService = locator.getManager(StorageNetworkService.class); - _taggedResourceService = locator.getManager(TaggedResourceService.class); - _vpcService = locator.getManager(VpcService.class); - _networkACLService = locator.getManager(NetworkACLService.class); - _s2sVpnService = locator.getManager(Site2SiteVpnService.class); - } - - public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; - - public String getResponseType() { - if (responseType == null) { - return RESPONSE_TYPE_XML; - } - return responseType; - } - - public void setResponseType(String responseType) { - this.responseType = responseType; - } - - public abstract String getCommandName(); - - /** - * For commands the API framework needs to know the owner of the object being acted upon. This method is - * used to determine that information. - * - * @return the id of the account that owns the object being acted upon - */ - public abstract long getEntityOwnerId(); - - public Object getResponseObject() { - return _responseObject; - } - - public void setResponseObject(Object responseObject) { - _responseObject = responseObject; - } - - public ManagementService getMgmtServiceRef() { - return _mgr; - } - - public static String getDateString(Date date) { - if (date == null) { - return ""; - } - String formattedString = null; - synchronized (_outputFormat) { - formattedString = _outputFormat.format(date); - } - return formattedString; - } - - // FIXME: move this to a utils method so that maps can be unpacked and integer/long values can be appropriately cast - @SuppressWarnings({ "unchecked", "rawtypes" }) - public Map unpackParams(Map params) { - Map lowercaseParams = new HashMap(); - for (String key : params.keySet()) { - int arrayStartIndex = key.indexOf('['); - int arrayStartLastIndex = key.lastIndexOf('['); - if (arrayStartIndex != arrayStartLastIndex) { - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key - + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } - - if (arrayStartIndex > 0) { - int arrayEndIndex = key.indexOf(']'); - int arrayEndLastIndex = key.lastIndexOf(']'); - if ((arrayEndIndex < arrayStartIndex) || (arrayEndIndex != arrayEndLastIndex)) { - // malformed parameter - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key - + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } - - // Now that we have an array object, check for a field name in the case of a complex object - int fieldIndex = key.indexOf('.'); - String fieldName = null; - if (fieldIndex < arrayEndIndex) { - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key - + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } else { - fieldName = key.substring(fieldIndex + 1); - } - - // parse the parameter name as the text before the first '[' character - String paramName = key.substring(0, arrayStartIndex); - paramName = paramName.toLowerCase(); - - Map mapArray = null; - Map mapValue = null; - String indexStr = key.substring(arrayStartIndex + 1, arrayEndIndex); - int index = 0; - boolean parsedIndex = false; - try { - if (indexStr != null) { - index = Integer.parseInt(indexStr); - parsedIndex = true; - } - } catch (NumberFormatException nfe) { - s_logger.warn("Invalid parameter " + key + " received, unable to parse object array, returning an error."); - } - - if (!parsedIndex) { - throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key - + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); - } - - Object value = lowercaseParams.get(paramName); - if (value == null) { - // for now, assume object array with sub fields - mapArray = new HashMap(); - mapValue = new HashMap(); - mapArray.put(Integer.valueOf(index), mapValue); - } else if (value instanceof Map) { - mapArray = (HashMap) value; - mapValue = mapArray.get(Integer.valueOf(index)); - if (mapValue == null) { - mapValue = new HashMap(); - mapArray.put(Integer.valueOf(index), mapValue); - } - } - - // we are ready to store the value for a particular field into the map for this object - mapValue.put(fieldName, params.get(key)); - - lowercaseParams.put(paramName, mapArray); - } else { - lowercaseParams.put(key.toLowerCase(), params.get(key)); - } - } - return lowercaseParams; - } - - public String buildResponse(ServerApiException apiException, String responseType) { - StringBuffer sb = new StringBuffer(); - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - // JSON response - sb.append("{ \"" + getCommandName() + "\" : { " + "\"@attributes\":{\"cloud-stack-version\":\"" + _mgr.getVersion() + "\"},"); - sb.append("\"errorcode\" : \"" + apiException.getErrorCode() + "\", \"description\" : \"" + apiException.getDescription() + "\" } }"); - } else { - sb.append(""); - sb.append("<" + getCommandName() + ">"); - sb.append("" + apiException.getErrorCode() + ""); - sb.append("" + escapeXml(apiException.getDescription()) + ""); - sb.append(""); - } - return sb.toString(); - } - - public String buildResponse(List> tagList, String responseType) { - StringBuffer prefixSb = new StringBuffer(); - StringBuffer suffixSb = new StringBuffer(); - - // set up the return value with the name of the response - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - prefixSb.append("{ \"" + getCommandName() + "\" : { \"@attributes\":{\"cloud-stack-version\":\"" + _mgr.getVersion() + "\"},"); - } else { - prefixSb.append(""); - prefixSb.append("<" + getCommandName() + " cloud-stack-version=\"" + _mgr.getVersion() + "\">"); - } - - int i = 0; - for (Pair tagData : tagList) { - String tagName = tagData.first(); - Object tagValue = tagData.second(); - if (tagValue instanceof Object[]) { - Object[] subObjects = (Object[]) tagValue; - if (subObjects.length < 1) { - continue; - } - writeObjectArray(responseType, suffixSb, i++, tagName, subObjects); - } else { - writeNameValuePair(suffixSb, tagName, tagValue, responseType, i++); - } - } - - if (suffixSb.length() > 0) { - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { // append comma only if we have some suffix else -// not as per strict Json syntax. - prefixSb.append(","); - } - prefixSb.append(suffixSb); - } - // close the response - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - prefixSb.append("} }"); - } else { - prefixSb.append(""); - } - return prefixSb.toString(); - } - - private void writeNameValuePair(StringBuffer sb, String tagName, Object tagValue, String responseType, int propertyCount) { - if (tagValue == null) { - return; - } - - if (tagValue instanceof Object[]) { - Object[] subObjects = (Object[]) tagValue; - if (subObjects.length < 1) { - return; - } - writeObjectArray(responseType, sb, propertyCount, tagName, subObjects); - } else { - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - String seperator = ((propertyCount > 0) ? ", " : ""); - sb.append(seperator + "\"" + tagName + "\" : \"" + escapeJSON(tagValue.toString()) + "\""); - } else { - sb.append("<" + tagName + ">" + escapeXml(tagValue.toString()) + ""); - } - } - } - - @SuppressWarnings("rawtypes") - private void writeObjectArray(String responseType, StringBuffer sb, int propertyCount, String tagName, Object[] subObjects) { - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - String separator = ((propertyCount > 0) ? ", " : ""); - sb.append(separator); - } - int j = 0; - for (Object subObject : subObjects) { - if (subObject instanceof List) { - List subObjList = (List) subObject; - writeSubObject(sb, tagName, subObjList, responseType, j++); - } - } - - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - sb.append("]"); - } - } - - @SuppressWarnings("rawtypes") - private void writeSubObject(StringBuffer sb, String tagName, List tagList, String responseType, int objectCount) { - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - sb.append(((objectCount == 0) ? "\"" + tagName + "\" : [ { " : ", { ")); - } else { - sb.append("<" + tagName + ">"); - } - - int i = 0; - for (Object tag : tagList) { - if (tag instanceof Pair) { - Pair nameValuePair = (Pair) tag; - writeNameValuePair(sb, (String) nameValuePair.first(), nameValuePair.second(), responseType, i++); - } - } - - if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - sb.append("}"); - } else { - sb.append(""); - } - } - - /** - * Escape xml response set to false by default. API commands to override this method to allow escaping - */ - public boolean requireXmlEscape() { - return true; - } - - private String escapeXml(String xml) { - if (!requireXmlEscape()) { - return xml; - } - int iLen = xml.length(); - if (iLen == 0) { - return xml; - } - StringBuffer sOUT = new StringBuffer(iLen + 256); - int i = 0; - for (; i < iLen; i++) { - char c = xml.charAt(i); - if (c == '<') { - sOUT.append("<"); - } else if (c == '>') { - sOUT.append(">"); - } else if (c == '&') { - sOUT.append("&"); - } else if (c == '"') { - sOUT.append("""); - } else if (c == '\'') { - sOUT.append("'"); - } else { - sOUT.append(c); - } - } - return sOUT.toString(); - } - - private static String escapeJSON(String str) { - if (str == null) { - return str; - } - - return str.replace("\"", "\\\""); - } - - protected long getInstanceIdFromJobSuccessResult(String result) { - s_logger.debug("getInstanceIdFromJobSuccessResult not overridden in subclass " + this.getClass().getName()); - return 0; - } - - public static boolean isAdmin(short accountType) { - return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) || - (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); - } - - public static boolean isRootAdmin(short accountType) { - return ((accountType == Account.ACCOUNT_TYPE_ADMIN)); - } - - public void setFullUrlParams(Map map) { - this.fullUrlParams = map; - } - - public Map getFullUrlParams() { - return this.fullUrlParams; - } - - public Long finalyzeAccountId(String accountName, Long domainId, Long projectId, boolean enabledOnly) { - if (accountName != null) { - if (domainId == null) { - throw new InvalidParameterValueException("Account must be specified with domainId parameter", null); - } - - Domain domain = _domainService.getDomain(domainId); - if (domain == null) { - throw new InvalidParameterValueException("Unable to find domain by id", null); - } - - Account account = _accountService.getActiveAccountByName(accountName, domainId); - if (account != null && account.getType() != Account.ACCOUNT_TYPE_PROJECT) { - if (!enabledOnly || account.getState() == Account.State.enabled) { - return account.getId(); - } else { - throw new PermissionDeniedException("Can't add resources to the account id=" + account.getId() + " in state=" + account.getState() + " as it's no longer active"); - } - } else { - List idList = new ArrayList(); - idList.add(new IdentityProxy("domain", domainId, "domainId")); - throw new InvalidParameterValueException("Unable to find account by name " + accountName + " in domain with specified id", idList); - } - } - - if (projectId != null) { - Project project = _projectService.getProject(projectId); - if (project != null) { - if (!enabledOnly || project.getState() == Project.State.Active) { - return project.getProjectAccountId(); - } else { - PermissionDeniedException ex = new PermissionDeniedException("Can't add resources to the project with specified projectId in state=" + project.getState() + " as it's no longer active"); - ex.addProxyObject(project, projectId, "projectId"); - throw ex; - } - } else { - throw new InvalidParameterValueException("Unable to find project by id", null); - } - } - return null; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.consoleproxy.ConsoleProxyService; +import com.cloud.dao.EntityManager; +import com.cloud.domain.Domain; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.NetworkService; +import com.cloud.network.StorageNetworkService; +import com.cloud.network.VirtualNetworkApplianceService; +import com.cloud.network.as.AutoScaleService; +import com.cloud.network.firewall.FirewallService; +import com.cloud.network.firewall.NetworkACLService; +import com.cloud.network.lb.LoadBalancingRulesService; +import com.cloud.network.rules.RulesService; +import com.cloud.network.security.SecurityGroupService; +import com.cloud.network.vpc.VpcService; +import com.cloud.network.vpn.RemoteAccessVpnService; +import com.cloud.network.vpn.Site2SiteVpnService; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectService; +import com.cloud.resource.ResourceService; +import com.cloud.server.ManagementService; +import com.cloud.server.TaggedResourceService; +import com.cloud.storage.StorageService; +import com.cloud.storage.snapshot.SnapshotService; +import com.cloud.template.TemplateService; +import com.cloud.user.Account; +import com.cloud.user.AccountService; +import com.cloud.user.DomainService; +import com.cloud.user.ResourceLimitService; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Pair; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.vm.BareMetalVmService; +import com.cloud.vm.UserVmService; + +public abstract class BaseCmd { + private static final Logger s_logger = Logger.getLogger(BaseCmd.class.getName()); + + public static final String USER_ERROR_MESSAGE = "Internal error executing command, please contact your system administrator"; + public static final int PROGRESS_INSTANCE_CREATED = 1; + + public static final String RESPONSE_TYPE_XML = "xml"; + public static final String RESPONSE_TYPE_JSON = "json"; + + public enum CommandType { + BOOLEAN, DATE, FLOAT, INTEGER, SHORT, LIST, LONG, OBJECT, MAP, STRING, TZDATE + } + + // FIXME: Extract these out into a separate file + // Client error codes + public static final int MALFORMED_PARAMETER_ERROR = 430; + public static final int PARAM_ERROR = 431; + public static final int UNSUPPORTED_ACTION_ERROR = 432; + public static final int PAGE_LIMIT_EXCEED = 433; + + // Server error codes + public static final int INTERNAL_ERROR = 530; + public static final int ACCOUNT_ERROR = 531; + public static final int ACCOUNT_RESOURCE_LIMIT_ERROR = 532; + public static final int INSUFFICIENT_CAPACITY_ERROR = 533; + public static final int RESOURCE_UNAVAILABLE_ERROR = 534; + public static final int RESOURCE_ALLOCATION_ERROR = 534; + public static final int RESOURCE_IN_USE_ERROR = 536; + public static final int NETWORK_RULE_CONFLICT_ERROR = 537; + + public static final DateFormat INPUT_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); + public static final DateFormat NEW_INPUT_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static Pattern newInputDateFormat = Pattern.compile("[\\d]+-[\\d]+-[\\d]+ [\\d]+:[\\d]+:[\\d]+"); + private static final DateFormat _outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + + private Object _responseObject = null; + private Map fullUrlParams; + + @Parameter(name = "response", type = CommandType.STRING) + private String responseType; + + public static ComponentLocator s_locator; + public static ConfigurationService _configService; + public static AccountService _accountService; + public static UserVmService _userVmService; + public static ManagementService _mgr; + public static StorageService _storageService; + public static ResourceService _resourceService; + public static NetworkService _networkService; + public static TemplateService _templateService; + public static SecurityGroupService _securityGroupService; + public static SnapshotService _snapshotService; + public static ConsoleProxyService _consoleProxyService; + public static VirtualNetworkApplianceService _routerService; + public static ResponseGenerator _responseGenerator; + public static EntityManager _entityMgr; + public static RulesService _rulesService; + public static LoadBalancingRulesService _lbService; + public static AutoScaleService _autoScaleService; + public static RemoteAccessVpnService _ravService; + public static BareMetalVmService _bareMetalVmService; + public static ProjectService _projectService; + public static FirewallService _firewallService; + public static DomainService _domainService; + public static ResourceLimitService _resourceLimitService; + public static IdentityService _identityService; + public static StorageNetworkService _storageNetworkService; + public static TaggedResourceService _taggedResourceService; + public static VpcService _vpcService; + public static NetworkACLService _networkACLService; + public static Site2SiteVpnService _s2sVpnService; + + static void setComponents(ResponseGenerator generator) { + ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name); + _mgr = (ManagementService) ComponentLocator.getComponent(ManagementService.Name); + _accountService = locator.getManager(AccountService.class); + _configService = locator.getManager(ConfigurationService.class); + _userVmService = locator.getManager(UserVmService.class); + _storageService = locator.getManager(StorageService.class); + _resourceService = locator.getManager(ResourceService.class); + _networkService = locator.getManager(NetworkService.class); + _templateService = locator.getManager(TemplateService.class); + _securityGroupService = locator.getManager(SecurityGroupService.class); + _snapshotService = locator.getManager(SnapshotService.class); + _consoleProxyService = locator.getManager(ConsoleProxyService.class); + _routerService = locator.getManager(VirtualNetworkApplianceService.class); + _entityMgr = locator.getManager(EntityManager.class); + _rulesService = locator.getManager(RulesService.class); + _lbService = locator.getManager(LoadBalancingRulesService.class); + _autoScaleService = locator.getManager(AutoScaleService.class); + _ravService = locator.getManager(RemoteAccessVpnService.class); + _responseGenerator = generator; + _bareMetalVmService = locator.getManager(BareMetalVmService.class); + _projectService = locator.getManager(ProjectService.class); + _firewallService = locator.getManager(FirewallService.class); + _domainService = locator.getManager(DomainService.class); + _resourceLimitService = locator.getManager(ResourceLimitService.class); + _identityService = locator.getManager(IdentityService.class); + _storageNetworkService = locator.getManager(StorageNetworkService.class); + _taggedResourceService = locator.getManager(TaggedResourceService.class); + _vpcService = locator.getManager(VpcService.class); + _networkACLService = locator.getManager(NetworkACLService.class); + _s2sVpnService = locator.getManager(Site2SiteVpnService.class); + } + + public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; + + public String getResponseType() { + if (responseType == null) { + return RESPONSE_TYPE_XML; + } + return responseType; + } + + public void setResponseType(String responseType) { + this.responseType = responseType; + } + + public abstract String getCommandName(); + + /** + * For commands the API framework needs to know the owner of the object being acted upon. This method is + * used to determine that information. + * + * @return the id of the account that owns the object being acted upon + */ + public abstract long getEntityOwnerId(); + + public Object getResponseObject() { + return _responseObject; + } + + public void setResponseObject(Object responseObject) { + _responseObject = responseObject; + } + + public ManagementService getMgmtServiceRef() { + return _mgr; + } + + public static String getDateString(Date date) { + if (date == null) { + return ""; + } + String formattedString = null; + synchronized (_outputFormat) { + formattedString = _outputFormat.format(date); + } + return formattedString; + } + + // FIXME: move this to a utils method so that maps can be unpacked and integer/long values can be appropriately cast + @SuppressWarnings({ "unchecked", "rawtypes" }) + public Map unpackParams(Map params) { + Map lowercaseParams = new HashMap(); + for (String key : params.keySet()) { + int arrayStartIndex = key.indexOf('['); + int arrayStartLastIndex = key.lastIndexOf('['); + if (arrayStartIndex != arrayStartLastIndex) { + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } + + if (arrayStartIndex > 0) { + int arrayEndIndex = key.indexOf(']'); + int arrayEndLastIndex = key.lastIndexOf(']'); + if ((arrayEndIndex < arrayStartIndex) || (arrayEndIndex != arrayEndLastIndex)) { + // malformed parameter + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } + + // Now that we have an array object, check for a field name in the case of a complex object + int fieldIndex = key.indexOf('.'); + String fieldName = null; + if (fieldIndex < arrayEndIndex) { + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } else { + fieldName = key.substring(fieldIndex + 1); + } + + // parse the parameter name as the text before the first '[' character + String paramName = key.substring(0, arrayStartIndex); + paramName = paramName.toLowerCase(); + + Map mapArray = null; + Map mapValue = null; + String indexStr = key.substring(arrayStartIndex + 1, arrayEndIndex); + int index = 0; + boolean parsedIndex = false; + try { + if (indexStr != null) { + index = Integer.parseInt(indexStr); + parsedIndex = true; + } + } catch (NumberFormatException nfe) { + s_logger.warn("Invalid parameter " + key + " received, unable to parse object array, returning an error."); + } + + if (!parsedIndex) { + throw new ServerApiException(MALFORMED_PARAMETER_ERROR, "Unable to decode parameter " + key + + "; if specifying an object array, please use parameter[index].field=XXX, e.g. userGroupList[0].group=httpGroup"); + } + + Object value = lowercaseParams.get(paramName); + if (value == null) { + // for now, assume object array with sub fields + mapArray = new HashMap(); + mapValue = new HashMap(); + mapArray.put(Integer.valueOf(index), mapValue); + } else if (value instanceof Map) { + mapArray = (HashMap) value; + mapValue = mapArray.get(Integer.valueOf(index)); + if (mapValue == null) { + mapValue = new HashMap(); + mapArray.put(Integer.valueOf(index), mapValue); + } + } + + // we are ready to store the value for a particular field into the map for this object + mapValue.put(fieldName, params.get(key)); + + lowercaseParams.put(paramName, mapArray); + } else { + lowercaseParams.put(key.toLowerCase(), params.get(key)); + } + } + return lowercaseParams; + } + + public String buildResponse(ServerApiException apiException, String responseType) { + StringBuffer sb = new StringBuffer(); + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + // JSON response + sb.append("{ \"" + getCommandName() + "\" : { " + "\"@attributes\":{\"cloud-stack-version\":\"" + _mgr.getVersion() + "\"},"); + sb.append("\"errorcode\" : \"" + apiException.getErrorCode() + "\", \"description\" : \"" + apiException.getDescription() + "\" } }"); + } else { + sb.append(""); + sb.append("<" + getCommandName() + ">"); + sb.append("" + apiException.getErrorCode() + ""); + sb.append("" + escapeXml(apiException.getDescription()) + ""); + sb.append(""); + } + return sb.toString(); + } + + public String buildResponse(List> tagList, String responseType) { + StringBuffer prefixSb = new StringBuffer(); + StringBuffer suffixSb = new StringBuffer(); + + // set up the return value with the name of the response + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + prefixSb.append("{ \"" + getCommandName() + "\" : { \"@attributes\":{\"cloud-stack-version\":\"" + _mgr.getVersion() + "\"},"); + } else { + prefixSb.append(""); + prefixSb.append("<" + getCommandName() + " cloud-stack-version=\"" + _mgr.getVersion() + "\">"); + } + + int i = 0; + for (Pair tagData : tagList) { + String tagName = tagData.first(); + Object tagValue = tagData.second(); + if (tagValue instanceof Object[]) { + Object[] subObjects = (Object[]) tagValue; + if (subObjects.length < 1) { + continue; + } + writeObjectArray(responseType, suffixSb, i++, tagName, subObjects); + } else { + writeNameValuePair(suffixSb, tagName, tagValue, responseType, i++); + } + } + + if (suffixSb.length() > 0) { + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { // append comma only if we have some suffix else +// not as per strict Json syntax. + prefixSb.append(","); + } + prefixSb.append(suffixSb); + } + // close the response + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + prefixSb.append("} }"); + } else { + prefixSb.append(""); + } + return prefixSb.toString(); + } + + private void writeNameValuePair(StringBuffer sb, String tagName, Object tagValue, String responseType, int propertyCount) { + if (tagValue == null) { + return; + } + + if (tagValue instanceof Object[]) { + Object[] subObjects = (Object[]) tagValue; + if (subObjects.length < 1) { + return; + } + writeObjectArray(responseType, sb, propertyCount, tagName, subObjects); + } else { + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + String seperator = ((propertyCount > 0) ? ", " : ""); + sb.append(seperator + "\"" + tagName + "\" : \"" + escapeJSON(tagValue.toString()) + "\""); + } else { + sb.append("<" + tagName + ">" + escapeXml(tagValue.toString()) + ""); + } + } + } + + @SuppressWarnings("rawtypes") + private void writeObjectArray(String responseType, StringBuffer sb, int propertyCount, String tagName, Object[] subObjects) { + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + String separator = ((propertyCount > 0) ? ", " : ""); + sb.append(separator); + } + int j = 0; + for (Object subObject : subObjects) { + if (subObject instanceof List) { + List subObjList = (List) subObject; + writeSubObject(sb, tagName, subObjList, responseType, j++); + } + } + + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + sb.append("]"); + } + } + + @SuppressWarnings("rawtypes") + private void writeSubObject(StringBuffer sb, String tagName, List tagList, String responseType, int objectCount) { + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + sb.append(((objectCount == 0) ? "\"" + tagName + "\" : [ { " : ", { ")); + } else { + sb.append("<" + tagName + ">"); + } + + int i = 0; + for (Object tag : tagList) { + if (tag instanceof Pair) { + Pair nameValuePair = (Pair) tag; + writeNameValuePair(sb, (String) nameValuePair.first(), nameValuePair.second(), responseType, i++); + } + } + + if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + sb.append("}"); + } else { + sb.append(""); + } + } + + /** + * Escape xml response set to false by default. API commands to override this method to allow escaping + */ + public boolean requireXmlEscape() { + return true; + } + + private String escapeXml(String xml) { + if (!requireXmlEscape()) { + return xml; + } + int iLen = xml.length(); + if (iLen == 0) { + return xml; + } + StringBuffer sOUT = new StringBuffer(iLen + 256); + int i = 0; + for (; i < iLen; i++) { + char c = xml.charAt(i); + if (c == '<') { + sOUT.append("<"); + } else if (c == '>') { + sOUT.append(">"); + } else if (c == '&') { + sOUT.append("&"); + } else if (c == '"') { + sOUT.append("""); + } else if (c == '\'') { + sOUT.append("'"); + } else { + sOUT.append(c); + } + } + return sOUT.toString(); + } + + private static String escapeJSON(String str) { + if (str == null) { + return str; + } + + return str.replace("\"", "\\\""); + } + + protected long getInstanceIdFromJobSuccessResult(String result) { + s_logger.debug("getInstanceIdFromJobSuccessResult not overridden in subclass " + this.getClass().getName()); + return 0; + } + + public static boolean isAdmin(short accountType) { + return ((accountType == Account.ACCOUNT_TYPE_ADMIN) || + (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) || + (accountType == Account.ACCOUNT_TYPE_DOMAIN_ADMIN) || (accountType == Account.ACCOUNT_TYPE_READ_ONLY_ADMIN)); + } + + public static boolean isRootAdmin(short accountType) { + return ((accountType == Account.ACCOUNT_TYPE_ADMIN)); + } + + public void setFullUrlParams(Map map) { + this.fullUrlParams = map; + } + + public Map getFullUrlParams() { + return this.fullUrlParams; + } + + public Long finalyzeAccountId(String accountName, Long domainId, Long projectId, boolean enabledOnly) { + if (accountName != null) { + if (domainId == null) { + throw new InvalidParameterValueException("Account must be specified with domainId parameter", null); + } + + Domain domain = _domainService.getDomain(domainId); + if (domain == null) { + throw new InvalidParameterValueException("Unable to find domain by id", null); + } + + Account account = _accountService.getActiveAccountByName(accountName, domainId); + if (account != null && account.getType() != Account.ACCOUNT_TYPE_PROJECT) { + if (!enabledOnly || account.getState() == Account.State.enabled) { + return account.getId(); + } else { + throw new PermissionDeniedException("Can't add resources to the account id=" + account.getId() + " in state=" + account.getState() + " as it's no longer active"); + } + } else { + List idList = new ArrayList(); + idList.add(new IdentityProxy("domain", domainId, "domainId")); + throw new InvalidParameterValueException("Unable to find account by name " + accountName + " in domain with specified id", idList); + } + } + + if (projectId != null) { + Project project = _projectService.getProject(projectId); + if (project != null) { + if (!enabledOnly || project.getState() == Project.State.Active) { + return project.getProjectAccountId(); + } else { + PermissionDeniedException ex = new PermissionDeniedException("Can't add resources to the project with specified projectId in state=" + project.getState() + " as it's no longer active"); + ex.addProxyObject(project, projectId, "projectId"); + throw ex; + } + } else { + throw new InvalidParameterValueException("Unable to find project by id", null); + } + } + return null; + } +} diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index ce1245b3947..d65d155433e 100755 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -1,339 +1,360 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.api; - -import java.text.DecimalFormat; -import java.util.EnumSet; -import java.util.List; - -import com.cloud.api.ApiConstants.HostDetails; -import com.cloud.api.ApiConstants.VMDetails; -import com.cloud.api.commands.QueryAsyncJobResultCmd; -import com.cloud.api.response.AccountResponse; -import com.cloud.api.response.AsyncJobResponse; -import com.cloud.api.response.CapacityResponse; -import com.cloud.api.response.ClusterResponse; -import com.cloud.api.response.ConfigurationResponse; -import com.cloud.api.response.CreateCmdResponse; -import com.cloud.api.response.DiskOfferingResponse; -import com.cloud.api.response.DomainResponse; -import com.cloud.api.response.DomainRouterResponse; -import com.cloud.api.response.EventResponse; -import com.cloud.api.response.ExtractResponse; -import com.cloud.api.response.FirewallResponse; -import com.cloud.api.response.FirewallRuleResponse; -import com.cloud.api.response.HostResponse; -import com.cloud.api.response.HypervisorCapabilitiesResponse; -import com.cloud.api.response.IPAddressResponse; -import com.cloud.api.response.InstanceGroupResponse; -import com.cloud.api.response.IpForwardingRuleResponse; -import com.cloud.api.response.LBStickinessResponse; -import com.cloud.api.response.LDAPConfigResponse; -import com.cloud.api.response.ListResponse; -import com.cloud.api.response.LoadBalancerResponse; -import com.cloud.api.response.NetworkACLResponse; -import com.cloud.api.response.NetworkOfferingResponse; -import com.cloud.api.response.NetworkResponse; -import com.cloud.api.response.PhysicalNetworkResponse; -import com.cloud.api.response.PodResponse; -import com.cloud.api.response.PrivateGatewayResponse; -import com.cloud.api.response.ProjectAccountResponse; -import com.cloud.api.response.ProjectInvitationResponse; -import com.cloud.api.response.ProjectResponse; -import com.cloud.api.response.ProviderResponse; -import com.cloud.api.response.RemoteAccessVpnResponse; -import com.cloud.api.response.ResourceCountResponse; -import com.cloud.api.response.ResourceLimitResponse; -import com.cloud.api.response.ResourceTagResponse; -import com.cloud.api.response.SecurityGroupResponse; -import com.cloud.api.response.ServiceOfferingResponse; -import com.cloud.api.response.ServiceResponse; -import com.cloud.api.response.Site2SiteCustomerGatewayResponse; -import com.cloud.api.response.Site2SiteVpnConnectionResponse; -import com.cloud.api.response.Site2SiteVpnGatewayResponse; -import com.cloud.api.response.SnapshotPolicyResponse; -import com.cloud.api.response.SnapshotResponse; -import com.cloud.api.response.StaticRouteResponse; -import com.cloud.api.response.StorageNetworkIpRangeResponse; -import com.cloud.api.response.StoragePoolResponse; -import com.cloud.api.response.SwiftResponse; -import com.cloud.api.response.SystemVmInstanceResponse; -import com.cloud.api.response.SystemVmResponse; -import com.cloud.api.response.TemplatePermissionsResponse; -import com.cloud.api.response.TemplateResponse; -import com.cloud.api.response.TrafficTypeResponse; -import com.cloud.api.response.UserResponse; -import com.cloud.api.response.UserVmResponse; -import com.cloud.api.response.VirtualRouterProviderResponse; -import com.cloud.api.response.VlanIpRangeResponse; -import com.cloud.api.response.VolumeResponse; -import com.cloud.api.response.VpcOfferingResponse; -import com.cloud.api.response.VpcResponse; -import com.cloud.api.response.VpnUsersResponse; -import com.cloud.api.response.ZoneResponse; -import com.cloud.async.AsyncJob; -import com.cloud.capacity.Capacity; -import com.cloud.configuration.Configuration; -import com.cloud.configuration.ResourceCount; -import com.cloud.configuration.ResourceLimit; -import com.cloud.dc.DataCenter; -import com.cloud.dc.Pod; -import com.cloud.dc.StorageNetworkIpRange; -import com.cloud.dc.Vlan; -import com.cloud.domain.Domain; -import com.cloud.event.Event; -import com.cloud.host.Host; -import com.cloud.hypervisor.HypervisorCapabilities; -import com.cloud.network.IpAddress; -import com.cloud.network.Network; -import com.cloud.network.Network.Service; -import com.cloud.network.PhysicalNetwork; -import com.cloud.network.PhysicalNetworkServiceProvider; -import com.cloud.network.PhysicalNetworkTrafficType; -import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.Site2SiteCustomerGateway; -import com.cloud.network.Site2SiteVpnConnection; -import com.cloud.network.Site2SiteVpnGateway; -import com.cloud.network.VirtualRouterProvider; -import com.cloud.network.VpnUser; -import com.cloud.network.router.VirtualRouter; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.LoadBalancer; -import com.cloud.network.rules.PortForwardingRule; -import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.StickinessPolicy; -import com.cloud.network.security.SecurityGroup; -import com.cloud.network.security.SecurityGroupRules; -import com.cloud.network.security.SecurityRule; -import com.cloud.network.vpc.PrivateGateway; -import com.cloud.network.vpc.StaticRoute; -import com.cloud.network.vpc.Vpc; -import com.cloud.network.vpc.VpcOffering; -import com.cloud.offering.DiskOffering; -import com.cloud.offering.NetworkOffering; -import com.cloud.offering.ServiceOffering; -import com.cloud.org.Cluster; -import com.cloud.projects.Project; -import com.cloud.projects.ProjectAccount; -import com.cloud.projects.ProjectInvitation; -import com.cloud.server.ResourceTag; -import com.cloud.storage.Snapshot; -import com.cloud.storage.StoragePool; -import com.cloud.storage.Swift; -import com.cloud.storage.Volume; -import com.cloud.storage.snapshot.SnapshotPolicy; -import com.cloud.template.VirtualMachineTemplate; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.user.UserAccount; -import com.cloud.uservm.UserVm; -import com.cloud.vm.InstanceGroup; -import com.cloud.vm.VirtualMachine; - -public interface ResponseGenerator { - UserResponse createUserResponse(UserAccount user); - - AccountResponse createAccountResponse(Account account); - - DomainResponse createDomainResponse(Domain domain); - - DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering); - - ResourceLimitResponse createResourceLimitResponse(ResourceLimit limit); - - ResourceCountResponse createResourceCountResponse(ResourceCount resourceCount); - - ServiceOfferingResponse createServiceOfferingResponse(ServiceOffering offering); - - ConfigurationResponse createConfigurationResponse(Configuration cfg); - - SnapshotResponse createSnapshotResponse(Snapshot snapshot); - - SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy); - - List createUserVmResponse(String objectName, UserVm... userVms); - - List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms); - - SystemVmResponse createSystemVmResponse(VirtualMachine systemVM); - - DomainRouterResponse createDomainRouterResponse(VirtualRouter router); - - HostResponse createHostResponse(Host host, EnumSet details); - - HostResponse createHostResponse(Host host); - - VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan); - - IPAddressResponse createIPAddressResponse(IpAddress ipAddress); - - LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer); - - LBStickinessResponse createLBStickinessPolicyResponse(List stickinessPolicies, LoadBalancer lb); - - LBStickinessResponse createLBStickinessPolicyResponse(StickinessPolicy stickinessPolicy, LoadBalancer lb); - - PodResponse createPodResponse(Pod pod, Boolean showCapacities); - - ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities); - - VolumeResponse createVolumeResponse(Volume volume); - - InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group); - - StoragePoolResponse createStoragePoolResponse(StoragePool pool); - - ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities); - - FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule); - - IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule); - - User findUserById(Long userId); - - UserVm findUserVmById(Long vmId); - - Volume findVolumeById(Long volumeId); - - Account findAccountByNameDomain(String accountName, Long domainId); - - VirtualMachineTemplate findTemplateById(Long templateId); - - Host findHostById(Long hostId); - - List createTemplateResponses(long templateId, long zoneId, boolean readyOnly); - - VpnUsersResponse createVpnUserResponse(VpnUser user); - - RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn); - - List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly); - - List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly); - - ListResponse createSecurityGroupResponses(List networkGroups); - - SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List SecurityRules); - - SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group); - - ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode); - - String toSerializedString(CreateCmdResponse response, String responseType); - - AsyncJobResponse createAsyncJobResponse(AsyncJob job); - - EventResponse createEventResponse(Event event); - - TemplateResponse createIsoResponse(VirtualMachineTemplate result); - - List createCapacityResponse(List result, DecimalFormat format); - - TemplatePermissionsResponse createTemplatePermissionsResponse(List accountNames, Long id, boolean isAdmin); - - AsyncJobResponse queryJobResult(QueryAsyncJobResultCmd cmd); - - NetworkOfferingResponse createNetworkOfferingResponse(NetworkOffering offering); - - NetworkResponse createNetworkResponse(Network network); - - UserResponse createUserResponse(User user); - - AccountResponse createUserAccountResponse(UserAccount user); - - Long getSecurityGroupId(String groupName, long accountId); - - List createIsoResponses(long isoId, Long zoneId, boolean readyOnly); - - ProjectResponse createProjectResponse(Project project); - - List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly); - - List createTemplateResponses(long templateId, Long vmId); - - FirewallResponse createFirewallResponse(FirewallRule fwRule); - - HypervisorCapabilitiesResponse createHypervisorCapabilitiesResponse(HypervisorCapabilities hpvCapabilities); - - ProjectAccountResponse createProjectAccountResponse(ProjectAccount projectAccount); - - ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite); - - SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine systemVM); - - SwiftResponse createSwiftResponse(Swift swift); - - PhysicalNetworkResponse createPhysicalNetworkResponse(PhysicalNetwork result); - - ServiceResponse createNetworkServiceResponse(Service service); - - ProviderResponse createNetworkServiceProviderResponse(PhysicalNetworkServiceProvider result); - - TrafficTypeResponse createTrafficTypeResponse(PhysicalNetworkTrafficType result); - - VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result); - - LDAPConfigResponse createLDAPConfigResponse(String hostname, Integer port, Boolean useSSL, String queryFilter, String baseSearch, String dn); - - StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result); - - /** - * @param tableName TODO - * @param token - * @return - */ - Long getIdentiyId(String tableName, String token); - - /** - * @param resourceTag - * @param keyValueOnly TODO - * @return - */ - ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly); - - Site2SiteVpnGatewayResponse createSite2SiteVpnGatewayResponse(Site2SiteVpnGateway result); - - /** - * @param offering - * @return - */ - VpcOfferingResponse createVpcOfferingResponse(VpcOffering offering); - - /** - * @param vpc - * @return - */ - VpcResponse createVpcResponse(Vpc vpc); - - /** - * @param networkACL - * @return - */ - NetworkACLResponse createNetworkACLResponse(FirewallRule networkACL); - - /** - * @param result - * @return - */ - PrivateGatewayResponse createPrivateGatewayResponse(PrivateGateway result); - - /** - * @param result - * @return - */ - StaticRouteResponse createStaticRouteResponse(StaticRoute result); - - Site2SiteCustomerGatewayResponse createSite2SiteCustomerGatewayResponse(Site2SiteCustomerGateway result); - - Site2SiteVpnConnectionResponse createSite2SiteVpnConnectionResponse(Site2SiteVpnConnection result); -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api; + +import java.text.DecimalFormat; +import java.util.EnumSet; +import java.util.List; + +import com.cloud.api.ApiConstants.HostDetails; +import com.cloud.api.ApiConstants.VMDetails; +import com.cloud.api.commands.QueryAsyncJobResultCmd; +import com.cloud.api.response.AccountResponse; +import com.cloud.api.response.AsyncJobResponse; +import com.cloud.api.response.AutoScalePolicyResponse; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.api.response.CapacityResponse; +import com.cloud.api.response.ClusterResponse; +import com.cloud.api.response.ConditionResponse; +import com.cloud.api.response.ConfigurationResponse; +import com.cloud.api.response.CounterResponse; +import com.cloud.api.response.CreateCmdResponse; +import com.cloud.api.response.DiskOfferingResponse; +import com.cloud.api.response.DomainResponse; +import com.cloud.api.response.DomainRouterResponse; +import com.cloud.api.response.EventResponse; +import com.cloud.api.response.ExtractResponse; +import com.cloud.api.response.FirewallResponse; +import com.cloud.api.response.FirewallRuleResponse; +import com.cloud.api.response.HostResponse; +import com.cloud.api.response.HypervisorCapabilitiesResponse; +import com.cloud.api.response.IPAddressResponse; +import com.cloud.api.response.InstanceGroupResponse; +import com.cloud.api.response.IpForwardingRuleResponse; +import com.cloud.api.response.LBStickinessResponse; +import com.cloud.api.response.AutoScaleVmProfileResponse; +import com.cloud.api.response.LDAPConfigResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.LoadBalancerResponse; +import com.cloud.api.response.NetworkACLResponse; +import com.cloud.api.response.NetworkOfferingResponse; +import com.cloud.api.response.NetworkResponse; +import com.cloud.api.response.PhysicalNetworkResponse; +import com.cloud.api.response.PodResponse; +import com.cloud.api.response.PrivateGatewayResponse; +import com.cloud.api.response.ProjectAccountResponse; +import com.cloud.api.response.ProjectInvitationResponse; +import com.cloud.api.response.ProjectResponse; +import com.cloud.api.response.ProviderResponse; +import com.cloud.api.response.RemoteAccessVpnResponse; +import com.cloud.api.response.ResourceCountResponse; +import com.cloud.api.response.ResourceLimitResponse; +import com.cloud.api.response.ResourceTagResponse; +import com.cloud.api.response.SecurityGroupResponse; +import com.cloud.api.response.ServiceOfferingResponse; +import com.cloud.api.response.ServiceResponse; +import com.cloud.api.response.Site2SiteCustomerGatewayResponse; +import com.cloud.api.response.Site2SiteVpnConnectionResponse; +import com.cloud.api.response.Site2SiteVpnGatewayResponse; +import com.cloud.api.response.SnapshotPolicyResponse; +import com.cloud.api.response.SnapshotResponse; +import com.cloud.api.response.StaticRouteResponse; +import com.cloud.api.response.StorageNetworkIpRangeResponse; +import com.cloud.api.response.StoragePoolResponse; +import com.cloud.api.response.SwiftResponse; +import com.cloud.api.response.SystemVmInstanceResponse; +import com.cloud.api.response.SystemVmResponse; +import com.cloud.api.response.TemplatePermissionsResponse; +import com.cloud.api.response.TemplateResponse; +import com.cloud.api.response.TrafficTypeResponse; +import com.cloud.api.response.UserResponse; +import com.cloud.api.response.UserVmResponse; +import com.cloud.api.response.VirtualRouterProviderResponse; +import com.cloud.api.response.VlanIpRangeResponse; +import com.cloud.api.response.VolumeResponse; +import com.cloud.api.response.VpcOfferingResponse; +import com.cloud.api.response.VpcResponse; +import com.cloud.api.response.VpnUsersResponse; +import com.cloud.api.response.ZoneResponse; +import com.cloud.async.AsyncJob; +import com.cloud.capacity.Capacity; +import com.cloud.configuration.Configuration; +import com.cloud.configuration.ResourceCount; +import com.cloud.configuration.ResourceLimit; +import com.cloud.dc.DataCenter; +import com.cloud.dc.Pod; +import com.cloud.dc.StorageNetworkIpRange; +import com.cloud.dc.Vlan; +import com.cloud.domain.Domain; +import com.cloud.event.Event; +import com.cloud.host.Host; +import com.cloud.hypervisor.HypervisorCapabilities; +import com.cloud.network.IpAddress; +import com.cloud.network.Network; +import com.cloud.network.Network.Service; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.PhysicalNetworkTrafficType; +import com.cloud.network.RemoteAccessVpn; +import com.cloud.network.Site2SiteCustomerGateway; +import com.cloud.network.Site2SiteVpnConnection; +import com.cloud.network.Site2SiteVpnGateway; +import com.cloud.network.VirtualRouterProvider; +import com.cloud.network.VpnUser; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.Condition; +import com.cloud.network.as.Counter; +import com.cloud.network.router.VirtualRouter; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.StaticNatRule; +import com.cloud.network.rules.StickinessPolicy; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.security.SecurityGroup; +import com.cloud.network.security.SecurityGroupRules; +import com.cloud.network.security.SecurityRule; +import com.cloud.network.vpc.PrivateGateway; +import com.cloud.network.vpc.StaticRoute; +import com.cloud.network.vpc.Vpc; +import com.cloud.network.vpc.VpcOffering; +import com.cloud.offering.DiskOffering; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.ServiceOffering; +import com.cloud.org.Cluster; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectAccount; +import com.cloud.projects.ProjectInvitation; +import com.cloud.server.ResourceTag; +import com.cloud.storage.Snapshot; +import com.cloud.storage.StoragePool; +import com.cloud.storage.Swift; +import com.cloud.storage.Volume; +import com.cloud.storage.snapshot.SnapshotPolicy; +import com.cloud.template.VirtualMachineTemplate; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.user.UserAccount; +import com.cloud.uservm.UserVm; +import com.cloud.vm.InstanceGroup; +import com.cloud.vm.VirtualMachine; + +public interface ResponseGenerator { + UserResponse createUserResponse(UserAccount user); + + AccountResponse createAccountResponse(Account account); + + DomainResponse createDomainResponse(Domain domain); + + DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering); + + ResourceLimitResponse createResourceLimitResponse(ResourceLimit limit); + + ResourceCountResponse createResourceCountResponse(ResourceCount resourceCount); + + ServiceOfferingResponse createServiceOfferingResponse(ServiceOffering offering); + + ConfigurationResponse createConfigurationResponse(Configuration cfg); + + SnapshotResponse createSnapshotResponse(Snapshot snapshot); + + SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy); + + List createUserVmResponse(String objectName, UserVm... userVms); + + List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms); + + SystemVmResponse createSystemVmResponse(VirtualMachine systemVM); + + DomainRouterResponse createDomainRouterResponse(VirtualRouter router); + + HostResponse createHostResponse(Host host, EnumSet details); + + HostResponse createHostResponse(Host host); + + VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan); + + IPAddressResponse createIPAddressResponse(IpAddress ipAddress); + + LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer); + + LBStickinessResponse createLBStickinessPolicyResponse(List stickinessPolicies, LoadBalancer lb); + + LBStickinessResponse createLBStickinessPolicyResponse(StickinessPolicy stickinessPolicy, LoadBalancer lb); + + PodResponse createPodResponse(Pod pod, Boolean showCapacities); + + ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities); + + VolumeResponse createVolumeResponse(Volume volume); + + InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group); + + StoragePoolResponse createStoragePoolResponse(StoragePool pool); + + ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities); + + FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule); + + IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule); + + User findUserById(Long userId); + + UserVm findUserVmById(Long vmId); + + Volume findVolumeById(Long volumeId); + + Account findAccountByNameDomain(String accountName, Long domainId); + + VirtualMachineTemplate findTemplateById(Long templateId); + + Host findHostById(Long hostId); + + List createTemplateResponses(long templateId, long zoneId, boolean readyOnly); + + VpnUsersResponse createVpnUserResponse(VpnUser user); + + RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn); + + List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly); + + List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly); + + ListResponse createSecurityGroupResponses(List networkGroups); + + SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List SecurityRules); + + SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group); + + ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode); + + String toSerializedString(CreateCmdResponse response, String responseType); + + AsyncJobResponse createAsyncJobResponse(AsyncJob job); + + EventResponse createEventResponse(Event event); + + TemplateResponse createIsoResponse(VirtualMachineTemplate result); + + List createCapacityResponse(List result, DecimalFormat format); + + TemplatePermissionsResponse createTemplatePermissionsResponse(List accountNames, Long id, boolean isAdmin); + + AsyncJobResponse queryJobResult(QueryAsyncJobResultCmd cmd); + + NetworkOfferingResponse createNetworkOfferingResponse(NetworkOffering offering); + + NetworkResponse createNetworkResponse(Network network); + + UserResponse createUserResponse(User user); + + AccountResponse createUserAccountResponse(UserAccount user); + + Long getSecurityGroupId(String groupName, long accountId); + + List createIsoResponses(long isoId, Long zoneId, boolean readyOnly); + + ProjectResponse createProjectResponse(Project project); + + List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly); + + List createTemplateResponses(long templateId, Long vmId); + + FirewallResponse createFirewallResponse(FirewallRule fwRule); + + HypervisorCapabilitiesResponse createHypervisorCapabilitiesResponse(HypervisorCapabilities hpvCapabilities); + + ProjectAccountResponse createProjectAccountResponse(ProjectAccount projectAccount); + + ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite); + + SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine systemVM); + + SwiftResponse createSwiftResponse(Swift swift); + + PhysicalNetworkResponse createPhysicalNetworkResponse(PhysicalNetwork result); + + ServiceResponse createNetworkServiceResponse(Service service); + + ProviderResponse createNetworkServiceProviderResponse(PhysicalNetworkServiceProvider result); + + TrafficTypeResponse createTrafficTypeResponse(PhysicalNetworkTrafficType result); + + VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result); + + LDAPConfigResponse createLDAPConfigResponse(String hostname, Integer port, Boolean useSSL, String queryFilter, String baseSearch, String dn); + + StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result); + + /** + * @param tableName + * TODO + * @param token + * @return + */ + Long getIdentiyId(String tableName, String token); + + /** + * @param resourceTag + * @param keyValueOnly TODO + * @return + */ + ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly); + + Site2SiteVpnGatewayResponse createSite2SiteVpnGatewayResponse(Site2SiteVpnGateway result); + + /** + * @param offering + * @return + */ + VpcOfferingResponse createVpcOfferingResponse(VpcOffering offering); + + /** + * @param vpc + * @return + */ + VpcResponse createVpcResponse(Vpc vpc); + + /** + * @param networkACL + * @return + */ + NetworkACLResponse createNetworkACLResponse(FirewallRule networkACL); + + /** + * @param result + * @return + */ + PrivateGatewayResponse createPrivateGatewayResponse(PrivateGateway result); + + /** + * @param result + * @return + */ + StaticRouteResponse createStaticRouteResponse(StaticRoute result); + + Site2SiteCustomerGatewayResponse createSite2SiteCustomerGatewayResponse(Site2SiteCustomerGateway result); + + Site2SiteVpnConnectionResponse createSite2SiteVpnConnectionResponse(Site2SiteVpnConnection result); + + CounterResponse createCounterResponse(Counter ctr); + + ConditionResponse createConditionResponse(Condition cndn); + + AutoScalePolicyResponse createAutoScalePolicyResponse(AutoScalePolicy policy); + + AutoScaleVmProfileResponse createAutoScaleVmProfileResponse(AutoScaleVmProfile profile); + + AutoScaleVmGroupResponse createAutoScaleVmGroupResponse(AutoScaleVmGroup vmGroup); +} diff --git a/api/src/com/cloud/api/commands/CreateAutoScalePolicyCmd.java b/api/src/com/cloud/api/commands/CreateAutoScalePolicyCmd.java new file mode 100644 index 00000000000..ade3751eae2 --- /dev/null +++ b/api/src/com/cloud/api/commands/CreateAutoScalePolicyCmd.java @@ -0,0 +1,156 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +package com.cloud.api.commands; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScalePolicyResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.Condition; + +@Implementation(description = "Creates an autoscale policy for a provision or deprovision action, the action is taken when the all the conditions evaluates to true for the specified duration. The policy is in effect once it is attached to a autscale vm group.", responseObject = AutoScalePolicyResponse.class) +public class CreateAutoScalePolicyCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(CreateAutoScalePolicyCmd.class.getName()); + + private static final String s_name = "autoscalepolicyresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.DURATION, type = CommandType.INTEGER, required = true, description = "the duration for which the conditions have to be true before action is taken") + private Integer duration; + + @Parameter(name = ApiConstants.QUIETTIME, type = CommandType.INTEGER, description = "the cool down period for which the policy should not be evaluated after the action has been taken") + private Integer quietTime; + + @Parameter(name = ApiConstants.ACTION, type = CommandType.STRING, required = true, description = "the action to be executed if all the conditions evaluate to true for the specified duration.") + private String action; + + @IdentityMapper(entityTableName = "conditions") + @Parameter(name = ApiConstants.CONDITION_IDS, type = CommandType.LIST, collectionType = CommandType.LONG, required = true, description = "the list of IDs of the conditions that are being evaluated on every interval") + private List conditionIds; + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + private Long conditionDomainId; + private Long conditionAccountId; + + @Override + public String getEntityTable() { + return "autoscale_policies"; + } + + public Integer getDuration() { + return duration; + } + + public Integer getQuietTime() { + return quietTime; + } + + public String getAction() { + return action; + } + + public List getConditionIds() { + return conditionIds; + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public static String getResultObjectName() { + return "autoscalepolicy"; + } + + public long getAccountId() + { + if (conditionAccountId == null) + getEntityOwnerId(); + return conditionAccountId; + } + + public long getDomainId() + { + if (conditionDomainId == null) { + getEntityOwnerId(); + } + + return conditionDomainId; + } + + @Override + public long getEntityOwnerId() { + if (conditionAccountId != null) { + return conditionAccountId; + } + long conditionId = getConditionIds().get(0); + Condition condition = _entityMgr.findById(Condition.class, conditionId); + conditionDomainId = condition.getDomainId(); + conditionAccountId = condition.getAccountId(); + + return conditionAccountId; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEPOLICY_CREATE; + } + + @Override + public String getEventDescription() { + return "creating AutoScale Policy"; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScalePolicy; + } + + @Override + public void execute() { + } + + @Override + public void create() throws ResourceAllocationException { + AutoScalePolicy result = _autoScaleService.createAutoScalePolicy(this); + if (result != null) { + this.setEntityId(result.getId()); + AutoScalePolicyResponse response = _responseGenerator.createAutoScalePolicyResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create AutoScale Policy"); + } + } +} diff --git a/api/src/com/cloud/api/commands/CreateAutoScaleVmGroupCmd.java b/api/src/com/cloud/api/commands/CreateAutoScaleVmGroupCmd.java new file mode 100644 index 00000000000..f30569589ba --- /dev/null +++ b/api/src/com/cloud/api/commands/CreateAutoScaleVmGroupCmd.java @@ -0,0 +1,193 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.rules.LoadBalancer; + +@Implementation(description="Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.", responseObject=AutoScaleVmGroupResponse.class) +public class CreateAutoScaleVmGroupCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(CreateAutoScaleVmGroupCmd.class.getName()); + + private static final String s_name = "autoscalevmgroupresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @IdentityMapper(entityTableName="firewall_rules") + @Parameter(name = ApiConstants.LBID, type = CommandType.LONG, required = true, description = "the ID of the load balancer rule") + private Long lbRuleId; + + @Parameter(name=ApiConstants.MIN_MEMBERS, type=CommandType.INTEGER, required=true, description="the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.") + private int minMembers; + + @Parameter(name=ApiConstants.MAX_MEMBERS, type=CommandType.INTEGER, required=true, description="the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.") + private int maxMembers; + + @Parameter(name=ApiConstants.INTERVAL, type=CommandType.INTEGER, description="the frequency at which the conditions have to be evaluated") + private Integer interval; + + @IdentityMapper(entityTableName="autoscale_policies") + @Parameter(name=ApiConstants.SCALEUP_POLICY_IDS, type=CommandType.LIST, collectionType=CommandType.LONG, required=true, description="list of provision autoscale policies") + private List scaleUpPolicyIds; + + @IdentityMapper(entityTableName="autoscale_policies") + @Parameter(name=ApiConstants.SCALEDOWN_POLICY_IDS, type=CommandType.LIST, collectionType=CommandType.LONG, required=true, description="list of de-provision autoscale policies") + private List scaleDownPolicyIds; + + @IdentityMapper(entityTableName="autoscale_vmprofiles") + @Parameter(name=ApiConstants.VMPROFILE_ID, type=CommandType.LONG, required=true, description="the autoscale profile that contains information about the vms in the vm group.") + private Long profileId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getEntityTable() { + return "autoscale_vm_groups"; + } + + public int getMinMembers() { + return minMembers; + } + + public int getMaxMembers() { + return maxMembers; + } + + + public Integer getInterval() { + return interval; + } + + public Long getProfileId() { + return profileId; + } + + public List getScaleUpPolicyIds() { + return scaleUpPolicyIds; + } + + public List getScaleDownPolicyIds() { + return scaleDownPolicyIds; + } + + public Long getLbRuleId() { + return lbRuleId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public static String getResultObjectName() { + return "autoscalevmgroup"; + } + + @Override + public long getEntityOwnerId() { + LoadBalancer lb = _entityMgr.findById(LoadBalancer.class, getLbRuleId()); + if(lb == null) { + throw new InvalidParameterValueException("Unable to find loadbalancer from lbRuleId=" + getLbRuleId()); + } + return lb.getAccountId(); + } + + public void setLbRuleId(Long lbRuleId) { + this.lbRuleId = lbRuleId; + } + + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEVMGROUP_CREATE; + } + + @Override + public String getCreateEventType() { + return EventTypes.EVENT_AUTOSCALEVMGROUP_CREATE; + } + + @Override + public String getCreateEventDescription() { + return "creating AutoScale Vm Group"; + } + + @Override + public String getEventDescription() { + return "configuring AutoScale Vm Group. Vm Group Id: "+getEntityId(); + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScaleVmGroup; + } + + @Override + public void create() throws ResourceAllocationException{ + AutoScaleVmGroup result = _autoScaleService.createAutoScaleVmGroup(this); + if (result != null) { + this.setEntityId(result.getId()); + AutoScaleVmGroupResponse response = _responseGenerator.createAutoScaleVmGroupResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create Autoscale Vm Group"); + } + } + + @Override + public void execute(){ + boolean success = false; + AutoScaleVmGroup vmGroup = null; + try + { + success = true; // Temporary, till we call configure. + // success = _lbService.configureAutoScaleVmGroup(this); + vmGroup = _entityMgr.findById(AutoScaleVmGroup.class, getEntityId()); + AutoScaleVmGroupResponse responseObject = _responseGenerator.createAutoScaleVmGroupResponse(vmGroup); + setResponseObject(responseObject); + responseObject.setResponseName(getCommandName()); + } catch (Exception ex) { + //TODO what will happen if Resource Layer fails in a step inbetween + s_logger.warn("Failed to create autoscale vm group", ex); + } finally { + if(!success || vmGroup == null) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create Autoscale Vm Group"); + } + } + } +} diff --git a/api/src/com/cloud/api/commands/CreateAutoScaleVmProfileCmd.java b/api/src/com/cloud/api/commands/CreateAutoScaleVmProfileCmd.java new file mode 100644 index 00000000000..0350d017daf --- /dev/null +++ b/api/src/com/cloud/api/commands/CreateAutoScaleVmProfileCmd.java @@ -0,0 +1,256 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScaleVmProfileResponse; +import com.cloud.async.AsyncJob; +import com.cloud.dc.DataCenter; +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.offering.ServiceOffering; +import com.cloud.template.VirtualMachineTemplate; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.user.UserContext; + +@Implementation(description = "Creates a profile that contains information about the virtual machine which will be provisioned automatically by autoscale feature.", responseObject = AutoScaleVmProfileResponse.class) +public class CreateAutoScaleVmProfileCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(CreateAutoScaleVmProfileCmd.class.getName()); + + private static final String s_name = "autoscalevmprofileresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "data_center") + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.LONG, required = true, description = "availability zone for the auto deployed virtual machine") + private Long zoneId; + + @IdentityMapper(entityTableName = "disk_offering") + @Parameter(name = ApiConstants.SERVICE_OFFERING_ID, type = CommandType.LONG, required = true, description = "the service offering of the auto deployed virtual machine") + private Long serviceOfferingId; + + @IdentityMapper(entityTableName = "vm_template") + @Parameter(name = ApiConstants.TEMPLATE_ID, type = CommandType.LONG, required = true, description = "the template of the auto deployed virtual machine") + private Long templateId; + + @Parameter(name = ApiConstants.OTHER_DEPLOY_PARAMS, type = CommandType.STRING, description = "parameters other than zoneId/serviceOfferringId/templateId of the auto deployed virtual machine") + private String otherDeployParams; + + @Parameter(name = ApiConstants.AUTOSCALE_VM_DESTROY_TIME, type = CommandType.INTEGER, required = true, description = "the time allowed for existing connections to get closed before a vm is destroyed") + private Integer destroyVmGraceperiod; + + @Parameter(name = ApiConstants.SNMP_COMMUNITY, type = CommandType.STRING, description = "snmp community string to be used to contact a virtual machine deployed by this profile") + private String snmpCommunity; + + @Parameter(name = ApiConstants.SNMP_PORT, type = CommandType.INTEGER, description = "port at which snmp agent is listening in a virtual machine deployed by this profile") + private Integer snmpPort; + + @IdentityMapper(entityTableName = "user") + @Parameter(name = ApiConstants.AUTOSCALE_USER_ID, type = CommandType.LONG, description = "the ID of the user used to launch and destroy the VMs") + private Long autoscaleUserId; + + private Map otherDeployParamMap; + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + private Long domainId; + private Long accountId; + + @Override + public String getEntityTable() { + return "autoscale_vmprofiles"; + } + + public Long getDomainId() { + if (domainId == null) { + getAccountId(); + } + return domainId; + } + + public Long getZoneId() { + return zoneId; + } + + public Long getServiceOfferingId() { + return serviceOfferingId; + } + + public Long getTemplateId() { + return templateId; + } + + public Integer getSnmpPort() { + return snmpPort; + } + + public String getSnmpCommunity() { + return snmpCommunity; + } + + public String getOtherDeployParams() { + return otherDeployParams; + } + + public Long getAutoscaleUserId() { + if(autoscaleUserId != null) { + return autoscaleUserId; + } else { + return UserContext.current().getCaller().getId(); + } + } + + public Integer getDestroyVmGraceperiod() { + return destroyVmGraceperiod; + } + + public long getAccountId() { + if(accountId != null) { + return accountId; + } + Account account = null; + if(autoscaleUserId != null) { + User user = _entityMgr.findById(User.class, autoscaleUserId); + account = _entityMgr.findById(Account.class, user.getAccountId()); + } else { + account = UserContext.current().getCaller(); + } + accountId = account.getAccountId(); + domainId = account.getDomainId(); + return accountId; + } + + private void createOtherDeployParamMap() + { + if (otherDeployParamMap == null) { + otherDeployParamMap = new HashMap(); + } + if (otherDeployParams == null) + return; + String[] keyValues = otherDeployParams.split("&"); // hostid=123, hypervisor=xenserver + for (String keyValue : keyValues) { // keyValue == "hostid=123" + String[] keyAndValue = keyValue.split("="); // keyValue = hostid, 123 + if (keyAndValue.length != 2) { + throw new InvalidParameterValueException("Invalid parameter in otherDeployParam : " + keyValue); + } + String paramName = keyAndValue[0]; // hostid + String paramValue = keyAndValue[1]; // 123 + otherDeployParamMap.put(paramName, paramValue); + } + } + + public HashMap getDeployParamMap() + { + createOtherDeployParamMap(); + HashMap deployParams = new HashMap(otherDeployParamMap); + deployParams.put("command", "deployVirtualMachine"); + deployParams.put("zoneId", zoneId.toString()); + deployParams.put("serviceOfferingId", serviceOfferingId.toString()); + deployParams.put("templateId", templateId.toString()); + return deployParams; + } + + public String getOtherDeployParam(String param) + { + if (param == null) { + return null; + } + createOtherDeployParamMap(); + return otherDeployParamMap.get(param); + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public static String getResultObjectName() { + return "autoscalevmprofile"; + } + + @Override + public long getEntityOwnerId() { + return getAccountId(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEVMPROFILE_CREATE; + } + + @Override + public String getEventDescription() { + return "creating AutoScale Vm Profile"; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScaleVmProfile; + } + + @Override + public void execute() { + } + + @Override + public void create() throws ResourceAllocationException { + + DataCenter zone = _configService.getZone(zoneId); + if (zone == null) { + throw new InvalidParameterValueException("Unable to find zone by id=" + zoneId); + } + + ServiceOffering serviceOffering = _configService.getServiceOffering(serviceOfferingId); + if (serviceOffering == null) { + throw new InvalidParameterValueException("Unable to find service offering: " + serviceOfferingId); + } + + VirtualMachineTemplate template = _templateService.getTemplate(templateId); + // Make sure a valid template ID was specified + if (template == null) { + throw new InvalidParameterValueException("Unable to use template " + templateId); + } + + AutoScaleVmProfile result = _autoScaleService.createAutoScaleVmProfile(this); + if (result != null) { + this.setEntityId(result.getId()); + AutoScaleVmProfileResponse response = _responseGenerator.createAutoScaleVmProfileResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create Autoscale Vm Profile"); + } + } +} diff --git a/api/src/com/cloud/api/commands/CreateConditionCmd.java b/api/src/com/cloud/api/commands/CreateConditionCmd.java new file mode 100644 index 00000000000..8ea3feaf74b --- /dev/null +++ b/api/src/com/cloud/api/commands/CreateConditionCmd.java @@ -0,0 +1,144 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.ConditionResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.network.as.Condition; +import com.cloud.user.UserContext; + +@Implementation(description = "Creates a condition", responseObject = ConditionResponse.class) +public class CreateConditionCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(CreateConditionCmd.class.getName()); + private static final String s_name = "conditionresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "counter") + @Parameter(name = ApiConstants.COUNTER_ID, type = CommandType.LONG, required = true, description = "ID of the Counter.") + private long counterId; + + @Parameter(name = ApiConstants.RELATIONAL_OPERATOR, type = CommandType.STRING, required = true, description = "Relational Operator to be used with threshold.") + private String relationalOperator; + + @Parameter(name = ApiConstants.THRESHOLD, type = CommandType.LONG, required = true, description = "Threshold value.") + private Long threshold; + + @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account of the condition. " + + "Must be used with the domainId parameter.") + private String accountName; + + @IdentityMapper(entityTableName = "domain") + @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.LONG, description = "the domain ID of the account.") + private Long domainId; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void create() throws ResourceAllocationException { + Condition condition = null; + condition = _autoScaleService.createCondition(this); + + if (condition != null) { + this.setEntityId(condition.getId()); + ConditionResponse response = _responseGenerator.createConditionResponse(condition); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create condition."); + } + } + + @Override + public void execute() { + } + + // ///////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public Long getCounterId() { + return counterId; + } + + public String getRelationalOperator() { + return relationalOperator; + } + + public String getAccountName() { + return accountName; + } + + public Long getDomainId() { + return domainId; + } + + public Long getThreshold() { + return threshold; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.Condition; + } + + @Override + public String getEventDescription() { + return "creating a condition"; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_CONDITION_CREATE; + } + + @Override + public long getEntityOwnerId() { + Long accountId = finalyzeAccountId(accountName, domainId, null, true); + if (accountId == null) { + return UserContext.current().getCaller().getId(); + } + + return accountId; + } + + @Override + public String getEntityTable() { + return "conditions"; + } +} \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/CreateCounterCmd.java b/api/src/com/cloud/api/commands/CreateCounterCmd.java new file mode 100644 index 00000000000..e5ba91f9ff4 --- /dev/null +++ b/api/src/com/cloud/api/commands/CreateCounterCmd.java @@ -0,0 +1,120 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCreateCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.CounterResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.Counter; +import com.cloud.user.Account; + +@Implementation(description = "Adds metric counter", responseObject = CounterResponse.class) +public class CreateCounterCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(CreateCounterCmd.class.getName()); + private static final String s_name = "counterresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Name of the counter.") + private String name; + + @Parameter(name = ApiConstants.SOURCE, type = CommandType.STRING, required = true, description = "Source of the counter.") + private String source; + + @Parameter(name = ApiConstants.VALUE, type = CommandType.STRING, required = true, description = "Value of the counter e.g. oid in case of snmp.") + private String value; + + // ///////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public String getName() { + return name; + } + + public String getSource() { + return source; + } + + public String getValue() { + return value; + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public void create() { + Counter ctr = null; + ctr = _autoScaleService.createCounter(this); + + if (ctr != null) { + this.setEntityId(ctr.getId()); + CounterResponse response = _responseGenerator.createCounterResponse(ctr); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to create Counter with name " + getName()); + } + } + + @Override + public void execute() { + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.Counter; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_COUNTER_CREATE; + } + + @Override + public String getEventDescription() { + return "creating a new Counter"; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public String getEntityTable() { + return "counter"; + } +} diff --git a/api/src/com/cloud/api/commands/DeleteAutoScalePolicyCmd.java b/api/src/com/cloud/api/commands/DeleteAutoScalePolicyCmd.java new file mode 100644 index 00000000000..ec6e151347b --- /dev/null +++ b/api/src/com/cloud/api/commands/DeleteAutoScalePolicyCmd.java @@ -0,0 +1,100 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +@Implementation(description="Deletes a autoscale policy.", responseObject=SuccessResponse.class) +public class DeleteAutoScalePolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteAutoScalePolicyCmd.class.getName()); + private static final String s_name = "deleteautoscalepolicyresponse"; + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @IdentityMapper(entityTableName="autoscale_policies") + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the autoscale policy") + private Long id; + + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScalePolicy autoScalePolicy = _entityMgr.findById(AutoScalePolicy.class, getId()); + if (autoScalePolicy != null) { + return autoScalePolicy.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEPOLICY_DELETE; + } + + @Override + public String getEventDescription() { + return "deleting AutoScale Policy: " + getId(); + } + + @Override + public void execute(){ + UserContext.current().setEventDetails("AutoScale Policy Id: "+getId()); + boolean result = _autoScaleService.deleteAutoScalePolicy(id); + + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + s_logger.info("Successfully deleted autoscale policy id : " + getId()); + this.setResponseObject(response); + } else { + s_logger.warn("Failed to delete autoscale policy " + getId()); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete AutoScale Policy"); + } + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScalePolicy; + } +} diff --git a/api/src/com/cloud/api/commands/DeleteAutoScaleVmGroupCmd.java b/api/src/com/cloud/api/commands/DeleteAutoScaleVmGroupCmd.java new file mode 100644 index 00000000000..0d5ca9f1fda --- /dev/null +++ b/api/src/com/cloud/api/commands/DeleteAutoScaleVmGroupCmd.java @@ -0,0 +1,100 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +@Implementation(description="Deletes a autoscale vm group.", responseObject=SuccessResponse.class) +public class DeleteAutoScaleVmGroupCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteAutoScaleVmGroupCmd.class.getName()); + private static final String s_name = "deleteautoscalevmgroupresponse"; + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @IdentityMapper(entityTableName="autoscale_vmgroups") + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the autoscale group") + private Long id; + + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScaleVmGroup autoScaleVmGroup = _entityMgr.findById(AutoScaleVmGroup.class, getId()); + if (autoScaleVmGroup != null) { + return autoScaleVmGroup.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEVMGROUP_DELETE; + } + + @Override + public String getEventDescription() { + return "deleting autoscale vm group: " + getId(); + } + + @Override + public void execute(){ + UserContext.current().setEventDetails("AutoScale Vm Group Id: "+getId()); + boolean result = _autoScaleService.deleteAutoScaleVmGroup(id); + + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + s_logger.info("Successfully deleted autoscale vm group id : " + getId()); + this.setResponseObject(response); + } else { + s_logger.warn("Failed to delete autoscale vm group " + getId()); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete autoscale vm group"); + } + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScalePolicy; + } +} diff --git a/api/src/com/cloud/api/commands/DeleteAutoScaleVmProfileCmd.java b/api/src/com/cloud/api/commands/DeleteAutoScaleVmProfileCmd.java new file mode 100644 index 00000000000..bb0c6d82aa9 --- /dev/null +++ b/api/src/com/cloud/api/commands/DeleteAutoScaleVmProfileCmd.java @@ -0,0 +1,99 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +@Implementation(description="Deletes a autoscale vm profile.", responseObject=SuccessResponse.class) +public class DeleteAutoScaleVmProfileCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteAutoScaleVmProfileCmd.class.getName()); + private static final String s_name = "deleteautoscalevmprofileresponse"; + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @IdentityMapper(entityTableName="autoscale_vmprofiles") + @Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the autoscale profile") + private Long id; + + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScaleVmProfile autoScaleVmProfile = _entityMgr.findById(AutoScaleVmProfile.class, getId()); + if (autoScaleVmProfile != null) { + return autoScaleVmProfile.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEVMPROFILE_DELETE; + } + + @Override + public String getEventDescription() { + return "deleting autoscale vm profile: " + getId(); + } + + @Override + public void execute(){ + UserContext.current().setEventDetails("AutoScale VM Profile Id: "+getId()); + boolean result = _autoScaleService.deleteAutoScaleVmProfile(id); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + s_logger.info("Successfully deleted autoscale vm profile id : " + getId()); + this.setResponseObject(response); + } else { + s_logger.warn("Failed to delete autoscale vm profile " + getId()); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete autoscale vm profile"); + } + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScaleVmProfile; + } +} diff --git a/api/src/com/cloud/api/commands/DeleteConditionCmd.java b/api/src/com/cloud/api/commands/DeleteConditionCmd.java new file mode 100644 index 00000000000..da0c7defe0b --- /dev/null +++ b/api/src/com/cloud/api/commands/DeleteConditionCmd.java @@ -0,0 +1,110 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceInUseException; +import com.cloud.network.as.Condition; +import com.cloud.user.Account; + +@Implementation(description = "Removes a condition", responseObject = SuccessResponse.class) +public class DeleteConditionCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteConditionCmd.class.getName()); + private static final String s_name = "deleteconditionresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "conditions") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "the ID of the condition.") + private Long id; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() { + boolean result = false; + try { + result = _autoScaleService.deleteCondition(getId()); + } catch (ResourceInUseException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(BaseCmd.RESOURCE_IN_USE_ERROR, ex.getMessage()); + } + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + s_logger.info("Successfully deleted condition id : " + getId()); + this.setResponseObject(response); + } else { + s_logger.warn("Failed to delete condition " + getId()); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete condition."); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.Condition; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + Condition condition = _entityMgr.findById(Condition.class, getId()); + if (condition != null) { + return condition.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are + // tracked + } + + @Override + public String getEventType() { + return EventTypes.EVENT_CONDITION_DELETE; + } + + @Override + public String getEventDescription() { + return "Deleting a condition."; + } +} \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/DeleteCounterCmd.java b/api/src/com/cloud/api/commands/DeleteCounterCmd.java new file mode 100644 index 00000000000..d2e95dcb252 --- /dev/null +++ b/api/src/com/cloud/api/commands/DeleteCounterCmd.java @@ -0,0 +1,104 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.SuccessResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.exception.ResourceInUseException; +import com.cloud.user.Account; + +@Implementation(description = "Deletes a counter", responseObject = SuccessResponse.class) +public class DeleteCounterCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteCounterCmd.class.getName()); + private static final String s_name = "deletecounterresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "counter") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "the ID of the counter") + private Long id; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() { + boolean result = false; + try { + result = _autoScaleService.deleteCounter(getId()); + } catch (ResourceInUseException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(BaseCmd.RESOURCE_IN_USE_ERROR, ex.getMessage()); + } + + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + s_logger.info("Successfully deleted counter id : " + getId()); + this.setResponseObject(response); + } else { + s_logger.warn("Failed to delete counter"); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete counter."); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public Long getId() { + return id; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.Counter; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_COUNTER_DELETE; + } + + @Override + public String getEventDescription() { + return "Deleting a counter."; + } +} \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/DisableAutoScaleVmGroupCmd.java b/api/src/com/cloud/api/commands/DisableAutoScaleVmGroupCmd.java new file mode 100644 index 00000000000..02bbad3b3ee --- /dev/null +++ b/api/src/com/cloud/api/commands/DisableAutoScaleVmGroupCmd.java @@ -0,0 +1,84 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.user.Account; + +@Implementation(description = "Disables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class) +public class DisableAutoScaleVmGroupCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(DisableAutoScaleVmGroupCmd.class.getName()); + private static final String s_name = "disableautoscalevmGroupresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "account") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, description = "Account id") + private Long id; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() { + AutoScaleVmGroup result = _autoScaleService.disableAutoScaleVmGroup(getId()); + if (result != null) { + AutoScaleVmGroupResponse response = _responseGenerator.createAutoScaleVmGroupResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to disable AutoScale Vm Group"); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScaleVmGroup autoScaleVmGroup = _entityMgr.findById(AutoScaleVmGroup.class, getId()); + if (autoScaleVmGroup != null) { + return autoScaleVmGroup.getAccountId(); + } + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are + // tracked + } + +} diff --git a/api/src/com/cloud/api/commands/EnableAutoScaleVmGroupCmd.java b/api/src/com/cloud/api/commands/EnableAutoScaleVmGroupCmd.java new file mode 100644 index 00000000000..6ee6bb5a96e --- /dev/null +++ b/api/src/com/cloud/api/commands/EnableAutoScaleVmGroupCmd.java @@ -0,0 +1,84 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.user.Account; + +@Implementation(description = "Enables an AutoScale Vm Group", responseObject = AutoScaleVmGroupResponse.class) +public class EnableAutoScaleVmGroupCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(EnableAutoScaleVmGroupCmd.class.getName()); + private static final String s_name = "enableautoscalevmGroupresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "account") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, description = "Account id") + private Long id; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() { + AutoScaleVmGroup result = _autoScaleService.enableAutoScaleVmGroup(getId()); + if (result != null) { + AutoScaleVmGroupResponse response = _responseGenerator.createAutoScaleVmGroupResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to enable AutoScale Vm Group"); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScaleVmGroup autoScaleVmGroup = _entityMgr.findById(AutoScaleVmGroup.class, getId()); + if (autoScaleVmGroup != null) { + return autoScaleVmGroup.getAccountId(); + } + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are + // tracked + } + +} diff --git a/api/src/com/cloud/api/commands/ListAutoScalePoliciesCmd.java b/api/src/com/cloud/api/commands/ListAutoScalePoliciesCmd.java new file mode 100644 index 00000000000..69a9a026087 --- /dev/null +++ b/api/src/com/cloud/api/commands/ListAutoScalePoliciesCmd.java @@ -0,0 +1,85 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListAccountResourcesCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.AutoScalePolicyResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.network.as.AutoScalePolicy; + +@Implementation(description = "Lists autoscale policies.", responseObject = AutoScalePolicyResponse.class) +public class ListAutoScalePoliciesCmd extends BaseListAccountResourcesCmd { + public static final Logger s_logger = Logger.getLogger(ListAutoScalePoliciesCmd.class.getName()); + + private static final String s_name = "listautoscalepoliciesresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "autoscale_policies") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, description = "the ID of the autoscale policy") + private Long id; + + @IdentityMapper(entityTableName = "conditions") + @Parameter(name = ApiConstants.CONDITION_ID, type = CommandType.LONG, description = "the ID of the condition of the policy") + private Long conditionId; + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getConditionId() { + return conditionId; + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public void execute() { + List autoScalePolicies = _autoScaleService.listAutoScalePolicies(this); + ListResponse response = new ListResponse(); + List responses = new ArrayList(); + if (autoScalePolicies != null) { + for (AutoScalePolicy autoScalePolicy : autoScalePolicies) { + AutoScalePolicyResponse autoScalePolicyResponse = _responseGenerator.createAutoScalePolicyResponse(autoScalePolicy); + autoScalePolicyResponse.setObjectName("autoscalepolicy"); + responses.add(autoScalePolicyResponse); + } + } + response.setResponses(responses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + +} diff --git a/api/src/com/cloud/api/commands/ListAutoScaleVmGroupsCmd.java b/api/src/com/cloud/api/commands/ListAutoScaleVmGroupsCmd.java new file mode 100644 index 00000000000..8103dedabab --- /dev/null +++ b/api/src/com/cloud/api/commands/ListAutoScaleVmGroupsCmd.java @@ -0,0 +1,111 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListProjectAndAccountResourcesCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.as.AutoScaleVmGroup; + +@Implementation(description = "Lists autoscale vm groups.", responseObject = AutoScaleVmGroupResponse.class) +public class ListAutoScaleVmGroupsCmd extends BaseListProjectAndAccountResourcesCmd { + public static final Logger s_logger = Logger.getLogger(ListAutoScaleVmGroupsCmd.class.getName()); + + private static final String s_name = "listautoscalevmgroupsresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName="autoscale_vmgroups") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, description = "the ID of the autoscale vm group") + private Long id; + + @IdentityMapper(entityTableName="firewall_rules") + @Parameter(name = ApiConstants.LBID, type = CommandType.LONG, description = "the ID of the loadbalancer") + private Long loadBalancerId; + + @IdentityMapper(entityTableName="autoscale_vmprofiles") + @Parameter(name = ApiConstants.VMPROFILE_ID, type = CommandType.LONG, description = "the ID of the profile") + private Long profileId; + + @IdentityMapper(entityTableName="autoscale_policies") + @Parameter(name = ApiConstants.POLICY_ID, type = CommandType.LONG, description = "the ID of the policy") + private Long policyId; + + @IdentityMapper(entityTableName="data_center") + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.LONG, description = "the availability zone ID") + private Long zoneId; + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getLoadBalancerId() { + return loadBalancerId; + } + + + public Long getProfileId() { + return profileId; + } + + public Long getPolicyId() { + return policyId; + } + + public Long getZoneId() { + return zoneId; + } + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public void execute() { + if(id != null && (loadBalancerId != null || profileId != null || policyId != null)) + throw new InvalidParameterValueException("When id is specified other parameters need not be specified"); + + List autoScaleGroups = _autoScaleService.listAutoScaleVmGroups(this); + ListResponse response = new ListResponse(); + List responses = new ArrayList(); + if (autoScaleGroups != null) { + for (AutoScaleVmGroup autoScaleVmGroup : autoScaleGroups) { + AutoScaleVmGroupResponse autoScaleVmGroupResponse = _responseGenerator.createAutoScaleVmGroupResponse(autoScaleVmGroup); + autoScaleVmGroupResponse.setObjectName("autoscalevmgroup"); + responses.add(autoScaleVmGroupResponse); + } + } + response.setResponses(responses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } +} diff --git a/api/src/com/cloud/api/commands/ListAutoScaleVmProfilesCmd.java b/api/src/com/cloud/api/commands/ListAutoScaleVmProfilesCmd.java new file mode 100644 index 00000000000..0d8940f28ce --- /dev/null +++ b/api/src/com/cloud/api/commands/ListAutoScaleVmProfilesCmd.java @@ -0,0 +1,91 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListProjectAndAccountResourcesCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.AutoScaleVmProfileResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.network.as.AutoScaleVmProfile; + +@Implementation(description = "Lists autoscale vm profiles.", responseObject = AutoScaleVmProfileResponse.class) +public class ListAutoScaleVmProfilesCmd extends BaseListProjectAndAccountResourcesCmd { + public static final Logger s_logger = Logger.getLogger(ListAutoScaleVmProfilesCmd.class.getName()); + + private static final String s_name = "listautoscalevmprofilesresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName="autoscale_vmprofiles") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, description = "the ID of the autoscale vm profile") + private Long id; + + @IdentityMapper(entityTableName="vm_template") + @Parameter(name=ApiConstants.TEMPLATE_ID, type=CommandType.LONG, description="the templateid of the autoscale vm profile") + private Long templateId; + + @Parameter(name=ApiConstants.OTHER_DEPLOY_PARAMS, type=CommandType.STRING, description="the otherdeployparameters of the autoscale vm profile") + private String otherDeployParams; + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getTemplateId() { + return templateId; + } + + public String getOtherDeployParams() { + return otherDeployParams; + } + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public void execute() { + List autoScaleProfiles = _autoScaleService.listAutoScaleVmProfiles(this); + ListResponse response = new ListResponse(); + List responses = new ArrayList(); + if (autoScaleProfiles != null) { + for (AutoScaleVmProfile autoScaleVmProfile : autoScaleProfiles) { + AutoScaleVmProfileResponse autoScaleVmProfileResponse = _responseGenerator.createAutoScaleVmProfileResponse(autoScaleVmProfile); + autoScaleVmProfileResponse.setObjectName("autoscalevmprofile"); + responses.add(autoScaleVmProfileResponse); + } + } + response.setResponses(responses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + +} diff --git a/api/src/com/cloud/api/commands/ListConditionsCmd.java b/api/src/com/cloud/api/commands/ListConditionsCmd.java new file mode 100644 index 00000000000..57a21b4774b --- /dev/null +++ b/api/src/com/cloud/api/commands/ListConditionsCmd.java @@ -0,0 +1,88 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListAccountResourcesCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.ConditionResponse; +import com.cloud.api.response.CounterResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.network.as.Condition; + +@Implementation(description = "List Conditions for the specific user", responseObject = CounterResponse.class) +public class ListConditionsCmd extends BaseListAccountResourcesCmd { + public static final Logger s_logger = Logger.getLogger(ListConditionsCmd.class.getName()); + private static final String s_name = "listconditionsresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "conditions") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = false, description = "ID of the Condition.") + private Long id; + + @Parameter(name = ApiConstants.COUNTER_ID, type = CommandType.LONG, required = false, description = "Counter-id of the condition.") + private Long counterId; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() { + List conditions = null; + conditions = _autoScaleService.listConditions(this); + ListResponse response = new ListResponse(); + List cndnResponses = new ArrayList(); + for (Condition cndn : conditions) { + ConditionResponse cndnResponse = _responseGenerator.createConditionResponse(cndn); + cndnResponses.add(cndnResponse); + } + + response.setResponses(cndnResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + + // ///////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getCounterId() { + return counterId; + } + + @Override + public String getCommandName() { + return s_name; + } + +} \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/ListCountersCmd.java b/api/src/com/cloud/api/commands/ListCountersCmd.java new file mode 100644 index 00000000000..f5c9d99e963 --- /dev/null +++ b/api/src/com/cloud/api/commands/ListCountersCmd.java @@ -0,0 +1,99 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseListCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.response.CounterResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.network.as.Counter; +import com.cloud.user.Account; + +@Implementation(description = "List the counters", responseObject = CounterResponse.class) +public class ListCountersCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListCountersCmd.class.getName()); + private static final String s_name = "counterresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "counter") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, description = "ID of the Counter.") + private Long id; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "Name of the counter.") + private String name; + + @Parameter(name = ApiConstants.SOURCE, type = CommandType.STRING, description = "Source of the counter.") + private String source; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() { + List counters = null; + counters = _autoScaleService.listCounters(this); + ListResponse response = new ListResponse(); + List ctrResponses = new ArrayList(); + for (Counter ctr : counters) { + CounterResponse ctrResponse = _responseGenerator.createCounterResponse(ctr); + ctrResponses.add(ctrResponse); + } + + response.setResponses(ctrResponses); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + + // ///////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getSource() { + return source; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} \ No newline at end of file diff --git a/api/src/com/cloud/api/commands/UpdateAutoScalePolicyCmd.java b/api/src/com/cloud/api/commands/UpdateAutoScalePolicyCmd.java new file mode 100644 index 00000000000..eacd9a9624c --- /dev/null +++ b/api/src/com/cloud/api/commands/UpdateAutoScalePolicyCmd.java @@ -0,0 +1,98 @@ +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScalePolicyResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +@Implementation(description = "Updates an existing autoscale policy.", responseObject = AutoScalePolicyResponse.class) +public class UpdateAutoScalePolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(UpdateAutoScalePolicyCmd.class.getName()); + + private static final String s_name = "updateautoscalepolicyresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.DURATION, type = CommandType.INTEGER, description = "the duration for which the conditions have to be true before action is taken") + private Integer duration; + + @Parameter(name = ApiConstants.QUIETTIME, type = CommandType.INTEGER, description = "the cool down period for which the policy should not be evaluated after the action has been taken") + private Integer quietTime; + + @IdentityMapper(entityTableName = "autoscale_policies") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "the ID of the autoscale policy") + private Long id; + + @Override + public void execute() throws ServerApiException { + UserContext.current().setEventDetails("AutoScale Policy Id: " + getId()); + AutoScalePolicy result = _autoScaleService.updateAutoScalePolicy(this); + if (result != null) { + AutoScalePolicyResponse response = _responseGenerator.createAutoScalePolicyResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update autoscale policy"); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Integer getDuration() { + return duration; + } + + public Integer getQuietTime() { + return quietTime; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScalePolicy autoScalePolicy = _entityMgr.findById(AutoScalePolicy.class, getId()); + if (autoScalePolicy != null) { + return autoScalePolicy.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are + // tracked + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEPOLICY_UPDATE; + } + + @Override + public String getEventDescription() { + return "Updating Auto Scale Policy."; + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScalePolicy; + } +} diff --git a/api/src/com/cloud/api/commands/UpdateAutoScaleVmGroupCmd.java b/api/src/com/cloud/api/commands/UpdateAutoScaleVmGroupCmd.java new file mode 100644 index 00000000000..4747959f89a --- /dev/null +++ b/api/src/com/cloud/api/commands/UpdateAutoScaleVmGroupCmd.java @@ -0,0 +1,137 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +@Implementation(description = "Updates an existing autoscale vm group.", responseObject = AutoScaleVmGroupResponse.class) +public class UpdateAutoScaleVmGroupCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(UpdateAutoScaleVmGroupCmd.class.getName()); + + private static final String s_name = "updateautoscalevmgroupresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.MIN_MEMBERS, type = CommandType.INTEGER, required = true, description = "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.") + private int minMembers; + + @Parameter(name = ApiConstants.MAX_MEMBERS, type = CommandType.INTEGER, required = true, description = "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.") + private int maxMembers; + + @IdentityMapper(entityTableName = "autoscale_policies") + @Parameter(name = ApiConstants.SCALEUP_POLICY_IDS, type = CommandType.LIST, collectionType = CommandType.LONG, description = "list of provision autoscale policies") + private List scaleUpPolicyIds; + + @IdentityMapper(entityTableName = "autoscale_policies") + @Parameter(name = ApiConstants.SCALEDOWN_POLICY_IDS, type = CommandType.LIST, collectionType = CommandType.LONG, description = "list of de-provision autoscale policies") + private List scaleDownPolicyIds; + + @IdentityMapper(entityTableName = "autoscale_vmgroups") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "the ID of the autoscale group") + private Long id; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() throws ServerApiException { + UserContext.current().setEventDetails("AutoScale Vm Group Id: " + getId()); + AutoScaleVmGroup result = _autoScaleService.updateAutoScaleVmGroup(this); + if (result != null) { + AutoScaleVmGroupResponse response = _responseGenerator.createAutoScaleVmGroupResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update autoscale VmGroup"); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public int getMinMembers() { + return minMembers; + } + + public int getMaxMembers() { + return maxMembers; + } + + public List getScaleUpPolicyIds() { + return scaleUpPolicyIds; + } + + public List getScaleDownPolicyIds() { + return scaleDownPolicyIds; + } + + @Override + public String getEventType() { + return "Update AutoScale Vm Group"; + } + + @Override + public String getEventDescription() { + return EventTypes.EVENT_AUTOSCALEVMGROUP_UPDATE; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScaleVmGroup autoScaleVmGroup = _entityMgr.findById(AutoScaleVmGroup.class, getId()); + if (autoScaleVmGroup != null) { + return autoScaleVmGroup.getAccountId(); + } + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are + // tracked + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScaleVmGroup; + } + +} diff --git a/api/src/com/cloud/api/commands/UpdateAutoScaleVmProfileCmd.java b/api/src/com/cloud/api/commands/UpdateAutoScaleVmProfileCmd.java new file mode 100644 index 00000000000..3947fbb8e31 --- /dev/null +++ b/api/src/com/cloud/api/commands/UpdateAutoScaleVmProfileCmd.java @@ -0,0 +1,119 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.commands; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseAsyncCmd; +import com.cloud.api.BaseCmd; +import com.cloud.api.IdentityMapper; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.AutoScaleVmProfileResponse; +import com.cloud.async.AsyncJob; +import com.cloud.event.EventTypes; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.user.Account; +import com.cloud.user.UserContext; + +@Implementation(description = "Updates an existing autoscale vm profile.", responseObject = AutoScaleVmProfileResponse.class) +public class UpdateAutoScaleVmProfileCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(UpdateAutoScaleVmProfileCmd.class.getName()); + + private static final String s_name = "updateautoscalevmprofileresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @IdentityMapper(entityTableName = "autoscale_vmgroups") + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, required = true, description = "the ID of the autoscale vm profile") + private Long id; + + @IdentityMapper(entityTableName = "vm_template") + @Parameter(name = ApiConstants.TEMPLATE_ID, type = CommandType.LONG, required = true, description = "the template of the auto deployed virtual machine") + private Long templateId; + + @Parameter(name = ApiConstants.OTHER_DEPLOY_PARAMS, type = CommandType.STRING, description = "parameters other than zoneId/serviceOfferringId/templateId of the auto deployed virtual machine") + private String otherDeployParams; + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public void execute() throws ServerApiException { + UserContext.current().setEventDetails("AutoScale Policy Id: " + getId()); + AutoScaleVmProfile result = _autoScaleService.updateAutoScaleVmProfile(this); + if (result != null) { + AutoScaleVmProfileResponse response = _responseGenerator.createAutoScaleVmProfileResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to update autoscale vm profile"); + } + } + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getTemplateId() { + return templateId; + } + + public String getOtherDeployParams() { + return otherDeployParams; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_AUTOSCALEVMPROFILE_UPDATE; + } + + @Override + public String getEventDescription() { + return "Updating AutoScale Vm Profile"; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + AutoScaleVmProfile vmProfile = _entityMgr.findById(AutoScaleVmProfile.class, getId()); + if (vmProfile != null) { + return vmProfile.getAccountId(); + } + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are + // tracked + } + + @Override + public AsyncJob.Type getInstanceType() { + return AsyncJob.Type.AutoScaleVmProfile; + } +} diff --git a/api/src/com/cloud/api/response/AutoScalePolicyResponse.java b/api/src/com/cloud/api/response/AutoScalePolicyResponse.java new file mode 100644 index 00000000000..b96383b52d7 --- /dev/null +++ b/api/src/com/cloud/api/response/AutoScalePolicyResponse.java @@ -0,0 +1,123 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.response; + +import com.cloud.api.ApiConstants; +import com.cloud.utils.IdentityProxy; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class AutoScalePolicyResponse extends BaseResponse implements ControlledEntityResponse { + + @SerializedName(ApiConstants.ID) + @Param(description = "the autoscale policy ID") + private IdentityProxy id = new IdentityProxy("autoscale_policies"); + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "the availability zone of the autoscale policy") + private IdentityProxy zoneId = new IdentityProxy("data_center"); + + @SerializedName(ApiConstants.ACTION) + @Param(description = "the action to be executed if all the conditions evaluate to true for the specified duration.") + private String action; + + @SerializedName(ApiConstants.DURATION) + @Param(description = "the duration for which the conditions have to be true before action is taken") + private Integer duration; + + @SerializedName(ApiConstants.INTERVAL) + @Param(description = "the frequency at which the conditions have to be evaluated") + private Integer interval; + + @SerializedName(ApiConstants.QUIETTIME) + @Param(description = "the cool down period for which the policy should not be evaluated after the action has been taken") + private Integer quietTime; + + @SerializedName("conditions") + @Param(description = "the list of IDs of the conditions that are being evaluated on every interval") + private List conditions; + + @SerializedName(ApiConstants.ACCOUNT) @Param(description="the account owning the autoscale policy") + private String accountName; + + @SerializedName(ApiConstants.PROJECT_ID) @Param(description="the project id autoscale policy") + private IdentityProxy projectId = new IdentityProxy("projects"); + + @SerializedName(ApiConstants.PROJECT) @Param(description="the project name of the autoscale policy") + private String projectName; + + @SerializedName(ApiConstants.DOMAIN_ID) @Param(description="the domain ID of the autoscale policy") + private IdentityProxy domainId = new IdentityProxy("domain"); + + @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the autoscale policy") + private String domainName; + + public void setId(Long id) { + this.id.setValue(id); + } + + public void setZoneId(IdentityProxy zoneId) { + this.zoneId = zoneId; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } + + public void setInterval(Integer interval) { + this.interval = interval; + } + + public void setQuietTime(Integer quietTime) { + this.quietTime = quietTime; + } + + public void setAction(String action) { + this.action = action; + } + + public void setConditions(List conditions) { + this.conditions = conditions; + } + + public void setZoneId(Long zoneId) { + this.zoneId.setValue(zoneId); + } + + @Override + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + @Override + public void setDomainId(Long domainId) { + this.domainId.setValue(domainId); + } + + @Override + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + @Override + public void setProjectId(Long projectId) { + this.projectId.setValue(projectId); + } + + @Override + public void setProjectName(String projectName) { + this.projectName = projectName; + } +} diff --git a/api/src/com/cloud/api/response/AutoScaleVmGroupResponse.java b/api/src/com/cloud/api/response/AutoScaleVmGroupResponse.java new file mode 100644 index 00000000000..32fc5801f18 --- /dev/null +++ b/api/src/com/cloud/api/response/AutoScaleVmGroupResponse.java @@ -0,0 +1,132 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.response; + +import com.cloud.api.ApiConstants; +import com.cloud.utils.IdentityProxy; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class AutoScaleVmGroupResponse extends BaseResponse implements ControlledEntityResponse { + + @SerializedName(ApiConstants.ID) + @Param(description = "the autoscale vm group ID") + private IdentityProxy id = new IdentityProxy("autoscale_groups"); + + @SerializedName(ApiConstants.LBID) + @Param(description = "the load balancer rule ID") + private IdentityProxy loadBalancerId = new IdentityProxy("firewall_rules"); + + @SerializedName(ApiConstants.VMPROFILE_ID) + @Param(description = "the autoscale profile that contains information about the vms in the vm group.") + private IdentityProxy profileId = new IdentityProxy("autoscale_vmprofiles"); + + @SerializedName(ApiConstants.DURATION) + @Param(description = "the duration for which the conditions have to be true before action is taken") + private Integer minMembers; + + @SerializedName(ApiConstants.INTERVAL) + @Param(description = "the frequency at which the conditions have to be evaluated") + private Integer maxMembers; + + @SerializedName(ApiConstants.INTERVAL) + @Param(description = "the frequency at which the conditions have to be evaluated") + private Integer interval; + + @SerializedName(ApiConstants.SCALEUP_POLICY_IDS) + @Param(description = "list of provision autoscale policies") + private List scaleUpPolicies; + + @SerializedName(ApiConstants.SCALEDOWN_POLICY_IDS) + @Param(description = "list of de-provision autoscale policies") + private List scaleDownPolicies; + + @SerializedName(ApiConstants.ACCOUNT) @Param(description="the account owning the instance group") + private String accountName; + + @SerializedName(ApiConstants.PROJECT_ID) @Param(description="the project id vm profile") + private IdentityProxy projectId = new IdentityProxy("projects"); + + @SerializedName(ApiConstants.PROJECT) @Param(description="the project name of the vm profile") + private String projectName; + + @SerializedName(ApiConstants.DOMAIN_ID) @Param(description="the domain ID of the vm profile") + private IdentityProxy domainId = new IdentityProxy("domain"); + + @SerializedName(ApiConstants.DOMAIN) @Param(description="the domain name of the vm profile") + private String domainName; + + public AutoScaleVmGroupResponse() { + + } + + public void setId(Long id) { + this.id.setValue(id); + } + + public void setLoadBalancerId(Long loadBalancerId) { + this.loadBalancerId.setValue(loadBalancerId); + } + + public void setProfileId(Long profileId) { + this.profileId.setValue(profileId); + } + + public void setMinMembers(Integer minMembers) { + this.minMembers = minMembers; + } + + public void setMaxMembers(Integer maxMembers) { + this.maxMembers = maxMembers; + } + + public void setInterval(Integer interval) { + this.interval = interval; + } + + public void setScaleUpPolicies(List scaleUpPolicies) { + this.scaleUpPolicies = scaleUpPolicies; + } + + public void setScaleDownPolicies(List scaleDownPolicies) { + this.scaleDownPolicies = scaleDownPolicies; + } + + @Override + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + @Override + public void setDomainId(Long domainId) { + this.domainId.setValue(domainId); + } + + @Override + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + @Override + public void setProjectId(Long projectId) { + this.projectId.setValue(projectId); + } + + @Override + public void setProjectName(String projectName) { + this.projectName = projectName; + } +} diff --git a/api/src/com/cloud/api/response/AutoScaleVmProfileResponse.java b/api/src/com/cloud/api/response/AutoScaleVmProfileResponse.java new file mode 100644 index 00000000000..c749d28782b --- /dev/null +++ b/api/src/com/cloud/api/response/AutoScaleVmProfileResponse.java @@ -0,0 +1,145 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api.response; + +import com.cloud.api.ApiConstants; +import com.cloud.serializer.Param; +import com.cloud.utils.IdentityProxy; +import com.google.gson.annotations.SerializedName; + +public class AutoScaleVmProfileResponse extends BaseResponse implements ControlledEntityResponse { + + @SerializedName(ApiConstants.ID) + @Param(description = "the autoscale vm profile ID") + private IdentityProxy id = new IdentityProxy("autoscale_vmprofiles"); + + /* Parameters related to deploy virtual machine */ + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "the availability zone to be used while deploying a virtual machine") + private IdentityProxy zoneId = new IdentityProxy("data_center"); + + @SerializedName(ApiConstants.SERVICE_OFFERING_ID) + @Param(description = "the service offering to be used while deploying a virtual machine") + private IdentityProxy serviceOfferingId = new IdentityProxy("disk_offering"); + + @SerializedName(ApiConstants.TEMPLATE_ID) + @Param(description = "the template to be used while deploying a virtual machine") + private IdentityProxy templateId = new IdentityProxy("vm_template"); + + @SerializedName(ApiConstants.OTHER_DEPLOY_PARAMS) + @Param(description = "parameters other than zoneId/serviceOfferringId/templateId to be used while deploying a virtual machine") + private String otherDeployParams; + + @SerializedName(ApiConstants.ACCOUNT) + @Param(description = "the account owning the instance group") + private String accountName; + + @SerializedName(ApiConstants.PROJECT_ID) + @Param(description = "the project id vm profile") + private IdentityProxy projectId = new IdentityProxy("projects"); + + @SerializedName(ApiConstants.PROJECT) + @Param(description = "the project name of the vm profile") + private String projectName; + + @SerializedName(ApiConstants.DOMAIN_ID) + @Param(description = "the domain ID of the vm profile") + private IdentityProxy domainId = new IdentityProxy("domain"); + + @SerializedName(ApiConstants.DOMAIN) + @Param(description = "the domain name of the vm profile") + private String domainName; + + /* Parameters related to destroying a virtual machine */ + @SerializedName(ApiConstants.AUTOSCALE_VM_DESTROY_TIME) + @Param(description = "the time allowed for existing connections to get closed before a vm is destroyed") + private Integer destroyVmGraceperiod; + + /* Parameters related to a running virtual machine - monitoring aspects */ + @SerializedName(ApiConstants.SNMP_COMMUNITY) + @Param(description = "snmp community string to be used to contact a virtual machine deployed by this profile") + private String snmpCommunity; + + @SerializedName(ApiConstants.SNMP_PORT) + @Param(description = "port at which the snmp agent is listening in a virtual machine deployed by this profile") + private Integer snmpPort; + + @SerializedName(ApiConstants.AUTOSCALE_USER_ID) + @Param(description = "the ID of the user used to launch and destroy the VMs") + private IdentityProxy autoscaleUserId = new IdentityProxy("user"); + + public AutoScaleVmProfileResponse() { + + } + + public void setId(Long id) { + this.id.setValue(id); + } + + public void setZoneId(Long zoneId) { + this.zoneId.setValue(zoneId); + } + + public void setServiceOfferingId(Long serviceOfferingId) { + this.serviceOfferingId.setValue(serviceOfferingId); + } + + public void setTemplateId(Long templateId) { + this.templateId.setValue(templateId); + } + + public void setOtherDeployParams(String otherDeployParams) { + this.otherDeployParams = otherDeployParams; + } + + public void setSnmpCommunity(String snmpCommunity) { + this.snmpCommunity = snmpCommunity; + } + + public void setSnmpPort(Integer snmpPort) { + this.snmpPort = snmpPort; + } + + @Override + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + @Override + public void setDomainId(Long domainId) { + this.domainId.setValue(domainId); + } + + @Override + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + @Override + public void setProjectId(Long projectId) { + this.projectId.setValue(projectId); + } + + @Override + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void setAutoscaleUserId(Long autoscaleUserId) { + this.autoscaleUserId.setValue(autoscaleUserId); + } + + public void setDestroyVmGraceperiod(Integer destroyVmGraceperiod) { + this.destroyVmGraceperiod = destroyVmGraceperiod; + } +} diff --git a/api/src/com/cloud/api/response/ConditionResponse.java b/api/src/com/cloud/api/response/ConditionResponse.java new file mode 100644 index 00000000000..0007a65e01f --- /dev/null +++ b/api/src/com/cloud/api/response/ConditionResponse.java @@ -0,0 +1,115 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.response; + +import com.cloud.api.ApiConstants; +import com.cloud.serializer.Param; +import com.cloud.utils.IdentityProxy; +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class ConditionResponse extends BaseResponse implements ControlledEntityResponse { + @SerializedName("id") + @Param(description = "the id of the Condition") + private final IdentityProxy id = new IdentityProxy("conditions"); + + @SerializedName(value = ApiConstants.THRESHOLD) + @Param(description = "Threshold Value for the counter.") + private long threshold; + + @SerializedName(value = ApiConstants.RELATIONAL_OPERATOR) + @Param(description = "Relational Operator to be used with threshold.") + private String relationalOperator; + + @SerializedName(value = ApiConstants.COUNTER_ID) + @Param(description = "Details of the Counter.") + private CounterResponse counter; + + @SerializedName(ApiConstants.DOMAIN_ID) + @Param(description = "the domain id of the Condition owner") + private final IdentityProxy domainId = new IdentityProxy("domain"); + + @SerializedName(ApiConstants.DOMAIN) + @Param(description = "the domain name of the owner.") + private String domain; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "zone id of counter") + private final IdentityProxy zoneId = new IdentityProxy("data_center"); + + @SerializedName(ApiConstants.PROJECT_ID) + @Param(description = "the project id of the Condition.") + private final IdentityProxy projectId = new IdentityProxy("projects"); + + @SerializedName(ApiConstants.PROJECT) + @Param(description = "the project name of the Condition") + private String projectName; + + @SerializedName(ApiConstants.ACCOUNT) + @Param(description = "the owner of the Condition.") + private String accountName; + + // ///////////////////////////////////////////////// + // ///////////////// Setters /////////////////////// + // /////////////////////////////////////////////////// + + public void setId(Long id) { + this.id.setValue(id); + } + + public void setThreshold(long threshold) { + this.threshold = threshold; + } + + public void setRelationalOperator(String relationalOperator) { + this.relationalOperator = relationalOperator; + } + + public void setCounter(CounterResponse counter) { + this.counter = counter; + } + + @Override + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + @Override + public void setProjectId(Long projectId) { + this.projectId.setValue(projectId); + } + + public void setZoneId(Long zoneId) { + this.zoneId.setValue(zoneId); + } + + @Override + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + @Override + public void setDomainId(Long domainId) { + this.domainId.setValue(domainId); + } + + @Override + public void setDomainName(String domainName) { + this.domain = domainName; + } +} \ No newline at end of file diff --git a/api/src/com/cloud/api/response/CounterResponse.java b/api/src/com/cloud/api/response/CounterResponse.java new file mode 100644 index 00000000000..aaea8e6bb32 --- /dev/null +++ b/api/src/com/cloud/api/response/CounterResponse.java @@ -0,0 +1,62 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.api.response; + +import com.cloud.api.ApiConstants; +import com.cloud.serializer.Param; +import com.cloud.utils.IdentityProxy; +import com.google.gson.annotations.SerializedName; + +@SuppressWarnings("unused") +public class CounterResponse extends BaseResponse { + @SerializedName("id") + @Param(description = "the id of the Counter") + private final IdentityProxy id = new IdentityProxy("counter"); + + @SerializedName(value = ApiConstants.NAME) + @Param(description = "Name of the counter.") + private String name; + + @SerializedName(value = ApiConstants.SOURCE) + @Param(description = "Source of the counter.") + private String source; + + @SerializedName(value = ApiConstants.VALUE) + @Param(description = "Value in case of snmp or other specific counters.") + private String value; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "zone id of counter") + private final IdentityProxy zoneId = new IdentityProxy("data_center"); + + public void setId(Long id) { + this.id.setValue(id); + } + + public void setName(String name) { + this.name = name; + } + + public void setSource(String source) { + this.source = source; + } + + public void setValue(String value) { + this.value = value; + } +} \ No newline at end of file diff --git a/api/src/com/cloud/async/AsyncJob.java b/api/src/com/cloud/async/AsyncJob.java index 32fa9ac38b2..45074daf546 100644 --- a/api/src/com/cloud/async/AsyncJob.java +++ b/api/src/com/cloud/async/AsyncJob.java @@ -1,91 +1,96 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.async; - -import java.util.Date; - -import com.cloud.api.Identity; - -public interface AsyncJob extends Identity { - public enum Type { - None, - VirtualMachine, - DomainRouter, - Volume, - ConsoleProxy, - Snapshot, - Template, - Iso, - SystemVm, - Host, - StoragePool, - IpAddress, - SecurityGroup, - PhysicalNetwork, - TrafficType, - PhysicalNetworkServiceProvider, - FirewallRule, - Account, - User, - PrivateGateway, - StaticRoute - } - - Long getId(); - - long getUserId(); - - long getAccountId(); - - String getCmd(); - - int getCmdVersion(); - - String getCmdInfo(); - - int getCallbackType(); - - String getCallbackAddress(); - - int getStatus(); - - int getProcessStatus(); - - int getResultCode(); - - String getResult(); - - Long getInitMsid(); - - Long getCompleteMsid(); - - Date getCreated(); - - Date getLastUpdated(); - - Date getLastPolled(); - - Date getRemoved(); - - Type getInstanceType(); - - Long getInstanceId(); - - String getSessionKey(); - - String getCmdOriginator(); - - boolean isFromPreviousSession(); - - SyncQueueItem getSyncSource(); -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.async; + +import java.util.Date; + +import com.cloud.api.Identity; + +public interface AsyncJob extends Identity { + public enum Type { + None, + VirtualMachine, + DomainRouter, + Volume, + ConsoleProxy, + Snapshot, + Template, + Iso, + SystemVm, + Host, + StoragePool, + IpAddress, + SecurityGroup, + PhysicalNetwork, + TrafficType, + PhysicalNetworkServiceProvider, + FirewallRule, + Account, + User, + PrivateGateway, + StaticRoute, + Counter, + Condition, + AutoScalePolicy, + AutoScaleVmProfile, + AutoScaleVmGroup + } + + Long getId(); + + long getUserId(); + + long getAccountId(); + + String getCmd(); + + int getCmdVersion(); + + String getCmdInfo(); + + int getCallbackType(); + + String getCallbackAddress(); + + int getStatus(); + + int getProcessStatus(); + + int getResultCode(); + + String getResult(); + + Long getInitMsid(); + + Long getCompleteMsid(); + + Date getCreated(); + + Date getLastUpdated(); + + Date getLastPolled(); + + Date getRemoved(); + + Type getInstanceType(); + + Long getInstanceId(); + + String getSessionKey(); + + String getCmdOriginator(); + + boolean isFromPreviousSession(); + + SyncQueueItem getSyncSource(); +} diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 5516751370a..1af3e5bd8c2 100755 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -1,289 +1,303 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.event; - -public class EventTypes { - // VM Events - public static final String EVENT_VM_CREATE = "VM.CREATE"; - public static final String EVENT_VM_DESTROY = "VM.DESTROY"; - public static final String EVENT_VM_START = "VM.START"; - public static final String EVENT_VM_STOP = "VM.STOP"; - public static final String EVENT_VM_REBOOT = "VM.REBOOT"; - public static final String EVENT_VM_UPDATE = "VM.UPDATE"; - public static final String EVENT_VM_UPGRADE = "VM.UPGRADE"; - public static final String EVENT_VM_RESETPASSWORD = "VM.RESETPASSWORD"; - public static final String EVENT_VM_MIGRATE = "VM.MIGRATE"; - public static final String EVENT_VM_MOVE = "VM.MOVE"; - public static final String EVENT_VM_RESTORE = "VM.RESTORE"; - - // Domain Router - public static final String EVENT_ROUTER_CREATE = "ROUTER.CREATE"; - public static final String EVENT_ROUTER_DESTROY = "ROUTER.DESTROY"; - public static final String EVENT_ROUTER_START = "ROUTER.START"; - public static final String EVENT_ROUTER_STOP = "ROUTER.STOP"; - public static final String EVENT_ROUTER_REBOOT = "ROUTER.REBOOT"; - public static final String EVENT_ROUTER_HA = "ROUTER.HA"; - public static final String EVENT_ROUTER_UPGRADE = "ROUTER.UPGRADE"; - - // Console proxy - public static final String EVENT_PROXY_CREATE = "PROXY.CREATE"; - public static final String EVENT_PROXY_DESTROY = "PROXY.DESTROY"; - public static final String EVENT_PROXY_START = "PROXY.START"; - public static final String EVENT_PROXY_STOP = "PROXY.STOP"; - public static final String EVENT_PROXY_REBOOT = "PROXY.REBOOT"; - public static final String EVENT_PROXY_HA = "PROXY.HA"; - - // VNC Console Events - public static final String EVENT_VNC_CONNECT = "VNC.CONNECT"; - public static final String EVENT_VNC_DISCONNECT = "VNC.DISCONNECT"; - - // Network Events - public static final String EVENT_NET_IP_ASSIGN = "NET.IPASSIGN"; - public static final String EVENT_NET_IP_RELEASE = "NET.IPRELEASE"; - public static final String EVENT_NET_RULE_ADD = "NET.RULEADD"; - public static final String EVENT_NET_RULE_DELETE = "NET.RULEDELETE"; - public static final String EVENT_NET_RULE_MODIFY = "NET.RULEMODIFY"; - public static final String EVENT_NETWORK_CREATE = "NETWORK.CREATE"; - public static final String EVENT_NETWORK_DELETE = "NETWORK.DELETE"; - public static final String EVENT_NETWORK_UPDATE = "NETWORK.UPDATE"; - public static final String EVENT_FIREWALL_OPEN = "FIREWALL.OPEN"; - public static final String EVENT_FIREWALL_CLOSE = "FIREWALL.CLOSE"; - - // Load Balancers - public static final String EVENT_ASSIGN_TO_LOAD_BALANCER_RULE = "LB.ASSIGN.TO.RULE"; - public static final String EVENT_REMOVE_FROM_LOAD_BALANCER_RULE = "LB.REMOVE.FROM.RULE"; - public static final String EVENT_LOAD_BALANCER_CREATE = "LB.CREATE"; - public static final String EVENT_LOAD_BALANCER_DELETE = "LB.DELETE"; - public static final String EVENT_LB_STICKINESSPOLICY_CREATE = "LB.STICKINESSPOLICY.CREATE"; - public static final String EVENT_LB_STICKINESSPOLICY_DELETE = "LB.STICKINESSPOLICY.DELETE"; - public static final String EVENT_LOAD_BALANCER_UPDATE = "LB.UPDATE"; - - // Account events - public static final String EVENT_ACCOUNT_DISABLE = "ACCOUNT.DISABLE"; - public static final String EVENT_ACCOUNT_CREATE = "ACCOUNT.CREATE"; - public static final String EVENT_ACCOUNT_DELETE = "ACCOUNT.DELETE"; - public static final String EVENT_ACCOUNT_MARK_DEFAULT_ZONE = "ACCOUNT.MARK.DEFAULT.ZONE"; - - // UserVO Events - public static final String EVENT_USER_LOGIN = "USER.LOGIN"; - public static final String EVENT_USER_LOGOUT = "USER.LOGOUT"; - public static final String EVENT_USER_CREATE = "USER.CREATE"; - public static final String EVENT_USER_DELETE = "USER.DELETE"; - public static final String EVENT_USER_DISABLE = "USER.DISABLE"; - public static final String EVENT_USER_UPDATE = "USER.UPDATE"; - public static final String EVENT_USER_ENABLE = "USER.ENABLE"; - public static final String EVENT_USER_LOCK = "USER.LOCK"; - - // Template Events - public static final String EVENT_TEMPLATE_CREATE = "TEMPLATE.CREATE"; - public static final String EVENT_TEMPLATE_DELETE = "TEMPLATE.DELETE"; - public static final String EVENT_TEMPLATE_UPDATE = "TEMPLATE.UPDATE"; - public static final String EVENT_TEMPLATE_DOWNLOAD_START = "TEMPLATE.DOWNLOAD.START"; - public static final String EVENT_TEMPLATE_DOWNLOAD_SUCCESS = "TEMPLATE.DOWNLOAD.SUCCESS"; - public static final String EVENT_TEMPLATE_DOWNLOAD_FAILED = "TEMPLATE.DOWNLOAD.FAILED"; - public static final String EVENT_TEMPLATE_COPY = "TEMPLATE.COPY"; - public static final String EVENT_TEMPLATE_EXTRACT = "TEMPLATE.EXTRACT"; - public static final String EVENT_TEMPLATE_UPLOAD = "TEMPLATE.UPLOAD"; - public static final String EVENT_TEMPLATE_CLEANUP = "TEMPLATE.CLEANUP"; - - // Volume Events - public static final String EVENT_VOLUME_CREATE = "VOLUME.CREATE"; - public static final String EVENT_VOLUME_DELETE = "VOLUME.DELETE"; - public static final String EVENT_VOLUME_ATTACH = "VOLUME.ATTACH"; - public static final String EVENT_VOLUME_DETACH = "VOLUME.DETACH"; - public static final String EVENT_VOLUME_EXTRACT = "VOLUME.EXTRACT"; - public static final String EVENT_VOLUME_UPLOAD = "VOLUME.UPLOAD"; - public static final String EVENT_VOLUME_MIGRATE = "VOLUME.MIGRATE"; - - // Domains - public static final String EVENT_DOMAIN_CREATE = "DOMAIN.CREATE"; - public static final String EVENT_DOMAIN_DELETE = "DOMAIN.DELETE"; - public static final String EVENT_DOMAIN_UPDATE = "DOMAIN.UPDATE"; - - // Snapshots - public static final String EVENT_SNAPSHOT_CREATE = "SNAPSHOT.CREATE"; - public static final String EVENT_SNAPSHOT_DELETE = "SNAPSHOT.DELETE"; - public static final String EVENT_SNAPSHOT_POLICY_CREATE = "SNAPSHOTPOLICY.CREATE"; - public static final String EVENT_SNAPSHOT_POLICY_UPDATE = "SNAPSHOTPOLICY.UPDATE"; - public static final String EVENT_SNAPSHOT_POLICY_DELETE = "SNAPSHOTPOLICY.DELETE"; - - // ISO - public static final String EVENT_ISO_CREATE = "ISO.CREATE"; - public static final String EVENT_ISO_DELETE = "ISO.DELETE"; - public static final String EVENT_ISO_COPY = "ISO.COPY"; - public static final String EVENT_ISO_ATTACH = "ISO.ATTACH"; - public static final String EVENT_ISO_DETACH = "ISO.DETACH"; - public static final String EVENT_ISO_EXTRACT = "ISO.EXTRACT"; - public static final String EVENT_ISO_UPLOAD = "ISO.UPLOAD"; - - // SSVM - public static final String EVENT_SSVM_CREATE = "SSVM.CREATE"; - public static final String EVENT_SSVM_DESTROY = "SSVM.DESTROY"; - public static final String EVENT_SSVM_START = "SSVM.START"; - public static final String EVENT_SSVM_STOP = "SSVM.STOP"; - public static final String EVENT_SSVM_REBOOT = "SSVM.REBOOT"; - public static final String EVENT_SSVM_HA = "SSVM.HA"; - - // Service Offerings - public static final String EVENT_SERVICE_OFFERING_CREATE = "SERVICE.OFFERING.CREATE"; - public static final String EVENT_SERVICE_OFFERING_EDIT = "SERVICE.OFFERING.EDIT"; - public static final String EVENT_SERVICE_OFFERING_DELETE = "SERVICE.OFFERING.DELETE"; - - // Disk Offerings - public static final String EVENT_DISK_OFFERING_CREATE = "DISK.OFFERING.CREATE"; - public static final String EVENT_DISK_OFFERING_EDIT = "DISK.OFFERING.EDIT"; - public static final String EVENT_DISK_OFFERING_DELETE = "DISK.OFFERING.DELETE"; - - // Network offerings - public static final String EVENT_NETWORK_OFFERING_CREATE = "NETWORK.OFFERING.CREATE"; - public static final String EVENT_NETWORK_OFFERING_ASSIGN = "NETWORK.OFFERING.ASSIGN"; - public static final String EVENT_NETWORK_OFFERING_EDIT = "NETWORK.OFFERING.EDIT"; - public static final String EVENT_NETWORK_OFFERING_REMOVE = "NETWORK.OFFERING.REMOVE"; - public static final String EVENT_NETWORK_OFFERING_DELETE = "NETWORK.OFFERING.DELETE"; - - // Pods - public static final String EVENT_POD_CREATE = "POD.CREATE"; - public static final String EVENT_POD_EDIT = "POD.EDIT"; - public static final String EVENT_POD_DELETE = "POD.DELETE"; - - // Zones - public static final String EVENT_ZONE_CREATE = "ZONE.CREATE"; - public static final String EVENT_ZONE_EDIT = "ZONE.EDIT"; - public static final String EVENT_ZONE_DELETE = "ZONE.DELETE"; - - // VLANs/IP ranges - public static final String EVENT_VLAN_IP_RANGE_CREATE = "VLAN.IP.RANGE.CREATE"; - public static final String EVENT_VLAN_IP_RANGE_DELETE = "VLAN.IP.RANGE.DELETE"; - - public static final String EVENT_STORAGE_IP_RANGE_CREATE = "STORAGE.IP.RANGE.CREATE"; - public static final String EVENT_STORAGE_IP_RANGE_DELETE = "STORAGE.IP.RANGE.DELETE"; - public static final String EVENT_STORAGE_IP_RANGE_UPDATE = "STORAGE.IP.RANGE.UPDATE"; - - // Configuration Table - public static final String EVENT_CONFIGURATION_VALUE_EDIT = "CONFIGURATION.VALUE.EDIT"; - - // Security Groups - public static final String EVENT_SECURITY_GROUP_AUTHORIZE_INGRESS = "SG.AUTH.INGRESS"; - public static final String EVENT_SECURITY_GROUP_REVOKE_INGRESS = "SG.REVOKE.INGRESS"; - public static final String EVENT_SECURITY_GROUP_AUTHORIZE_EGRESS = "SG.AUTH.EGRESS"; - public static final String EVENT_SECURITY_GROUP_REVOKE_EGRESS = "SG.REVOKE.EGRESS"; - public static final String EVENT_SECURITY_GROUP_CREATE = "SG.CREATE"; - public static final String EVENT_SECURITY_GROUP_DELETE = "SG.DELETE"; - public static final String EVENT_SECURITY_GROUP_ASSIGN = "SG.ASSIGN"; - public static final String EVENT_SECURITY_GROUP_REMOVE = "SG.REMOVE"; - - // Host - public static final String EVENT_HOST_RECONNECT = "HOST.RECONNECT"; - - // Maintenance - public static final String EVENT_MAINTENANCE_CANCEL = "MAINT.CANCEL"; - public static final String EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE = "MAINT.CANCEL.PS"; - public static final String EVENT_MAINTENANCE_PREPARE = "MAINT.PREPARE"; - public static final String EVENT_MAINTENANCE_PREPARE_PRIMARY_STORAGE = "MAINT.PREPARE.PS"; - - // VPN - public static final String EVENT_REMOTE_ACCESS_VPN_CREATE = "VPN.REMOTE.ACCESS.CREATE"; - public static final String EVENT_REMOTE_ACCESS_VPN_DESTROY = "VPN.REMOTE.ACCESS.DESTROY"; - public static final String EVENT_VPN_USER_ADD = "VPN.USER.ADD"; - public static final String EVENT_VPN_USER_REMOVE = "VPN.USER.REMOVE"; - public static final String EVENT_S2S_VPN_GATEWAY_CREATE = "VPN.S2S.VPN.GATEWAY.CREATE"; - public static final String EVENT_S2S_VPN_GATEWAY_DELETE = "VPN.S2S.VPN.GATEWAY.DELETE"; - public static final String EVENT_S2S_CUSTOMER_GATEWAY_CREATE = "VPN.S2S.CUSTOMER.GATEWAY.CREATE"; - public static final String EVENT_S2S_CUSTOMER_GATEWAY_DELETE = "VPN.S2S.CUSTOMER.GATEWAY.DELETE"; - public static final String EVENT_S2S_CUSTOMER_GATEWAY_UPDATE = "VPN.S2S.CUSTOMER.GATEWAY.UPDATE"; - public static final String EVENT_S2S_CONNECTION_CREATE = "VPN.S2S.CONNECTION.CREATE"; - public static final String EVENT_S2S_CONNECTION_DELETE = "VPN.S2S.CONNECTION.DELETE"; - public static final String EVENT_S2S_CONNECTION_RESET = "VPN.S2S.CONNECTION.RESET"; - - // Network - public static final String EVENT_NETWORK_RESTART = "NETWORK.RESTART"; - - // Custom certificates - public static final String EVENT_UPLOAD_CUSTOM_CERTIFICATE = "UPLOAD.CUSTOM.CERTIFICATE"; - - // OneToOnenat - public static final String EVENT_ENABLE_STATIC_NAT = "STATICNAT.ENABLE"; - public static final String EVENT_DISABLE_STATIC_NAT = "STATICNAT.DISABLE"; - - public static final String EVENT_ZONE_VLAN_ASSIGN = "ZONE.VLAN.ASSIGN"; - public static final String EVENT_ZONE_VLAN_RELEASE = "ZONE.VLAN.RELEASE"; - - // Projects - public static final String EVENT_PROJECT_CREATE = "PROJECT.CREATE"; - public static final String EVENT_PROJECT_UPDATE = "PROJECT.UPDATE"; - public static final String EVENT_PROJECT_DELETE = "PROJECT.DELETE"; - public static final String EVENT_PROJECT_ACTIVATE = "PROJECT.ACTIVATE"; - public static final String EVENT_PROJECT_SUSPEND = "PROJECT.SUSPEND"; - public static final String EVENT_PROJECT_ACCOUNT_ADD = "PROJECT.ACCOUNT.ADD"; - public static final String EVENT_PROJECT_INVITATION_UPDATE = "PROJECT.INVITATION.UPDATE"; - public static final String EVENT_PROJECT_INVITATION_REMOVE = "PROJECT.INVITATION.REMOVE"; - public static final String EVENT_PROJECT_ACCOUNT_REMOVE = "PROJECT.ACCOUNT.REMOVE"; - - // Network as a Service - public static final String EVENT_NETWORK_ELEMENT_CONFIGURE = "NETWORK.ELEMENT.CONFIGURE"; - - // Physical Network Events - public static final String EVENT_PHYSICAL_NETWORK_CREATE = "PHYSICAL.NETWORK.CREATE"; - public static final String EVENT_PHYSICAL_NETWORK_DELETE = "PHYSICAL.NETWORK.DELETE"; - public static final String EVENT_PHYSICAL_NETWORK_UPDATE = "PHYSICAL.NETWORK.UPDATE"; - - // Physical Network Service Provider Events - public static final String EVENT_SERVICE_PROVIDER_CREATE = "SERVICE.PROVIDER.CREATE"; - public static final String EVENT_SERVICE_PROVIDER_DELETE = "SERVICE.PROVIDER.DELETE"; - public static final String EVENT_SERVICE_PROVIDER_UPDATE = "SERVICE.PROVIDER.UPDATE"; - - // Physical Network TrafficType Events - public static final String EVENT_TRAFFIC_TYPE_CREATE = "TRAFFIC.TYPE.CREATE"; - public static final String EVENT_TRAFFIC_TYPE_DELETE = "TRAFFIC.TYPE.DELETE"; - public static final String EVENT_TRAFFIC_TYPE_UPDATE = "TRAFFIC.TYPE.UPDATE"; - - // external network device events - public static final String EVENT_EXTERNAL_LB_DEVICE_ADD = "PHYSICAL.LOADBALANCER.ADD"; - public static final String EVENT_EXTERNAL_LB_DEVICE_DELETE = "PHYSICAL.LOADBALANCER.DELETE"; - public static final String EVENT_EXTERNAL_LB_DEVICE_CONFIGURE = "PHYSICAL.LOADBALANCER.CONFIGURE"; - - // external switch management device events (E.g.: Cisco Nexus 1000v Virtual Supervisor Module. - public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ADD = "SWITCH.MGMT.ADD"; - public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DELETE = "SWITCH.MGMT.DELETE"; - public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_CONFIGURE = "SWITCH.MGMT.CONFIGURE"; - public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ENABLE = "SWITCH.MGMT.ENABLE"; - public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DISABLE = "SWITCH.MGMT.DISABLE"; - - - public static final String EVENT_EXTERNAL_FIREWALL_DEVICE_ADD = "PHYSICAL.FIREWALL.ADD"; - public static final String EVENT_EXTERNAL_FIREWALL_DEVICE_DELETE = "PHYSICAL.FIREWALL.DELETE"; - public static final String EVENT_EXTERNAL_FIREWALL_DEVICE_CONFIGURE = "PHYSICAL.FIREWALL.CONFIGURE"; - - // tag related events - public static final String EVENT_TAGS_CREATE = "CREATE_TAGS"; - public static final String EVENT_TAGS_DELETE = "DELETE_TAGS"; - - // VPC - public static final String EVENT_VPC_CREATE = "VPC.CREATE"; - public static final String EVENT_VPC_UPDATE = "VPC.UPDATE"; - public static final String EVENT_VPC_DELETE = "VPC.DELETE"; - public static final String EVENT_VPC_RESTART = "VPC.RESTART"; - - // VPC offerings - public static final String EVENT_VPC_OFFERING_CREATE = "VPC.OFFERING.CREATE"; - public static final String EVENT_VPC_OFFERING_UPDATE = "VPC.OFFERING.UPDATE"; - public static final String EVENT_VPC_OFFERING_DELETE = "VPC.OFFERING.DELETE"; - - // Private gateway - public static final String EVENT_PRIVATE_GATEWAY_CREATE = "PRIVATE.GATEWAY.CREATE"; - public static final String EVENT_PRIVATE_GATEWAY_DELETE = "PRIVATE.GATEWAY.DELETE"; - - // Static routes - public static final String EVENT_STATIC_ROUTE_CREATE = "STATIC.ROUTE.CREATE"; - public static final String EVENT_STATIC_ROUTE_DELETE = "STATIC.ROUTE.DELETE"; -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.event; + +public class EventTypes { + // VM Events + public static final String EVENT_VM_CREATE = "VM.CREATE"; + public static final String EVENT_VM_DESTROY = "VM.DESTROY"; + public static final String EVENT_VM_START = "VM.START"; + public static final String EVENT_VM_STOP = "VM.STOP"; + public static final String EVENT_VM_REBOOT = "VM.REBOOT"; + public static final String EVENT_VM_UPDATE = "VM.UPDATE"; + public static final String EVENT_VM_UPGRADE = "VM.UPGRADE"; + public static final String EVENT_VM_RESETPASSWORD = "VM.RESETPASSWORD"; + public static final String EVENT_VM_MIGRATE = "VM.MIGRATE"; + public static final String EVENT_VM_MOVE = "VM.MOVE"; + public static final String EVENT_VM_RESTORE = "VM.RESTORE"; + + // Domain Router + public static final String EVENT_ROUTER_CREATE = "ROUTER.CREATE"; + public static final String EVENT_ROUTER_DESTROY = "ROUTER.DESTROY"; + public static final String EVENT_ROUTER_START = "ROUTER.START"; + public static final String EVENT_ROUTER_STOP = "ROUTER.STOP"; + public static final String EVENT_ROUTER_REBOOT = "ROUTER.REBOOT"; + public static final String EVENT_ROUTER_HA = "ROUTER.HA"; + public static final String EVENT_ROUTER_UPGRADE = "ROUTER.UPGRADE"; + + // Console proxy + public static final String EVENT_PROXY_CREATE = "PROXY.CREATE"; + public static final String EVENT_PROXY_DESTROY = "PROXY.DESTROY"; + public static final String EVENT_PROXY_START = "PROXY.START"; + public static final String EVENT_PROXY_STOP = "PROXY.STOP"; + public static final String EVENT_PROXY_REBOOT = "PROXY.REBOOT"; + public static final String EVENT_PROXY_HA = "PROXY.HA"; + + // VNC Console Events + public static final String EVENT_VNC_CONNECT = "VNC.CONNECT"; + public static final String EVENT_VNC_DISCONNECT = "VNC.DISCONNECT"; + + // Network Events + public static final String EVENT_NET_IP_ASSIGN = "NET.IPASSIGN"; + public static final String EVENT_NET_IP_RELEASE = "NET.IPRELEASE"; + public static final String EVENT_NET_RULE_ADD = "NET.RULEADD"; + public static final String EVENT_NET_RULE_DELETE = "NET.RULEDELETE"; + public static final String EVENT_NET_RULE_MODIFY = "NET.RULEMODIFY"; + public static final String EVENT_NETWORK_CREATE = "NETWORK.CREATE"; + public static final String EVENT_NETWORK_DELETE = "NETWORK.DELETE"; + public static final String EVENT_NETWORK_UPDATE = "NETWORK.UPDATE"; + public static final String EVENT_FIREWALL_OPEN = "FIREWALL.OPEN"; + public static final String EVENT_FIREWALL_CLOSE = "FIREWALL.CLOSE"; + + // Load Balancers + public static final String EVENT_ASSIGN_TO_LOAD_BALANCER_RULE = "LB.ASSIGN.TO.RULE"; + public static final String EVENT_REMOVE_FROM_LOAD_BALANCER_RULE = "LB.REMOVE.FROM.RULE"; + public static final String EVENT_LOAD_BALANCER_CREATE = "LB.CREATE"; + public static final String EVENT_LOAD_BALANCER_DELETE = "LB.DELETE"; + public static final String EVENT_LB_STICKINESSPOLICY_CREATE = "LB.STICKINESSPOLICY.CREATE"; + public static final String EVENT_LB_STICKINESSPOLICY_DELETE = "LB.STICKINESSPOLICY.DELETE"; + public static final String EVENT_LOAD_BALANCER_UPDATE = "LB.UPDATE"; + + // Account events + public static final String EVENT_ACCOUNT_DISABLE = "ACCOUNT.DISABLE"; + public static final String EVENT_ACCOUNT_CREATE = "ACCOUNT.CREATE"; + public static final String EVENT_ACCOUNT_DELETE = "ACCOUNT.DELETE"; + public static final String EVENT_ACCOUNT_MARK_DEFAULT_ZONE = "ACCOUNT.MARK.DEFAULT.ZONE"; + + // UserVO Events + public static final String EVENT_USER_LOGIN = "USER.LOGIN"; + public static final String EVENT_USER_LOGOUT = "USER.LOGOUT"; + public static final String EVENT_USER_CREATE = "USER.CREATE"; + public static final String EVENT_USER_DELETE = "USER.DELETE"; + public static final String EVENT_USER_DISABLE = "USER.DISABLE"; + public static final String EVENT_USER_UPDATE = "USER.UPDATE"; + public static final String EVENT_USER_ENABLE = "USER.ENABLE"; + public static final String EVENT_USER_LOCK = "USER.LOCK"; + + // Template Events + public static final String EVENT_TEMPLATE_CREATE = "TEMPLATE.CREATE"; + public static final String EVENT_TEMPLATE_DELETE = "TEMPLATE.DELETE"; + public static final String EVENT_TEMPLATE_UPDATE = "TEMPLATE.UPDATE"; + public static final String EVENT_TEMPLATE_DOWNLOAD_START = "TEMPLATE.DOWNLOAD.START"; + public static final String EVENT_TEMPLATE_DOWNLOAD_SUCCESS = "TEMPLATE.DOWNLOAD.SUCCESS"; + public static final String EVENT_TEMPLATE_DOWNLOAD_FAILED = "TEMPLATE.DOWNLOAD.FAILED"; + public static final String EVENT_TEMPLATE_COPY = "TEMPLATE.COPY"; + public static final String EVENT_TEMPLATE_EXTRACT = "TEMPLATE.EXTRACT"; + public static final String EVENT_TEMPLATE_UPLOAD = "TEMPLATE.UPLOAD"; + public static final String EVENT_TEMPLATE_CLEANUP = "TEMPLATE.CLEANUP"; + + // Volume Events + public static final String EVENT_VOLUME_CREATE = "VOLUME.CREATE"; + public static final String EVENT_VOLUME_DELETE = "VOLUME.DELETE"; + public static final String EVENT_VOLUME_ATTACH = "VOLUME.ATTACH"; + public static final String EVENT_VOLUME_DETACH = "VOLUME.DETACH"; + public static final String EVENT_VOLUME_EXTRACT = "VOLUME.EXTRACT"; + public static final String EVENT_VOLUME_UPLOAD = "VOLUME.UPLOAD"; + public static final String EVENT_VOLUME_MIGRATE = "VOLUME.MIGRATE"; + + // Domains + public static final String EVENT_DOMAIN_CREATE = "DOMAIN.CREATE"; + public static final String EVENT_DOMAIN_DELETE = "DOMAIN.DELETE"; + public static final String EVENT_DOMAIN_UPDATE = "DOMAIN.UPDATE"; + + // Snapshots + public static final String EVENT_SNAPSHOT_CREATE = "SNAPSHOT.CREATE"; + public static final String EVENT_SNAPSHOT_DELETE = "SNAPSHOT.DELETE"; + public static final String EVENT_SNAPSHOT_POLICY_CREATE = "SNAPSHOTPOLICY.CREATE"; + public static final String EVENT_SNAPSHOT_POLICY_UPDATE = "SNAPSHOTPOLICY.UPDATE"; + public static final String EVENT_SNAPSHOT_POLICY_DELETE = "SNAPSHOTPOLICY.DELETE"; + + // ISO + public static final String EVENT_ISO_CREATE = "ISO.CREATE"; + public static final String EVENT_ISO_DELETE = "ISO.DELETE"; + public static final String EVENT_ISO_COPY = "ISO.COPY"; + public static final String EVENT_ISO_ATTACH = "ISO.ATTACH"; + public static final String EVENT_ISO_DETACH = "ISO.DETACH"; + public static final String EVENT_ISO_EXTRACT = "ISO.EXTRACT"; + public static final String EVENT_ISO_UPLOAD = "ISO.UPLOAD"; + + // SSVM + public static final String EVENT_SSVM_CREATE = "SSVM.CREATE"; + public static final String EVENT_SSVM_DESTROY = "SSVM.DESTROY"; + public static final String EVENT_SSVM_START = "SSVM.START"; + public static final String EVENT_SSVM_STOP = "SSVM.STOP"; + public static final String EVENT_SSVM_REBOOT = "SSVM.REBOOT"; + public static final String EVENT_SSVM_HA = "SSVM.HA"; + + // Service Offerings + public static final String EVENT_SERVICE_OFFERING_CREATE = "SERVICE.OFFERING.CREATE"; + public static final String EVENT_SERVICE_OFFERING_EDIT = "SERVICE.OFFERING.EDIT"; + public static final String EVENT_SERVICE_OFFERING_DELETE = "SERVICE.OFFERING.DELETE"; + + // Disk Offerings + public static final String EVENT_DISK_OFFERING_CREATE = "DISK.OFFERING.CREATE"; + public static final String EVENT_DISK_OFFERING_EDIT = "DISK.OFFERING.EDIT"; + public static final String EVENT_DISK_OFFERING_DELETE = "DISK.OFFERING.DELETE"; + + // Network offerings + public static final String EVENT_NETWORK_OFFERING_CREATE = "NETWORK.OFFERING.CREATE"; + public static final String EVENT_NETWORK_OFFERING_ASSIGN = "NETWORK.OFFERING.ASSIGN"; + public static final String EVENT_NETWORK_OFFERING_EDIT = "NETWORK.OFFERING.EDIT"; + public static final String EVENT_NETWORK_OFFERING_REMOVE = "NETWORK.OFFERING.REMOVE"; + public static final String EVENT_NETWORK_OFFERING_DELETE = "NETWORK.OFFERING.DELETE"; + + // Pods + public static final String EVENT_POD_CREATE = "POD.CREATE"; + public static final String EVENT_POD_EDIT = "POD.EDIT"; + public static final String EVENT_POD_DELETE = "POD.DELETE"; + + // Zones + public static final String EVENT_ZONE_CREATE = "ZONE.CREATE"; + public static final String EVENT_ZONE_EDIT = "ZONE.EDIT"; + public static final String EVENT_ZONE_DELETE = "ZONE.DELETE"; + + // VLANs/IP ranges + public static final String EVENT_VLAN_IP_RANGE_CREATE = "VLAN.IP.RANGE.CREATE"; + public static final String EVENT_VLAN_IP_RANGE_DELETE = "VLAN.IP.RANGE.DELETE"; + + public static final String EVENT_STORAGE_IP_RANGE_CREATE = "STORAGE.IP.RANGE.CREATE"; + public static final String EVENT_STORAGE_IP_RANGE_DELETE = "STORAGE.IP.RANGE.DELETE"; + public static final String EVENT_STORAGE_IP_RANGE_UPDATE = "STORAGE.IP.RANGE.UPDATE"; + + // Configuration Table + public static final String EVENT_CONFIGURATION_VALUE_EDIT = "CONFIGURATION.VALUE.EDIT"; + + // Security Groups + public static final String EVENT_SECURITY_GROUP_AUTHORIZE_INGRESS = "SG.AUTH.INGRESS"; + public static final String EVENT_SECURITY_GROUP_REVOKE_INGRESS = "SG.REVOKE.INGRESS"; + public static final String EVENT_SECURITY_GROUP_AUTHORIZE_EGRESS = "SG.AUTH.EGRESS"; + public static final String EVENT_SECURITY_GROUP_REVOKE_EGRESS = "SG.REVOKE.EGRESS"; + public static final String EVENT_SECURITY_GROUP_CREATE = "SG.CREATE"; + public static final String EVENT_SECURITY_GROUP_DELETE = "SG.DELETE"; + public static final String EVENT_SECURITY_GROUP_ASSIGN = "SG.ASSIGN"; + public static final String EVENT_SECURITY_GROUP_REMOVE = "SG.REMOVE"; + + // Host + public static final String EVENT_HOST_RECONNECT = "HOST.RECONNECT"; + + // Maintenance + public static final String EVENT_MAINTENANCE_CANCEL = "MAINT.CANCEL"; + public static final String EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE = "MAINT.CANCEL.PS"; + public static final String EVENT_MAINTENANCE_PREPARE = "MAINT.PREPARE"; + public static final String EVENT_MAINTENANCE_PREPARE_PRIMARY_STORAGE = "MAINT.PREPARE.PS"; + + // VPN + public static final String EVENT_REMOTE_ACCESS_VPN_CREATE = "VPN.REMOTE.ACCESS.CREATE"; + public static final String EVENT_REMOTE_ACCESS_VPN_DESTROY = "VPN.REMOTE.ACCESS.DESTROY"; + public static final String EVENT_VPN_USER_ADD = "VPN.USER.ADD"; + public static final String EVENT_VPN_USER_REMOVE = "VPN.USER.REMOVE"; + public static final String EVENT_S2S_VPN_GATEWAY_CREATE = "VPN.S2S.VPN.GATEWAY.CREATE"; + public static final String EVENT_S2S_VPN_GATEWAY_DELETE = "VPN.S2S.VPN.GATEWAY.DELETE"; + public static final String EVENT_S2S_CUSTOMER_GATEWAY_CREATE = "VPN.S2S.CUSTOMER.GATEWAY.CREATE"; + public static final String EVENT_S2S_CUSTOMER_GATEWAY_DELETE = "VPN.S2S.CUSTOMER.GATEWAY.DELETE"; + public static final String EVENT_S2S_CUSTOMER_GATEWAY_UPDATE = "VPN.S2S.CUSTOMER.GATEWAY.UPDATE"; + public static final String EVENT_S2S_CONNECTION_CREATE = "VPN.S2S.CONNECTION.CREATE"; + public static final String EVENT_S2S_CONNECTION_DELETE = "VPN.S2S.CONNECTION.DELETE"; + public static final String EVENT_S2S_CONNECTION_RESET = "VPN.S2S.CONNECTION.RESET"; + + // Network + public static final String EVENT_NETWORK_RESTART = "NETWORK.RESTART"; + + // Custom certificates + public static final String EVENT_UPLOAD_CUSTOM_CERTIFICATE = "UPLOAD.CUSTOM.CERTIFICATE"; + + // OneToOnenat + public static final String EVENT_ENABLE_STATIC_NAT = "STATICNAT.ENABLE"; + public static final String EVENT_DISABLE_STATIC_NAT = "STATICNAT.DISABLE"; + + public static final String EVENT_ZONE_VLAN_ASSIGN = "ZONE.VLAN.ASSIGN"; + public static final String EVENT_ZONE_VLAN_RELEASE = "ZONE.VLAN.RELEASE"; + + // Projects + public static final String EVENT_PROJECT_CREATE = "PROJECT.CREATE"; + public static final String EVENT_PROJECT_UPDATE = "PROJECT.UPDATE"; + public static final String EVENT_PROJECT_DELETE = "PROJECT.DELETE"; + public static final String EVENT_PROJECT_ACTIVATE = "PROJECT.ACTIVATE"; + public static final String EVENT_PROJECT_SUSPEND = "PROJECT.SUSPEND"; + public static final String EVENT_PROJECT_ACCOUNT_ADD = "PROJECT.ACCOUNT.ADD"; + public static final String EVENT_PROJECT_INVITATION_UPDATE = "PROJECT.INVITATION.UPDATE"; + public static final String EVENT_PROJECT_INVITATION_REMOVE = "PROJECT.INVITATION.REMOVE"; + public static final String EVENT_PROJECT_ACCOUNT_REMOVE = "PROJECT.ACCOUNT.REMOVE"; + + // Network as a Service + public static final String EVENT_NETWORK_ELEMENT_CONFIGURE = "NETWORK.ELEMENT.CONFIGURE"; + + // Physical Network Events + public static final String EVENT_PHYSICAL_NETWORK_CREATE = "PHYSICAL.NETWORK.CREATE"; + public static final String EVENT_PHYSICAL_NETWORK_DELETE = "PHYSICAL.NETWORK.DELETE"; + public static final String EVENT_PHYSICAL_NETWORK_UPDATE = "PHYSICAL.NETWORK.UPDATE"; + + // Physical Network Service Provider Events + public static final String EVENT_SERVICE_PROVIDER_CREATE = "SERVICE.PROVIDER.CREATE"; + public static final String EVENT_SERVICE_PROVIDER_DELETE = "SERVICE.PROVIDER.DELETE"; + public static final String EVENT_SERVICE_PROVIDER_UPDATE = "SERVICE.PROVIDER.UPDATE"; + + // Physical Network TrafficType Events + public static final String EVENT_TRAFFIC_TYPE_CREATE = "TRAFFIC.TYPE.CREATE"; + public static final String EVENT_TRAFFIC_TYPE_DELETE = "TRAFFIC.TYPE.DELETE"; + public static final String EVENT_TRAFFIC_TYPE_UPDATE = "TRAFFIC.TYPE.UPDATE"; + + // external network device events + public static final String EVENT_EXTERNAL_LB_DEVICE_ADD = "PHYSICAL.LOADBALANCER.ADD"; + public static final String EVENT_EXTERNAL_LB_DEVICE_DELETE = "PHYSICAL.LOADBALANCER.DELETE"; + public static final String EVENT_EXTERNAL_LB_DEVICE_CONFIGURE = "PHYSICAL.LOADBALANCER.CONFIGURE"; + + // external switch management device events (E.g.: Cisco Nexus 1000v Virtual Supervisor Module. + public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ADD = "SWITCH.MGMT.ADD"; + public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DELETE = "SWITCH.MGMT.DELETE"; + public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_CONFIGURE = "SWITCH.MGMT.CONFIGURE"; + public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ENABLE = "SWITCH.MGMT.ENABLE"; + public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DISABLE = "SWITCH.MGMT.DISABLE"; + + public static final String EVENT_EXTERNAL_FIREWALL_DEVICE_ADD = "PHYSICAL.FIREWALL.ADD"; + public static final String EVENT_EXTERNAL_FIREWALL_DEVICE_DELETE = "PHYSICAL.FIREWALL.DELETE"; + public static final String EVENT_EXTERNAL_FIREWALL_DEVICE_CONFIGURE = "PHYSICAL.FIREWALL.CONFIGURE"; + + // tag related events + public static final String EVENT_TAGS_CREATE = "CREATE_TAGS"; + public static final String EVENT_TAGS_DELETE = "DELETE_TAGS"; + + // VPC + public static final String EVENT_VPC_CREATE = "VPC.CREATE"; + public static final String EVENT_VPC_UPDATE = "VPC.UPDATE"; + public static final String EVENT_VPC_DELETE = "VPC.DELETE"; + public static final String EVENT_VPC_RESTART = "VPC.RESTART"; + + // VPC offerings + public static final String EVENT_VPC_OFFERING_CREATE = "VPC.OFFERING.CREATE"; + public static final String EVENT_VPC_OFFERING_UPDATE = "VPC.OFFERING.UPDATE"; + public static final String EVENT_VPC_OFFERING_DELETE = "VPC.OFFERING.DELETE"; + + // Private gateway + public static final String EVENT_PRIVATE_GATEWAY_CREATE = "PRIVATE.GATEWAY.CREATE"; + public static final String EVENT_PRIVATE_GATEWAY_DELETE = "PRIVATE.GATEWAY.DELETE"; + + // Static routes + public static final String EVENT_STATIC_ROUTE_CREATE = "STATIC.ROUTE.CREATE"; + public static final String EVENT_STATIC_ROUTE_DELETE = "STATIC.ROUTE.DELETE"; + + // AutoScale + public static final String EVENT_COUNTER_CREATE = "COUNTER.CREATE"; + public static final String EVENT_COUNTER_DELETE = "COUNTER.DELETE"; + public static final String EVENT_CONDITION_CREATE = "CONDITION.CREATE"; + public static final String EVENT_CONDITION_DELETE = "CONDITION.DELETE"; + public static final String EVENT_AUTOSCALEPOLICY_CREATE = "AUTOSCALEPOLICY.CREATE"; + public static final String EVENT_AUTOSCALEPOLICY_UPDATE = "AUTOSCALEPOLICY.UPDATE"; + public static final String EVENT_AUTOSCALEPOLICY_DELETE = "AUTOSCALEPOLICY.DELETE"; + public static final String EVENT_AUTOSCALEVMPROFILE_CREATE = "AUTOSCALEVMPROFILE.CREATE"; + public static final String EVENT_AUTOSCALEVMPROFILE_DELETE = "AUTOSCALEVMPROFILE.DELETE"; + public static final String EVENT_AUTOSCALEVMPROFILE_UPDATE = "AUTOSCALEVMPROFILE.UPDATE"; + public static final String EVENT_AUTOSCALEVMGROUP_CREATE = "AUTOSCALEVMGROUP.CREATE"; + public static final String EVENT_AUTOSCALEVMGROUP_DELETE = "AUTOSCALEVMGROUP.DELETE"; + public static final String EVENT_AUTOSCALEVMGROUP_UPDATE = "AUTOSCALEVMGROUP.UPDATE"; +} diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index b8ebb93fe8a..e629b0b8d9b 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -1,293 +1,295 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; - -import com.cloud.acl.ControlledEntity; -import com.cloud.network.Networks.BroadcastDomainType; -import com.cloud.network.Networks.Mode; -import com.cloud.network.Networks.TrafficType; -import com.cloud.utils.fsm.FiniteState; -import com.cloud.utils.fsm.StateMachine; - -/** - * owned by an account. - */ -public interface Network extends ControlledEntity { - - public enum GuestType { - Shared, - Isolated - } - - public static class Service { - private static List supportedServices = new ArrayList(); - - public static final Service Vpn = new Service("Vpn", Capability.SupportedVpnProtocols, Capability.VpnTypes); - public static final Service Dhcp = new Service("Dhcp"); - public static final Service Dns = new Service("Dns", Capability.AllowDnsSuffixModification); - public static final Service Gateway = new Service("Gateway"); - public static final Service Firewall = new Service("Firewall", Capability.SupportedProtocols, - Capability.MultipleIps, Capability.TrafficStatistics); - public static final Service Lb = new Service("Lb", Capability.SupportedLBAlgorithms, Capability.SupportedLBIsolation, - Capability.SupportedProtocols, Capability.TrafficStatistics, Capability.LoadBalancingSupportedIps, - Capability.SupportedStickinessMethods, Capability.ElasticLb); - public static final Service UserData = new Service("UserData"); - public static final Service SourceNat = new Service("SourceNat", Capability.SupportedSourceNatTypes, Capability.RedundantRouter); - public static final Service StaticNat = new Service("StaticNat", Capability.ElasticIp); - public static final Service PortForwarding = new Service("PortForwarding"); - public static final Service SecurityGroup = new Service("SecurityGroup"); - public static final Service NetworkACL = new Service("NetworkACL", Capability.SupportedProtocols); - - private String name; - private Capability[] caps; - - public Service(String name, Capability... caps) { - this.name = name; - this.caps = caps; - supportedServices.add(this); - } - - public String getName() { - return name; - } - - public Capability[] getCapabilities() { - return caps; - } - - public boolean containsCapability(Capability cap) { - boolean success = false; - if (caps != null) { - int length = caps.length; - for (int i = 0; i< length; i++) { - if (caps[i].getName().equalsIgnoreCase(cap.getName())) { - success = true; - break; - } - } - } - - return success; - } - - public static Service getService(String serviceName) { - for (Service service : supportedServices) { - if (service.getName().equalsIgnoreCase(serviceName)) { - return service; - } - } - return null; - } - - public static List listAllServices(){ - return supportedServices; - } - } - - /** - * Provider -> NetworkElement must always be one-to-one mapping. Thus for each NetworkElement we need a separate Provider added in here. - */ - public static class Provider { - private static List supportedProviders = new ArrayList(); - - public static final Provider VirtualRouter = new Provider("VirtualRouter", false); - public static final Provider JuniperSRX = new Provider("JuniperSRX", true); - public static final Provider F5BigIp = new Provider("F5BigIp", true); - public static final Provider Netscaler = new Provider("Netscaler", true); - public static final Provider ExternalDhcpServer = new Provider("ExternalDhcpServer", true); - public static final Provider ExternalGateWay = new Provider("ExternalGateWay", true); - public static final Provider ElasticLoadBalancerVm = new Provider("ElasticLoadBalancerVm", false); - public static final Provider SecurityGroupProvider = new Provider("SecurityGroupProvider", false); - public static final Provider VPCVirtualRouter = new Provider("VpcVirtualRouter", false); - public static final Provider None = new Provider("None", false); - - private String name; - private boolean isExternal; - - public Provider(String name, boolean isExternal) { - this.name = name; - this.isExternal = isExternal; - supportedProviders.add(this); - } - - public String getName() { - return name; - } - - public boolean isExternal() { - return isExternal; - } - - public static Provider getProvider(String providerName) { - for (Provider provider : supportedProviders) { - if (provider.getName().equalsIgnoreCase(providerName)) { - return provider; - } - } - return null; - } - } - - public static class Capability { - - private static List supportedCapabilities = new ArrayList(); - - public static final Capability SupportedProtocols = new Capability("SupportedProtocols"); - public static final Capability SupportedLBAlgorithms = new Capability("SupportedLbAlgorithms"); - public static final Capability SupportedLBIsolation = new Capability("SupportedLBIsolation"); - public static final Capability SupportedStickinessMethods = new Capability("SupportedStickinessMethods"); - public static final Capability MultipleIps = new Capability("MultipleIps"); - public static final Capability SupportedSourceNatTypes = new Capability("SupportedSourceNatTypes"); - public static final Capability SupportedVpnProtocols = new Capability("SupportedVpnTypes"); - public static final Capability VpnTypes = new Capability("VpnTypes"); - public static final Capability TrafficStatistics = new Capability("TrafficStatistics"); - public static final Capability LoadBalancingSupportedIps = new Capability("LoadBalancingSupportedIps"); - public static final Capability AllowDnsSuffixModification = new Capability("AllowDnsSuffixModification"); - public static final Capability RedundantRouter = new Capability("RedundantRouter"); - public static final Capability ElasticIp = new Capability("ElasticIp"); - public static final Capability ElasticLb = new Capability("ElasticLb"); - - private String name; - - public Capability(String name) { - this.name = name; - supportedCapabilities.add(this); - } - - public String getName() { - return name; - } - - public static Capability getCapability(String capabilityName) { - for (Capability capability : supportedCapabilities) { - if (capability.getName().equalsIgnoreCase(capabilityName)) { - return capability; - } - } - return null; - } - } - - enum Event { - ImplementNetwork, - DestroyNetwork, - OperationSucceeded, - OperationFailed; - } - - enum State implements FiniteState { - Allocated("Indicates the network configuration is in allocated but not setup"), - Setup("Indicates the network configuration is setup"), - Implementing("Indicates the network configuration is being implemented"), - Implemented("Indicates the network configuration is in use"), - Shutdown("Indicates the network configuration is being destroyed"), - Destroy("Indicates that the network is destroyed"); - - - @Override - public StateMachine getStateMachine() { - return s_fsm; - } - - @Override - public State getNextState(Event event) { - return s_fsm.getNextState(this, event); - } - - @Override - public List getFromStates(Event event) { - return s_fsm.getFromStates(this, event); - } - - @Override - public Set getPossibleEvents() { - return s_fsm.getPossibleEvents(this); - } - - String _description; - - @Override - public String getDescription() { - return _description; - } - - private State(String description) { - _description = description; - } - - private static StateMachine s_fsm = new StateMachine(); - static { - s_fsm.addTransition(State.Allocated, Event.ImplementNetwork, State.Implementing); - s_fsm.addTransition(State.Implementing, Event.OperationSucceeded, State.Implemented); - s_fsm.addTransition(State.Implementing, Event.OperationFailed, State.Shutdown); - s_fsm.addTransition(State.Implemented, Event.DestroyNetwork, State.Shutdown); - s_fsm.addTransition(State.Shutdown, Event.OperationSucceeded, State.Allocated); - s_fsm.addTransition(State.Shutdown, Event.OperationFailed, State.Implemented); - } - } - - /** - * @return id of the network profile. Null means the network profile is not from the database. - */ - long getId(); - - String getName(); - - Mode getMode(); - - BroadcastDomainType getBroadcastDomainType(); - - TrafficType getTrafficType(); - - String getGateway(); - - String getCidr(); - - long getDataCenterId(); - - long getNetworkOfferingId(); - - State getState(); - - long getRelated(); - - URI getBroadcastUri(); - - String getDisplayText(); - - String getReservationId(); - - String getNetworkDomain(); - - GuestType getGuestType(); - - Long getPhysicalNetworkId(); - - void setPhysicalNetworkId(Long physicalNetworkId); - - ACLType getAclType(); - - boolean isRestartRequired(); - - boolean getSpecifyIpRanges(); - - /** - * @return - */ - Long getVpcId(); -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import com.cloud.acl.ControlledEntity; +import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.Networks.Mode; +import com.cloud.network.Networks.TrafficType; +import com.cloud.utils.fsm.FiniteState; +import com.cloud.utils.fsm.StateMachine; + +/** + * owned by an account. + */ +public interface Network extends ControlledEntity { + + public enum GuestType { + Shared, + Isolated + } + + public static class Service { + private static List supportedServices = new ArrayList(); + + public static final Service Vpn = new Service("Vpn", Capability.SupportedVpnProtocols, Capability.VpnTypes); + public static final Service Dhcp = new Service("Dhcp"); + public static final Service Dns = new Service("Dns", Capability.AllowDnsSuffixModification); + public static final Service Gateway = new Service("Gateway"); + public static final Service Firewall = new Service("Firewall", Capability.SupportedProtocols, + Capability.MultipleIps, Capability.TrafficStatistics); + public static final Service Lb = new Service("Lb", Capability.SupportedLBAlgorithms, Capability.SupportedLBIsolation, + Capability.SupportedProtocols, Capability.TrafficStatistics, Capability.LoadBalancingSupportedIps, + Capability.SupportedStickinessMethods, Capability.ElasticLb); + public static final Service UserData = new Service("UserData"); + public static final Service SourceNat = new Service("SourceNat", Capability.SupportedSourceNatTypes, Capability.RedundantRouter); + public static final Service StaticNat = new Service("StaticNat", Capability.ElasticIp); + public static final Service PortForwarding = new Service("PortForwarding"); + public static final Service SecurityGroup = new Service("SecurityGroup"); + public static final Service NetworkACL = new Service("NetworkACL", Capability.SupportedProtocols); + + private String name; + private Capability[] caps; + + public Service(String name, Capability... caps) { + this.name = name; + this.caps = caps; + supportedServices.add(this); + } + + public String getName() { + return name; + } + + public Capability[] getCapabilities() { + return caps; + } + + public boolean containsCapability(Capability cap) { + boolean success = false; + if (caps != null) { + int length = caps.length; + for (int i = 0; i< length; i++) { + if (caps[i].getName().equalsIgnoreCase(cap.getName())) { + success = true; + break; + } + } + } + + return success; + } + + public static Service getService(String serviceName) { + for (Service service : supportedServices) { + if (service.getName().equalsIgnoreCase(serviceName)) { + return service; + } + } + return null; + } + + public static List listAllServices(){ + return supportedServices; + } + } + + /** + * Provider -> NetworkElement must always be one-to-one mapping. Thus for each NetworkElement we need a separate Provider added in here. + */ + public static class Provider { + private static List supportedProviders = new ArrayList(); + + public static final Provider VirtualRouter = new Provider("VirtualRouter", false); + public static final Provider JuniperSRX = new Provider("JuniperSRX", true); + public static final Provider F5BigIp = new Provider("F5BigIp", true); + public static final Provider Netscaler = new Provider("Netscaler", true); + public static final Provider ExternalDhcpServer = new Provider("ExternalDhcpServer", true); + public static final Provider ExternalGateWay = new Provider("ExternalGateWay", true); + public static final Provider ElasticLoadBalancerVm = new Provider("ElasticLoadBalancerVm", false); + public static final Provider SecurityGroupProvider = new Provider("SecurityGroupProvider", false); + public static final Provider VPCVirtualRouter = new Provider("VpcVirtualRouter", false); + public static final Provider None = new Provider("None", false); + + private String name; + private boolean isExternal; + + public Provider(String name, boolean isExternal) { + this.name = name; + this.isExternal = isExternal; + supportedProviders.add(this); + } + + public String getName() { + return name; + } + + public boolean isExternal() { + return isExternal; + } + + public static Provider getProvider(String providerName) { + for (Provider provider : supportedProviders) { + if (provider.getName().equalsIgnoreCase(providerName)) { + return provider; + } + } + return null; + } + } + + public static class Capability { + + private static List supportedCapabilities = new ArrayList(); + + public static final Capability SupportedProtocols = new Capability("SupportedProtocols"); + public static final Capability SupportedLBAlgorithms = new Capability("SupportedLbAlgorithms"); + public static final Capability SupportedLBIsolation = new Capability("SupportedLBIsolation"); + public static final Capability SupportedStickinessMethods = new Capability("SupportedStickinessMethods"); + public static final Capability MultipleIps = new Capability("MultipleIps"); + public static final Capability SupportedSourceNatTypes = new Capability("SupportedSourceNatTypes"); + public static final Capability SupportedVpnProtocols = new Capability("SupportedVpnTypes"); + public static final Capability VpnTypes = new Capability("VpnTypes"); + public static final Capability TrafficStatistics = new Capability("TrafficStatistics"); + public static final Capability LoadBalancingSupportedIps = new Capability("LoadBalancingSupportedIps"); + public static final Capability AllowDnsSuffixModification = new Capability("AllowDnsSuffixModification"); + public static final Capability RedundantRouter = new Capability("RedundantRouter"); + public static final Capability ElasticIp = new Capability("ElasticIp"); + public static final Capability ElasticLb = new Capability("ElasticLb"); + public static final Capability AutoScaleCounters = new Capability("AutoScaleCounters"); + + + private String name; + + public Capability(String name) { + this.name = name; + supportedCapabilities.add(this); + } + + public String getName() { + return name; + } + + public static Capability getCapability(String capabilityName) { + for (Capability capability : supportedCapabilities) { + if (capability.getName().equalsIgnoreCase(capabilityName)) { + return capability; + } + } + return null; + } + } + + enum Event { + ImplementNetwork, + DestroyNetwork, + OperationSucceeded, + OperationFailed; + } + + enum State implements FiniteState { + Allocated("Indicates the network configuration is in allocated but not setup"), + Setup("Indicates the network configuration is setup"), + Implementing("Indicates the network configuration is being implemented"), + Implemented("Indicates the network configuration is in use"), + Shutdown("Indicates the network configuration is being destroyed"), + Destroy("Indicates that the network is destroyed"); + + + @Override + public StateMachine getStateMachine() { + return s_fsm; + } + + @Override + public State getNextState(Event event) { + return s_fsm.getNextState(this, event); + } + + @Override + public List getFromStates(Event event) { + return s_fsm.getFromStates(this, event); + } + + @Override + public Set getPossibleEvents() { + return s_fsm.getPossibleEvents(this); + } + + String _description; + + @Override + public String getDescription() { + return _description; + } + + private State(String description) { + _description = description; + } + + private static StateMachine s_fsm = new StateMachine(); + static { + s_fsm.addTransition(State.Allocated, Event.ImplementNetwork, State.Implementing); + s_fsm.addTransition(State.Implementing, Event.OperationSucceeded, State.Implemented); + s_fsm.addTransition(State.Implementing, Event.OperationFailed, State.Shutdown); + s_fsm.addTransition(State.Implemented, Event.DestroyNetwork, State.Shutdown); + s_fsm.addTransition(State.Shutdown, Event.OperationSucceeded, State.Allocated); + s_fsm.addTransition(State.Shutdown, Event.OperationFailed, State.Implemented); + } + } + + /** + * @return id of the network profile. Null means the network profile is not from the database. + */ + long getId(); + + String getName(); + + Mode getMode(); + + BroadcastDomainType getBroadcastDomainType(); + + TrafficType getTrafficType(); + + String getGateway(); + + String getCidr(); + + long getDataCenterId(); + + long getNetworkOfferingId(); + + State getState(); + + long getRelated(); + + URI getBroadcastUri(); + + String getDisplayText(); + + String getReservationId(); + + String getNetworkDomain(); + + GuestType getGuestType(); + + Long getPhysicalNetworkId(); + + void setPhysicalNetworkId(Long physicalNetworkId); + + ACLType getAclType(); + + boolean isRestartRequired(); + + boolean getSpecifyIpRanges(); + + /** + * @return + */ + Long getVpcId(); +} diff --git a/api/src/com/cloud/network/as/AutoScalePolicy.java b/api/src/com/cloud/network/as/AutoScalePolicy.java new file mode 100644 index 00000000000..f14d10b2d97 --- /dev/null +++ b/api/src/com/cloud/network/as/AutoScalePolicy.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as; + +import com.cloud.acl.ControlledEntity; + +public interface AutoScalePolicy extends ControlledEntity { + + long getId(); + + public Integer getDuration(); + + public Integer getQuietTime(); + + public String getAction(); + +} \ No newline at end of file diff --git a/api/src/com/cloud/network/as/AutoScaleService.java b/api/src/com/cloud/network/as/AutoScaleService.java new file mode 100644 index 00000000000..f4b9ddd1dc6 --- /dev/null +++ b/api/src/com/cloud/network/as/AutoScaleService.java @@ -0,0 +1,80 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import java.util.List; + +import com.cloud.api.commands.CreateAutoScalePolicyCmd; +import com.cloud.api.commands.CreateAutoScaleVmGroupCmd; +import com.cloud.api.commands.CreateAutoScaleVmProfileCmd; +import com.cloud.api.commands.CreateConditionCmd; +import com.cloud.api.commands.CreateCounterCmd; +import com.cloud.api.commands.ListAutoScalePoliciesCmd; +import com.cloud.api.commands.ListAutoScaleVmGroupsCmd; +import com.cloud.api.commands.ListAutoScaleVmProfilesCmd; +import com.cloud.api.commands.ListConditionsCmd; +import com.cloud.api.commands.ListCountersCmd; +import com.cloud.api.commands.UpdateAutoScalePolicyCmd; +import com.cloud.api.commands.UpdateAutoScaleVmGroupCmd; +import com.cloud.api.commands.UpdateAutoScaleVmProfileCmd; +import com.cloud.exception.ResourceInUseException; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.as.Condition; +import com.cloud.network.as.Counter; + +public interface AutoScaleService { + + public AutoScalePolicy createAutoScalePolicy(CreateAutoScalePolicyCmd createAutoScalePolicyCmd); + + public boolean deleteAutoScalePolicy(long autoScalePolicyId); + + List listAutoScalePolicies(ListAutoScalePoliciesCmd cmd); + + AutoScalePolicy updateAutoScalePolicy(UpdateAutoScalePolicyCmd cmd); + + AutoScaleVmProfile createAutoScaleVmProfile(CreateAutoScaleVmProfileCmd cmd); + + boolean deleteAutoScaleVmProfile(long profileId); + + List listAutoScaleVmProfiles(ListAutoScaleVmProfilesCmd listAutoScaleVmProfilesCmd); + + AutoScaleVmProfile updateAutoScaleVmProfile(UpdateAutoScaleVmProfileCmd cmd); + + AutoScaleVmGroup createAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd); + + boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd); + + boolean deleteAutoScaleVmGroup(long vmGroupId); + + AutoScaleVmGroup updateAutoScaleVmGroup(UpdateAutoScaleVmGroupCmd cmd); + + AutoScaleVmGroup enableAutoScaleVmGroup(Long id); + + AutoScaleVmGroup disableAutoScaleVmGroup(Long id); + + List listAutoScaleVmGroups(ListAutoScaleVmGroupsCmd listAutoScaleVmGroupsCmd); + + Counter createCounter(CreateCounterCmd cmd); + + boolean deleteCounter(long counterId) throws ResourceInUseException; + + List listCounters(ListCountersCmd cmd); + + Condition createCondition(CreateConditionCmd cmd); + + List listConditions(ListConditionsCmd cmd); + + boolean deleteCondition(long conditionId) throws ResourceInUseException; +} diff --git a/api/src/com/cloud/network/as/AutoScaleVmGroup.java b/api/src/com/cloud/network/as/AutoScaleVmGroup.java new file mode 100644 index 00000000000..291739e49d3 --- /dev/null +++ b/api/src/com/cloud/network/as/AutoScaleVmGroup.java @@ -0,0 +1,53 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as; + +import com.cloud.acl.ControlledEntity; + +/** + * @author Deepak Garg + */ + +public interface AutoScaleVmGroup extends ControlledEntity { + + static enum Operator { + EQ, GT, LT, GE, LE + }; + + long getId(); + + @Override + long getAccountId(); + + long getLoadBalancerId(); + + long getProfileId(); + + int getMinMembers(); + + int getMaxMembers(); + + int getMemberPort(); + + int getInterval(); + + boolean isRevoke(); + + String getState(); + +} \ No newline at end of file diff --git a/api/src/com/cloud/network/as/AutoScaleVmProfile.java b/api/src/com/cloud/network/as/AutoScaleVmProfile.java new file mode 100644 index 00000000000..02719ee2059 --- /dev/null +++ b/api/src/com/cloud/network/as/AutoScaleVmProfile.java @@ -0,0 +1,38 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by the License. +// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +package com.cloud.network.as; + +import com.cloud.acl.ControlledEntity; + +/** + * AutoScaleVmProfile + */ +public interface AutoScaleVmProfile extends ControlledEntity { + + public long getId(); + + public Long getZoneId(); + + public Long getServiceOfferingId(); + + public Long getTemplateId(); + + public String getOtherDeployParams(); + + public String getSnmpCommunity(); + + public Integer getSnmpPort(); + + public Integer getDestroyVmGraceperiod(); + + public long getAutoScaleUserId(); +} diff --git a/api/src/com/cloud/network/as/Condition.java b/api/src/com/cloud/network/as/Condition.java new file mode 100644 index 00000000000..117827d59de --- /dev/null +++ b/api/src/com/cloud/network/as/Condition.java @@ -0,0 +1,37 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as; + +import com.cloud.acl.ControlledEntity; + +public interface Condition extends ControlledEntity { + + static enum Operator { + EQ, GT, LT, GE, LE + }; + + long getCounterid(); + + long getThreshold(); + + Operator getRelationalOperator(); + + String getUuid(); + + long getId(); +} \ No newline at end of file diff --git a/api/src/com/cloud/network/as/Counter.java b/api/src/com/cloud/network/as/Counter.java new file mode 100644 index 00000000000..b4be1b8ec0e --- /dev/null +++ b/api/src/com/cloud/network/as/Counter.java @@ -0,0 +1,36 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as; + +public interface Counter { + + public static enum Source { + netscaler, + snmp + } + + String getName(); + + String getValue(); + + Source getSource(); + + String getUuid(); + + long getId(); +} \ No newline at end of file diff --git a/api/src/com/cloud/network/lb/LoadBalancingRule.java b/api/src/com/cloud/network/lb/LoadBalancingRule.java index fb789fd6d73..c0208c2352b 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRule.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java @@ -1,222 +1,443 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.lb; - -import java.util.List; - -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.LoadBalancer; -import com.cloud.utils.Pair; - -public class LoadBalancingRule implements FirewallRule, LoadBalancer{ - private LoadBalancer lb; - private List destinations; - private List stickinessPolicies; - - public LoadBalancingRule(LoadBalancer lb, List destinations, List stickinessPolicies) { - this.lb = lb; - this.destinations = destinations; - this.stickinessPolicies = stickinessPolicies; - } - - @Override - public long getId() { - return lb.getId(); - } - - @Override - public long getAccountId() { - return lb.getAccountId(); - } - - @Override - public long getDomainId() { - return lb.getDomainId(); - } - - @Override - public String getName() { - return lb.getName(); - } - - @Override - public String getDescription() { - return lb.getDescription(); - } - - public int getDefaultPortStart() { - return lb.getDefaultPortStart(); - } - - @Override - public int getDefaultPortEnd() { - return lb.getDefaultPortEnd(); - } - - @Override - public String getAlgorithm() { - return lb.getAlgorithm(); - } - - @Override - public String getXid() { - return lb.getXid(); - } - - @Override - public Long getSourceIpAddressId() { - return lb.getSourceIpAddressId(); - } - - @Override - public Integer getSourcePortStart() { - return lb.getSourcePortStart(); - } - - @Override - public Integer getSourcePortEnd() { - return lb.getSourcePortEnd(); - } - - @Override - public String getProtocol() { - return lb.getProtocol(); - } - - @Override - public Purpose getPurpose() { - return Purpose.LoadBalancing; - } - - @Override - public State getState() { - return lb.getState(); - } - - @Override - public long getNetworkId() { - return lb.getNetworkId(); - } - - public LoadBalancer getLb() { - return lb; - } - - public List getDestinations() { - return destinations; - } - - public List getStickinessPolicies() { - return stickinessPolicies; - } - - - public interface Destination { - String getIpAddress(); - int getDestinationPortStart(); - int getDestinationPortEnd(); - boolean isRevoked(); - } - - public static class LbStickinessPolicy { - private String _methodName; - private List> _params; - private boolean _revoke; - - public LbStickinessPolicy(String methodName, List> params, boolean revoke) { - this._methodName = methodName; - this._params = params; - this._revoke = revoke; - } - - public LbStickinessPolicy(String methodName, List> params) { - this._methodName = methodName; - this._params = params; - this._revoke = false; - } - - public String getMethodName() { - return _methodName; - } - - public List> getParams() { - return _params; - } - - public boolean isRevoked() { - return _revoke; - } - } - - public static class LbDestination implements Destination { - private int portStart; - private int portEnd; - private String ip; - boolean revoked; - - public LbDestination(int portStart, int portEnd, String ip, boolean revoked) { - this.portStart = portStart; - this.portEnd = portEnd; - this.ip = ip; - this.revoked = revoked; - } - - public String getIpAddress() { - return ip; - } - public int getDestinationPortStart() { - return portStart; - } - public int getDestinationPortEnd() { - return portEnd; - } - - public boolean isRevoked() { - return revoked; - } - - public void setRevoked(boolean revoked) { - this.revoked = revoked; - } - } - - @Override - public Integer getIcmpCode() { - return null; - } - - @Override - public Integer getIcmpType() { - return null; - } - - @Override - public List getSourceCidrList() { - return null; - } - - @Override - public Long getRelated() { - return null; - } - - @Override - public FirewallRuleType getType() { - return FirewallRuleType.User; - } - - @Override - public TrafficType getTrafficType() { - return null; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.lb; + +import java.util.List; + +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.as.Condition; +import com.cloud.network.as.Counter; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.utils.Pair; + +public class LoadBalancingRule implements FirewallRule, LoadBalancer{ + private final LoadBalancer lb; + private final List destinations; + private final List stickinessPolicies; + private LbAutoScaleVmGroup autoScaleVmGroup; + + public LoadBalancingRule(LoadBalancer lb, List destinations, List stickinessPolicies) { + this.lb = lb; + this.destinations = destinations; + this.stickinessPolicies = stickinessPolicies; + } + + @Override + public long getId() { + return lb.getId(); + } + + @Override + public long getAccountId() { + return lb.getAccountId(); + } + + @Override + public long getDomainId() { + return lb.getDomainId(); + } + + @Override + public String getName() { + return lb.getName(); + } + + @Override + public String getDescription() { + return lb.getDescription(); + } + + @Override + public int getDefaultPortStart() { + return lb.getDefaultPortStart(); + } + + @Override + public int getDefaultPortEnd() { + return lb.getDefaultPortEnd(); + } + + @Override + public String getAlgorithm() { + return lb.getAlgorithm(); + } + + @Override + public String getXid() { + return lb.getXid(); + } + + @Override + public Long getSourceIpAddressId() { + return lb.getSourceIpAddressId(); + } + + @Override + public Integer getSourcePortStart() { + return lb.getSourcePortStart(); + } + + @Override + public Integer getSourcePortEnd() { + return lb.getSourcePortEnd(); + } + + @Override + public String getProtocol() { + return lb.getProtocol(); + } + + @Override + public Purpose getPurpose() { + return Purpose.LoadBalancing; + } + + @Override + public State getState() { + return lb.getState(); + } + + @Override + public long getNetworkId() { + return lb.getNetworkId(); + } + + public LoadBalancer getLb() { + return lb; + } + + public List getDestinations() { + return destinations; + } + + public List getStickinessPolicies() { + return stickinessPolicies; + } + + + public interface Destination { + String getIpAddress(); + int getDestinationPortStart(); + int getDestinationPortEnd(); + boolean isRevoked(); + } + + public static class LbStickinessPolicy { + private final String _methodName; + private final List> _params; + private final boolean _revoke; + + public LbStickinessPolicy(String methodName, List> params, boolean revoke) { + this._methodName = methodName; + this._params = params; + this._revoke = revoke; + } + + public LbStickinessPolicy(String methodName, List> params) { + this._methodName = methodName; + this._params = params; + this._revoke = false; + } + + public String getMethodName() { + return _methodName; + } + + public List> getParams() { + return _params; + } + + public boolean isRevoked() { + return _revoke; + } + } + + public static class LbDestination implements Destination { + private final int portStart; + private final int portEnd; + private final String ip; + boolean revoked; + + public LbDestination(int portStart, int portEnd, String ip, boolean revoked) { + this.portStart = portStart; + this.portEnd = portEnd; + this.ip = ip; + this.revoked = revoked; + } + + @Override + public String getIpAddress() { + return ip; + } + @Override + public int getDestinationPortStart() { + return portStart; + } + @Override + public int getDestinationPortEnd() { + return portEnd; + } + + @Override + public boolean isRevoked() { + return revoked; + } + + public void setRevoked(boolean revoked) { + this.revoked = revoked; + } + } + + @Override + public Integer getIcmpCode() { + return null; + } + + @Override + public Integer getIcmpType() { + return null; + } + + @Override + public List getSourceCidrList() { + return null; + } + + @Override + public Long getRelated() { + return null; + } + + @Override + public FirewallRuleType getType() { + return FirewallRuleType.User; + } + + @Override + public TrafficType getTrafficType() { + return null; + } + + public LbAutoScaleVmGroup getAutoScaleVmGroup() { + return autoScaleVmGroup; + } + + public boolean isAutoScaleConfig() { + return this.autoScaleVmGroup != null; + } + + public void setAutoScaleVmGroup(LbAutoScaleVmGroup autoScaleVmGroup) { + this.autoScaleVmGroup = autoScaleVmGroup; + } + + + public static class LbCondition { + private final Condition condition; + private final Counter counter; + public LbCondition(Counter counter, Condition condition) { + this.condition = condition; + this.counter = counter; + } + public Condition getCondition() { + return condition; + } + public Counter getCounter() { + return counter; + } + } + + public static class LbAutoScalePolicy { + private final List conditions; + private final AutoScalePolicy policy; + private boolean revoked; + public LbAutoScalePolicy(AutoScalePolicy policy, List conditions) + { + this.policy = policy; + this.conditions = conditions; + } + public List getConditions() { + return conditions; + } + public AutoScalePolicy getPolicy() { + return policy; + } + + public boolean isRevoked() { + return revoked; + } + public void setRevoked(boolean revoked) { + this.revoked = revoked; + } + } + + public static class LbAutoScaleVmProfile { + AutoScaleVmProfile profile; + private final String cloudStackApiUrl; + private final String autoScaleUserApiKey; + private final String autoScaleUserSecretKey; + + public LbAutoScaleVmProfile(AutoScaleVmProfile profile, String cloudStackApiUrl, String autoScaleUserApiKey, String autoScaleUserSecretKey) { + this.profile = profile; + this.cloudStackApiUrl = cloudStackApiUrl; + this.autoScaleUserApiKey = autoScaleUserApiKey; + this.autoScaleUserSecretKey = autoScaleUserSecretKey; + } + public AutoScaleVmProfile getProfile() { + return profile; + } + public String getCloudStackApiUrl() { + return cloudStackApiUrl; + } + public String getAutoScaleUserApiKey() { + return autoScaleUserApiKey; + } + public String getAutoScaleUserSecretKey() { + return autoScaleUserSecretKey; + } + } + + public static class LbAutoScaleVmGroup { + AutoScaleVmGroup vmGroup; + private final List policies; + private final LbAutoScaleVmProfile profile; + + public LbAutoScaleVmGroup(AutoScaleVmGroup vmGroup, List policies, LbAutoScaleVmProfile profile) { + this.vmGroup = vmGroup; + this.policies = policies; + this.profile = profile; + } + + public AutoScaleVmGroup getVmGroup() { + return vmGroup; + } + + public List getPolicies() { + return policies; + } + + public LbAutoScaleVmProfile getProfile() { + return profile; + } + } + //public static class LbCounter{ + //private String name; + //private String source; + //private String value; + // + //public LbCounter(String name, String source, String value) + //{ + // this.name = name; + // this.source = source; + // this.value = value; + //} + // + //public String getName() { + // return name; + //} + //public String getSource() { + // return source; + //} + //public String getValue() { + // return value; + //} + //} + // + //public static class LbCondition{ + //private long threshold; + //private String relationalOperator; + //private LbCounter counter; + //public LbCondition(int threshold, String relationalOperator, LbCounter counter) + //{ + // this.threshold = threshold; + // this.relationalOperator = relationalOperator; + // this.counter = counter; + //} + //public long getThreshold() { + // return threshold; + //} + //public String getRelationalOperator() { + // return relationalOperator; + //} + //public LbCounter getCounter() { + // return counter; + //} + //} + // + //public static class AutoScaleVmGroup { + //private int minMembers; + //private int maxMembers; + //private List scaleUpPolicies; + //private List scaleDownPolicies; + //private List profile; + //private boolean revoked; + // + //public boolean isRevoked() { + // return revoked; + //} + // + //public void setRevoked(boolean revoked) { + // this.revoked = revoked; + //} + //} + // + //public static class AutoScaleVmProfile { + //private Long zoneId; + //private long domainId; + //private long accountId; + //private Long serviceOfferingId; + //private Long templateId; + //private String otherDeployParams; + //private String snmpCommunity; + //private Integer snmpPort; + // + //} + // + //public static class AutoscalePolicy { + //private int interval; + // + //private int duration; + //private int quietTime; + //private String action; + //private List conditions; + // + //public AutoscalePolicy(int interval, int duration, int quietTime, String action, List conditions) { + // this.interval = interval; + // this.duration = duration; + // this.quietTime = quietTime; + // this.conditions = conditions; + //} + // + //public int getInterval() { + // return interval; + //} + // + //public int getDuration() { + // return duration; + //} + // + //public int getQuietTime() { + // return quietTime; + //} + // + //public String getAction() { + // return action; + //} + // + //public List getConditions() { + // return conditions; + //} + //} +} diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java index ad5d0a02fa7..4196a9b34bd 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java @@ -1,104 +1,104 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.lb; - -import java.util.List; - -import com.cloud.api.commands.CreateLBStickinessPolicyCmd; -import com.cloud.api.commands.CreateLoadBalancerRuleCmd; -import com.cloud.api.commands.ListLBStickinessPoliciesCmd; -import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd; -import com.cloud.api.commands.ListLoadBalancerRulesCmd; -import com.cloud.api.commands.UpdateLoadBalancerRuleCmd; -import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.rules.LoadBalancer; -import com.cloud.network.rules.StickinessPolicy; -import com.cloud.uservm.UserVm; - -public interface LoadBalancingRulesService { - /** - * Create a load balancer rule from the given ipAddress/port to the given private port - * - * @param openFirewall - * TODO - * @param cmd - * the command specifying the ip address, public port, protocol, private port, and algorithm - * @return the newly created LoadBalancerVO if successful, null otherwise - * @throws InsufficientAddressCapacityException - */ - LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException, InsufficientAddressCapacityException; - - LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd); - - boolean deleteLoadBalancerRule(long lbRuleId, boolean apply); - - /** - * Create a stickiness policy to a load balancer from the given stickiness method name and parameters in - * (name,value) pairs. - * - * @param cmd - * the command specifying the stickiness method name, params (name,value pairs), policy name and - * description. - * @return the newly created stickiness policy if successfull, null otherwise - * @thows NetworkRuleConflictException - */ - public StickinessPolicy createLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws NetworkRuleConflictException; - - public boolean applyLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws ResourceUnavailableException; - - boolean deleteLBStickinessPolicy(long stickinessPolicyId, boolean apply); - /** - * Assign a virtual machine, or list of virtual machines, to a load balancer. - */ - boolean assignToLoadBalancer(long lbRuleId, List vmIds); - - boolean removeFromLoadBalancer(long lbRuleId, List vmIds); - - boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException; - - /** - * List instances that have either been applied to a load balancer or are eligible to be assigned to a load - * balancer. - * - * @param cmd - * @return list of vm instances that have been or can be applied to a load balancer - */ - List listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd); - - /** - * List load balancer rules based on the given criteria - * - * @param cmd - * the command that specifies the criteria to use for listing load balancers. Load balancers can be - * listed - * by id, name, public ip, and vm instance id - * @return list of load balancers that match the criteria - */ - List searchForLoadBalancers(ListLoadBalancerRulesCmd cmd); - - /** - * List stickiness policies based on the given criteria - * - * @param cmd - * the command specifies the load balancing rule id. - * @return list of stickiness policies that match the criteria. - */ - List searchForLBStickinessPolicies(ListLBStickinessPoliciesCmd cmd); - - List listByNetworkId(long networkId); - - LoadBalancer findById(long LoadBalancer); - -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.lb; + +import java.util.List; + +import com.cloud.api.commands.CreateLBStickinessPolicyCmd; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; +import com.cloud.api.commands.ListLBStickinessPoliciesCmd; +import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd; +import com.cloud.api.commands.ListLoadBalancerRulesCmd; +import com.cloud.api.commands.UpdateLoadBalancerRuleCmd; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.network.rules.StickinessPolicy; +import com.cloud.uservm.UserVm; + +public interface LoadBalancingRulesService { + /** + * Create a load balancer rule from the given ipAddress/port to the given private port + * + * @param openFirewall + * TODO + * @param cmd + * the command specifying the ip address, public port, protocol, private port, and algorithm + * @return the newly created LoadBalancerVO if successful, null otherwise + * @throws InsufficientAddressCapacityException + */ + LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException, InsufficientAddressCapacityException; + + LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd); + + boolean deleteLoadBalancerRule(long lbRuleId, boolean apply); + + /** + * Create a stickiness policy to a load balancer from the given stickiness method name and parameters in + * (name,value) pairs. + * + * @param cmd + * the command specifying the stickiness method name, params (name,value pairs), policy name and + * description. + * @return the newly created stickiness policy if successfull, null otherwise + * @thows NetworkRuleConflictException + */ + public StickinessPolicy createLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws NetworkRuleConflictException; + + public boolean applyLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws ResourceUnavailableException; + + boolean deleteLBStickinessPolicy(long stickinessPolicyId, boolean apply); + + /** + * Assign a virtual machine, or list of virtual machines, to a load balancer. + */ + boolean assignToLoadBalancer(long lbRuleId, List vmIds); + + boolean removeFromLoadBalancer(long lbRuleId, List vmIds); + + boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException; + + /** + * List instances that have either been applied to a load balancer or are eligible to be assigned to a load + * balancer. + * + * @param cmd + * @return list of vm instances that have been or can be applied to a load balancer + */ + List listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd); + + /** + * List load balancer rules based on the given criteria + * + * @param cmd + * the command that specifies the criteria to use for listing load balancers. Load balancers can be + * listed + * by id, name, public ip, and vm instance id + * @return list of load balancers that match the criteria + */ + List searchForLoadBalancers(ListLoadBalancerRulesCmd cmd); + + /** + * List stickiness policies based on the given criteria + * + * @param cmd + * the command specifies the load balancing rule id. + * @return list of stickiness policies that match the criteria. + */ + List searchForLBStickinessPolicies(ListLBStickinessPoliciesCmd cmd); + + List listByNetworkId(long networkId); + + LoadBalancer findById(long LoadBalancer); +} diff --git a/build/build-common.xml b/build/build-common.xml index 8cf0bbcf6a9..c36061f790e 100755 --- a/build/build-common.xml +++ b/build/build-common.xml @@ -48,7 +48,7 @@ + memoryinitialsize="256m" memorymaximumsize="512m" fork="true"> diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 979a6f97bae..869a11931b2 100755 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -49,7 +49,7 @@ listVirtualMachines=com.cloud.api.commands.ListVMsCmd;15 getVMPassword=com.cloud.api.commands.GetVMPasswordCmd;15 migrateVirtualMachine=com.cloud.api.commands.MigrateVMCmd;1 assignVirtualMachine=com.cloud.api.commands.AssignVMCmd;1 -restoreVirtualMachine=com.cloud.api.commands.RestoreVMCmd;15 +restoreVirtualMachine=com.cloud.api.commands.RestoreVMCmd;15 #### snapshot commands createSnapshot=com.cloud.api.commands.CreateSnapshotCmd;15 @@ -128,12 +128,30 @@ createLoadBalancerRule=com.cloud.api.commands.CreateLoadBalancerRuleCmd;15 deleteLoadBalancerRule=com.cloud.api.commands.DeleteLoadBalancerRuleCmd;15 removeFromLoadBalancerRule=com.cloud.api.commands.RemoveFromLoadBalancerRuleCmd;15 assignToLoadBalancerRule=com.cloud.api.commands.AssignToLoadBalancerRuleCmd;15 -createLBStickinessPolicy=com.cloud.api.commands.CreateLBStickinessPolicyCmd;15 -deleteLBStickinessPolicy=com.cloud.api.commands.DeleteLBStickinessPolicyCmd;15 +createLBStickinessPolicy=com.cloud.api.commands.CreateLBStickinessPolicyCmd;15 +deleteLBStickinessPolicy=com.cloud.api.commands.DeleteLBStickinessPolicyCmd;15 listLoadBalancerRules=com.cloud.api.commands.ListLoadBalancerRulesCmd;15 listLBStickinessPolicies=com.cloud.api.commands.ListLBStickinessPoliciesCmd;15 listLoadBalancerRuleInstances=com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd;15 updateLoadBalancerRule=com.cloud.api.commands.UpdateLoadBalancerRuleCmd;15 +#### autoscale commands +createCounter = com.cloud.api.commands.CreateCounterCmd;1 +createCondition = com.cloud.api.commands.CreateConditionCmd;15 +createAutoScalePolicy=com.cloud.api.commands.CreateAutoScalePolicyCmd;15 +createAutoScaleVmProfile=com.cloud.api.commands.CreateAutoScaleVmProfileCmd;15 +createAutoScaleVmGroup=com.cloud.api.commands.CreateAutoScaleVmGroupCmd;15 +deleteCounter = com.cloud.api.commands.DeleteCounterCmd;1 +deleteCondition = com.cloud.api.commands.DeleteConditionCmd;15 +deleteAutoScalePolicy=com.cloud.api.commands.DeleteAutoScalePolicyCmd;15 +deleteAutoScaleVmProfile=com.cloud.api.commands.DeleteAutoScaleVmProfileCmd;15 +deleteAutoScaleVmGroup=com.cloud.api.commands.DeleteAutoScaleVmGroupCmd;15 +listCounters = com.cloud.api.commands.ListCountersCmd;15 +listConditions = com.cloud.api.commands.ListConditionsCmd;15 +listAutoScalePolicies=com.cloud.api.commands.ListAutoScalePoliciesCmd;15 +listAutoScaleVmProfiles=com.cloud.api.commands.ListAutoScaleVmProfilesCmd;15 +listAutoScaleVmGroups=com.cloud.api.commands.ListAutoScaleVmGroupsCmd;15 +enableAutoScaleVmGroup=com.cloud.api.commands.EnableAutoScaleVmGroupCmd;15 +disableAutoScaleVmGroup=com.cloud.api.commands.DisableAutoScaleVmGroupCmd;15 #### router commands startRouter=com.cloud.api.commands.StartRouterCmd;7 @@ -180,11 +198,11 @@ listAlerts=com.cloud.api.commands.ListAlertsCmd;3 #### system capacity commands listCapacity=com.cloud.api.commands.ListCapacityCmd;3 - -#### swift commands^M -addSwift=com.cloud.api.commands.AddSwiftCmd;1 -listSwifts=com.cloud.api.commands.ListSwiftsCmd;1 - + +#### swift commands^M +addSwift=com.cloud.api.commands.AddSwiftCmd;1 +listSwifts=com.cloud.api.commands.ListSwiftsCmd;1 + #### host commands addHost=com.cloud.api.commands.AddHostCmd;3 @@ -277,21 +295,21 @@ updateNetwork=com.cloud.api.commands.UpdateNetworkCmd;15 registerSSHKeyPair=com.cloud.api.commands.RegisterSSHKeyPairCmd;15 createSSHKeyPair=com.cloud.api.commands.CreateSSHKeyPairCmd;15 deleteSSHKeyPair=com.cloud.api.commands.DeleteSSHKeyPairCmd;15 -listSSHKeyPairs=com.cloud.api.commands.ListSSHKeyPairsCmd;15 - +listSSHKeyPairs=com.cloud.api.commands.ListSSHKeyPairsCmd;15 + #### Projects commands createProject=com.cloud.api.commands.CreateProjectCmd;15 deleteProject=com.cloud.api.commands.DeleteProjectCmd;15 updateProject=com.cloud.api.commands.UpdateProjectCmd;15 activateProject=com.cloud.api.commands.ActivateProjectCmd;15 suspendProject=com.cloud.api.commands.SuspendProjectCmd;15 -listProjects=com.cloud.api.commands.ListProjectsCmd;15 +listProjects=com.cloud.api.commands.ListProjectsCmd;15 addAccountToProject=com.cloud.api.commands.AddAccountToProjectCmd;15 deleteAccountFromProject=com.cloud.api.commands.DeleteAccountFromProjectCmd;15 listProjectAccounts=com.cloud.api.commands.ListProjectAccountsCmd;15 listProjectInvitations=com.cloud.api.commands.ListProjectInvitationsCmd;15 updateProjectInvitation=com.cloud.api.commands.UpdateProjectInvitationCmd;15 -deleteProjectInvitation=com.cloud.api.commands.DeleteProjectInvitationCmd;15 +deleteProjectInvitation=com.cloud.api.commands.DeleteProjectInvitationCmd;15 #### createFirewallRule=com.cloud.api.commands.CreateFirewallRuleCmd;15 @@ -307,7 +325,7 @@ createPhysicalNetwork=com.cloud.api.commands.CreatePhysicalNetworkCmd;1 deletePhysicalNetwork=com.cloud.api.commands.DeletePhysicalNetworkCmd;1 listPhysicalNetworks=com.cloud.api.commands.ListPhysicalNetworksCmd;1 updatePhysicalNetwork=com.cloud.api.commands.UpdatePhysicalNetworkCmd;1 - + #### Physical Network Service Provider commands listSupportedNetworkServices=com.cloud.api.commands.ListSupportedNetworkServicesCmd;1 addNetworkServiceProvider=com.cloud.api.commands.AddNetworkServiceProviderCmd;1 @@ -320,13 +338,13 @@ addTrafficType=com.cloud.api.commands.AddTrafficTypeCmd;1 deleteTrafficType=com.cloud.api.commands.DeleteTrafficTypeCmd;1 listTrafficTypes=com.cloud.api.commands.ListTrafficTypesCmd;1 updateTrafficType=com.cloud.api.commands.UpdateTrafficTypeCmd;1 -listTrafficTypeImplementors=com.cloud.api.commands.ListTrafficTypeImplementorsCmd;1 +listTrafficTypeImplementors=com.cloud.api.commands.ListTrafficTypeImplementorsCmd;1 #### Storage Network commands createStorageNetworkIpRange=com.cloud.api.commands.CreateStorageNetworkIpRangeCmd;1 deleteStorageNetworkIpRange=com.cloud.api.commands.DeleteStorageNetworkIpRangeCmd;1 listStorageNetworkIpRange=com.cloud.api.commands.listStorageNetworkIpRangeCmd;1 -updateStorageNetworkIpRange=com.cloud.api.commands.UpdateStorageNetworkIpRangeCmd;1 +updateStorageNetworkIpRange=com.cloud.api.commands.UpdateStorageNetworkIpRangeCmd;1 #### Network Devices commands addNetworkDevice=com.cloud.api.commands.AddNetworkDeviceCmd;1 @@ -365,16 +383,16 @@ listNetworkACLs=com.cloud.api.commands.ListNetworkACLsCmd;15 createStaticRoute=com.cloud.api.commands.CreateStaticRouteCmd;15 deleteStaticRoute=com.cloud.api.commands.DeleteStaticRouteCmd;15 listStaticRoutes=com.cloud.api.commands.ListStaticRoutesCmd;15 - -### Site-to-site VPN commands -createVpnCustomerGateway=com.cloud.api.commands.CreateVpnCustomerGatewayCmd;1 -createVpnGateway=com.cloud.api.commands.CreateVpnGatewayCmd;1 -createVpnConnection=com.cloud.api.commands.CreateVpnConnectionCmd;1 -deleteVpnCustomerGateway=com.cloud.api.commands.DeleteVpnCustomerGatewayCmd;1 -deleteVpnGateway=com.cloud.api.commands.DeleteVpnGatewayCmd;1 -deleteVpnConnection=com.cloud.api.commands.DeleteVpnConnectionCmd;1 -updateVpnCustomerGateway=com.cloud.api.commands.UpdateVpnCustomerGatewayCmd;1 -resetVpnConnection=com.cloud.api.commands.ResetVpnConnectionCmd;1 -listVpnCustomerGateways=com.cloud.api.commands.ListVpnCustomerGatewaysCmd;15 -listVpnGateways=com.cloud.api.commands.ListVpnGatewaysCmd;15 -listVpnConnections=com.cloud.api.commands.ListVpnConnectionsCmd;15 + +### Site-to-site VPN commands +createVpnCustomerGateway=com.cloud.api.commands.CreateVpnCustomerGatewayCmd;1 +createVpnGateway=com.cloud.api.commands.CreateVpnGatewayCmd;1 +createVpnConnection=com.cloud.api.commands.CreateVpnConnectionCmd;1 +deleteVpnCustomerGateway=com.cloud.api.commands.DeleteVpnCustomerGatewayCmd;1 +deleteVpnGateway=com.cloud.api.commands.DeleteVpnGatewayCmd;1 +deleteVpnConnection=com.cloud.api.commands.DeleteVpnConnectionCmd;1 +updateVpnCustomerGateway=com.cloud.api.commands.UpdateVpnCustomerGatewayCmd;1 +resetVpnConnection=com.cloud.api.commands.ResetVpnConnectionCmd;1 +listVpnCustomerGateways=com.cloud.api.commands.ListVpnCustomerGatewaysCmd;15 +listVpnGateways=com.cloud.api.commands.ListVpnGatewaysCmd;15 +listVpnConnections=com.cloud.api.commands.ListVpnConnectionsCmd;15 diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index c7b31f31464..230104520e0 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -1,1533 +1,2138 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.resource; - -import java.util.List; -import java.util.Map; -import javax.naming.ConfigurationException; -import com.cloud.agent.IAgentControl; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; -import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; -import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; -import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; -import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; -import com.cloud.agent.api.MaintainAnswer; -import com.cloud.agent.api.MaintainCommand; -import com.cloud.agent.api.PingCommand; -import com.cloud.agent.api.ReadyAnswer; -import com.cloud.agent.api.ReadyCommand; -import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.api.StartupExternalLoadBalancerCommand; -import com.cloud.agent.api.routing.IpAssocAnswer; -import com.cloud.agent.api.routing.IpAssocCommand; -import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.SetStaticNatRulesAnswer; -import com.cloud.agent.api.routing.SetStaticNatRulesCommand; -import com.cloud.agent.api.to.IpAddressTO; -import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.StaticNatRuleTO; -import com.cloud.agent.api.to.LoadBalancerTO.DestinationTO; -import com.cloud.agent.api.to.LoadBalancerTO.StickinessPolicyTO; -import com.cloud.host.Host; -import com.cloud.host.Host.Type; -import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; -import com.cloud.resource.ServerResource; -import com.cloud.serializer.GsonHelper; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; -import com.cloud.utils.exception.ExecutionException; -import com.cloud.utils.net.NetUtils; -import com.google.gson.Gson; - -import com.citrix.netscaler.nitro.service.nitro_service; -import com.citrix.netscaler.nitro.util.filtervalue; -import com.citrix.netscaler.nitro.resource.base.base_response; -import com.citrix.netscaler.nitro.exception.nitro_exception; -import com.citrix.netscaler.nitro.resource.config.ns.nsconfig; -import com.citrix.netscaler.nitro.resource.config.lb.lbvserver; -import com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding; -import com.citrix.netscaler.nitro.resource.config.network.*; -import com.citrix.netscaler.nitro.resource.config.ns.*; -import com.citrix.netscaler.nitro.resource.config.basic.server_service_binding; -import com.citrix.netscaler.nitro.resource.stat.lb.lbvserver_stats; -import com.citrix.sdx.nitro.resource.config.device_profile; -import com.citrix.sdx.nitro.resource.config.ns; -import com.citrix.sdx.nitro.resource.config.mps; -import com.citrix.sdx.nitro.resource.config.xen_vpx_image; - -import org.apache.log4j.Logger; - -class NitroError { - static final int NS_RESOURCE_EXISTS = 273; - static final int NS_RESOURCE_NOT_EXISTS=258; - static final int NS_NO_SERIVCE = 344; - static final int NS_OPERATION_NOT_PERMITTED = 257; - static final int NS_INTERFACE_ALREADY_BOUND_TO_VLAN = 2080; -} - -public class NetscalerResource implements ServerResource { - - // deployment configuration - private String _name; - private String _zoneId; - private String _physicalNetworkId; - private String _ip; - private String _username; - private String _password; - private String _publicInterface; - private String _privateInterface; - private Integer _numRetries; - private String _guid; - private boolean _inline; - private boolean _isSdx; - private boolean _cloudManaged; - private String _deviceName; - private String _publicIP; - private String _publicIPNetmask; - private String _publicIPGateway; - private String _publicIPVlan; - - private static final Logger s_logger = Logger.getLogger(NetscalerResource.class); - protected Gson _gson; - private String _objectNamePathSep = "-"; - - // interface to interact with VPX and MPX devices - com.citrix.netscaler.nitro.service.nitro_service _netscalerService ; - - // interface to interact with service VM of the SDX appliance - com.citrix.sdx.nitro.service.nitro_service _netscalerSdxService; - - Long _timeout = new Long(100000); - base_response apiCallResult; - - public NetscalerResource () { - _gson = GsonHelper.getGsonLogger(); - } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - try { - _name = (String) params.get("name"); - if (_name == null) { - throw new ConfigurationException("Unable to find name in the configuration parameters"); - } - - _zoneId = (String) params.get("zoneId"); - if (_zoneId == null) { - throw new ConfigurationException("Unable to find zone Id in the configuration parameters"); - } - - _physicalNetworkId = (String) params.get("physicalNetworkId"); - if (_physicalNetworkId == null) { - throw new ConfigurationException("Unable to find physical network id in the configuration parameters"); - } - - _ip = (String) params.get("ip"); - if (_ip == null) { - throw new ConfigurationException("Unable to find IP address in the configuration parameters"); - } - - _username = (String) params.get("username"); - if (_username == null) { - throw new ConfigurationException("Unable to find username in the configuration parameters"); - } - - _password = (String) params.get("password"); - if (_password == null) { - throw new ConfigurationException("Unable to find password in the configuration parameters"); - } - - _publicInterface = (String) params.get("publicinterface"); - if (_publicInterface == null) { - throw new ConfigurationException("Unable to find public interface in the configuration parameters"); - } - - _privateInterface = (String) params.get("privateinterface"); - if (_privateInterface == null) { - throw new ConfigurationException("Unable to find private interface in the configuration parameters"); - } - - _numRetries = NumbersUtil.parseInt((String) params.get("numretries"), 2); - - _guid = (String)params.get("guid"); - if (_guid == null) { - throw new ConfigurationException("Unable to find the guid in the configuration parameters"); - } - - _deviceName = (String) params.get("deviceName"); - if (_deviceName == null) { - throw new ConfigurationException("Unable to find the device name in the configuration parameters"); - } - - _isSdx = _deviceName.equalsIgnoreCase("NetscalerSDXLoadBalancer"); - - _inline = Boolean.parseBoolean((String) params.get("inline")); - - if (((String) params.get("cloudmanaged")) != null) { - _cloudManaged = Boolean.parseBoolean((String) params.get("cloudmanaged")); - } - - // validate device configuration parameters - login(); - validateDeviceType(_deviceName); - validateInterfaces(_publicInterface, _privateInterface); - - //enable load balancing feature - enableLoadBalancingFeature(); - - //if the the device is cloud stack provisioned then make it part of the public network - if (_cloudManaged) { - _publicIP = (String) params.get("publicip"); - _publicIPGateway = (String) params.get("publicipgateway"); - _publicIPNetmask = (String) params.get("publicipnetmask"); - _publicIPVlan = (String) params.get("publicipvlan"); - if ("untagged".equalsIgnoreCase(_publicIPVlan)) { - // if public network is un-tagged just add subnet IP - addSubnetIP(_publicIP, _publicIPNetmask); - } else { - // if public network is tagged then add vlan and bind subnet IP to the vlan - addGuestVlanAndSubnet(Long.parseLong(_publicIPVlan), _publicIP, _publicIPNetmask, false); - } - } - - return true; - } catch (Exception e) { - throw new ConfigurationException(e.getMessage()); - } - } - - private void login() throws ExecutionException { - try { - if (!_isSdx) { - _netscalerService = new nitro_service(_ip, "https"); - _netscalerService.set_credential(_username, _password); - _netscalerService.set_timeout(_timeout); - apiCallResult = _netscalerService.login(); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException ("Failed to log in to Netscaler device at " + _ip + " due to error " + apiCallResult.errorcode + " and message " + apiCallResult.message); - } - } else { - _netscalerSdxService = new com.citrix.sdx.nitro.service.nitro_service(_ip, "https"); - _netscalerSdxService.set_credential(_username, _password); - com.citrix.sdx.nitro.resource.base.login login = _netscalerSdxService.login(); - if (login == null) { - throw new ExecutionException ("Failed to log in to Netscaler device at " + _ip + " due to error " + apiCallResult.errorcode + " and message " + apiCallResult.message); - } - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to log in to Netscaler device at " + _ip + " due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to log in to Netscaler device at " + _ip + " due to " + e.getMessage()); - } - } - - private void enableLoadBalancingFeature() throws ExecutionException { - if (_isSdx) { - return; - } - try { - String[] features = _netscalerService.get_enabled_features(); - if (features != null) { - for (String feature : features) { - if (feature.equalsIgnoreCase("LB")) { - return; - } - } - } - - // enable load balancing on the device - String[] feature = new String[1]; - feature[0] = "LB"; - apiCallResult = _netscalerService.enable_features(feature); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Enabling load balancing feature on the device failed."); - } - } catch (nitro_exception e) { - throw new ExecutionException("Enabling load balancing feature on the device failed due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Enabling load balancing feature on the device failed due to " + e.getMessage()); - } - } - - private void validateInterfaces(String publicInterface, String privateInterface) throws ExecutionException { - try { - if (!_isSdx && !_cloudManaged) { - Interface publicIf = Interface.get(_netscalerService, publicInterface); - Interface privateIf = Interface.get(_netscalerService, privateInterface); - if (publicIf != null || privateIf != null) { - return; - } else { - throw new ExecutionException("Invalid interface name specified for public/private interfaces."); - } - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - throw new ExecutionException("Invalid interface name specified for public and private interfaces."); - } else { - throw new ExecutionException("Failed to verify public interface and private intefaces are valid due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify public interface and private intefaces are valid due to " + e.getMessage()); - } - } - - private void validateDeviceType(String deviceType) throws ExecutionException { - try { - if (!_isSdx && !_cloudManaged) { - nshardware nsHw = com.citrix.netscaler.nitro.resource.config.ns.nshardware.get(_netscalerService); - if (nsHw == null) { - throw new ExecutionException("Failed to get the hardware description of the Netscaler device at " + _ip); - } else { - if ((_deviceName.equalsIgnoreCase("NetscalerMPXLoadBalancer") && nsHw.get_hwdescription().contains("MPX")) - || (_deviceName.equalsIgnoreCase("NetscalerVPXLoadBalancer") && nsHw.get_hwdescription().contains("NetScaler Virtual Appliance"))) { - return; - } - throw new ExecutionException("Netscalar device type specified does not match with the actuall device type."); - } - } else if (_isSdx) { - mps serviceVM = mps.get(_netscalerSdxService); - if (serviceVM != null) { - if (serviceVM.get_platform().contains("SDX") || serviceVM.get_product().contains("SDX")) { - return; - } else { - throw new ExecutionException("Netscalar device type specified does not match with the actuall device type."); - } - } else { - throw new ExecutionException("Failed to get the hardware details of the Netscaler device at " + _ip); - } - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify device type specified when matching with actuall device type due to " + e.getMessage()); - } - } - - @Override - public StartupCommand[] initialize() { - StartupExternalLoadBalancerCommand cmd = new StartupExternalLoadBalancerCommand(); - cmd.setName(_name); - cmd.setDataCenter(_zoneId); - cmd.setPod(""); - cmd.setPrivateIpAddress(_ip); - cmd.setStorageIpAddress(""); - cmd.setVersion(""); - cmd.setGuid(_guid); - return new StartupCommand[]{cmd}; - } - - @Override - public Answer executeRequest(Command cmd) { - return executeRequest(cmd, _numRetries); - } - - private Answer executeRequest(Command cmd, int numRetries) { - if (cmd instanceof ReadyCommand) { - return execute((ReadyCommand) cmd); - } else if (cmd instanceof MaintainCommand) { - return execute((MaintainCommand) cmd); - } else if (cmd instanceof IpAssocCommand) { - return execute((IpAssocCommand) cmd, numRetries); - } else if (cmd instanceof LoadBalancerConfigCommand) { - return execute((LoadBalancerConfigCommand) cmd, numRetries); - } else if (cmd instanceof ExternalNetworkResourceUsageCommand) { - return execute((ExternalNetworkResourceUsageCommand) cmd, numRetries); - } else if (cmd instanceof CreateLoadBalancerApplianceCommand) { - return execute((CreateLoadBalancerApplianceCommand) cmd, numRetries); - } else if (cmd instanceof DestroyLoadBalancerApplianceCommand) { - return execute((DestroyLoadBalancerApplianceCommand) cmd, numRetries); - } else if (cmd instanceof SetStaticNatRulesCommand) { - return execute((SetStaticNatRulesCommand) cmd, numRetries); - } else { - return Answer.createUnsupportedCommandAnswer(cmd); - } - } - - private Answer execute(ReadyCommand cmd) { - return new ReadyAnswer(cmd); - } - - protected Answer execute(MaintainCommand cmd) { - return new MaintainAnswer(cmd); - } - - private synchronized Answer execute(IpAssocCommand cmd, int numRetries) { - if (_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - String[] results = new String[cmd.getIpAddresses().length]; - int i = 0; - try { - IpAddressTO[] ips = cmd.getIpAddresses(); - for (IpAddressTO ip : ips) { - long guestVlanTag = Long.valueOf(ip.getVlanId()); - String vlanSelfIp = ip.getVlanGateway(); - String vlanNetmask = ip.getVlanNetmask(); - - if (ip.isAdd()) { - // Add a new guest VLAN and its subnet and bind it to private interface - addGuestVlanAndSubnet(guestVlanTag, vlanSelfIp, vlanNetmask, true); - } else { - // Check and delete guest VLAN with this tag, self IP, and netmask - deleteGuestVlan(guestVlanTag, vlanSelfIp, vlanNetmask); - } - - saveConfiguration(); - results[i++] = ip.getPublicIp() + " - success"; - String action = ip.isAdd() ? "associate" : "remove"; - if (s_logger.isDebugEnabled()) { - s_logger.debug("Netscaler load balancer " + _ip + " successfully executed IPAssocCommand to " + action + " IP " + ip); - } - } - } catch (ExecutionException e) { - s_logger.error("Netscaler loadbalancer " + _ip+ " failed to execute IPAssocCommand due to " + e.getMessage()); - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } else { - results[i++] = IpAssocAnswer.errorResult; - } - } - - return new IpAssocAnswer(cmd, results); - } - - private synchronized Answer execute(LoadBalancerConfigCommand cmd, int numRetries) { - try { - if (_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - LoadBalancerTO[] loadBalancers = cmd.getLoadBalancers(); - if (loadBalancers == null) { - return new Answer(cmd); - } - - for (LoadBalancerTO loadBalancer : loadBalancers) { - String srcIp = loadBalancer.getSrcIp(); - int srcPort = loadBalancer.getSrcPort(); - String lbProtocol = getNetScalerProtocol(loadBalancer); - String lbAlgorithm = loadBalancer.getAlgorithm(); - String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - - boolean destinationsToAdd = false; - for (DestinationTO destination : loadBalancer.getDestinations()) { - if (!destination.isRevoked()) { - destinationsToAdd = true; - break; - } - } - - if (!loadBalancer.isRevoked() && destinationsToAdd) { - - // create a load balancing virtual server - addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancer.getStickinessPolicies()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); - } - - for (DestinationTO destination : loadBalancer.getDestinations()) { - - String nsServerName = generateNSServerName(destination.getDestIp()); - String nsServiceName = generateNSServiceName(destination.getDestIp(), destination.getDestPort()); - - if (!destination.isRevoked()) { - // add a new destination to deployed load balancing rule - - // add a new server - if (!nsServerExists(nsServerName)) { - com.citrix.netscaler.nitro.resource.config.basic.server nsServer = new com.citrix.netscaler.nitro.resource.config.basic.server(); - nsServer.set_name(nsServerName); - nsServer.set_ipaddress(destination.getDestIp()); - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.add(_netscalerService, nsServer); - if ((apiCallResult.errorcode != 0) && (apiCallResult.errorcode != NitroError.NS_RESOURCE_EXISTS)) { - throw new ExecutionException("Failed to add server " + destination.getDestIp() + " due to" + apiCallResult.message); - } - } - - // create a new service using the server added - if (!nsServiceExists(nsServiceName)) { - com.citrix.netscaler.nitro.resource.config.basic.service newService = new com.citrix.netscaler.nitro.resource.config.basic.service(); - newService.set_name(nsServiceName); - newService.set_port(destination.getDestPort()); - newService.set_servername(nsServerName); - newService.set_state("ENABLED"); - newService.set_servicetype(lbProtocol); - - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.add(_netscalerService, newService); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to create service " + nsServiceName + " using server " + nsServerName + " due to" + apiCallResult.message); - } - } - - //bind service to load balancing virtual server - if (!nsServiceBindingExists(nsVirtualServerName, nsServiceName)) { - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding svcBinding = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding(); - svcBinding.set_name(nsVirtualServerName); - svcBinding.set_servicename(nsServiceName); - apiCallResult = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.add(_netscalerService, svcBinding); - - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to bind service: " + nsServiceName + " to the lb virtual server: " + nsVirtualServerName + " on Netscaler device"); - } - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully added LB destination: " + destination.getDestIp() + ":" + destination.getDestPort() + " to load balancer " + srcIp + ":" + srcPort); - } - } else { - // remove a destination from the deployed load balancing rule - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, nsVirtualServerName); - if (serviceBindings != null) { - for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { - if (nsServiceName.equalsIgnoreCase(binding.get_servicename())) { - // delete the binding - apiCallResult = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.delete(_netscalerService, binding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to delete the binding between the virtual server: " + nsVirtualServerName + " and service:" + nsServiceName + " due to" + apiCallResult.message); - } - - // check if service is bound to any other virtual server - if (!isServiceBoundToVirtualServer(nsServiceName)) { - // no lb virtual servers are bound to this service so delete it - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, nsServiceName); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to delete service: " + nsServiceName + " due to " + apiCallResult.message); - } - } - - // delete the server if there is no associated services - server_service_binding[] services = server_service_binding.get(_netscalerService, nsServerName); - if ((services == null) || (services.length == 0)) { - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, nsServerName); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove server:" + nsServerName + " due to " + apiCallResult.message); - } - } - } - } - } - } - } - } else { - // delete the implemented load balancing rule and its destinations - lbvserver lbserver = getVirtualServerIfExisits(nsVirtualServerName); - if (lbserver != null) { - //unbind the all services associated with this virtual server - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, nsVirtualServerName); - - if (serviceBindings != null) { - for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { - String serviceName = binding.get_servicename(); - apiCallResult = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.delete(_netscalerService, binding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to unbind service from the lb virtual server: " + nsVirtualServerName + " due to " + apiCallResult.message); - } - - com.citrix.netscaler.nitro.resource.config.basic.service svc = com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, serviceName); - String nsServerName = svc.get_servername(); - - // check if service is bound to any other virtual server - if (!isServiceBoundToVirtualServer(serviceName)) { - // no lb virtual servers are bound to this service so delete it - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, serviceName); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to delete service: " + serviceName + " due to " + apiCallResult.message); - } - } - - //delete the server if no more services attached - server_service_binding[] services = server_service_binding.get(_netscalerService, nsServerName); - if ((services == null) || (services.length == 0)) { - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, nsServerName); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove server:" + nsServerName + " due to " + apiCallResult.message); - } - } - } - } - removeLBVirtualServer(nsVirtualServerName); - } - } - } - - if (s_logger.isInfoEnabled()) { - s_logger.info("Successfully executed resource LoadBalancerConfigCommand: " + _gson.toJson(cmd)); - } - - saveConfiguration(); - return new Answer(cmd); - } catch (ExecutionException e) { - s_logger.error("Failed to execute LoadBalancerConfigCommand due to " + e.getMessage()); - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } else { - return new Answer(cmd, e); - } - } catch (Exception e) { - s_logger.error("Failed to execute LoadBalancerConfigCommand due to " + e.getMessage()); - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } else { - return new Answer(cmd, e); - } - } - } - - private synchronized Answer execute(CreateLoadBalancerApplianceCommand cmd, int numRetries) { - - if (!_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - try { - String vpxName = "Cloud-VPX-"+cmd.getLoadBalancerIP(); - String username = "admin"; - String password = "admin"; - - ns ns_obj = new ns(); - ns_obj.set_name(vpxName); - ns_obj.set_ip_address(cmd.getLoadBalancerIP()); - ns_obj.set_netmask(cmd.getNetmask()); - ns_obj.set_gateway(cmd.getGateway()); - ns_obj.set_username(username); - ns_obj.set_password(password); - - // configure VPX instances with defaults - ns_obj.set_feature_license("Standard"); - ns_obj.set_memory_total(new Double(2048)); - ns_obj.set_throughput(new Double(1000)); - ns_obj.set_pps(new Double(1000000)); - ns_obj.set_number_of_ssl_cores(0); - - // use the first device profile available on the SDX to create an instance of VPX - device_profile[] profiles = device_profile.get(_netscalerSdxService); - if (!(profiles != null && profiles.length >= 1)) { - new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip + - " as there are no admin profile to use for creating VPX.")); - } - String profileName = profiles[0].get_name(); - ns_obj.set_nsroot_profile(profileName); - - // use the first VPX image of the available VPX images on the SDX to create an instance of VPX - // TODO: should enable the option to choose the template while adding the SDX device in to CloudStack - xen_vpx_image[] vpxImages = xen_vpx_image.get(_netscalerSdxService); - if (!(vpxImages != null && vpxImages.length >= 1)) { - new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip + - " as there are no VPX images on SDX to use for creating VPX.")); - } - String imageName = vpxImages[0].get_file_name(); - ns_obj.set_image_name(imageName); - - String publicIf = _publicInterface; - String privateIf = _privateInterface; - - // enable only the interfaces that will be used by VPX - enableVPXInterfaces(_publicInterface, _privateInterface, ns_obj); - - // create new VPX instance - ns newVpx = ns.add(_netscalerSdxService, ns_obj); - - if (newVpx == null) { - new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip)); - } - - // wait for VPX instance to start-up - long startTick = System.currentTimeMillis(); - long startWaitMilliSeconds = 600000; - while(!newVpx.get_ns_state().equalsIgnoreCase("up") && System.currentTimeMillis() - startTick < startWaitMilliSeconds) { - try { - Thread.sleep(10000); - } catch(InterruptedException e) { - } - ns refreshNsObj = new ns(); - refreshNsObj.set_id(newVpx.get_id()); - newVpx = ns.get(_netscalerSdxService, refreshNsObj); - } - - // if vpx instance never came up then error out - if (!newVpx.get_ns_state().equalsIgnoreCase("up")) { - return new Answer(cmd, new ExecutionException("Failed to start VPX instance " + vpxName + " created on the netscaler SDX device " + _ip)); - } - - // wait till NS service in side VPX is actually ready - startTick = System.currentTimeMillis(); - boolean nsServiceUp = false; - long nsServiceWaitMilliSeconds = 60000; - while (System.currentTimeMillis() - startTick < nsServiceWaitMilliSeconds) { - try { - nitro_service _netscalerService = new nitro_service(cmd.getLoadBalancerIP(), "https"); - _netscalerService.set_credential(username, password); - _netscalerService.set_timeout(_timeout); - apiCallResult = _netscalerService.login(); - if (apiCallResult.errorcode == 0) { - nsServiceUp = true; - break; - } - } catch (Exception e) { - Thread.sleep(10000); - continue; - } - } - - if (!nsServiceUp) { - return new Answer(cmd, new ExecutionException("Failed to create VPX instance " + vpxName + " on the netscaler SDX device " + _ip)); - } - - if (s_logger.isInfoEnabled()) { - s_logger.info("Successfully provisioned VPX instance " + vpxName + " on the Netscaler SDX device " + _ip); - } - - // physical interfaces on the SDX range from 10/1 to 10/8 & 1/1 to 1/8 of which two different port or same port can be used for public and private interfaces - // However the VPX instances created will have interface range start from 10/1 but will only have as many interfaces enabled while creating the VPX instance - // So due to this, we need to map public & private interface on SDX to correct public & private interface of VPX - - int publicIfnum = Integer.parseInt(_publicInterface.substring(_publicInterface.lastIndexOf("/") + 1)); - int privateIfnum = Integer.parseInt(_privateInterface.substring(_privateInterface.lastIndexOf("/") + 1)); - - if (_publicInterface.startsWith("10/") && _privateInterface.startsWith("10/")) { - if (publicIfnum == privateIfnum) { - publicIf = "10/1"; - privateIf = "10/1"; - } else if (publicIfnum > privateIfnum) { - privateIf = "10/1"; - publicIf = "10/2"; - } else { - publicIf = "10/1"; - privateIf = "10/2"; - } - } else if (_publicInterface.startsWith("1/") && _privateInterface.startsWith("1/")) { - if (publicIfnum == privateIfnum) { - publicIf = "1/1"; - privateIf = "1/1"; - } else if (publicIfnum > privateIfnum) { - privateIf = "1/1"; - publicIf = "1/2"; - } else { - publicIf = "1/1"; - privateIf = "1/2"; - } - } else if (_publicInterface.startsWith("1/") && _privateInterface.startsWith("10/")) { - publicIf = "1/1"; - privateIf = "10/1"; - } else if (_publicInterface.startsWith("10/") && _privateInterface.startsWith("1/")) { - publicIf = "10/1"; - privateIf = "1/1"; - } - - return new CreateLoadBalancerApplianceAnswer(cmd, true, "provisioned VPX instance", "NetscalerVPXLoadBalancer", "Netscaler", new NetscalerResource(), - publicIf, privateIf, _username, _password); - } catch (Exception e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } - return new CreateLoadBalancerApplianceAnswer(cmd, false, "failed to provisioned VPX instance due to " + e.getMessage(), null, null, null, null, null, null, null); - } - } - - private void enableVPXInterfaces(String publicIf, String privateIf, ns ns_obj) { - // enable VPX to use 10 gigabit Ethernet interfaces if public/private interface - // on SDX is a 10Gig interface - if (publicIf.equals("10/1") || privateIf.equals("10/1")) { - ns_obj.set_if_10_1(new Boolean(true)); - } - - if (publicIf.equals("10/2") || privateIf.equals("10/2")) { - ns_obj.set_if_10_2(new Boolean(true)); - } - - if (publicIf.equals("10/3") || privateIf.equals("10/3")) { - ns_obj.set_if_10_3(new Boolean(true)); - } - - if (publicIf.equals("10/4") || privateIf.equals("10/4")) { - ns_obj.set_if_10_4(new Boolean(true)); - } - - if (publicIf.equals("10/5") || privateIf.equals("10/5")) { - ns_obj.set_if_10_5(new Boolean(true)); - } - - if (publicIf.equals("10/6") || privateIf.equals("10/6")) { - ns_obj.set_if_10_6(new Boolean(true)); - } - - if (publicIf.equals("10/7") || privateIf.equals("10/7")) { - ns_obj.set_if_10_7(new Boolean(true)); - } - - if (publicIf.equals("10/8") || privateIf.equals("10/8")) { - ns_obj.set_if_10_8(new Boolean(true)); - } - - // enable VPX to use 1 gigabit Ethernet interfaces if public/private interface - // on SDX is a 1Gig interface - if (publicIf.equals("1/1") || privateIf.equals("1/1")) { - ns_obj.set_if_1_1(new Boolean(true)); - } - - if (publicIf.equals("1/2") || privateIf.equals("1/2")) { - ns_obj.set_if_1_2(new Boolean(true)); - } - - if (publicIf.equals("1/3") || privateIf.equals("1/3")) { - ns_obj.set_if_1_3(new Boolean(true)); - } - - if (publicIf.equals("1/4") || privateIf.equals("1/4")) { - ns_obj.set_if_1_4(new Boolean(true)); - } - - if (publicIf.equals("1/5") || privateIf.equals("1/5")) { - ns_obj.set_if_1_5(new Boolean(true)); - } - - if (publicIf.equals("1/6") || privateIf.equals("1/6")) { - ns_obj.set_if_1_6(new Boolean(true)); - } - - if (publicIf.equals("1/7") || privateIf.equals("1/7")) { - ns_obj.set_if_1_7(new Boolean(true)); - } - - if (publicIf.equals("1/8") || privateIf.equals("1/8")) { - ns_obj.set_if_1_8(new Boolean(true)); - } - } - - private synchronized Answer execute(DestroyLoadBalancerApplianceCommand cmd, int numRetries) { - String vpxName = "Cloud-VPX-"+cmd.getLoadBalancerIP(); - if (!_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - try { - ns vpxToDelete =null; - ns[] vpxInstances = ns.get(_netscalerSdxService); - for (ns vpx : vpxInstances) { - if (vpx.get_name().equals(vpxName)) { - vpxToDelete = vpx; - break; - } - } - - if (vpxToDelete == null) { - String msg = "There is no VPX instance " + vpxName + " on the Netscaler SDX device " + _ip + " to delete"; - s_logger.warn(msg); - return new DestroyLoadBalancerApplianceAnswer(cmd, true, msg); - } - - // destroy the VPX instance - ns nsDelObj = new ns(); - nsDelObj.set_id(vpxToDelete.get_id()); - vpxToDelete = ns.delete(_netscalerSdxService, nsDelObj); - String msg = "Deleted VPX instance " + vpxName + " on Netscaler SDX " + _ip + " successfully."; - s_logger.info(msg); - return new DestroyLoadBalancerApplianceAnswer(cmd, true,msg); - } catch (Exception e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } - return new DestroyLoadBalancerApplianceAnswer(cmd, false, "Failed to delete VPX instance " + vpxName + " on Netscaler SDX " + _ip); - } - } - - private synchronized Answer execute(SetStaticNatRulesCommand cmd, int numRetries) { - - if (_isSdx) { - return Answer.createUnsupportedCommandAnswer(cmd); - } - - String[] results = new String[cmd.getRules().length]; - int i = 0; - boolean endResult = true; - - try { - for (StaticNatRuleTO rule : cmd.getRules()) { - String srcIp = rule.getSrcIp(); - String dstIP = rule.getDstIp(); - String iNatRuleName = generateInatRuleName(srcIp, dstIP); - inat iNatRule = null; - - if (!rule.revoked()) { - try { - iNatRule = inat.get(_netscalerService, iNatRuleName); - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) { - throw e; - } - } - - if (iNatRule == null) { - iNatRule = new inat(); - iNatRule.set_name(iNatRuleName); - iNatRule.set_publicip(srcIp); - iNatRule.set_privateip(dstIP); - iNatRule.set_usnip("OFF"); - iNatRule.set_usip("ON"); - try { - apiCallResult = inat.add(_netscalerService, iNatRule); - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_EXISTS) { - throw e; - } - } - s_logger.debug("Created Inat rule on the Netscaler device " + _ip + " to enable static NAT from " + srcIp + " to " + dstIP); - } - } else { - try { - inat.delete(_netscalerService, iNatRuleName); - } catch (nitro_exception e) { - if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) { - throw e; - } - } - s_logger.debug("Deleted Inat rule on the Netscaler device " + _ip + " to remove static NAT from " + srcIp + " to " + dstIP); - } - - saveConfiguration(); - results[i++] = "Static nat rule from " + srcIp + " to " + dstIP + " successfully " + (rule.revoked() ? " revoked.":" created."); - } - } catch (Exception e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } - results[i++] = "Configuring static nat rule failed due to " + e.getMessage(); - endResult = false; - return new SetStaticNatRulesAnswer(cmd, results, endResult); - } - - return new SetStaticNatRulesAnswer(cmd, results, endResult); - } - - private synchronized Answer execute(ExternalNetworkResourceUsageCommand cmd, int numRetries) { - try { - if (!_isSdx) { - return getPublicIpBytesSentAndReceived(cmd); - } else { - return Answer.createUnsupportedCommandAnswer(cmd); - } - } catch (ExecutionException e) { - if (shouldRetry(numRetries)) { - return retry(cmd, numRetries); - } else { - return new ExternalNetworkResourceUsageAnswer(cmd, e); - } - } - } - - private void addSubnetIP(String snip, String netmask) throws ExecutionException { - try { - nsip selfIp = new nsip(); - selfIp.set_ipaddress(snip); - selfIp.set_netmask(netmask); - selfIp.set_type("SNIP"); - apiCallResult = nsip.add(_netscalerService, selfIp); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to "+ apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + e.getMessage()); - } - } - - private void addGuestVlanAndSubnet(long vlanTag, String vlanSelfIp, String vlanNetmask, boolean guestVlan) throws ExecutionException { - try { - // add vlan object for guest VLAN - if (!nsVlanExists(vlanTag)) { - try { - vlan vlanObj = new vlan(); - vlanObj.set_id(vlanTag); - apiCallResult = vlan.add(_netscalerService, vlanObj); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to add new vlan with tag:" + vlanTag + "on the NetScaler device due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add new vlan with tag:" + vlanTag + "on the NetScaler device due to " + e.getMessage()); - } - } - - // add subnet IP object for this guest network - if (!nsSnipExists(vlanSelfIp)) { - try { - nsip selfIp = new nsip(); - selfIp.set_ipaddress(vlanSelfIp); - selfIp.set_netmask(vlanNetmask); - selfIp.set_type("SNIP"); - apiCallResult = nsip.add(_netscalerService, selfIp); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to add SNIP object for the guest network on the Netscaler device due to "+ apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to add SNIP object for the guest network on the Netscaler device due to " + e.getMessage()); - } - } - - // bind the vlan object to subnet IP object - if (!nsVlanNsipBindingExists(vlanTag, vlanSelfIp)) { - try { - vlan_nsip_binding ipVlanBinding = new vlan_nsip_binding(); - ipVlanBinding.set_id(vlanTag); - ipVlanBinding.set_ipaddress(vlanSelfIp); - ipVlanBinding.set_netmask(vlanNetmask); - apiCallResult = vlan_nsip_binding.add(_netscalerService, ipVlanBinding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to bind VLAN with tag:" + vlanTag + " to the subnet due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to bind VLAN with tage:"+ vlanTag + " to the subnet due to " + e.getMessage()); - } - } - - // bind vlan object to the private interface - try { - vlan_interface_binding vlanBinding = new vlan_interface_binding(); - if (guestVlan) { - vlanBinding.set_ifnum(_privateInterface); - } else { - vlanBinding.set_ifnum(_publicInterface); - } - vlanBinding.set_tagged(true); - vlanBinding.set_id(vlanTag); - apiCallResult = vlan_interface_binding.add(_netscalerService, vlanBinding); - if (apiCallResult.errorcode != 0) { - String vlanInterface = guestVlan ? _privateInterface : _publicInterface; - throw new ExecutionException("Failed to bind vlan with tag:" + vlanTag + " with the interface " + vlanInterface + " due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - if (!(e.getErrorCode() == NitroError.NS_INTERFACE_ALREADY_BOUND_TO_VLAN)) { - throw new ExecutionException("Failed to bind VLAN "+ vlanTag + " with interface on the Netscaler device due to " + e.getMessage()); - } - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to implement guest network on the Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to implement guest network on the Netscaler device due to " + e.getMessage()); - } - } - - private void deleteGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { - try { - - // Delete all servers and associated services from this guest VLAN - deleteServersInGuestVlan(vlanTag, vlanSelfIp, vlanNetmask); - - // unbind vlan to the private interface - try { - vlan_interface_binding vlanIfBinding = new vlan_interface_binding(); - vlanIfBinding.set_id(vlanTag); - vlanIfBinding.set_ifnum(_privateInterface); - vlanIfBinding.set_tagged(true); - apiCallResult = vlan_interface_binding.delete(_netscalerService, vlanIfBinding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the private interface due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - // if Vlan to interface binding does not exist then ignore the exception and proceed - if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { - throw new ExecutionException("Failed to unbind vlan from the interface while shutdown of guest network on the Netscaler device due to " + e.getMessage()); - } - } - - // unbind the vlan to subnet - try { - vlan_nsip_binding vlanSnipBinding = new vlan_nsip_binding(); - vlanSnipBinding.set_netmask(vlanNetmask); - vlanSnipBinding.set_ipaddress(vlanSelfIp); - vlanSnipBinding.set_id(vlanTag); - apiCallResult = vlan_nsip_binding.delete(_netscalerService, vlanSnipBinding); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the subnet due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - // if Vlan to subnet binding does not exist then ignore the exception and proceed - if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { - throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the subnet due to " + e.getMessage()); - } - } - - // remove subnet IP - try { - nsip subnetIp = nsip.get(_netscalerService, vlanSelfIp); - apiCallResult = nsip.delete(_netscalerService, subnetIp); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove subnet ip:" + vlanSelfIp + " from the NetScaler device due to" + apiCallResult.message); - } - } catch (nitro_exception e) { - // if subnet SNIP does not exist then ignore the exception and proceed - if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { - throw new ExecutionException("Failed to remove subnet ip:" + vlanSelfIp + " from the NetScaler device due to" + e.getMessage()); - } - } - - // remove the vlan from the NetScaler device - if (nsVlanExists(vlanTag)) { - // remove vlan - apiCallResult = com.citrix.netscaler.nitro.resource.config.network.vlan.delete(_netscalerService, vlanTag); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove vlan with tag:" + vlanTag + "due to" + apiCallResult.message); - } - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to delete guest vlan network on the Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to delete guest vlan network on the Netscaler device due to " + e.getMessage()); - } - } - - private boolean nsVlanExists(long vlanTag) throws ExecutionException { - try { - if (vlan.get(_netscalerService, new Long(vlanTag)) != 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 VLAN exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify VLAN exists on the NetScaler device due to " + e.getMessage()); - } - } - - private boolean nsSnipExists(String subnetIP) throws ExecutionException { - try { - nsip snip = nsip.get(_netscalerService, subnetIP); - return (snip != null); - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return false; - } else { - throw new ExecutionException("Failed to verify if SNIP exists on the NetScaler device due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify if SNIP exists on the NetScaler device due to " + e.getMessage()); - } - } - - private boolean nsServerExists(String serverName) throws ExecutionException { - try { - if (com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService, 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 boolean nsVlanNsipBindingExists(long vlanTag, String vlanSelfIp) throws ExecutionException { - try { - vlan_nsip_binding[] vlanNsipBindings = vlan_nsip_binding.get(_netscalerService, vlanTag); - if (vlanNsipBindings != null && vlanNsipBindings[0] != null && vlanNsipBindings[0].get_ipaddress().equalsIgnoreCase(vlanSelfIp)) { - 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 Vlan " + vlanTag + " to SNIP " + vlanSelfIp + " binding exists due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify Vlan " + vlanTag + " to SNIP " + vlanSelfIp + " binding exists due to " + e.getMessage()); - } - } - - private lbvserver getVirtualServerIfExisits(String lbVServerName ) throws ExecutionException { - try { - return lbvserver.get(_netscalerService, lbVServerName); - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return null; - } else { - throw new ExecutionException(e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException(e.getMessage()); - } - } - - private boolean isServiceBoundToVirtualServer(String serviceName) throws ExecutionException { - try { - lbvserver[] lbservers = lbvserver.get(_netscalerService); - for (lbvserver vserver : lbservers) { - filtervalue[] filter = new filtervalue[1]; - filter[0] = new filtervalue("servicename", serviceName); - lbvserver_service_binding[] result = (lbvserver_service_binding[]) lbvserver_service_binding.get_filtered(_netscalerService, vserver.get_name(), filter); - if (result != null && result.length > 0) { - return true; - } - } - return false; - } catch (Exception e) { - throw new ExecutionException("Failed to verify service " + serviceName + " is bound to any virtual server due to " + e.getMessage()); - } - } - - private boolean nsServiceExists(String serviceName) throws ExecutionException { - try { - if (com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, serviceName) != null) { - return true; - } else { - return false; - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_NO_SERIVCE) { - return false; - } else { - throw new ExecutionException("Failed to verify service " + serviceName + " exists due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to verify service " + serviceName + " exists due to " + e.getMessage()); - } - } - - private boolean nsServiceBindingExists(String lbVirtualServer, String serviceName) throws ExecutionException { - try { - com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, lbVirtualServer); - if (serviceBindings != null) { - for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { - if (serviceName.equalsIgnoreCase(binding.get_servicename())) { - return true; - } - } - } - return false; - } catch (nitro_exception e) { - throw new ExecutionException("Failed to verify lb vserver " + lbVirtualServer + "and service " + serviceName + " binding exists due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to verify lb vserver " + lbVirtualServer + "and service " + serviceName + " binding exists due to " + e.getMessage()); - } - } - - private void deleteServersInGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { - try { - com.citrix.netscaler.nitro.resource.config.basic.server[] serverList = com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService); - - if (serverList == null) { - return; - } - - // remove the server and services associated with guest vlan - for (com.citrix.netscaler.nitro.resource.config.basic.server server : serverList) { - // check if server belong to same subnet as one associated with vlan - if (NetUtils.sameSubnet(vlanSelfIp, server.get_ipaddress(), vlanNetmask)) { - // first remove services associated with this server - com.citrix.netscaler.nitro.resource.config.basic.service serveicesList[] = com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService); - if (serveicesList != null) { - for (com.citrix.netscaler.nitro.resource.config.basic.service svc : serveicesList) { - if (svc.get_servername().equals(server.get_ipaddress())) { - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, svc.get_name()); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove service:" + svc.get_name()); - } - } - } - } - // remove the server - apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, server.get_name()); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to remove server:" + server.get_name()); - } - } - } - } catch (Exception e) { - throw new ExecutionException("Failed to delete server and services in the guest vlan:" + vlanTag + " on the Netscaler device due to: "+ e.getMessage()); - } - } - - private String getNetScalerProtocol(LoadBalancerTO loadBalancer) throws ExecutionException { - String port = Integer.toString(loadBalancer.getSrcPort()); - String lbProtocol = loadBalancer.getProtocol(); - StickinessPolicyTO[] stickyPolicies = loadBalancer.getStickinessPolicies(); - String nsProtocol = "TCP"; - - if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)){ - StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; - if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName()) || - (StickinessMethodType.AppCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName()))) { - nsProtocol = "HTTP"; - return nsProtocol; - } - } - - if (port.equals(NetUtils.HTTP_PORT)) { - nsProtocol = "HTTP"; - } else if (NetUtils.TCP_PROTO.equalsIgnoreCase(lbProtocol)) { - nsProtocol = "TCP"; - } else if (NetUtils.UDP_PROTO.equalsIgnoreCase(lbProtocol)) { - nsProtocol = "UDP"; - } - - return nsProtocol; - } - - private void addLBVirtualServer(String virtualServerName, String publicIp, int publicPort, String lbAlgorithm, String protocol, StickinessPolicyTO[] stickyPolicies) throws ExecutionException { - try { - String lbMethod; - if ("roundrobin".equalsIgnoreCase(lbAlgorithm)) { - lbMethod = "ROUNDROBIN"; - } else if ("leastconn".equalsIgnoreCase(lbAlgorithm)) { - lbMethod = "LEASTCONNECTION"; - } else if ("source".equalsIgnoreCase(lbAlgorithm)) { - lbMethod = "SOURCEIPHASH"; - } else { - throw new ExecutionException("Got invalid load balancing algorithm: " + lbAlgorithm + " in the load balancing rule"); - } - - boolean vserverExisis = false; - lbvserver vserver = getVirtualServerIfExisits(virtualServerName); - if (vserver == null) { - vserver = new lbvserver(); - } else { - if (!vserver.get_servicetype().equalsIgnoreCase(protocol)) { - throw new ExecutionException("Can not update virtual server:" + virtualServerName + " as current protocol:" + vserver.get_servicetype() + " of virtual server is different from the " - + " intended protocol:" + protocol); - } - vserverExisis = true; - } - vserver.set_name(virtualServerName); - vserver.set_ipv46(publicIp); - vserver.set_port(publicPort); - vserver.set_servicetype(protocol); - vserver.set_lbmethod(lbMethod); - - // netmask can only be set for source IP load balancer algorithm - if (!lbMethod.equalsIgnoreCase("SOURCEIPHASH")) { - vserver.set_netmask(null); - vserver.set_v6netmasklen(null); - } - - if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)){ - long timeout = 2;// netscaler default 2 min - String cookieName = null; - StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; - - // get the session persistence parameters - List> paramsList = stickinessPolicy.getParams(); - for(Pair param : paramsList) { - if ("holdtime".equalsIgnoreCase(param.first())) { - timeout = Long.parseLong(param.second()); - } else if ("name".equalsIgnoreCase(param.first())) { - cookieName = param.second(); - } - } - - // configure virtual server based on the persistence method - if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - vserver.set_persistencetype("COOKIEINSERT"); - } else if (StickinessMethodType.SourceBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - vserver.set_persistencetype("SOURCEIP"); - } else if (StickinessMethodType.AppCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { - vserver.set_persistencetype("RULE"); - vserver.set_rule("HTTP.REQ.HEADER(\"COOKIE\").VALUE(0).typecast_nvlist_t('=',';').value(\"" + cookieName + "\")"); - vserver.set_resrule("HTTP.RES.HEADER(\"SET-COOKIE\").VALUE(0).typecast_nvlist_t('=',';').value(\"" + cookieName + "\")"); - } else { - throw new ExecutionException("Got invalid session persistence method: " + stickinessPolicy.getMethodName() + " in the load balancing rule"); - } - - // set session persistence timeout - vserver.set_timeout(timeout); - } else { - if (vserver.get_persistencetype() != null) { - // delete the LB stickyness policy - vserver.set_persistencetype("NONE"); - } - } - - if (vserverExisis) { - apiCallResult = lbvserver.update(_netscalerService,vserver); - } else { - apiCallResult = lbvserver.add(_netscalerService,vserver); - } - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to create new load balancing virtual server:" + virtualServerName + " due to " + apiCallResult.message); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Created load balancing virtual server " + virtualServerName + " on the Netscaler device"); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to create new virtual server:" + virtualServerName + " due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to create new virtual server:" + virtualServerName + " due to " + e.getMessage()); - } - } - - private void removeLBVirtualServer (String virtualServerName) throws ExecutionException { - try { - lbvserver vserver = lbvserver.get(_netscalerService, virtualServerName); - if (vserver == null) { - return; - } - apiCallResult = lbvserver.delete(_netscalerService, vserver); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Failed to delete virtual server:" + virtualServerName + " due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { - return; - } else { - throw new ExecutionException("Failed remove virtual server:" + virtualServerName +" due to " + e.getMessage()); - } - } catch (Exception e) { - throw new ExecutionException("Failed to remove virtual server:" + virtualServerName +" due to " + e.getMessage()); - } - } - - private void saveConfiguration() throws ExecutionException { - try { - apiCallResult = nsconfig.save(_netscalerService); - if (apiCallResult.errorcode != 0) { - throw new ExecutionException("Error occured while saving configuration changes to Netscaler device due to " + apiCallResult.message); - } - } catch (nitro_exception e) { - throw new ExecutionException("Failed to save configuration changes to Netscaler device due to " + e.getMessage()); - } catch (Exception e) { - throw new ExecutionException("Failed to save configuration changes to Netscaler device due to " + e.getMessage()); - } - } - - private ExternalNetworkResourceUsageAnswer getPublicIpBytesSentAndReceived(ExternalNetworkResourceUsageCommand cmd) throws ExecutionException { - ExternalNetworkResourceUsageAnswer answer = new ExternalNetworkResourceUsageAnswer(cmd); - - try { - lbvserver_stats[] stats = lbvserver_stats.get(_netscalerService); - - if (stats == null || stats.length == 0) { - return answer; - } - - for (lbvserver_stats stat_entry : stats) { - String lbvserverName = stat_entry.get_name(); - lbvserver vserver = lbvserver.get(_netscalerService, lbvserverName); - if(vserver != null){ - String lbVirtualServerIp = vserver.get_ipv46(); - - long[] bytesSentAndReceived = answer.ipBytes.get(lbVirtualServerIp); - if (bytesSentAndReceived == null) { - bytesSentAndReceived = new long[]{0, 0}; - } - bytesSentAndReceived[0] += stat_entry.get_totalrequestbytes(); - bytesSentAndReceived[1] += stat_entry.get_totalresponsebytes(); - - if (bytesSentAndReceived[0] >= 0 && bytesSentAndReceived[1] >= 0) { - answer.ipBytes.put(lbVirtualServerIp, bytesSentAndReceived); - } - } - } - } catch (Exception e) { - s_logger.error("Failed to get bytes sent and recived statistics due to " + e); - throw new ExecutionException(e.getMessage()); - } - - return answer; - } - - private Answer retry(Command cmd, int numRetries) { - int numRetriesRemaining = numRetries - 1; - s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetriesRemaining); - return executeRequest(cmd, numRetriesRemaining); - } - - private boolean shouldRetry(int numRetries) { - try { - if (numRetries > 0) { - login(); - return true; - } - } catch (Exception e) { - s_logger.error("Failed to log in to Netscaler device at " + _ip + " due to " + e.getMessage()); - } - return false; - } - - private String generateInatRuleName(String srcIp, String dstIP) { - return genObjectName("Cloud-Inat", srcIp); - } - - private String generateNSVirtualServerName(String srcIp, long srcPort) { - return genObjectName("Cloud-VirtualServer", srcIp, srcPort); - } - - private String generateNSServerName(String serverIP) { - return genObjectName("Cloud-Server-", serverIP); - } - - private String generateNSServiceName(String ip, long port) { - return genObjectName("Cloud-Service", ip, port); - } - - private String genObjectName(Object... args) { - String objectName = ""; - for (int i = 0; i < args.length; i++) { - objectName += args[i]; - if (i != args.length -1) { - objectName += _objectNamePathSep; - } - } - return objectName; - } - - @Override - public IAgentControl getAgentControl() { - return null; - } - - @Override - public PingCommand getCurrentStatus(long id) { - return new PingCommand(Host.Type.ExternalLoadBalancer, id); - } - - @Override - public Type getType() { - return Host.Type.ExternalLoadBalancer; - } - - @Override - public void setAgentControl(IAgentControl agentControl) { - return; - } - - @Override - public String getName() { - return _name; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - return true; - } - - @Override - public void disconnected() { - return; - } -} \ No newline at end of file +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.resource; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Formatter; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.citrix.netscaler.nitro.exception.nitro_exception; +import com.citrix.netscaler.nitro.resource.base.base_response; +import com.citrix.netscaler.nitro.resource.config.basic.server_service_binding; +import com.citrix.netscaler.nitro.resource.config.lb.lbvserver; +import com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding; +import com.citrix.netscaler.nitro.resource.config.network.Interface; +import com.citrix.netscaler.nitro.resource.config.network.inat; +import com.citrix.netscaler.nitro.resource.config.network.vlan; +import com.citrix.netscaler.nitro.resource.config.network.vlan_interface_binding; +import com.citrix.netscaler.nitro.resource.config.network.vlan_nsip_binding; +import com.citrix.netscaler.nitro.resource.config.ns.nsconfig; +import com.citrix.netscaler.nitro.resource.config.ns.nshardware; +import com.citrix.netscaler.nitro.resource.config.ns.nsip; +import com.citrix.netscaler.nitro.resource.stat.lb.lbvserver_stats; +import com.citrix.netscaler.nitro.service.nitro_service; +import com.citrix.netscaler.nitro.util.filtervalue; +import com.citrix.sdx.nitro.resource.config.device_profile; +import com.citrix.sdx.nitro.resource.config.mps; +import com.citrix.sdx.nitro.resource.config.ns; +import com.citrix.sdx.nitro.resource.config.xen_vpx_image; +import com.cloud.agent.IAgentControl; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.ExternalNetworkResourceUsageAnswer; +import com.cloud.agent.api.ExternalNetworkResourceUsageCommand; +import com.cloud.agent.api.MaintainAnswer; +import com.cloud.agent.api.MaintainCommand; +import com.cloud.agent.api.PingCommand; +import com.cloud.agent.api.ReadyAnswer; +import com.cloud.agent.api.ReadyCommand; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.StartupExternalLoadBalancerCommand; +import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; +import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; +import com.cloud.agent.api.routing.IpAssocAnswer; +import com.cloud.agent.api.routing.IpAssocCommand; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.SetStaticNatRulesAnswer; +import com.cloud.agent.api.routing.SetStaticNatRulesCommand; +import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.agent.api.to.LoadBalancerTO.AutoScalePolicyTO; +import com.cloud.agent.api.to.LoadBalancerTO.AutoScaleVmGroupTO; +import com.cloud.agent.api.to.LoadBalancerTO.AutoScaleVmProfileTO; +import com.cloud.agent.api.to.LoadBalancerTO.ConditionTO; +import com.cloud.agent.api.to.LoadBalancerTO.CounterTO; +import com.cloud.agent.api.to.LoadBalancerTO.DestinationTO; +import com.cloud.agent.api.to.LoadBalancerTO.StickinessPolicyTO; +import com.cloud.agent.api.to.StaticNatRuleTO; +import com.cloud.api.ApiConstants; +import com.cloud.host.Host; +import com.cloud.host.Host.Type; +import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; +import com.cloud.resource.ServerResource; +import com.cloud.serializer.GsonHelper; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.exception.ExecutionException; +import com.cloud.utils.net.NetUtils; +import com.google.gson.Gson; + +class NitroError { + static final int NS_RESOURCE_EXISTS = 273; + static final int NS_RESOURCE_NOT_EXISTS=258; + static final int NS_NO_SERIVCE = 344; + static final int NS_OPERATION_NOT_PERMITTED = 257; + static final int NS_INTERFACE_ALREADY_BOUND_TO_VLAN = 2080; +} + +public class NetscalerResource implements ServerResource { + + // deployment configuration + private String _name; + private String _zoneId; + private String _physicalNetworkId; + private String _ip; + private String _username; + private String _password; + private String _publicInterface; + private String _privateInterface; + private Integer _numRetries; + private String _guid; + private boolean _inline; + private boolean _isSdx; + private boolean _cloudManaged; + private String _deviceName; + private String _publicIP; + private String _publicIPNetmask; + private String _publicIPGateway; + private String _publicIPVlan; + + private static final Logger s_logger = Logger.getLogger(NetscalerResource.class); + protected Gson _gson; + private String _objectNamePathSep = "-"; + + // interface to interact with VPX and MPX devices + com.citrix.netscaler.nitro.service.nitro_service _netscalerService ; + + // interface to interact with service VM of the SDX appliance + com.citrix.sdx.nitro.service.nitro_service _netscalerSdxService; + + Long _timeout = new Long(100000); + base_response apiCallResult; + + public NetscalerResource () { + _gson = GsonHelper.getGsonLogger(); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + try { + _name = (String) params.get("name"); + if (_name == null) { + throw new ConfigurationException("Unable to find name in the configuration parameters"); + } + + _zoneId = (String) params.get("zoneId"); + if (_zoneId == null) { + throw new ConfigurationException("Unable to find zone Id in the configuration parameters"); + } + + _physicalNetworkId = (String) params.get("physicalNetworkId"); + if (_physicalNetworkId == null) { + throw new ConfigurationException("Unable to find physical network id in the configuration parameters"); + } + + _ip = (String) params.get("ip"); + if (_ip == null) { + throw new ConfigurationException("Unable to find IP address in the configuration parameters"); + } + + _username = (String) params.get("username"); + if (_username == null) { + throw new ConfigurationException("Unable to find username in the configuration parameters"); + } + + _password = (String) params.get("password"); + if (_password == null) { + throw new ConfigurationException("Unable to find password in the configuration parameters"); + } + + _publicInterface = (String) params.get("publicinterface"); + if (_publicInterface == null) { + throw new ConfigurationException("Unable to find public interface in the configuration parameters"); + } + + _privateInterface = (String) params.get("privateinterface"); + if (_privateInterface == null) { + throw new ConfigurationException("Unable to find private interface in the configuration parameters"); + } + + _numRetries = NumbersUtil.parseInt((String) params.get("numretries"), 2); + + _guid = (String)params.get("guid"); + if (_guid == null) { + throw new ConfigurationException("Unable to find the guid in the configuration parameters"); + } + + _deviceName = (String) params.get("deviceName"); + if (_deviceName == null) { + throw new ConfigurationException("Unable to find the device name in the configuration parameters"); + } + + _isSdx = _deviceName.equalsIgnoreCase("NetscalerSDXLoadBalancer"); + + _inline = Boolean.parseBoolean((String) params.get("inline")); + + if (((String) params.get("cloudmanaged")) != null) { + _cloudManaged = Boolean.parseBoolean((String) params.get("cloudmanaged")); + } + + // validate device configuration parameters + login(); + validateDeviceType(_deviceName); + validateInterfaces(_publicInterface, _privateInterface); + + //enable load balancing feature + enableLoadBalancingFeature(); + + //if the the device is cloud stack provisioned then make it part of the public network + if (_cloudManaged) { + _publicIP = (String) params.get("publicip"); + _publicIPGateway = (String) params.get("publicipgateway"); + _publicIPNetmask = (String) params.get("publicipnetmask"); + _publicIPVlan = (String) params.get("publicipvlan"); + if ("untagged".equalsIgnoreCase(_publicIPVlan)) { + // if public network is un-tagged just add subnet IP + addSubnetIP(_publicIP, _publicIPNetmask); + } else { + // if public network is tagged then add vlan and bind subnet IP to the vlan + addGuestVlanAndSubnet(Long.parseLong(_publicIPVlan), _publicIP, _publicIPNetmask, false); + } + } + + return true; + } catch (Exception e) { + throw new ConfigurationException(e.getMessage()); + } + } + + private void login() throws ExecutionException { + try { + if (!_isSdx) { + _netscalerService = new com.citrix.netscaler.nitro.service.nitro_service(_ip, "https"); + _netscalerService.set_credential(_username, _password); + _netscalerService.set_timeout(_timeout); + apiCallResult = _netscalerService.login(); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException ("Failed to log in to Netscaler device at " + _ip + " due to error " + apiCallResult.errorcode + " and message " + apiCallResult.message); + } + } else { + _netscalerSdxService = new com.citrix.sdx.nitro.service.nitro_service(_ip, "https"); + _netscalerSdxService.set_credential(_username, _password); + com.citrix.sdx.nitro.resource.base.login login = _netscalerSdxService.login(); + if (login == null) { + throw new ExecutionException ("Failed to log in to Netscaler device at " + _ip + " due to error " + apiCallResult.errorcode + " and message " + apiCallResult.message); + } + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to log in to Netscaler device at " + _ip + " due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to log in to Netscaler device at " + _ip + " due to " + e.getMessage()); + } + } + + private void enableLoadBalancingFeature() throws ExecutionException { + if (_isSdx) { + return; + } + try { + String[] features = _netscalerService.get_enabled_features(); + if (features != null) { + for (String feature : features) { + if (feature.equalsIgnoreCase("LB")) { + return; + } + } + } + + // enable load balancing on the device + String[] feature = new String[1]; + feature[0] = "LB"; + apiCallResult = _netscalerService.enable_features(feature); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Enabling load balancing feature on the device failed."); + } + } catch (nitro_exception e) { + throw new ExecutionException("Enabling load balancing feature on the device failed due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Enabling load balancing feature on the device failed due to " + e.getMessage()); + } + } + + private void validateInterfaces(String publicInterface, String privateInterface) throws ExecutionException { + try { + if (!_isSdx && !_cloudManaged) { + Interface publicIf = Interface.get(_netscalerService, publicInterface); + Interface privateIf = Interface.get(_netscalerService, privateInterface); + if (publicIf != null || privateIf != null) { + return; + } else { + throw new ExecutionException("Invalid interface name specified for public/private interfaces."); + } + } + } catch (nitro_exception e) { + if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { + throw new ExecutionException("Invalid interface name specified for public and private interfaces."); + } else { + throw new ExecutionException("Failed to verify public interface and private intefaces are valid due to " + e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify public interface and private intefaces are valid due to " + e.getMessage()); + } + } + + private void validateDeviceType(String deviceType) throws ExecutionException { + try { + if (!_isSdx && !_cloudManaged) { + nshardware nsHw = com.citrix.netscaler.nitro.resource.config.ns.nshardware.get(_netscalerService); + if (nsHw == null) { + throw new ExecutionException("Failed to get the hardware description of the Netscaler device at " + _ip); + } else { + if ((_deviceName.equalsIgnoreCase("NetscalerMPXLoadBalancer") && nsHw.get_hwdescription().contains("MPX")) + || (_deviceName.equalsIgnoreCase("NetscalerVPXLoadBalancer") && nsHw.get_hwdescription().contains("NetScaler Virtual Appliance"))) { + return; + } + throw new ExecutionException("Netscalar device type specified does not match with the actuall device type."); + } + } else if (_isSdx) { + mps serviceVM = mps.get(_netscalerSdxService); + if (serviceVM != null) { + if (serviceVM.get_platform().contains("SDX") || serviceVM.get_product().contains("SDX")) { + return; + } else { + throw new ExecutionException("Netscalar device type specified does not match with the actuall device type."); + } + } else { + throw new ExecutionException("Failed to get the hardware details of the Netscaler device at " + _ip); + } + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify device type specified when matching with actuall device type due to " + e.getMessage()); + } + } + + @Override + public StartupCommand[] initialize() { + StartupExternalLoadBalancerCommand cmd = new StartupExternalLoadBalancerCommand(); + cmd.setName(_name); + cmd.setDataCenter(_zoneId); + cmd.setPod(""); + cmd.setPrivateIpAddress(_ip); + cmd.setStorageIpAddress(""); + cmd.setVersion(""); + cmd.setGuid(_guid); + return new StartupCommand[]{cmd}; + } + + @Override + public Answer executeRequest(Command cmd) { + return executeRequest(cmd, _numRetries); + } + + private Answer executeRequest(Command cmd, int numRetries) { + if (cmd instanceof ReadyCommand) { + return execute((ReadyCommand) cmd); + } else if (cmd instanceof MaintainCommand) { + return execute((MaintainCommand) cmd); + } else if (cmd instanceof IpAssocCommand) { + return execute((IpAssocCommand) cmd, numRetries); + } else if (cmd instanceof LoadBalancerConfigCommand) { + return execute((LoadBalancerConfigCommand) cmd, numRetries); + } else if (cmd instanceof ExternalNetworkResourceUsageCommand) { + return execute((ExternalNetworkResourceUsageCommand) cmd, numRetries); + } else if (cmd instanceof CreateLoadBalancerApplianceCommand) { + return execute((CreateLoadBalancerApplianceCommand) cmd, numRetries); + } else if (cmd instanceof DestroyLoadBalancerApplianceCommand) { + return execute((DestroyLoadBalancerApplianceCommand) cmd, numRetries); + } else if (cmd instanceof SetStaticNatRulesCommand) { + return execute((SetStaticNatRulesCommand) cmd, numRetries); + } else { + return Answer.createUnsupportedCommandAnswer(cmd); + } + } + + private Answer execute(ReadyCommand cmd) { + return new ReadyAnswer(cmd); + } + + protected Answer execute(MaintainCommand cmd) { + return new MaintainAnswer(cmd); + } + + private synchronized Answer execute(IpAssocCommand cmd, int numRetries) { + if (_isSdx) { + return Answer.createUnsupportedCommandAnswer(cmd); + } + + String[] results = new String[cmd.getIpAddresses().length]; + int i = 0; + try { + IpAddressTO[] ips = cmd.getIpAddresses(); + for (IpAddressTO ip : ips) { + long guestVlanTag = Long.valueOf(ip.getVlanId()); + String vlanSelfIp = ip.getVlanGateway(); + String vlanNetmask = ip.getVlanNetmask(); + + if (ip.isAdd()) { + // Add a new guest VLAN and its subnet and bind it to private interface + addGuestVlanAndSubnet(guestVlanTag, vlanSelfIp, vlanNetmask, true); + } else { + // Check and delete guest VLAN with this tag, self IP, and netmask + deleteGuestVlan(guestVlanTag, vlanSelfIp, vlanNetmask); + } + + saveConfiguration(); + results[i++] = ip.getPublicIp() + " - success"; + String action = ip.isAdd() ? "associate" : "remove"; + if (s_logger.isDebugEnabled()) { + s_logger.debug("Netscaler load balancer " + _ip + " successfully executed IPAssocCommand to " + action + " IP " + ip); + } + } + } catch (ExecutionException e) { + s_logger.error("Netscaler loadbalancer " + _ip+ " failed to execute IPAssocCommand due to " + e.getMessage()); + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } else { + results[i++] = IpAssocAnswer.errorResult; + } + } + + return new IpAssocAnswer(cmd, results); + } + + private boolean isScaleUpPolicy(AutoScalePolicyTO autoScalePolicyTO) { + return autoScalePolicyTO.getAction().equals("scaleup"); + } + + private boolean isScaleDownPolicy(AutoScalePolicyTO autoScalePolicyTO) { + return autoScalePolicyTO.getAction().equals("scaledown"); + } + + private long allocateNextAvailablePriority(List priorities) { + long cur_prirotiy = 1; + Collections.sort(priorities); + for (Long priority : priorities) { + if(cur_prirotiy != priority) { + priorities.add(cur_prirotiy); + return cur_prirotiy; + } + cur_prirotiy++; + } + return -1; + } + + @SuppressWarnings("static-access") + private synchronized boolean removeAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception, ExecutionException { + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + String serviceGroupName = generateAutoScaleServiceGroupName(nsVirtualServerName); + + disableAutoScaleConfig(loadBalancerTO); + + // UnBind autoscale service group + // unbind lb vserver lb lb_autoscaleGroup + com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding vserver_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding(); + try { + vserver_servicegroup_binding.set_name(nsVirtualServerName); + vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); + vserver_servicegroup_binding.delete(_netscalerService, vserver_servicegroup_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Remove autoscale service group + com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); + try { + serviceGroup.set_servicegroupname(serviceGroupName); + serviceGroup.delete(_netscalerService, serviceGroup); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // // Set min and max autoscale members to zero + // com.citrix.netscaler.nitro.resource.config.lb.lbvserver lbvserver = new +// com.citrix.netscaler.nitro.resource.config.lb.lbvserver(); + // try { + // lbvserver.set_name(nsVirtualServerName); + // lbvserver.set_minautoscalemembers(0); + // lbvserver.set_maxautoscalemembers(0); + // lbvserver.update(_netscalerService, lbvserver); + // } catch (Exception e) { + // // Ignore Exception + // throw e; + // } + + removeLBVirtualServer(nsVirtualServerName); + + return true; + } + + @SuppressWarnings("static-access") + private synchronized boolean disableAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception { + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + String profileName = generateAutoScaleProfileName(nsVirtualServerName); + String timerName = generateAutoScaleTimerName(nsVirtualServerName); + String scaleDownActionName = generateAutoScaleScaleDownActionName(nsVirtualServerName); + String scaleUpActionName = generateAutoScaleScaleUpActionName(nsVirtualServerName); + String mtName = generateSnmpMetricTableName(nsVirtualServerName); + String monitorName = generateSnmpMonitorName(nsVirtualServerName); + if(!loadBalancerTO.isAutoScaleVmGroupTO()) + return true; + AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); + List policies = vmGroupTO.getPolicies(); + + /* Create Counters */ + for (AutoScalePolicyTO autoScalePolicyTO : policies) { + List conditions = autoScalePolicyTO.getConditions(); + for (ConditionTO conditionTO : conditions) { + CounterTO counterTO = conditionTO.getCounter(); + if(counterTO.getSource() == "snmp") + { + break; + } + } + String policyId = Long.toString(autoScalePolicyTO.getId()); + String policyName = generateAutoScalePolicyName(nsVirtualServerName,policyId); + // unbind timer policy + // unbbind timer trigger lb_astimer -policyName lb_policy_scaleUp + com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding timer_policy_binding = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding(); + try { + timer_policy_binding.set_name(timerName); + timer_policy_binding.set_policyname(policyName); + timer_policy_binding.delete(_netscalerService, timer_policy_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + // Removing Timer policy + // rm timer policy lb_policy_scaleUp_cpu_mem + com.citrix.netscaler.nitro.resource.config.timer.timerpolicy timerPolicy = new com.citrix.netscaler.nitro.resource.config.timer.timerpolicy(); + try { + timerPolicy.set_name(policyName); + timerPolicy.delete(_netscalerService, timerPolicy); + } catch (Exception e) { + // Ignore Exception + throw e; + } + } + + /* Delete AutoScale Config */ + // Delete AutoScale ScaleDown action + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + try { + scaleDownAction.set_name(scaleDownActionName); + scaleDownAction.delete(_netscalerService, scaleDownAction); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Delete AutoScale ScaleUp action + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + try { + scaleUpAction.set_name(scaleUpActionName); + scaleUpAction.delete(_netscalerService, scaleUpAction); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Delete Timer + com.citrix.netscaler.nitro.resource.config.timer.timertrigger timer = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger(); + try { + timer.set_name(timerName); + timer.delete(_netscalerService, timer); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Delete AutoScale Profile + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile autoscaleProfile = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile(); + try { + autoscaleProfile.set_name(profileName); + autoscaleProfile.delete(_netscalerService, autoscaleProfile); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Delete Monitor + // rm lb monitor lb_metric_table_mon + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); + try { + monitor.set_monitorname(monitorName); + monitor.delete(_netscalerService, monitor); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Delete Metric Table + com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); + try { + metricTable.set_metric(mtName); + metricTable.delete(_netscalerService, metricTable); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + return true; + } + + @SuppressWarnings("static-access") + private synchronized boolean createAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws ExecutionException, Exception { + + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + String lbProtocol = getNetScalerProtocol(loadBalancerTO); + String lbAlgorithm = loadBalancerTO.getAlgorithm(); + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancerTO.getStickinessPolicies()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); + } + + String serviceGroupName = generateAutoScaleServiceGroupName(nsVirtualServerName); + if(!loadBalancerTO.isAutoScaleVmGroupTO()) + return true; + AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); + // add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80 + com.citrix.netscaler.nitro.resource.config.basic.servicegroup serviceGroup = new com.citrix.netscaler.nitro.resource.config.basic.servicegroup(); + int memberPort = vmGroupTO.getMemberPort(); + try { + serviceGroup.set_servicegroupname(serviceGroupName); + serviceGroup.set_autoscale("POLICY"); // TODO: Values not displayed in API + serviceGroup.set_memberport(memberPort); + serviceGroup.add(_netscalerService, serviceGroup); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Bind autoscale service group + // bind lb vserver lb lb_autoscaleGroup + com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding vserver_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver_servicegroup_binding(); + + try { + vserver_servicegroup_binding.set_name(nsVirtualServerName); + vserver_servicegroup_binding.set_servicegroupname(serviceGroupName); + vserver_servicegroup_binding.add(_netscalerService, vserver_servicegroup_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Create the autoscale config + enableAutoScaleConfig(loadBalancerTO); + return true; + } + + @SuppressWarnings("static-access") + private synchronized boolean enableAutoScaleConfig(LoadBalancerTO loadBalancerTO) throws Exception { + String srcIp = loadBalancerTO.getSrcIp(); + int srcPort = loadBalancerTO.getSrcPort(); + + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + String serviceGroupName = generateAutoScaleServiceGroupName(nsVirtualServerName); + String profileName = generateAutoScaleProfileName(nsVirtualServerName); + String timerName = generateAutoScaleTimerName(nsVirtualServerName); + String scaleDownActionName = generateAutoScaleScaleDownActionName(nsVirtualServerName); + String scaleUpActionName = generateAutoScaleScaleUpActionName(nsVirtualServerName); + String mtName = generateSnmpMetricTableName(nsVirtualServerName); + String monitorName = generateSnmpMonitorName(nsVirtualServerName); + if(!loadBalancerTO.isAutoScaleVmGroupTO()) + return true; + AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); + AutoScaleVmProfileTO profileTO = vmGroupTO.getProfile(); + List policies = vmGroupTO.getPolicies(); + int interval = vmGroupTO.getInterval(); + int snmpPort = profileTO.getSnmpPort(); + String snmpCommunity = profileTO.getSnmpCommunity(); + ArrayList priorities = new ArrayList(); + if(!vmGroupTO.isRevoked()) { + // Set min and max autoscale members; + // add lb vserver lb http 10.102.31.100 80 -minAutoscaleMinMembers 3 -maxAutoscaleMembers 10 + int minAutoScaleMembers = vmGroupTO.getMinMembers(); + int maxAutoScaleMembers = vmGroupTO.getMaxMembers(); + com.citrix.netscaler.nitro.resource.config.lb.lbvserver lbvserver = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver(); + try { + lbvserver.set_name(nsVirtualServerName); + lbvserver.set_minautoscalemembers(minAutoScaleMembers); + lbvserver.set_maxautoscalemembers(maxAutoScaleMembers); + lbvserver.update(_netscalerService, lbvserver); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + /* AutoScale Config */ + // Add AutoScale Profile + // add autoscale profile lb_asprofile CLOUDSTACK -url -http:// 10.102.31.34:8080/client/api- -apiKey abcdef +// -sharedSecret xyzabc + String apiKey = profileTO.getAutoScaleUserApiKey(); + String secretKey = profileTO.getAutoScaleUserSecretKey(); + String url = profileTO.getCloudStackApiUrl(); + + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile autoscaleProfile = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleprofile(); + try { + autoscaleProfile.set_name(profileName); + autoscaleProfile.set_apikey(apiKey); + autoscaleProfile.set_sharedsecret(secretKey); + autoscaleProfile.set_url(url); + autoscaleProfile.add(_netscalerService, autoscaleProfile); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Add Timer + com.citrix.netscaler.nitro.resource.config.timer.timertrigger timer = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger(); + try { + timer.set_name(timerName); + timer.set_interval(interval); + timer.add(_netscalerService, timer); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // AutoScale Actions + Integer scaleUpQuietTime = null; + Integer scaleDownQuietTime = null; + for (AutoScalePolicyTO autoScalePolicyTO : policies) { + if(scaleUpQuietTime == null) { + if(isScaleUpPolicy(autoScalePolicyTO)) { + scaleUpQuietTime = autoScalePolicyTO.getQuietTime(); + if(scaleDownQuietTime == null) { + break; + } + } + } + if(scaleDownQuietTime == null) { + if(isScaleDownPolicy(autoScalePolicyTO)) { + scaleDownQuietTime = autoScalePolicyTO.getQuietTime(); + if(scaleUpQuietTime == null) { + break; + } + } + } + } + + // Add AutoScale ScaleUp action + // add autoscale action lb_scaleUpAction provision -vserver lb -profilename lb_asprofile -params +// -lbruleid=1234&command=deployvm&zoneid=10&templateid=5&serviceofferingid=3- -quiettime 300 + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleUpAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + try { + scaleUpAction.set_name(scaleUpActionName); + scaleUpAction.set_type("SCALE_UP"); // TODO: will this be called provision? + scaleUpAction.set_vserver(nsVirtualServerName); // Actions Vserver, the one that is autoscaled, with CS +// now both are same. Not exposed in API. + scaleUpAction.set_profilename(profileName); + scaleUpAction.set_quiettime(scaleUpQuietTime); + String scaleUpParameters = "command=deployVirtualMachine" + "&" + + ApiConstants.ZONE_ID + "=" + profileTO.getZoneId()+ "&" + + ApiConstants.SERVICE_OFFERING_ID + "=" + profileTO.getServiceOfferingId()+ "&" + + ApiConstants.TEMPLATE_ID + "=" + profileTO.getTemplateId()+ "&" + + ((profileTO.getOtherDeployParams() == null)? "" : (profileTO.getOtherDeployParams() + "&")) + + "lbRuleId=" + loadBalancerTO.getId(); + scaleUpAction.set_parameters(scaleUpParameters); + scaleUpAction.add(_netscalerService, scaleUpAction); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction scaleDownAction = new com.citrix.netscaler.nitro.resource.config.autoscale.autoscaleaction(); + Integer destroyVmGracePeriod = profileTO.getDestroyVmGraceperiod(); + try { + scaleDownAction.set_name(scaleDownActionName); + scaleDownAction.set_type("SCALE_DOWN"); // TODO: will this be called de-provision? + scaleDownAction.set_vserver(nsVirtualServerName); // TODO: no global option as of now through Nitro. +// Testing cannot be done. + scaleDownAction.set_profilename(profileName); + scaleDownAction.set_quiettime(scaleDownQuietTime); + String scaleDownParameters = "command=destroyVirtualMachine" + "&" + + "lbRuleId=" + loadBalancerTO.getId(); + scaleDownAction.set_parameters(scaleDownParameters); + scaleDownAction.set_vmdestroygraceperiod(destroyVmGracePeriod); + scaleDownAction.add(_netscalerService, scaleDownAction); + } catch (Exception e) { + // Ignore Exception + throw e; + } + } + + /* Create Counters */ + for (AutoScalePolicyTO autoScalePolicyTO : policies) { + boolean isPolicyRevoked = autoScalePolicyTO.isRevoked(); + List conditions = autoScalePolicyTO.getConditions(); + HashMap snmpMetrics = new HashMap(); + String policyExpression = ""; + int snmpCounterNumber = 0; + for (ConditionTO conditionTO : conditions) { + CounterTO counterTO = conditionTO.getCounter(); + String counterName = counterTO.getName(); + String operator = conditionTO.getRelationalOperator(); + long threshold = conditionTO.getThreshold(); + + StringBuilder conditionExpression = new StringBuilder(); + Formatter formatter = new Formatter(conditionExpression, Locale.US); + + if(counterTO.getSource().equals("snmp")) + { + counterName = counterName.replace(' ', '_'); + if(snmpMetrics.size() == 0) { + // Create Metric Table + //add lb metricTable lb_metric_table + com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable metricTable = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable(); + try { + metricTable.set_metric(mtName); + metricTable.add(_netscalerService, metricTable); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Create Monitor + // add lb monitor lb_metric_table_mon LOAD -destPort 161 -snmpCommunity public -metricTable +// lb_metric_table -interval + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor monitor = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor(); + try { + monitor.set_monitorname(monitorName); + monitor.set_destport(snmpPort); + monitor.set_snmpcommunity(snmpCommunity); + monitor.set_metrictable(mtName); + monitor.set_interval((int)(interval * 0.8)); + monitor.add(_netscalerService, monitor); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // Bind servicegroup to monitor. TODO: This will change later to bind Monitor to ServiceGroup. + // bind lb monitor lb_metric_table_mon lb_autoscaleGroup -passive + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding monitor_servicegroup_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_servicegroup_binding(); + try { + monitor_servicegroup_binding.set_monitorname(monitorName); + monitor_servicegroup_binding.set_servicegroupname(serviceGroupName); + monitor_servicegroup_binding.set_passive(true); // Mark the monitor to do only collect +// metrics, basically use it for autoscaling purpose only. + monitor_servicegroup_binding.add(_netscalerService, monitor_servicegroup_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + } + + // formatter.format("SYS.CUR_VSERVER.METRIC_TABLE(%s).AVG_VAL.%s(%ld)",counterName, operator, +// threshold); + boolean newMetric = !snmpMetrics.containsKey(counterName); + if(newMetric) { + snmpMetrics.put(counterName, snmpCounterNumber++); + } + formatter.format("SYS.VSERVER.SNMP_TABLE(%d).AVG_VAL.%s(%d)",snmpMetrics.get(counterName), operator, threshold); + + if(newMetric) + { + // bind lb metricTable lb_metric_table mem 1.3.6.1.4.1.2021.11.9.0 + String counterOid = counterTO.getValue(); + com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable_metric_binding metrictable_metric_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmetrictable_metric_binding(); + try { + metrictable_metric_binding.set_metrictable(mtName); + metrictable_metric_binding.set_metric(counterName); + metrictable_metric_binding.set_Snmpoid(counterOid); + metrictable_metric_binding.add(_netscalerService, metrictable_metric_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // bind lb monitor lb_metric_table_mon -metric cpu -metricThreshold 1 + com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding monitor_metrictable_binding = new com.citrix.netscaler.nitro.resource.config.lb.lbmonitor_lbmetrictable_binding(); + try { + monitor_metrictable_binding.set_metrictable(mtName); + monitor_metrictable_binding.set_metric(counterName); + monitor_metrictable_binding.set_metricthreshold(1); // 1 is a dummy threshold + monitor_metrictable_binding.add(_netscalerService, monitor_metrictable_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + } + } + else if (counterTO.getSource().equals("netscaler")) + { + formatter.format("SYS.VSERVER(%s).%s.AVG_VAL.%s(%d)",nsVirtualServerName, counterName, operator, threshold); + } + if(policyExpression.length() != 0) { + policyExpression += " && "; + } + policyExpression += conditionExpression; + } + policyExpression = "(" + policyExpression + ")"; + + String policyId = Long.toString(autoScalePolicyTO.getId()); + String policyName = generateAutoScalePolicyName(nsVirtualServerName,policyId); + if(!isPolicyRevoked) { + // Adding a autoscale policy + // add timer policy lb_policy_scaleUp_cpu_mem -rule - (SYS.CUR_VSERVER.METRIC_TABLE(cpu).AVG_VAL.GT(80)- +// -action lb_scaleUpAction + com.citrix.netscaler.nitro.resource.config.timer.timerpolicy timerPolicy = new com.citrix.netscaler.nitro.resource.config.timer.timerpolicy(); + try { + timerPolicy.set_name(policyName); + timerPolicy.set_action((isScaleUpPolicy(autoScalePolicyTO))? scaleUpActionName : scaleDownActionName); + timerPolicy.set_rule(policyExpression); + timerPolicy.add(_netscalerService, timerPolicy); + } catch (Exception e) { + // Ignore Exception + throw e; + } + + // bind timer policy + // bind timer trigger lb_astimer -policyName lb_policy_scaleUp -vserver lb -priority 1 -samplesize 5 +// -thresholdsize 5 + com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding timer_policy_binding = new com.citrix.netscaler.nitro.resource.config.timer.timertrigger_timerpolicy_binding(); + int sampleSize = autoScalePolicyTO.getDuration()/interval; + long priority = allocateNextAvailablePriority(priorities); + try { + timer_policy_binding.set_name(timerName); + timer_policy_binding.set_policyname(policyName); + timer_policy_binding.set_vserver(nsVirtualServerName); + timer_policy_binding.set_samplesize(sampleSize); + timer_policy_binding.set_thresholdsize(sampleSize); // We are not exposing this parameter as of now. +// i.e. n(m) is not exposed to CS user. So thresholdSize == sampleSize + timer_policy_binding.set_priority(priority); + timer_policy_binding.add(_netscalerService, timer_policy_binding); + } catch (Exception e) { + // Ignore Exception + throw e; + } + } + } + + return true; + } + + private synchronized void applyAutoScaleConfig(LoadBalancerTO loadBalancer) throws Exception, ExecutionException { + AutoScaleVmGroupTO vmGroupTO = loadBalancer.getAutoScaleVmGroupTO(); + if(vmGroupTO.getState().equals("New")) { + assert !loadBalancer.isRevoked(); + createAutoScaleConfig(loadBalancer); + } + if(loadBalancer.isRevoked() || vmGroupTO.getState().equals("Revoke")) { + removeAutoScaleConfig(loadBalancer); + } + if(vmGroupTO.getState().equals("Enabled")) { + assert !loadBalancer.isRevoked(); + enableAutoScaleConfig(loadBalancer); + } + if(vmGroupTO.getState().equals("Disabled")) { + assert !loadBalancer.isRevoked(); + disableAutoScaleConfig(loadBalancer); + } + } + + private synchronized Answer execute(LoadBalancerConfigCommand cmd, int numRetries) { + try { + if (_isSdx) { + return Answer.createUnsupportedCommandAnswer(cmd); + } + + LoadBalancerTO[] loadBalancers = cmd.getLoadBalancers(); + if (loadBalancers == null) { + return new Answer(cmd); + } + + for (LoadBalancerTO loadBalancer : loadBalancers) { + String srcIp = loadBalancer.getSrcIp(); + int srcPort = loadBalancer.getSrcPort(); + String lbProtocol = getNetScalerProtocol(loadBalancer); + String lbAlgorithm = loadBalancer.getAlgorithm(); + String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); + + if(loadBalancer.isAutoScaleVmGroupTO()) { + applyAutoScaleConfig(loadBalancer); + new Answer(cmd); + } + + boolean destinationsToAdd = false; + for (DestinationTO destination : loadBalancer.getDestinations()) { + if (!destination.isRevoked()) { + destinationsToAdd = true; + break; + } + } + + if (!loadBalancer.isRevoked() && destinationsToAdd) { + + // create a load balancing virtual server + addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancer.getStickinessPolicies()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Created load balancing virtual server " + nsVirtualServerName + " on the Netscaler device"); + } + + for (DestinationTO destination : loadBalancer.getDestinations()) { + + String nsServerName = generateNSServerName(destination.getDestIp()); + String nsServiceName = generateNSServiceName(destination.getDestIp(), destination.getDestPort()); + + if (!destination.isRevoked()) { + // add a new destination to deployed load balancing rule + + // add a new server + if (!nsServerExists(nsServerName)) { + com.citrix.netscaler.nitro.resource.config.basic.server nsServer = new com.citrix.netscaler.nitro.resource.config.basic.server(); + nsServer.set_name(nsServerName); + nsServer.set_ipaddress(destination.getDestIp()); + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.add(_netscalerService, nsServer); + if ((apiCallResult.errorcode != 0) && (apiCallResult.errorcode != NitroError.NS_RESOURCE_EXISTS)) { + throw new ExecutionException("Failed to add server " + destination.getDestIp() + " due to" + apiCallResult.message); + } + } + + // create a new service using the server added + if (!nsServiceExists(nsServiceName)) { + com.citrix.netscaler.nitro.resource.config.basic.service newService = new com.citrix.netscaler.nitro.resource.config.basic.service(); + newService.set_name(nsServiceName); + newService.set_port(destination.getDestPort()); + newService.set_servername(nsServerName); + newService.set_state("ENABLED"); + newService.set_servicetype(lbProtocol); + + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.add(_netscalerService, newService); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to create service " + nsServiceName + " using server " + nsServerName + " due to" + apiCallResult.message); + } + } + + //bind service to load balancing virtual server + if (!nsServiceBindingExists(nsVirtualServerName, nsServiceName)) { + com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding svcBinding = new com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding(); + svcBinding.set_name(nsVirtualServerName); + svcBinding.set_servicename(nsServiceName); + apiCallResult = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.add(_netscalerService, svcBinding); + + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to bind service: " + nsServiceName + " to the lb virtual server: " + nsVirtualServerName + " on Netscaler device"); + } + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Successfully added LB destination: " + destination.getDestIp() + ":" + destination.getDestPort() + " to load balancer " + srcIp + ":" + srcPort); + } + } else { + // remove a destination from the deployed load balancing rule + com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, + nsVirtualServerName); + if (serviceBindings != null) { + for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { + if (nsServiceName.equalsIgnoreCase(binding.get_servicename())) { + // delete the binding + apiCallResult = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.delete(_netscalerService, binding); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to delete the binding between the virtual server: " + nsVirtualServerName + " and service:" + nsServiceName + " due to" + + apiCallResult.message); + } + + // check if service is bound to any other virtual server + if (!isServiceBoundToVirtualServer(nsServiceName)) { + // no lb virtual servers are bound to this service so delete it + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, nsServiceName); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to delete service: " + nsServiceName + " due to " + apiCallResult.message); + } + } + + // delete the server if there is no associated services + server_service_binding[] services = server_service_binding.get(_netscalerService, nsServerName); + if ((services == null) || (services.length == 0)) { + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, nsServerName); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to remove server:" + nsServerName + " due to " + apiCallResult.message); + } + } + } + } + } + } + } + } else { + // delete the implemented load balancing rule and its destinations + lbvserver lbserver = getVirtualServerIfExisits(nsVirtualServerName); + if (lbserver != null) { + //unbind the all services associated with this virtual server + com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, + nsVirtualServerName); + + if (serviceBindings != null) { + for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { + String serviceName = binding.get_servicename(); + apiCallResult = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.delete(_netscalerService, binding); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to unbind service from the lb virtual server: " + nsVirtualServerName + " due to " + apiCallResult.message); + } + + com.citrix.netscaler.nitro.resource.config.basic.service svc = com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, serviceName); + String nsServerName = svc.get_servername(); + + // check if service is bound to any other virtual server + if (!isServiceBoundToVirtualServer(serviceName)) { + // no lb virtual servers are bound to this service so delete it + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, serviceName); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to delete service: " + serviceName + " due to " + apiCallResult.message); + } + } + + //delete the server if no more services attached + server_service_binding[] services = server_service_binding.get(_netscalerService, nsServerName); + if ((services == null) || (services.length == 0)) { + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, nsServerName); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to remove server:" + nsServerName + " due to " + apiCallResult.message); + } + } + } + } + removeLBVirtualServer(nsVirtualServerName); + } + } + } + + if (s_logger.isInfoEnabled()) { + s_logger.info("Successfully executed resource LoadBalancerConfigCommand: " + _gson.toJson(cmd)); + } + + saveConfiguration(); + return new Answer(cmd); + } catch (ExecutionException e) { + s_logger.error("Failed to execute LoadBalancerConfigCommand due to " + e.getMessage()); + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } else { + return new Answer(cmd, e); + } + } catch (Exception e) { + s_logger.error("Failed to execute LoadBalancerConfigCommand due to " + e.getMessage()); + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } else { + return new Answer(cmd, e); + } + } + } + + private synchronized Answer execute(CreateLoadBalancerApplianceCommand cmd, int numRetries) { + + if (!_isSdx) { + return Answer.createUnsupportedCommandAnswer(cmd); + } + + try { + String vpxName = "Cloud-VPX-"+cmd.getLoadBalancerIP(); + String username = "admin"; + String password = "admin"; + + ns ns_obj = new ns(); + ns_obj.set_name(vpxName); + ns_obj.set_ip_address(cmd.getLoadBalancerIP()); + ns_obj.set_netmask(cmd.getNetmask()); + ns_obj.set_gateway(cmd.getGateway()); + ns_obj.set_username(username); + ns_obj.set_password(password); + + // configure VPX instances with defaults + ns_obj.set_feature_license("Standard"); + ns_obj.set_memory_total(new Double(2048)); + ns_obj.set_throughput(new Double(1000)); + ns_obj.set_pps(new Double(1000000)); + ns_obj.set_number_of_ssl_cores(0); + + // use the first device profile available on the SDX to create an instance of VPX + device_profile[] profiles = device_profile.get(_netscalerSdxService); + if (!(profiles != null && profiles.length >= 1)) { + new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip + + " as there are no admin profile to use for creating VPX.")); + } + String profileName = profiles[0].get_name(); + ns_obj.set_nsroot_profile(profileName); + + // use the first VPX image of the available VPX images on the SDX to create an instance of VPX + // TODO: should enable the option to choose the template while adding the SDX device in to CloudStack + xen_vpx_image[] vpxImages = xen_vpx_image.get(_netscalerSdxService); + if (!(vpxImages != null && vpxImages.length >= 1)) { + new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip + + " as there are no VPX images on SDX to use for creating VPX.")); + } + String imageName = vpxImages[0].get_file_name(); + ns_obj.set_image_name(imageName); + + String publicIf = _publicInterface; + String privateIf = _privateInterface; + + // enable only the interfaces that will be used by VPX + enableVPXInterfaces(_publicInterface, _privateInterface, ns_obj); + + // create new VPX instance + ns newVpx = ns.add(_netscalerSdxService, ns_obj); + + if (newVpx == null) { + new Answer(cmd, new ExecutionException("Failed to create VPX instance on the netscaler SDX device " + _ip)); + } + + // wait for VPX instance to start-up + long startTick = System.currentTimeMillis(); + long startWaitMilliSeconds = 600000; + while(!newVpx.get_ns_state().equalsIgnoreCase("up") && System.currentTimeMillis() - startTick < startWaitMilliSeconds) { + try { + Thread.sleep(10000); + } catch(InterruptedException e) { + } + ns refreshNsObj = new ns(); + refreshNsObj.set_id(newVpx.get_id()); + newVpx = ns.get(_netscalerSdxService, refreshNsObj); + } + + // if vpx instance never came up then error out + if (!newVpx.get_ns_state().equalsIgnoreCase("up")) { + return new Answer(cmd, new ExecutionException("Failed to start VPX instance " + vpxName + " created on the netscaler SDX device " + _ip)); + } + + // wait till NS service in side VPX is actually ready + startTick = System.currentTimeMillis(); + boolean nsServiceUp = false; + long nsServiceWaitMilliSeconds = 60000; + while (System.currentTimeMillis() - startTick < nsServiceWaitMilliSeconds) { + try { + nitro_service _netscalerService = new nitro_service(cmd.getLoadBalancerIP(), "https"); + _netscalerService.set_credential(username, password); + _netscalerService.set_timeout(_timeout); + apiCallResult = _netscalerService.login(); + if (apiCallResult.errorcode == 0) { + nsServiceUp = true; + break; + } + } catch (Exception e) { + Thread.sleep(10000); + continue; + } + } + + if (!nsServiceUp) { + return new Answer(cmd, new ExecutionException("Failed to create VPX instance " + vpxName + " on the netscaler SDX device " + _ip)); + } + + if (s_logger.isInfoEnabled()) { + s_logger.info("Successfully provisioned VPX instance " + vpxName + " on the Netscaler SDX device " + _ip); + } + + // physical interfaces on the SDX range from 10/1 to 10/8 & 1/1 to 1/8 of which two different port or same +// port can be used for public and private interfaces + // However the VPX instances created will have interface range start from 10/1 but will only have as many +// interfaces enabled while creating the VPX instance + // So due to this, we need to map public & private interface on SDX to correct public & private interface of +// VPX + + int publicIfnum = Integer.parseInt(_publicInterface.substring(_publicInterface.lastIndexOf("/") + 1)); + int privateIfnum = Integer.parseInt(_privateInterface.substring(_privateInterface.lastIndexOf("/") + 1)); + + if (_publicInterface.startsWith("10/") && _privateInterface.startsWith("10/")) { + if (publicIfnum == privateIfnum) { + publicIf = "10/1"; + privateIf = "10/1"; + } else if (publicIfnum > privateIfnum) { + privateIf = "10/1"; + publicIf = "10/2"; + } else { + publicIf = "10/1"; + privateIf = "10/2"; + } + } else if (_publicInterface.startsWith("1/") && _privateInterface.startsWith("1/")) { + if (publicIfnum == privateIfnum) { + publicIf = "1/1"; + privateIf = "1/1"; + } else if (publicIfnum > privateIfnum) { + privateIf = "1/1"; + publicIf = "1/2"; + } else { + publicIf = "1/1"; + privateIf = "1/2"; + } + } else if (_publicInterface.startsWith("1/") && _privateInterface.startsWith("10/")) { + publicIf = "1/1"; + privateIf = "10/1"; + } else if (_publicInterface.startsWith("10/") && _privateInterface.startsWith("1/")) { + publicIf = "10/1"; + privateIf = "1/1"; + } + + return new CreateLoadBalancerApplianceAnswer(cmd, true, "provisioned VPX instance", "NetscalerVPXLoadBalancer", "Netscaler", new NetscalerResource(), + publicIf, privateIf, _username, _password); + } catch (Exception e) { + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } + return new CreateLoadBalancerApplianceAnswer(cmd, false, "failed to provisioned VPX instance due to " + e.getMessage(), null, null, null, null, null, null, null); + } + } + + private void enableVPXInterfaces(String publicIf, String privateIf, ns ns_obj) { + // enable VPX to use 10 gigabit Ethernet interfaces if public/private interface + // on SDX is a 10Gig interface + if (publicIf.equals("10/1") || privateIf.equals("10/1")) { + ns_obj.set_if_10_1(new Boolean(true)); + } + + if (publicIf.equals("10/2") || privateIf.equals("10/2")) { + ns_obj.set_if_10_2(new Boolean(true)); + } + + if (publicIf.equals("10/3") || privateIf.equals("10/3")) { + ns_obj.set_if_10_3(new Boolean(true)); + } + + if (publicIf.equals("10/4") || privateIf.equals("10/4")) { + ns_obj.set_if_10_4(new Boolean(true)); + } + + if (publicIf.equals("10/5") || privateIf.equals("10/5")) { + ns_obj.set_if_10_5(new Boolean(true)); + } + + if (publicIf.equals("10/6") || privateIf.equals("10/6")) { + ns_obj.set_if_10_6(new Boolean(true)); + } + + if (publicIf.equals("10/7") || privateIf.equals("10/7")) { + ns_obj.set_if_10_7(new Boolean(true)); + } + + if (publicIf.equals("10/8") || privateIf.equals("10/8")) { + ns_obj.set_if_10_8(new Boolean(true)); + } + + // enable VPX to use 1 gigabit Ethernet interfaces if public/private interface + // on SDX is a 1Gig interface + if (publicIf.equals("1/1") || privateIf.equals("1/1")) { + ns_obj.set_if_1_1(new Boolean(true)); + } + + if (publicIf.equals("1/2") || privateIf.equals("1/2")) { + ns_obj.set_if_1_2(new Boolean(true)); + } + + if (publicIf.equals("1/3") || privateIf.equals("1/3")) { + ns_obj.set_if_1_3(new Boolean(true)); + } + + if (publicIf.equals("1/4") || privateIf.equals("1/4")) { + ns_obj.set_if_1_4(new Boolean(true)); + } + + if (publicIf.equals("1/5") || privateIf.equals("1/5")) { + ns_obj.set_if_1_5(new Boolean(true)); + } + + if (publicIf.equals("1/6") || privateIf.equals("1/6")) { + ns_obj.set_if_1_6(new Boolean(true)); + } + + if (publicIf.equals("1/7") || privateIf.equals("1/7")) { + ns_obj.set_if_1_7(new Boolean(true)); + } + + if (publicIf.equals("1/8") || privateIf.equals("1/8")) { + ns_obj.set_if_1_8(new Boolean(true)); + } + } + + private synchronized Answer execute(DestroyLoadBalancerApplianceCommand cmd, int numRetries) { + String vpxName = "Cloud-VPX-"+cmd.getLoadBalancerIP(); + if (!_isSdx) { + return Answer.createUnsupportedCommandAnswer(cmd); + } + + try { + ns vpxToDelete =null; + ns[] vpxInstances = ns.get(_netscalerSdxService); + for (ns vpx : vpxInstances) { + if (vpx.get_name().equals(vpxName)) { + vpxToDelete = vpx; + break; + } + } + + if (vpxToDelete == null) { + String msg = "There is no VPX instance " + vpxName + " on the Netscaler SDX device " + _ip + " to delete"; + s_logger.warn(msg); + return new DestroyLoadBalancerApplianceAnswer(cmd, true, msg); + } + + // destroy the VPX instance + ns nsDelObj = new ns(); + nsDelObj.set_id(vpxToDelete.get_id()); + vpxToDelete = ns.delete(_netscalerSdxService, nsDelObj); + String msg = "Deleted VPX instance " + vpxName + " on Netscaler SDX " + _ip + " successfully."; + s_logger.info(msg); + return new DestroyLoadBalancerApplianceAnswer(cmd, true,msg); + } catch (Exception e) { + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } + return new DestroyLoadBalancerApplianceAnswer(cmd, false, "Failed to delete VPX instance " + vpxName + " on Netscaler SDX " + _ip); + } + } + + private synchronized Answer execute(SetStaticNatRulesCommand cmd, int numRetries) { + + if (_isSdx) { + return Answer.createUnsupportedCommandAnswer(cmd); + } + + String[] results = new String[cmd.getRules().length]; + int i = 0; + boolean endResult = true; + + try { + for (StaticNatRuleTO rule : cmd.getRules()) { + String srcIp = rule.getSrcIp(); + String dstIP = rule.getDstIp(); + String iNatRuleName = generateInatRuleName(srcIp, dstIP); + inat iNatRule = null; + + if (!rule.revoked()) { + try { + iNatRule = inat.get(_netscalerService, iNatRuleName); + } catch (nitro_exception e) { + if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) { + throw e; + } + } + + if (iNatRule == null) { + iNatRule = new inat(); + iNatRule.set_name(iNatRuleName); + iNatRule.set_publicip(srcIp); + iNatRule.set_privateip(dstIP); + iNatRule.set_usnip("OFF"); + iNatRule.set_usip("ON"); + try { + apiCallResult = inat.add(_netscalerService, iNatRule); + } catch (nitro_exception e) { + if (e.getErrorCode() != NitroError.NS_RESOURCE_EXISTS) { + throw e; + } + } + s_logger.debug("Created Inat rule on the Netscaler device " + _ip + " to enable static NAT from " + srcIp + " to " + dstIP); + } + } else { + try { + inat.delete(_netscalerService, iNatRuleName); + } catch (nitro_exception e) { + if (e.getErrorCode() != NitroError.NS_RESOURCE_NOT_EXISTS) { + throw e; + } + } + s_logger.debug("Deleted Inat rule on the Netscaler device " + _ip + " to remove static NAT from " + srcIp + " to " + dstIP); + } + + saveConfiguration(); + results[i++] = "Static nat rule from " + srcIp + " to " + dstIP + " successfully " + (rule.revoked() ? " revoked.":" created."); + } + } catch (Exception e) { + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } + results[i++] = "Configuring static nat rule failed due to " + e.getMessage(); + endResult = false; + return new SetStaticNatRulesAnswer(cmd, results, endResult); + } + + return new SetStaticNatRulesAnswer(cmd, results, endResult); + } + + private synchronized Answer execute(ExternalNetworkResourceUsageCommand cmd, int numRetries) { + try { + if (!_isSdx) { + return getPublicIpBytesSentAndReceived(cmd); + } else { + return Answer.createUnsupportedCommandAnswer(cmd); + } + } catch (ExecutionException e) { + if (shouldRetry(numRetries)) { + return retry(cmd, numRetries); + } else { + return new ExternalNetworkResourceUsageAnswer(cmd, e); + } + } + } + + private void addSubnetIP(String snip, String netmask) throws ExecutionException { + try { + nsip selfIp = new nsip(); + selfIp.set_ipaddress(snip); + selfIp.set_netmask(netmask); + selfIp.set_type("SNIP"); + apiCallResult = nsip.add(_netscalerService, selfIp); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to "+ apiCallResult.message); + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to add SNIP object on the Netscaler device due to " + e.getMessage()); + } + } + + private void addGuestVlanAndSubnet(long vlanTag, String vlanSelfIp, String vlanNetmask, boolean guestVlan) throws ExecutionException { + try { + // add vlan object for guest VLAN + if (!nsVlanExists(vlanTag)) { + try { + vlan vlanObj = new vlan(); + vlanObj.set_id(vlanTag); + apiCallResult = vlan.add(_netscalerService, vlanObj); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to add new vlan with tag:" + vlanTag + "on the NetScaler device due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to add new vlan with tag:" + vlanTag + "on the NetScaler device due to " + e.getMessage()); + } + } + + // add subnet IP object for this guest network + if (!nsSnipExists(vlanSelfIp)) { + try { + nsip selfIp = new nsip(); + selfIp.set_ipaddress(vlanSelfIp); + selfIp.set_netmask(vlanNetmask); + selfIp.set_type("SNIP"); + apiCallResult = nsip.add(_netscalerService, selfIp); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to add SNIP object for the guest network on the Netscaler device due to "+ apiCallResult.message); + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to add SNIP object for the guest network on the Netscaler device due to " + e.getMessage()); + } + } + + // bind the vlan object to subnet IP object + if (!nsVlanNsipBindingExists(vlanTag, vlanSelfIp)) { + try { + vlan_nsip_binding ipVlanBinding = new vlan_nsip_binding(); + ipVlanBinding.set_id(vlanTag); + ipVlanBinding.set_ipaddress(vlanSelfIp); + ipVlanBinding.set_netmask(vlanNetmask); + apiCallResult = vlan_nsip_binding.add(_netscalerService, ipVlanBinding); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to bind VLAN with tag:" + vlanTag + " to the subnet due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to bind VLAN with tage:"+ vlanTag + " to the subnet due to " + e.getMessage()); + } + } + + // bind vlan object to the private interface + try { + vlan_interface_binding vlanBinding = new vlan_interface_binding(); + if (guestVlan) { + vlanBinding.set_ifnum(_privateInterface); + } else { + vlanBinding.set_ifnum(_publicInterface); + } + vlanBinding.set_tagged(true); + vlanBinding.set_id(vlanTag); + apiCallResult = vlan_interface_binding.add(_netscalerService, vlanBinding); + if (apiCallResult.errorcode != 0) { + String vlanInterface = guestVlan ? _privateInterface : _publicInterface; + throw new ExecutionException("Failed to bind vlan with tag:" + vlanTag + " with the interface " + vlanInterface + " due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + if (!(e.getErrorCode() == NitroError.NS_INTERFACE_ALREADY_BOUND_TO_VLAN)) { + throw new ExecutionException("Failed to bind VLAN "+ vlanTag + " with interface on the Netscaler device due to " + e.getMessage()); + } + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to implement guest network on the Netscaler device due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to implement guest network on the Netscaler device due to " + e.getMessage()); + } + } + + private void deleteGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { + try { + + // Delete all servers and associated services from this guest VLAN + deleteServersInGuestVlan(vlanTag, vlanSelfIp, vlanNetmask); + + // unbind vlan to the private interface + try { + vlan_interface_binding vlanIfBinding = new vlan_interface_binding(); + vlanIfBinding.set_id(vlanTag); + vlanIfBinding.set_ifnum(_privateInterface); + vlanIfBinding.set_tagged(true); + apiCallResult = vlan_interface_binding.delete(_netscalerService, vlanIfBinding); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the private interface due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + // if Vlan to interface binding does not exist then ignore the exception and proceed + if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { + throw new ExecutionException("Failed to unbind vlan from the interface while shutdown of guest network on the Netscaler device due to " + e.getMessage()); + } + } + + // unbind the vlan to subnet + try { + vlan_nsip_binding vlanSnipBinding = new vlan_nsip_binding(); + vlanSnipBinding.set_netmask(vlanNetmask); + vlanSnipBinding.set_ipaddress(vlanSelfIp); + vlanSnipBinding.set_id(vlanTag); + apiCallResult = vlan_nsip_binding.delete(_netscalerService, vlanSnipBinding); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the subnet due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + // if Vlan to subnet binding does not exist then ignore the exception and proceed + if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { + throw new ExecutionException("Failed to unbind vlan:" + vlanTag + " with the subnet due to " + e.getMessage()); + } + } + + // remove subnet IP + try { + nsip subnetIp = nsip.get(_netscalerService, vlanSelfIp); + apiCallResult = nsip.delete(_netscalerService, subnetIp); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to remove subnet ip:" + vlanSelfIp + " from the NetScaler device due to" + apiCallResult.message); + } + } catch (nitro_exception e) { + // if subnet SNIP does not exist then ignore the exception and proceed + if (!(e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS)) { + throw new ExecutionException("Failed to remove subnet ip:" + vlanSelfIp + " from the NetScaler device due to" + e.getMessage()); + } + } + + // remove the vlan from the NetScaler device + if (nsVlanExists(vlanTag)) { + // remove vlan + apiCallResult = com.citrix.netscaler.nitro.resource.config.network.vlan.delete(_netscalerService, vlanTag); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to remove vlan with tag:" + vlanTag + "due to" + apiCallResult.message); + } + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to delete guest vlan network on the Netscaler device due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to delete guest vlan network on the Netscaler device due to " + e.getMessage()); + } + } + + private boolean nsVlanExists(long vlanTag) throws ExecutionException { + try { + if (vlan.get(_netscalerService, new Long(vlanTag)) != 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 VLAN exists on the NetScaler device due to " + e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify VLAN exists on the NetScaler device due to " + e.getMessage()); + } + } + + private boolean nsSnipExists(String subnetIP) throws ExecutionException { + try { + nsip snip = nsip.get(_netscalerService, subnetIP); + return (snip != null); + } catch (nitro_exception e) { + if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { + return false; + } else { + throw new ExecutionException("Failed to verify if SNIP exists on the NetScaler device due to " + e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify if SNIP exists on the NetScaler device due to " + e.getMessage()); + } + } + + private boolean nsServerExists(String serverName) throws ExecutionException { + try { + if (com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService, 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 boolean nsVlanNsipBindingExists(long vlanTag, String vlanSelfIp) throws ExecutionException { + try { + vlan_nsip_binding[] vlanNsipBindings = vlan_nsip_binding.get(_netscalerService, vlanTag); + if (vlanNsipBindings != null && vlanNsipBindings[0] != null && vlanNsipBindings[0].get_ipaddress().equalsIgnoreCase(vlanSelfIp)) { + 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 Vlan " + vlanTag + " to SNIP " + vlanSelfIp + " binding exists due to " + e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify Vlan " + vlanTag + " to SNIP " + vlanSelfIp + " binding exists due to " + e.getMessage()); + } + } + + private lbvserver getVirtualServerIfExisits(String lbVServerName ) throws ExecutionException { + try { + return lbvserver.get(_netscalerService, lbVServerName); + } catch (nitro_exception e) { + if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { + return null; + } else { + throw new ExecutionException(e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException(e.getMessage()); + } + } + + private boolean isServiceBoundToVirtualServer(String serviceName) throws ExecutionException { + try { + lbvserver[] lbservers = lbvserver.get(_netscalerService); + for (lbvserver vserver : lbservers) { + filtervalue[] filter = new filtervalue[1]; + filter[0] = new filtervalue("servicename", serviceName); + lbvserver_service_binding[] result = lbvserver_service_binding.get_filtered(_netscalerService, vserver.get_name(), filter); + if (result != null && result.length > 0) { + return true; + } + } + return false; + } catch (Exception e) { + throw new ExecutionException("Failed to verify service " + serviceName + " is bound to any virtual server due to " + e.getMessage()); + } + } + + private boolean nsServiceExists(String serviceName) throws ExecutionException { + try { + if (com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService, serviceName) != null) { + return true; + } else { + return false; + } + } catch (nitro_exception e) { + if (e.getErrorCode() == NitroError.NS_NO_SERIVCE) { + return false; + } else { + throw new ExecutionException("Failed to verify service " + serviceName + " exists due to " + e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException("Failed to verify service " + serviceName + " exists due to " + e.getMessage()); + } + } + + private boolean nsServiceBindingExists(String lbVirtualServer, String serviceName) throws ExecutionException { + try { + com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding[] serviceBindings = com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding.get(_netscalerService, lbVirtualServer); + if (serviceBindings != null) { + for (com.citrix.netscaler.nitro.resource.config.lb.lbvserver_service_binding binding : serviceBindings) { + if (serviceName.equalsIgnoreCase(binding.get_servicename())) { + return true; + } + } + } + return false; + } catch (nitro_exception e) { + throw new ExecutionException("Failed to verify lb vserver " + lbVirtualServer + "and service " + serviceName + " binding exists due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to verify lb vserver " + lbVirtualServer + "and service " + serviceName + " binding exists due to " + e.getMessage()); + } + } + + private void deleteServersInGuestVlan(long vlanTag, String vlanSelfIp, String vlanNetmask) throws ExecutionException { + try { + com.citrix.netscaler.nitro.resource.config.basic.server[] serverList = com.citrix.netscaler.nitro.resource.config.basic.server.get(_netscalerService); + + if (serverList == null) { + return; + } + + // remove the server and services associated with guest vlan + for (com.citrix.netscaler.nitro.resource.config.basic.server server : serverList) { + // check if server belong to same subnet as one associated with vlan + if (NetUtils.sameSubnet(vlanSelfIp, server.get_ipaddress(), vlanNetmask)) { + // first remove services associated with this server + com.citrix.netscaler.nitro.resource.config.basic.service serveicesList[] = com.citrix.netscaler.nitro.resource.config.basic.service.get(_netscalerService); + if (serveicesList != null) { + for (com.citrix.netscaler.nitro.resource.config.basic.service svc : serveicesList) { + if (svc.get_servername().equals(server.get_ipaddress())) { + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.service.delete(_netscalerService, svc.get_name()); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to remove service:" + svc.get_name()); + } + } + } + } + // remove the server + apiCallResult = com.citrix.netscaler.nitro.resource.config.basic.server.delete(_netscalerService, server.get_name()); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to remove server:" + server.get_name()); + } + } + } + } catch (Exception e) { + throw new ExecutionException("Failed to delete server and services in the guest vlan:" + vlanTag + " on the Netscaler device due to: "+ e.getMessage()); + } + } + + private String getNetScalerProtocol(LoadBalancerTO loadBalancer) throws ExecutionException { + String port = Integer.toString(loadBalancer.getSrcPort()); + String lbProtocol = loadBalancer.getProtocol(); + StickinessPolicyTO[] stickyPolicies = loadBalancer.getStickinessPolicies(); + String nsProtocol = "TCP"; + + if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)){ + StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; + if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName()) || + (StickinessMethodType.AppCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName()))) { + nsProtocol = "HTTP"; + return nsProtocol; + } + } + + if (port.equals(NetUtils.HTTP_PORT)) { + nsProtocol = "HTTP"; + } else if (NetUtils.TCP_PROTO.equalsIgnoreCase(lbProtocol)) { + nsProtocol = "TCP"; + } else if (NetUtils.UDP_PROTO.equalsIgnoreCase(lbProtocol)) { + nsProtocol = "UDP"; + } + + return nsProtocol; + } + + private void addLBVirtualServer(String virtualServerName, String publicIp, int publicPort, String lbAlgorithm, String protocol, StickinessPolicyTO[] stickyPolicies) throws ExecutionException { + try { + String lbMethod; + if ("roundrobin".equalsIgnoreCase(lbAlgorithm)) { + lbMethod = "ROUNDROBIN"; + } else if ("leastconn".equalsIgnoreCase(lbAlgorithm)) { + lbMethod = "LEASTCONNECTION"; + } else if ("source".equalsIgnoreCase(lbAlgorithm)) { + lbMethod = "SOURCEIPHASH"; + } else { + throw new ExecutionException("Got invalid load balancing algorithm: " + lbAlgorithm + " in the load balancing rule"); + } + + boolean vserverExisis = false; + lbvserver vserver = getVirtualServerIfExisits(virtualServerName); + if (vserver == null) { + vserver = new lbvserver(); + } else { + if (!vserver.get_servicetype().equalsIgnoreCase(protocol)) { + throw new ExecutionException("Can not update virtual server:" + virtualServerName + " as current protocol:" + vserver.get_servicetype() + " of virtual server is different from the " + + " intended protocol:" + protocol); + } + vserverExisis = true; + } + vserver.set_name(virtualServerName); + vserver.set_ipv46(publicIp); + vserver.set_port(publicPort); + vserver.set_servicetype(protocol); + vserver.set_lbmethod(lbMethod); + + // netmask can only be set for source IP load balancer algorithm + if (!lbMethod.equalsIgnoreCase("SOURCEIPHASH")) { + vserver.set_netmask(null); + vserver.set_v6netmasklen(null); + } + + if ((stickyPolicies != null) && (stickyPolicies.length > 0) && (stickyPolicies[0] != null)){ + long timeout = 2;// netscaler default 2 min + String cookieName = null; + StickinessPolicyTO stickinessPolicy = stickyPolicies[0]; + + // get the session persistence parameters + List> paramsList = stickinessPolicy.getParams(); + for(Pair param : paramsList) { + if ("holdtime".equalsIgnoreCase(param.first())) { + timeout = Long.parseLong(param.second()); + } else if ("name".equalsIgnoreCase(param.first())) { + cookieName = param.second(); + } + } + + // configure virtual server based on the persistence method + if (StickinessMethodType.LBCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { + vserver.set_persistencetype("COOKIEINSERT"); + } else if (StickinessMethodType.SourceBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { + vserver.set_persistencetype("SOURCEIP"); + } else if (StickinessMethodType.AppCookieBased.getName().equalsIgnoreCase(stickinessPolicy.getMethodName())) { + vserver.set_persistencetype("RULE"); + vserver.set_rule("HTTP.REQ.HEADER(\"COOKIE\").VALUE(0).typecast_nvlist_t('=',';').value(\"" + cookieName + "\")"); + vserver.set_resrule("HTTP.RES.HEADER(\"SET-COOKIE\").VALUE(0).typecast_nvlist_t('=',';').value(\"" + cookieName + "\")"); + } else { + throw new ExecutionException("Got invalid session persistence method: " + stickinessPolicy.getMethodName() + " in the load balancing rule"); + } + + // set session persistence timeout + vserver.set_timeout(timeout); + } else { + if (vserver.get_persistencetype() != null) { + // delete the LB stickyness policy + vserver.set_persistencetype("NONE"); + } + } + + if (vserverExisis) { + apiCallResult = lbvserver.update(_netscalerService,vserver); + } else { + apiCallResult = lbvserver.add(_netscalerService,vserver); + } + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to create new load balancing virtual server:" + virtualServerName + " due to " + apiCallResult.message); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Created load balancing virtual server " + virtualServerName + " on the Netscaler device"); + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to create new virtual server:" + virtualServerName + " due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to create new virtual server:" + virtualServerName + " due to " + e.getMessage()); + } + } + + private void removeLBVirtualServer (String virtualServerName) throws ExecutionException { + try { + lbvserver vserver = lbvserver.get(_netscalerService, virtualServerName); + if (vserver == null) { + return; + } + apiCallResult = lbvserver.delete(_netscalerService, vserver); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Failed to delete virtual server:" + virtualServerName + " due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + if (e.getErrorCode() == NitroError.NS_RESOURCE_NOT_EXISTS) { + return; + } else { + throw new ExecutionException("Failed remove virtual server:" + virtualServerName +" due to " + e.getMessage()); + } + } catch (Exception e) { + throw new ExecutionException("Failed to remove virtual server:" + virtualServerName +" due to " + e.getMessage()); + } + } + + private void saveConfiguration() throws ExecutionException { + try { + apiCallResult = nsconfig.save(_netscalerService); + if (apiCallResult.errorcode != 0) { + throw new ExecutionException("Error occured while saving configuration changes to Netscaler device due to " + apiCallResult.message); + } + } catch (nitro_exception e) { + throw new ExecutionException("Failed to save configuration changes to Netscaler device due to " + e.getMessage()); + } catch (Exception e) { + throw new ExecutionException("Failed to save configuration changes to Netscaler device due to " + e.getMessage()); + } + } + + private ExternalNetworkResourceUsageAnswer getPublicIpBytesSentAndReceived(ExternalNetworkResourceUsageCommand cmd) throws ExecutionException { + ExternalNetworkResourceUsageAnswer answer = new ExternalNetworkResourceUsageAnswer(cmd); + + try { + lbvserver_stats[] stats = lbvserver_stats.get(_netscalerService); + + if (stats == null || stats.length == 0) { + return answer; + } + + for (lbvserver_stats stat_entry : stats) { + String lbvserverName = stat_entry.get_name(); + lbvserver vserver = lbvserver.get(_netscalerService, lbvserverName); + if(vserver != null){ + String lbVirtualServerIp = vserver.get_ipv46(); + + long[] bytesSentAndReceived = answer.ipBytes.get(lbVirtualServerIp); + if (bytesSentAndReceived == null) { + bytesSentAndReceived = new long[]{0, 0}; + } + bytesSentAndReceived[0] += stat_entry.get_totalrequestbytes(); + bytesSentAndReceived[1] += stat_entry.get_totalresponsebytes(); + + if (bytesSentAndReceived[0] >= 0 && bytesSentAndReceived[1] >= 0) { + answer.ipBytes.put(lbVirtualServerIp, bytesSentAndReceived); + } + } + } + } catch (Exception e) { + s_logger.error("Failed to get bytes sent and recived statistics due to " + e); + throw new ExecutionException(e.getMessage()); + } + + return answer; + } + + private Answer retry(Command cmd, int numRetries) { + int numRetriesRemaining = numRetries - 1; + s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetriesRemaining); + return executeRequest(cmd, numRetriesRemaining); + } + + private boolean shouldRetry(int numRetries) { + try { + if (numRetries > 0) { + login(); + return true; + } + } catch (Exception e) { + s_logger.error("Failed to log in to Netscaler device at " + _ip + " due to " + e.getMessage()); + } + return false; + } + + private String generateInatRuleName(String srcIp, String dstIP) { + return genObjectName("Cloud-Inat", srcIp); + } + + private String generateNSVirtualServerName(String srcIp, long srcPort) { + return genObjectName("Cloud-VirtualServer", srcIp, srcPort); + } + + private String generateAutoScaleServiceGroupName(String virtualServerName) { + return genObjectName("Cloud-AutoScaleServiceGroup", virtualServerName); + } + + private String generateAutoScaleTimerName(String virtualServerName) { + return genObjectName("Cloud-AutoScale-Timer", virtualServerName); + } + + private String generateAutoScaleProfileName(String virtualServerName) { + return genObjectName("Cloud-AutoScale-Profile", virtualServerName); + } + + private String generateAutoScaleScaleUpActionName(String virtualServerName) { + return genObjectName("Cloud-AutoScale-ScaleUpAction", virtualServerName); + } + + private String generateAutoScaleScaleDownActionName(String virtualServerName) { + return genObjectName("Cloud-AutoScale-ScaleDownAction", virtualServerName); + } + + private String generateAutoScalePolicyName(String virtualServerName, String poilcyId) { + return genObjectName("Cloud-AutoScale-Policy", virtualServerName, poilcyId); + } + + private String generateSnmpMetricTableName(String virtualServerName) { + return genObjectName("Cloud-MetricTable", virtualServerName); + } + + private String generateSnmpMonitorName(String virtualServerName) { + return genObjectName("Cloud-Monitor", virtualServerName); + } + + private String generateSnmpMetricName(String counterName) { + return counterName; + } + + private String generateNSServerName(String serverIP) { + return genObjectName("Cloud-Server-", serverIP); + } + + private String generateNSServiceName(String ip, long port) { + return genObjectName("Cloud-Service", ip, port); + } + + private String genObjectName(Object... args) { + String objectName = ""; + for (int i = 0; i < args.length; i++) { + objectName += args[i]; + if (i != args.length -1) { + objectName += _objectNamePathSep; + } + } + return objectName; + } + + @Override + public IAgentControl getAgentControl() { + return null; + } + + @Override + public PingCommand getCurrentStatus(long id) { + return new PingCommand(Host.Type.ExternalLoadBalancer, id); + } + + @Override + public Type getType() { + return Host.Type.ExternalLoadBalancer; + } + + @Override + public void setAgentControl(IAgentControl agentControl) { + return; + } + + @Override + public String getName() { + return _name; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public void disconnected() { + return; + } +} diff --git a/deps/cloud-netscaler.jar b/deps/cloud-netscaler.jar index a073b5067c811cdcf117f348cfbd0902a4af24b7..64d9701b2d1f32857c7f07653914c1c5eb85869c 100755 GIT binary patch literal 3169132 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 z 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½@pBJ*MLk7g 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

<1*_D)lEs~u~GKvggev^y0TY#oCQo4VNnDVq%i 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Π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

6Y>BcwQ$8fux~tNx)zoz2#JNurUwcrWzDw8 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 &nx#` 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

@a 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

;yxLnIwjKeS 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

Z`*9^Y2<7n84lt2&pIN3LLy3vzsB^@89JLW) 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 z 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

n##RC=&M(-aDVpY`k#dg{llg951V?$ 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≫V(&s#dD?ULoktV`^~j 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%0DW+thqq+61>DvA6@fIANjKj|nJuwSH*o^@ zFON3Sh%%5@l1P&fwxNXaNl)WDijy3k zs&$J6jZKwS5KW5kqS2qK1#aD*eW6)V;-GFYPb3C8#Prr~l_Sl&XG9apbst_+u87J{ zI5QJIA1ib>^o*KIBMLDYGRj5L(=q@AgRNsPP}idTZ!rs{^mvJ#`*N=PO2HfLl~ z8u}Ken{(7ES2o`pzPR$n8HU

`dCVzzeQ47cmj@avUJ?i)%Mb>|5m^B{pa>P@k>U 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∋-s~|=a=@|!_l9K@Q7GTAOzn2#Msy>XTy4Hp z{Yz4UGU>dVwbEl!Tul*DJ{@&+G13^R@=XaVaka)XQpw@-ronR0qG*#ck5&KiMKP=! z2@*3CrIg^liKgV2nmGA$n-!YgrrEHcckOVr#UaciWf|SN;m2=SCSvcC_T~)`%iP4I zty)=#jsmgF^foOx5X%Vnu6o)@K?1Q1PkQv`3=qq#3eOCre>f23QKUaWJ$b`2Ho~(N zD^jaCom*>&%nA7zp-s5?NtWr1B5HGlUb^3u=X^A!CvJ&k?K~iD*MEH+ar>6W?2 zdtrlU50m9<%n`O|q`EOzDYWC5i7Z7V=H9B|^VZqlCNkvk^`%{zx*P^ax6FNrmQDr| z6Tm}1u@r9gUY%hs?BTvXCKXeWDt3>MkhrV_k-X+{5C;cX3eUsK?RJxu(m7G4&wGx? zKMD7-B%~YHFx^^NC^oKj0=&sE?-qbahWZaAW4CDvL^6$Q1CrxPUYc6qvozq|;(Hp87Au`oNrbmknEupF8C)wM4F*XO8xK;xOhi+-~96ll+$ zM|Fu;G3J1zva^lo4qhjz%v=Po8=T2pQcs@S#{rw)Ho?;fr1j5R{7 zVwcQ*QEFY}zh+vz4~;1#)ZRR|bbbic6|$wP96Y_ z;}?$wfiX{y_?rA)l-k`;^5o=FX(=m_Bh&AJLc^z4X$w0ooE^HVy3cZ0Gwn-IcX0nE zR|whSVNf8JHL#pEe)#RjIjKPA8eV?$e zW_-zt>D{0BN?Ut-5q86SF@hhduFY+VR;cZRg~nh1luqMI7^ye1%ieIGt?m~$nEL_U zA@q5`<>mKfy2r}NHv$AQ-hT^Z{+kOV|E0_HuSh2THHzs8X5cNXm*SMWF_{w_+{rzZ%g#7w#S_@6`oZ$ zrsoJlI}=!|>396xb!HgT?s=HRHiyUN>SEjTpvI!T$e=Jr5>ZX{IYltBe&JNIqS~t^L>DFKg$xH zoB!>p+lOsh>?aV+{QYKv@V`#X{AmreNma{fP8DbgMz3HkOveTpoDvem_D%LvBbYfh zRz^r%2`gkhGQl*F@%{j@XmeDN@i(Pc5i|D_Idd~}rX<-hCH%)iu8l$rJ!4XNY`o4& zUcQcBXDefzz%b%px$pRT`$<9=l0QMEg0<0nLlxkY+I8|KGO#$76pK>s|Hx%#G`rKduwB~RX z!~tJcKV%7w{W+f9mlTv8lA&RwaSkoa zVTT-JvNaG9#ruF+*>{0ujxuog^I^X;h@0u$Fx%i5A@oVbYf-k6ZmczQjVR+6Q}-}D z4D&{B%GEop{{2bGAi@obkVkQY)=R&!&p*f{t1B+lo4fOER%JErc+MHLl{Tvcz3oji zL8xMn=;q6rb$W(ar)(o0BWCBpoKnu)4WgGC8&B^L{3Yy%>v8*gP?m}M75aDE3l|RF z3)PObv>ADF?{QYmfCpGP11^WP+C>U2#4Ya9+J*^|N7{9XV*4dKCPW-$V8KoT44MIq zOW&n6NSYk17r8Ux3Fn{-uaB_`+;m_NXYQ|25xXv&Ed6rlzz8;>$qqng=13-Hxrlv< zIv`R^dI*WcmE+O~uJn%NJVz06MYFztY{L+FZ*+ah9mv90;5Yo8dN-3>B!K~aicjb| zwcRqdheIOsgJ8SgclMYsgp%=jv&CqnAJT!w2J#jqB9xKg2*vL57WopCqWV({Nxnps zqEEd8be^+uWVwax5vg%0le|K^lr_+7-(K!9k

uocHXaKBgqNIb2gtc7EF88hJJZ z;DNtDjSfIyn-3j13kbO&P$%{AWZU{LE`FTC^$gh>B%0`RF{d@35~?P>Hl`i;2t8z$ zumOF2xfOd%bVYG>4PCT&7dI(m?B;Mvs>n``9pUqmLbWh%6aZ+k#NW=N z|H^XNKe%;gn}7I5|JSJXx{p9=eHBWiHyKE+k6J1~COT_EkfkT2D<6l9?$&(9tM}B7 z!JnqjDGaFAr10*$`Ofb4{N48n^4N)d&eWm^y86%4=;K}J^Sk4#EC@A%y&+L}vYiwp z9!1wJ9)1 zAJnlmw>`bpZ%$*z_8Q2e(_{qF?Mn#vxB+vz>_|vFxFIzn9lMg!$?`LeT1UzO?MQa; zw#`VIojz?ryD>qgBrKIueMwPUnJ~YW8p6=*WLE0hxy<`<;l!ei*AwKOtI?LKPDoMQ zt(qn5t64N3ygU-o)PzRVg=MT2h`7Xzm74l25K`T`(#|!y=qp^+GZ5J~7)X^poq7jp z+IX#Of?LSoMb>;n#;Gpkv-{LFye0=MG!DRd6$uaae^cuQLC6&=0;@Rd7d8=C_4-Nu ztKItAP2*(+mEn23^yU@eva}T?o(82YJn$`R^u|DHok;*ltxKcs_!BzPq64XQ+uzjs z`{E{*zN2~uY{pE0smAO6Hk|&dn$wgLAjb=T{NSMnlNsluTQ;nq83M5 zk#sSk>*PgYJ8jjO622$Z`FOk8UhcI!v_$!QPjG-gPjR0U(&a zuJVEg(FyY4c&uaCA$~F8AxS>Ds}F&gBMAbig@y!h5*#pMzqu zIO*^Vag6Y?>>7y^lB73gJt*79RMfm8yCMTy%I1(Rxe2yt1ZPTuM3yN1cy)qzh{JZM*iNx}v#G!r6ZMEh zxG;jCy@`7pH`!vFnP%W8T0Ok~iVJl*>Og>X~8pO|uO{Dl6F{rF7eqJ9NLHN+eo61HOg<-IjDm)ug%;YiZA) zdOX-_RI`zWez;&=M2i{7tK%$jMdp|RdG*pBh;vC42)<7eAd~qV%3e@8wpBS>ynu2Plj#vMsy6C7_gWIC1r;9@}4Es^5Eb$&xJ`dkL6FIPe)fhGDK-}Z@s z%BpDaS)iA~__zfWaw(=eL7;z~ccIaPL=0*}w}|C!?l8FDE44b{fq({y3v=|nIwIDG#Ok8Be}+SHH*HPjsrZcZwe zfdId_S*SIgQantXiF1>stb0a*-zUtoqMIaI*>s9aa6zp6Q9Y&!Wblq7LTx#s7CEAJ zQbGGUH^L^GA1a!eiM6C)+k*(FbO^nyJ`+oC?_O$tc_Pm@{l3pGF#7_@<8^B5AK9J z!QE>uv|B;&dCyr(JymF3LX972X$Y!U|C9mKO&DnB@uLT@@WNZ~yUqKc1Q!WQY|1#W z&|i0-zE5v_MXm89iq?}jh(GX{Nb@q<9+r7ZUi0wVoMAVdnf7fOHUHabROesED*unG z^e@<@8n_c6%!t6dvb1n=jJDXv7NGeyiemR#A_~v+?IsulNE3z=j79jzB@8kM^`Ex^e<&g;f4Z zhl-(2Ec7_gJuC`Zi1&K`K9(!kL^-2!8((_t3!suj4nwpwXF^*MX7o0gxmSG<4No<4^J|tx>#*vZvF`xb0r=K~R$i zVNp{B3-=ZI!swOr4dr{kDQQb>t>4Ua0YOX~Z}xZsVnUpJ^199W^Caii^Ldw^-|ZAc z*E_UrPW%I+-9a+^Ap<8&OZ!BM<}kxbc;J&AeRDEEbzLGgGQ-r{Fb5h}W6dj>$w~w;i zT@0l6TrfJ3ZluXURQc`oI!DTV?FrV%0Ep>OPqw8mANxO zuI||*j=GyV0G6TEm=a^qQi9R^_}b$MYmSSmzfPd#olnh1s&3#HDWg=H_hquujBLLW zFBs}}+nU9B$`D&ts6tpc+2{5!+LH7+z*%+lODr_+M$}{&nCUJnPRP>Mlz1t$v~<2} zS(`EeVwlmQ^fbfbNb^^OHdRPX(JGzj#BAaUaSMxhdsC9}kUkZ|>CA6g+Yav9goh#t z>?$tmd74C6R4pV5l!F2Q+#t9LGv}q!jNNg7WRDi8g9t&86MYO$b-<7^1}5c-oKRwl zT{h|u*?u~`WOi5W+l}W9kj7=oXO2@APvc*=H{0DN`6!ucOF=uM+AmGPR;bn2^kTsC zVU+;%df^AO`s8}Q0~%Xn*IjRZD{@_>s9 z;}Q6nBafP8d3Hr6;(^v1ijk&lPfj&$8#-xW7LuNhn-vAPd_by)B|^^h=zc>n$L0#B zr#6dXKorCCq1*v-K=BbS=0dt0&F+?ch=!3eZc|76y<)QLr-s;Y?gZ*G!2$1Al5Nqq$f_xY1n*w_(V?qpz_GBWr>= zb9*yTmU;7x4Lu`<@9pIHw~+3FMvqi zNOQtcnK+F_N0u|_6MOJkT)<@eDNi=d0HPq>w{accSI^N_ro0saYc9r&#A&VeBh|T1 z+JQ7C@yE?s!G@K6b)_Y$6(Z%FTw%!r3K?5)fHMiZz&zf$55;ugYE-o4Foc)F=(q(B za;Zcsem!VrI*x3bHrV1gc@gr8q}cFPn4+_y}_8F+@K+e z6|6Z0`=pOkN&x8jWtnJt$0t(DQ&agK=_fTOjOyKR%BosMah=2|L#WpVh1ti=yl$hk zFm|V^>R!zy%^)DD?(w|I6Y7k%FNxVti-a7Biis(zm(5^xjWp5MO2~ z;zRh9Sx_7@P4Dz4uNnZLVRJhs4~&TXguA7}Pf?}UPUjQoo#8#>0-K+s=^SSlTCC&v z{I#c(eaf;iugqe1*Wb5_;Wu9=3j3zWS^4|Hygbj2(;?GG+X>aAeQ-1`;&vT$G%QF`hV)}z9P3d-}t4bZM0ED^~k z3fdZd*&vNsBvTlohaun5VV(o~xkGwQ)XhUi*4=%Y92JMPfH-Df1}!(;c3F?y`-viF z0D~9>=I-^Rjc5|MoMD~y0>m-5$?OjHC!iDWVwc$84KKsUi;fAc^>Yc`@W6z!!<^X@;(^5m=lqQSA~_|8 zk>VvaelAR5~*Mv~mkdAL8Jc^C4@m5E(;sdjenntiKOtew%#@Esl zZBqC2U%JY(!f9NIobHAy$alImeX>bmxczj@wJm^o0cez%%#Gd5n6hY0jxeRKo`kLn z1=j+t!9d@64Cn*IJHJaV6`I)KI)PEwUjO4A=w)WqYtEo1Z5kH~{bCHO0wJ?cmXMX| zLVtwY@?Cw~<^&RIw|`5j{VPize=elCv$MUOt+j`dot>4%KdWpNI%Gi^5peYI+&JGu z5`Lzjh@<#SgvJ_61_ntf85cmLz%>LG%8mWt{gE#cDm(ywyAZ)^=`#ZEgu7YM#)^iY zcXt;k$AD=R)G8qt;UXs0QXr&|St~+p0D0f|!vMFRn_ui4{6d zd2aU)UikstpX+qPdNEn6l5A+5kD?`D>mpcLx_>8ndtEIL&;!f$XOEM=_MZCxxcBT$ z9GxtjoK0+<|9#Q^(s2;Ifu0QR$WQNVs8J+8Pc?cuydm z7RI8+NCo3y$3REJXc)3u&c>C+oOE|f4wGEdr35pP&t{oqrnGN6$U;hrxwbChQjA`N z%v9UCwD=M8BRu*DEQxwVU9UZ{%}{X(c21i@uT(tMFeR{ZN%UwA786}LS8-Q*W3Kqg zKUX140vc}xD!WIRN1wE8VSts(gp!j221(;;%N7kH zl||N4{`kAy{%ZZ|8v^bL`3UKXS+J6n&#w_l-s@zb z>W!DhRw)%Sk_b1MGJzUIhR`{!C|9Kr%R0r$@sGV+W~ zlH#R3&Y2jMaHOYkPU=>99=A}pfgb@J%#Os?Mi6K8Z}-^-cx){p zuqp$8TbX}lZ~xy_#>mmc7}!%52G;*nBZUrNzBdYQVrYj(p$7&kG<2^ZEl!nBUKQed z#(3fPDTyN(WT%sT<5l-sssX|H+hXBva}SAf^nERS-7JfDVO= zTg&UO)93U9iQC}}PJFkjnGclxnpv2K!B@!fdsM=~`E2Jy{k^Onf9{S z49dIKB^X#fHuD5>rK6jX7J`y2laAC2(RAX&rLvr*%)~|HJan2%hz6`*(fZ|0DN{2- z+z&)O$VCchO4--|s%<8Obj&}?4%bVc)arc>nJgBhF>6I;Sv^LlAB8IKq7>L zetJFcIOi9cal9_!EDMFp!uH`R%YVSN8u=Z~UKoWshP)`TqT>jRW(SrH^4Z_M7(pu4 zSY2-w>$`lEIBk9~?ED{RpdVv64UFtD#>krLqk*lvHBy&RSkkHpS18U%E|ch2n^$Yv zEG)J!(y6XZ)jn57ZY|xqZFU+Tbn!GB7oFYp@?NaB9cFE<*q(RMzgp=*e0I2B4y}0W_wvq5-XCJ`gxi+qd;YZylebz3Et9ugNT{*9dPp@B4^clGCZ3B?$MnV6 zWg1Lu$5jx7NMbOQ&>{hIC{Q2C zb3Qg%%oq#i%MB%jly&QWjX$H>L#PzYhpZRmdssBjPhL7fooH2?jS@_z)H5J*|_ZSlEPs2V^_0)bKhP> z#VuB3k=ae=lNKc&1F{z-(kT*UEtU;>v7v%xMA8>a|1zq|22p9#$iT(@VzMq#^U$!x z!eBS?OAP3BF1ita?&Sv+!*LVSB9djFnrZc=^zyzu;9Kfe^$IoYs&vZO=(zg{+Q=G>PyoLz~pIyKCrb2314f zYerbHwOX(hJIu^9PHVDY7G|LN@vySE$;vP@;n}olLp!S~#`H9)>|Es#aO0u)n;VNz zsHd6(_{$q>3ewmf2fC*F#pzwI-<@53p#5bJ7|2|!2yOxk^s#Y;$~%nj=oX6~!+Ot) zF_K*E3mHN^f_ct~-GG!tQ$X@9CUFaX#btZ)l!R-njsIHDe4VBv4ml}9=K5w zG`uf`Ce@@=n8juE8~A{h>@J!c3r>rPMd^u;aOV$pHxY`gY4-|+)*EBI_c0+S`PS@4 zOo&iR#W?!{6zRzkZkWTz;k*{DA9$8deqiqKb93*M9)C^6=hwWVnF&2!Z86B77`ye6D;b1J-{?C9})|PS$g+y%r+uaX1s%iEpUYduv-@=U1F9svud*kW; z*d<@CVdzpT>vG5Bzu86YJRY?Aal`!Jsnfj~SDOn!*X;~%>2$~LQBGS~n+59Ke-wZ~ zcez9KsFv})_^d{{iJbB(T+(gc?SguLA6!Y;kG;eWmf-Ecrx-s=mMeAcBBD9Z&N-)t zgNpQoop@5uw|BT;!F$dY$}e|2KFbv!oqgW8;mBjS6}}@3hI)QH*29i@)XG#7HnMpE zYrzf1R3W$LfO1j#itD9GKd{eMYgacBZZ4`JJL%muy;Wiz3v*O1@(7!%|D#Er1`GPT z9fM`JpaDVEgVBU&*^OG-f~Is&{awA~o{ET8@^vU61szN1;X5?yx{dN4yrPF*CVSSy zBX%TdJrDflQ1*^?E4kl_r!V7o;zg~59cqp?s`9~y7MHbDSE?3|!0!_)9ULyPlOJ`{ z8I4@aI9vwDwav!UmQat_r=v`GJ@Q7*yQ*0}j6^wIj7ZC;Tu41S=^SD;E3T!wIW_oP ztv>ZQm^2I?z-Cljkeq>KFY;d1c!djs zQO)s&yxf)04o*J}1A^=@&*bHI5#5wnf@D3%N-Ni1108;Fy7~NgJ=sb6-Pb{mr8t~* zlkb=uuC9;=$BBtDf->rcAEQh9aAy0CpTB9aIkRVVY&U3TLvmJUqGp+ewq)*kSLo>{ z@Zd|?T((!aXG#mAFNcyZS)LPRbS#rRsH|P?X-+g{1f{HGI%!Qb&1eshc;r`ewk)h$ zCQggo9{i{}s3~kakx4*b%NYBTp=F2EKCr3Xy|50Rv1Xp2ZEHohWqHn*DF3C4Gj?IU zpQUAi#G}0W?K3hNVNX}v`$|qU>Q$Kp+U5hOssk=*LH|P6geA)x5!YEMv=7bM^D;kN zD*XCMRxH;fbg4Jpn1ZsV>-rE@g(oH2J4ptyZV2*|SrG)c}Ya;x@LYBz>ixThSMYH7=9*m}X zW{fazB9sbvD3zFh#i#J&NdF3a(ejtHJSs*hSbZ>X!#1p-I;MO4fzq?wd&&Q!5nSIOkp zgiBl#M6@#V&m@Umn6Kw$lILX_i)_nej?HCb0b)qQgy|0RTEa4BI8(+rW(+aRn8RN% zhBYvTFGeCD;8pDWjg*lVG3`x{>`S1tDA72GW7H+M3hrV*hjCX}k`#ytH>QP6k`|De zx-ynj{8R@>$%GM+mm-I1a$g~pSaHrRjLUW=Wq&s#Z>~cIJsnUjm|qU3Ru2_`UVZ&3 zi?i5;OgyfZ^q@K7U2WKHIIfoUAX&$j5cSp4bvOBRfc12s>2$#5bf9uM9Qe0Xhg{1n zLJ^TH%16$S`GdT0Jxribj%!9uXDw!D@t`ewMSV)ObECj2IsXJtXz7E6jwng=>Lq5= z4zp#y*?h=U8EmcsHeVr|x2TQ!PEmvr=#I6q!}`c>YviBxQixcf+pq{ zM#e8%V4C`RC1ml$gUhpD)O^g^Uj1+!T~WgqDRW9O{K&M^)AgK4+6XGcd`6?_GC zc9R!F!Hk(rZD@K;we%7(g~}R(IIpDjT6&F*b?tCk1369Fu4wNqGXw5C;~BDaM^zeL z-C$CLGdMNKls@S>W>pY>U^0zyT|yL$s$)X0q$QJjmn$g_NTz*JMd~(6urhaledf+` zzy0a{W()j{CI6(_RDlZaCvBH)Q5OX4c|vQ2sU3-$jpCePkedKXZAg;Xx(D`odvr{X zkENG-rtrnbcc^INl@w~V8jaO#jWTSaV5-xW6f?YNWZpHcM zFp3IG{9P)|MoFhmdYl8e6heCCRZ15MTfeMp;iuJn%xBt$raeOI^Cet>+E9gBwPC@r z61E{zCFC_!*&P@#scYE7=+$hh=%NfUr80g3J)Z!>8!^v2%8-gF`RbRT@Z+h|WV!lJ zJ~7}o=*WFdPfE#x%ioqi_9s5qfx8j#wM>CsXOcuOzjBcheD&qXh%7>%BTXpmqL=!3JHeXQc?{}46482 zc4Mt1w^sldpnNz_Lm1D>*5Z2#$954~E$YM2A}#9SX;bur3Q-DiOfXK$7&N+5?s}8< z!*;gjZC}Do*5vU-6^iHJdOz+V_UaR12!aWP>tld(gcOc4zULbjmv+dq6mWQUDEy9g zY?OD2IEYbDMjTNu%osy4ggj^=%*Y5D49fmVSI>4&L7`$c*r9B|y&&@wSG+UQk?|~L zQE8$qX?DodA88UrT=!*gzi=yi{h!8J@D^2cT8p=~?)F?f*^h=n(Dg>pM8>WaqXEN&kcP`VK}>xSxM!5S{Od7ZQja;>v*@ z8!#+5bw909Y&HxNsZ*##-iRH}k;q2{lN_o0x)?eo&#j=@rWEqyd@~G5hdKU@WnP&| zs0XslIEhFwGXKmnKND1m7bV^j*sXv1`~m(1#w}jLy~sR>yrx)+7*T4hJdt&MwDEE` zenyEEK)2KL>`LZH)vz2szJXnt6I@so=6HHUW3c>qA_S1MvgoK6AIZ$W=}PZ)rz0M= zzuh9Nk4DM{3BoSRgIYD~<=K6K*DVd(A0xDmYtXRIYkvg}>mWMebt#djaZo7{4P>fE zu;R1^nABx{zl|rHJ+tiJVrgIhc39W=->B&Sn{NJRi$J~zX!HPRmzix@d0`6FpjkRm zD7rbu#rgCi63m$?N7B}}rIV{kYZT|hgS{NkLq1tPzO79VoI>>c2-(lJpJ_vmCm2k> z$Dr*h04*IkW4ly5eMjrK7~U)$mESBKjmo0P2?axj(q~6=6Q8&3N9D28v__`!C~1d1 z*b;9w#}yR|miO4=Q!5B~b2*Q)m^>+~z7?f5>qXfR_DO!W3E^PGltZDt9QcQyBbi2j zwX+F*4u((Z!MfR#ThFuCMXG4&R5&BNB%DjmjDufzHBeB9ThyljA2NCOoVX%Lmb0_l zGo}xZ8i5tW4fF{dtu_X^x`eP(9E?Ets8w{Df>Vay70@Lw;3u$5A?zv`(lom`L-&!;PhCztDw@`)Fx-g4+|ehNx{rv>9yFX2)3J<6=6*sWf?Xuoj;%eI)h!QJ{gFvBVL z$Cihelts3qt|dP9&$7KwW|TsQc5RIFnyb1*IQtBZ-I=ZFw8p2HbT3{Az&D;asD0+>^ofSfArnTFxmw> zuzpv6+jswpgX%wSsee03|H?f7v6>El;V6m>5UZ<0pqcL*TqO`>pa?1oE85DkTDEVY z?(o{(YCxiSdnRx=heD;X+3dbsPG@Jv&$YXFH#s9GFUBrN-$$3vmW|*ENcK)3N;IW3 z?X~#QNnj0AeI<~=kgAby$nx>#$Q*^3tO~YqW+x#VkjRY8g0KLe!!7X30%{42fy`b-zO?J@=wrLVmJ&+r@Dy5OhlAt@sJ@p*I(XmiNJ}lE< zdS!};C-15KwRz}d-mXJUvqd22)~Y7BrnwX1|xy>jp@TD=S47gHZCj4g| z(@2>u&If47NYjea!}pp-C6-84H7gaLDWZT^+yTYb=BLl7@LDhc3K{pJ?=iq0`w|~k zywf;Rv@Wh?d_}PUZ`rHU=XZFfktr%VS?nq~zzcjvJ>zc_)w8nbQ&*SNH}^?p$e=aZ z!vJ;|6tKf4|LCwqs6Sp&WoT+Y|Ea?W-#U!^cZXR|W5;Ou;-cF^W1dJl-(-0B#JrR={9HGsrzEx z>u&wamiF^C^gF3b*>^t?Q0@KRiNrlo2;rkM((P)0)4q0!-`*uahe8hp!+|3RPx|ak zsSIa7Eq)Ci)H&2Fm?&Z0P&6aDx|TmQR}sba;Eagmidlmmimg!FZ^)IRf)e zjt`v41_@kC<{FwQDUaH#pgDTweWn?}=barnN-9E8)8&vaF@#Vb23R=hN?}DLO($ZR zS%&s~DS`6kCA&cg45n&| zNAap?G_MEOO75+VR(Tjj=FC#k{5GM!J>#Ir2h!`5Hh7eh-OdBaGE)pGdhS6CCN=i@06fBl)n8@AA zp#@LRM~NCdlJHU&7?rr5RF(OJ?k!`??2doZX8OLfuKZ00IzBDqTn!14ScKnK`e+CDr!rkKt-uB27fJdJIHF8*Q2$LrV0qR`tn2C_WQX zA{cC_Vw!DAL^%Lv$fTf9G(IW_xky&u7owd0pG3M}EfMJ*o4Y4?dAYs7I!Sg-vP{+a zAd7fhE7iHV_|P0eYI~_ViFQ>w$#z|$!rVdaA~+&jFxYgo_S2p5J<3`zRb{J#7_DiO zdi$=LOIo(&A9N6erkoKP@8n@-0s>_>{TWZ`FnYWED%0JOhdVGsnonri=X28BYFVeaTr=F5;;+Us zN-P<_s2FF@KMW)^6p2(Xl;8=aLYPcgvr}aw9O^Uw$T2YGr%eA9aZQYY<1^}F46F*K{ zsPLf((?ZW2<&=k)p^9{bzu$l5vH`B4u`qDR+mqS*GL8;fM{s7dM8TaeVCiTPd{b>* zQcky_mKn6F-U}bG2CdGL(y!d(aU?_hfaMq zhiA*D?}7iEHE`NEgi^cqZHU=JSm(I4_Mvj`Jle==ZR~)NXGz+FvQ5dVar8p6 z8#}EYz^Uy9am(71Tj#9l>_}$WliSGZoZI`7{~zYwDmbn!+tM}&EM_K)nVC7ovY45f z87*eXVwT0s%*+-uGcz-E`c&2Js=7B$|4~(cM?d9`$fsO8V~sWET;m%nroNo|*DITl z`_A3zb?lBUJ)mhe=SVByEaU0rHXlh>*i)y|W81~@q-SK^VtJfEY&>JHxM<}cC|Sl^ zG}d$FNY^VYrMb(+LZu6=?bBKh^6m+b9WnqsQzETDb4puw35LyOCZ8ZExP>b9%A6DK zKNSNiS7#JYYMk*Wa?N;3A0eS6H8tH47y*?Bh(>3-fgJW%WJet%4gTCOwo2A6z8iXR zF)xuO9#I@G-$`DA;k^i+#}(kcvrgYpS}w5=AJW&7cr8Ls@=t0EtGkBVgW2WZW5us= zS1gG=Vwl!v&m_o}IYR?+%BU5}3a4yOa}awS>1V;pLETK7XtEkY%z1I_%Rf83HPYmH zTEb}doEh~tVQ7X;3gUTgUFh^!7!I{(xZK7)sYA~o@Y0&% zqz+sKUXx$YL#;;-peE4`b6wEGu1^Z24&0PE79O#cG1w*3MJY6h7pe*+Q$p&)%vO;= zHiqv@7OENp*y7!(BP*+isaVUNm}Lnkxno4!EKeS(a`-5Y?N<}Z_k*1)P^=^3 zuSzeaASTJphrv!@_rW!UKKdnfrPzN$m3`bxJova`Kyt`fu?GrL`{QOb*BZYq*x`o* z<01SZ>cd~~grcAyz!!j*`gZ;yMCqTew|x5#Xz71ztNg`{P*YJdKO0b2iAXiut)ri# zQu_5vScD#BlWp7}i7N0;%ikvO_JkHS5nn%Fv)S*B&}pyZ{rnI~Up(1Y*=-a+-Obk0 zOTM_V&tW!@OsLDi+(oW$Ut2M3FAW%HqoC!JiI!Ip>KO)kH~FdHWTv?NJ3f-ZM*83k zZw0{(ZPN!Lr|8zB%?4&beRTw+$U1Z-&oV4su_(v*H9H7BlR)G3zT91R)bCsM(GIOz zgmi}$doZ`dj?agX+X-5XrE8*cv3hk5zV{298>OY=fC=B_E%Oi@i%>D;~J{;J0Ny%4RFtMym_B?XEemNVByAvB%lq3TyiCwlEym0*wB z;b5Aw`cJhj7w7`gCkb!3Xrb^4NG{OR*R^)f=RoX|N z<*?(nY)Lb0bW@U&14#{c$W3u#wkj*#mjaA03`sK-E1khO90I1ER(;O+9N8uowN{a% z0y&n=9~(>vMml!EeJ^El<+~2=!3jgg8oL*24{s6l?cSzjjLF(Hx|EpRDd)>WYV9n= zJPYNmB^_!HCaHZ;tCZlUx8I0NTxWF@RFBmfcnh5&j7CBTHKuqfb4$&fSn>lWiPZJ& zst;o(y{^jdYNd;G>5-!VFS6Wo!e6C%6%_Hp9TdRXv6r-0iw5+&_*9~lu&#^s-D)|J zXJWZK7E4B}efHE<@zsbB@{$wys8k=GgBl|cvrtSI%fO%S&7o@RDO$O)jRbWO!X4@Z zmP)p9UP2D5(EAQU{RO)|*VR~iqXmYq^yTSR;-r`~6<{HaTh8{lrRnj;V}YZ$+XV&X zX^f$x>k&1peI^Jb>_P~9`o)ew97H8n?R>M1-+<-9%nF{qU33172Vxc3pkt2qGXhSZ zP_VVZx*aK?hTZAc8%p#}105Q2RQMK(GbQeTox^m527*+3lVz5TM%2;E3@*+n(S}m% z*e(Y;(xprzN7LjPA6qn1lylPKM)xMj3Rr-izGun{+z!Ai1$NE#HF(R6L8ur?tXx0ZDU zu}gbs_Yk+{RGPRPws$|ot;2G;0P*PM^H(^;$|}kmd~Ap&w++JCI6iFY3cA9xmLB4Q ze$aI7<|3786{SfCk#8~sVr&x9#%CkQ$%@^8F=A)A9vYWXw1IJCuPmp?q8jhzT>gKzDMgA@8;JT zyR4I~g1jE|cQnTgg><9KiRCF=7h5rwZ3-)s?TxIAY1L^4hBCfy53uVhsT+n|@^-)^ zMcNjA(h(`&rs@Y47y+tM)3RM}?w`MT!TiR@gyv4Rh9R)e9U#+OW2=8Y=EFWsBx^m!9?1KI|6w{hL3iWMt66FvL(pbjyTqKpf%TmRV_C&x=(ye7}{oYJmT zJyvji6ajay$sbqR`8K%YBd&2oeq5KTSHFv0G=>?@|RC9C5b9c#h<#aox2<&KTJ83Dx z(%l$tulzT~qVtr8R*5EWI7hcMx6P7mYugWSUtE%%dr-gxqXMMg4{@0eOIZ%6kT@i$ z9E?_O9AE%H*Ze0P32tI0gA8Uw0C=`9q+DG*T6ny9-m8N;3anfe89KK|Kjq)FW!|)> zO1yk2R}7m^Ml2MFFxkRC5DFZ&@QI@>mh_nDM_}p;ubZr?y-wcj&P7OZDjH_RCAb8=3!E_Np$d*R$d^aq@#JU z-%_rp(%^Q@BKuYV(<^dwdRBTAF79-~1de8S`jn$uMI-W1Cf4|&GXx5SeW*Y_Mk?uu zOni--=veU>TM3v%GV#ZMB(3kP3wnW9ykkk7Lp#J-xomcpx#{m^TXZ@aOP_!`l(ms)jo}GsG7m;6-Pqvls#mJteBov z7)`u^u$RQK%4nF5_v?UJlNN$tIK+1GFf2s1%zO-7;(wUgR>{t&t$djJp$Z-IWUqpa zAC_Za8%~u$7`AO->q{jKOfC%m*@t$gkHJ@}G2s8^$d05UJ}|7@uEuXsfN)~>a- zFx7X}*45Sh9}_H(?SZYOcgxgjDHXLZ<5%!h6--PZ6uz}z%v@Ed_#si%{VT=lZSjW^ zR;8%3QD?sKbc87KvTeuOCQVl5UZL;$Wo|vtvcH`frK0)Bk+H?D4J^8kojZ>;-LEXG zziU0BbOKtBdmvBlx}&(WUA34rvlowhpbiqMtVswK&I7{H0(QQm-_C4j!UbK#glp0B zo(O){Le1g9c;zuWM;%3&Y$ez(4AJY7bGJi=vS&4<}|kN{8gUqgB0%{8{FDRpxR&0yDGu z4Q=1|k)l&G;!4xJW`7#fr zbogk~oJ_-BX_HHccQf*6n>Sg8Fs$T{+!*!KFRCeq^iq$N!itJgDF7!r%xT6D52dsR zxC3%^#yWq0sA++lNtq6MYK?PoD)Zwa8y*fpGl~*!WZt6{#%5zTmLV+&n8?1E+B@#j zT12X6?_8h8c0cJ-=i_XvvJ9%RW6*5h4{FF>Hcw;dtCak~+|to6V$T%kq!GWrf5m_W1qpt59%2{q5hGmc@KlVtLu&`G8Sq5mc7z}%CL*)*&OM4TWH2M8VOi&!?>+$gk?v> z^m9h$6lN7^z9Tj$zp!PwCP@eztJtA4N2aXE&WgGQRM}wHc$cKr{FFDS0n@6N9qF>A z@*VE%CzGI?_`DEG)NF(3IT%;9I;^8)^@E}dJO9vWkKlX(_O82%Sb6gtYhcB*Y=^gk zIjQI6Sfx{&NP%g?IUzC=*O(q^f1-D}V6gMo4$o=IsR;Gv_uKMCQPHHf(10{5vwJ32 zHG30C&{QsVsW-+~_sZDR7nVa8<~7m&*ev!OI2T8x7=ouYZ$@bAWEd z;GfsaXokU@7vW(^_{RxfgPSCnDO`1y`Yu#KyJ&4_PzR&E zpzV6k%#$5m9v%{a^~(wG@igrXo|mlfz8aS?L)-q_mTPG*C|u{@hD>?o2x+h9S4j^2 zT>Fr&OoZ^*J=zt6MAww^AKi73;_34F4(It6%d{b8o=OU&X||qo=5WInu~) z4?q8yubH;-1MDoH(<^r6vChF{r?J>;m`N}e`KW0cSy^lnWVs^mKUEd)&Bxi9Q6GM)nLx zIw48=GLlM>1V6aA6rZcjn5VF*scy`^h_WcK@uXX%NzBZgp_R)lHBro@r3RLEL(({B zPFPnHr7)Nu1GF@P0QP%tpnTrCHq$$GHkAN6%|zzqOBAecO1s2_hf>HLxqq=V=4Q;I z6B2#8PrXf}FK}Y1jF^5W+oyQR=Ox%XxZMBPMc+y1bTDGKx@CpR+Iew+vqfFru+0yC zW-HxvS9$#hUTQ|qEAlt)_|Gkk^8ZHP>Az(6kF3vs00#Cc|5bHk|E9Xsf2X<@P^hK# zUvy(FwgqCSTT<18s0)93cnOwx+4Q4D_Jl_g#}AO z?33*m+TjDF>%^DBfnRzvwECUjPPwz$sZx{;u%m5fqWT0H(Pi-ywLJ zpoc}pf9L~PVk==Fe9E_vDlx^1k_~n;Esv57TKt>wr9-zuA;j&T6K$1s|1fa9Tj{S;Txh&-}nOH-#> zJ_FqgB@%(v4tJt*n8oJkDuY(>GJ~QyUmbfzaQ{QDie>}d!eHIWI=FK6rXH!X~WPgtrDspsD-q?9yRlYpA5yD0?^)Z8uvh*id;0AD44 zl(g<+MA(s+OSsj(L;5S$2;XVnp}%TwD5EcW!LbnPIK>~DYiB*H-u<%GM73g#$Rd63 zalPbl#&oOjTXXq;Yc5=ce|qc6SxTB$7*KOxd1hQq)yDQw>mm><8WPqnamZ(@i#?Bs zvtP$<0Sr8&OfZaRtwg!f5cXT-Qp`D4!|71oD)!n`@u-gklhQ`Baf+9NHW93F7nd>l z_{?J4VZ~g69DSSyyU5_-X+jhv>BK5exJR?ETwh+4HoZo9V?zyHPqf7MSG{TOh27E+CXwmq)O$;j^Ev3b5~U7j7X?_KBOLcG)@$*kr;mWmDLT5dszu=Nn(ul-tLW zS@{s-(=3B)P<|&ur+mLb0!N&yN#FgFSY^o%OoTQ^dd93mRr5w*?rZZBS(1drx7Zkz zaP{}bdW;f~0v%*C^D6ydN-b|z2D@M6Z%(>$$1plj((OvI=@d_H*^i_c*BURrYACK= zOfjoOaT`zOT7~khS$v=Ex|+9{CrI@gzd=JF9en=lz5l=_Ru9eOXl%I`L^9_~+Gx8^ zd^Qvr`v^u)F=gTTek;F4TIb3-#s0}Y%3^6ilqK@D4YWiiLnZw%BJ|DIdi)USG(KJi zLyHFbqnBWtoLLMLxc!{^r5qJr=_BEcfp@E%KCj>^JQp0s6 zR1UN%QpwC+>MR>rN)0x!AZqubchk z>vLCFZ!-N$=nO~IG^f|I#`JaH0n07wgBhiqSY9vQ*fF+44Fft85Tx8kD7ZypFR4Va zO*7EENK^S{W_)>>W@+(`*eMvfC%?EiqPz~#LlW{=DaiLY&zqJs#OCKeG`DwhLB$2A zxu5@3b2a|c8~=Zk+!pb_g9w=D{1qag;}D#wp;tLFRwwf7Y=pjs@<|oo>+{E3bB1f3kSbFq%ODRQQ(ZuV1TqAYyEmrB#dH}AMdmFv z#d<@e1=tQm8)iUL2_m4q~jQ{8Q>-)Eh6+`Z1iq*TZ-}FMMzCb%E#n{6#m>Bm-5d!Ndvt z657q+BsoOu1ctA_M&LRP{gzor8~*vSHQWoo173(w3pwW_h9AG$Ir8Yo$yTE6%y2<| zD&*mSV5nVPVA&fBuP65*-*)6JI*FZdHwjUITVxi2IYBnU!Q!X>A)r}aprH#1Q3GqH5$Ph2*Pv_g#bsH;Q@Efc+@iUvzWCdnZ=YIY1fc+7}nZ$C$3^67I6 z^raJc)oU#Ciz+Q_nfI|Lp+&wG6F3uo606yQSQSN)+ab{x9cN3)%Ol!3hd6$QAK<K?*7!uNs@C*>#VS9UjzhobXrREK7I)Be0mbl(_jiVA7vu!lrw## zrU*@A)HMcBQqT(J%M|ps@(pBZs1)S+V2_`&7hr2~m4{<%;1Ko_&rJ`$;wrqe_FX}X zp3JjI81hnmL6Vdu94j}7^_P#WmUd5$u#Fn&&bnj9i%wCdEA+pz*EF<*9Sjwg%N>Q| zitd`>$c8|eele8gs+WkaA{r4hrkM4$!E7WTOFCtd6yFV|h;U}eGdd|^Y_nVA7`Vpe z5i(2dLzy9StY%MzNSn4qXNis&9Qco|b(J}@f{ISiv~L7dmpU{>tqy^DJO}NUn^=GO zcByA<_K85@TURy2VR(OR2rZH6lpm>GN$Nk}`*gG&wZYe|R?n!hi&$?NJf$FMsjE%eEJaon2z$}L1pa5C1A5TvA6iMkOl=@4KF=0ZO`cu>_B3N#je%}^+Ae`?VjtO2?Y zIliZ;G)A{zMO8^T4y#=n$e)(`wLt235CuLXCAAbpyzJKrUnO~iLOmQuBw+im6ctQ- zpH2#3G})6^(1X{p!@FLA?G|CvN#Cz$rC8DG7Jv-nco}`G=Ss|cK_w;@ch5@$mwdRt#zDtWCe?$XJi6|vCOdjPJcI$-*Aw17 zY2Lp)A2dP3NH60CwsO&&=OeaIxvVPJe5F09IRZ}a2@k_#$6RT^(sg{9ythbNI;S0? zk!h4=k5U-&j*;x3#5-c9taBaWFiA?}s#h{SQ>6 z>OV9gSJp@CN^GxNgZH6-3ObR76g9myxwc^gsC zM>KRnNbIYPWR;sPSt)3f#VR-pD9zvs%$u-zivSVy0t7NI+tv)ID(qM;oi!Z`I}|Uu z>p=^GQ4OG9B0mP=2yn8`!vI<|!O?Ns`CFY%N6!Q#fJT1}_k}00-x>|C{+a#}xZH1l zs?q-jvEqNi6qYHE%3~|SzjHh3=wJxw)W9=EdtfAL>JS3-K>Q%^1U^aV=p)Op)bvzB zkDYCdP@xo;Ug_NED2AuVQKJ32+G18Bmci^xv%A>i&Ar1)ctt1iIMZz@a9^)z(e60& zV)TB0e&+bDob@;vzJ>{Mfl8XlcDTJ`DNXZi3;Id`W=0>Jg{iQOQ;xCsjc~T{Xn;99 z6n)!nB+4!Py5N|AytJrLwr_C69GFZOc{aoY>YxY3mmr@Xtx3^KXS;!}K{8}nGLTZL*m`|zc%f!7 zX@%aI>k()4hgFc z3EGkxH}V#4O=*VMD<&b>86sv_Fw%di74i&PyGqcEDsV_f{qg#>I?>wMchL1^V~l%h zZMW(Abje4cNimS?WWqK>)wV&@wR&sPB|^H-<}(CCrBHxS-L1xzDqb%r5EZZ`TSPEc%uNQ<+Dq9U*ow+7u~=ovy#YikkY6G`d=y1^f0 zx~Zb@eNY33yM~4?#Sj{Z21Oat*83}(+3)R|Mt>n9*IuNLipkKA)2SpJ5U2G~BFd@g z9IR<8GJ-(vXZ&1--oI1hbHKScQ;AV_5X_Jm!7@^-x12RNfI2O&PT#1d1}k)PgZ)sT ztH-{ZRvD44sZG}2^5nQ!&Ba-riRrwQ;aemtHBE=I?`A*R@7fRCINa zK5cp}n^;BB=#98W2;|!BjY1cxZ;vS%TiPD*g9*L@blcDG03(JbHUq&LqQWO&QD4Dk zYg=d|_e%LGmWDlBY6rwX{HqHL2AdGrryIEKHesX2Ciz~?$c*^I*IJle0_aRyk$~@r%!8xmZgbo>kE^lUnI*m2UR%x@GRgevJc5WRYiVk zo>aZZ@QhvM$Kfd$e$F1`Zg8bHzLuD}EDjgW*idl%9f$)eY8fJY`c=FO=g zB-?52Kdhn@;639cvmr<0e~Ik$dOZJm7gP!_mPCQpD8bW_J>Kj7Wy}2NyS3;$HO_)3 z^bZe|bzNlMxS7sW>7Lua@c*N$Ah@eRK76Qz{j=8XzdyG7YvJ-wD)qZ#`?nYX$zdi) z^4adben1sMFF~%X1y%Q&5e%Voi|#$aQ_bJJY3f}xItYJF0r2qj_V~osM<#;h2knj# z=x?hjj78|)a7COt@7iV6WhK_=nuMuM-s8A|wrhbCL1QTcoaFdMc;SRA_P2;=6*tRa z#f?FP2<( z{^Jf?;-om|5m1)$|5TR#l?da1Y?A|%c!AV1d&9q6X5+lIp63Ar0}}-Eq5(4k!*v4F zasuN4fW5`6Y|U(Kjl8t_zNC%phy%caOn&aXXuR%>#AJ^^zP8T9Z0+=>%@DkDW%9Lq z$(q@EnabJ~d)awusTnnUiIwxDK+J_hTd*Ya%{qlck6@;I4(hr04 z_g!k+y{wM1(0Hr(g+UHs*F9qNge@;ndF{_p2!LUZ4aIe!;*K?omEqJm z%+KR2AReK4S~G3dMqxfY@LT$BdLUMQVK`F@h`n@)0pLI|)*oW5F4AOi%*>3QpBmwH z%sU@pP$x){G9CX&p(9H+HJ9f4X5e+;L?XalX--xI!`7T!WeDtrD^$(3%E$`?d*Rp> zOA21VUU*lXPDuIwibYlaOjo8kzcUr1mFe9FU@zRJkkK?hM=bO<%LHJ5l51w7G^2@D z$80Y1&8$gvCACh`<}VZI5jCb*nNtm}d+}c;&=M)hUfd{-Q!k4t zmW)zOm3`?B!*oc+2;UBp+clI{9`26=b5zxS{^JDt_yE9!md-yrXa?68g?S!+mYg9~ ztt^mkUPV^M4M$l9^6L%H^sCiICf4z4bD??(Y1p-!PvKX8640m|*)Gh<(q0PCk}C1Q z@{Qjo0jM(mSxMQcS89Qz2 zxW99pOD}WV*$z-$xk+3qu3Ht>YaTYDh1|6?U=KYo|1QCwGkL>@8&MTS#PgkVu8(Y;cY02Rsct@y+NM=XLzm<4M{7p+7nOcoF5nT zC#ScRQSL;@I@cYqqy4s@iQw67^h|xtBNh(nuoEG=Fm>70)3v*XNF?1 zS7NX;nc{KAk;Ou`PS3Mi9sRKtj{CPigqV%7_AD^m#SVf7@Lzj<{2eWf8@q`uQW3I> zRh9#me2&56Ry-F zj*?PzD<<}wQpqm)lTwmB4#(fclUbG*D#(}5Xy)$ppmOb!dv+&By;eEuC()zXT^r6Q zZFB6X7$CnPoFK1aA1)>SXd>ub97$E7Y0hK_R3%h#MRDX#n-2@vPI^^;OnXiHl*)Wj z6QK_qsgIxl#=@_P_jxs{Of>5=>7<_|#Bv$5(IZ$9{0M%El_8B?b&IJbxMzZk~a?2LzplmnD5z??#vdI(Iz&g%QG_iL-I-icTHO%33lZgBUad#8s(}V zvBG8TVA|K{m;{?(>*%QaHfrXWq19CjvtCi6=SYX2sXBvHLZco|w;6g*fi*Y-`Iakz zmv}D%fft~6{P8plu@}dsUvLDzD$vth?0~CR#h*_iwI`aM>Usk>fj+|Yn5E8fv4H+X z`$W4pi4_9n(RXK_?d|vYkPzO!o%No<-qGp#AP5m=e3>?|6~6EMoc@B!bp~(EUyzTO zzH;}R>;MqkNA%+-L?<29ZXBYyX41qDFgJ`_Dv&(9^OqDjbe3!87iSeagp+%Uje8@= zQ_sC&C4Z5(J8*6$c9{46UGeR&fztiom_YyY-v8guGylJ{xVcxnAGBUf;rW zvft@5O~TQCsrogMG>#57UFU+#g+#IobzUn*i_S7IhpdI(fvj3Y00KSwXn=^XXQFME z^U6$4S|AaqV}XY(Xk8qU67QP5(k99vw-rF0u7IQ&oi*NuR1%*c;AS~m$Z$%~4+!QC z^+3yI%QHC08kzowFTOMF0}~DK1p1!`vHs&5`!iGgsQ71k^t6Sa zt8-@NWk3>;FZiv_#R;5=dX@}@${}}zso1I%(NJi`Z&Uo|2WXzKhf^)&%RR%Z(N2$R zde?Uk&(AjDWgOxr!X_dMI>AplVZU@c1}1Q6dUO6DN5V>{K0@?}&tu~GLm)*PPymwg z&tUokhyf!q+_Qin`@pHUF8{2RI_JF-j zRUfL zSq%d`0~PAurueehW`E|=oV!0*toW*wzQ0ZJ|9KYcKfb*G!4dygm$hDaXh48Y7OHCL ztBJrTfkBk$n^Z?6mX*`)vy6v^KgzU@o^|~87JypfcWF%$WZ`#PSuadjEA6&Ovz#t%WQm3#WRxCUz%dsp1wqYkNofaLF z@HrE`S>AG{bTDyvHOvqo&Cn1KYnClR|HaituWm|iFtZFJAq$6SA=IXmE&&*vB>#f+ z8wSJhR~+jsK24eGAu}BNyZyi}Lr$9k~^FC#%SLzX0DL7`E=d;%bd^-qcsg;T;Cw{0-#dS1bOh|U-3w^jt z+P_8ULIrk;2>5dT9LM^vc$EI(<^0W~i}9|>5GzJP3*k>>LGj5qRxB`Bpwqt( zvey^iA~c)YmcccgFgBSE>XTy^Oxd$l5tbebN>L*`AF?gJk~tc3-KnX&oAjx-<@>Rl zn}zp!YT`(1BDes9+<0=+a?AStYx}x$$Mcydp4a2k#}D!sjI^IbQFAcK;ij~ZbEhHlC-NSN%9! z|zNB6{U&^1(A1S!i_ADXBhP> zK%r>45n_muJgib6!_`KbWQ5eH(kYNGN+|I?_Pw3dq0;E!iVyDXmV#Ww%vC9s7n@C9!biv2pK3B?Glc38i+hxnsmUYu1=N_S*6G(pD~)xpgjuNos4y! z$>%CTl;4ogxqRCz+;vAL5*p)HOzl@UJdam8=(b-0cc}TvSMnv8V3Q|WTstDx4|s2T zUM$f%%LMbRhLbYKP#Z1f6%FDPV;f7&{0`sC z?!c6Q`K5!e*^=LoSmUUg(Hy$FmRhT{!6(Q z4uoN$buqgwEi~p~-`K}YZl0+tI99RN030`kZ_y{mS2Z8N##Zt_(kHTlfMFb#M`r%m zl(zRTveVWQ9U>I><+8cD#_xdT`tg%*pZyN}9WEr*7!9(!+DQJh%?{iBX^wk#CG+^N zYGr~9*P#8+ThyesVVtOu>esc?Fc}D=Y)(Sig}=g>7hc$jFII~ zfN59NORMV%4$H3)4L?Xl1$lzrpsoaY6@%Kn-c0&hR=yUo6Np@iWAVp=CIv1g<>+E! z9+cnOP(`7dBt>FijtTn(0?1QxlS07YGA1vm>M5DvC?q|fbHK+t9hgxS|G54^V#?ec!XstLqJaMwn@*&xN_ z=?ua&5>xRGjY7r*bHbNN;wAezcF=-Mi;ZagUoZ8r5D>(ydCGGSG^E zh1R+Ub06uCNG8o}o;J}M07R+8)%riYBIG2SCy3Tw@R$Dt277$y14xWFN z^2X}AQZosR0qw-3AZomZa2Smu%TlRm8&U|yBD6m!edlg!u}sdKR&tlZCa z>1H@*7k=z53C3qx>^m^5BBikL#^okW*CPnWtqj{>iHw$C@z}21&x;26s<&3089vAD zKLbqJf^_rc_UE0iZC>OotNw}=@IJMIt{Sfhz;a9)NC?}$ zezfif&EF~V4AkoRq3P)x(7&M&HqlVkiCmo3{b?@m?UhW0-3d;kWwTyA9h4nW4TZ{~ zd-+>+@)2#Ns8%p4c&ioXS|4hb@YoIV(x|4mJtcKaS>*3$P-=m&^ikK7z4GiPX4E0# z$UQD6d$F(yIb(ZaC;Rz{l{(ZR!^pkRlRc}dFVxN~$`-87tfQ;?(XE4%8da++gzN$| z8sRAU6FnzQDiy`2fzE8=M|b>`o&0gNU|NEQs3WmvNpAX-TxqiXTCQ;Y;)?XOSUvSR z-Chc%2HuU5D}KWbC!TYPs=zkMh#h6%CV6--OY<|+K!&c9wJ{0r0JckX$u2R}lEgvw z(~-lH$ZVn<+qQ~t9ns{;YoS&XI3eontX$wBWnHQ%z9as8$qX(HQBfGWZc!NU57mK1 zSi{nv6THixV69KKhX3Gf%R$S;gWav#nl`dQO$?>>L&J!Gy_=r(czGs!33o-oeFH*6 z*?mJwp#hbtu~?%Hynb_-FaB3=Q`%^a`Qv!z=pBfCJ?UT#ch}F;5VXaN2fG>x%lC7_ zw@$5aHHF06A_PM!Z|SrSJ_xU&Ozge0d-~5;5Ud4+D<63c?>qt(AFyR#Ac1iVNM3%U z4`qGxzba3xi9$>hqDhCABrkD+EI<{_xK~b7F*!E?Y zrb05Q1wE>+Pyr&fem1}U&?rgdhPe2r_1-0hV^b&N(VYA$m_ktmi=(dms^na@l>y6n z3q60#W4NDW(|6A%i|lr+Mo4R+y5^z$YjOGgQzI}59h$gKCM+LSgI`-iu&Pw`B^pzV z2vn?gmo}?3hHyitWJ=DN8mnUGXWc4}tS?8nlJfU<$!h@tM_z%u{7~Irz6D|Um+b)H zrH^jicuA@=deaX3lO5mqSUoTRSeiK+s=sCl@^Fd4qv#EB3wBBA__bF?tK)E!!64i8O?$15ZKZpn ze%qdfJVH_Ph(~qRlW(EdaLX7&k7$jvarnm3EE9 z*Ex7YlfVToXBIzS74FlKXFDxVW!3?Q74mE08zgd2$d-QggFjg$d|!dkC5EhrG;+rn zKRt*!zVZmjx9^=MTS+4evq-DRbH+71LAMIX?|)o}Q29t(oB;XZ0}08Wjgg~ zga4`Z@*6Mt379B-Jl_}AFR;ufuD==6PlEWVTTuj)SSqx#VG)Ybxuv=x@TE+_SJ>-2 zuXx%rA7lw1dQudt^%}H2+gZoQ6OB_^G2-fWMQzhR zSID%*WXT3#J|=J~E|$fHN|@Wdj(HA^BcEY#*h`&&2kt%GC1=%DT8Ap-Efp46CX+WH zs`87rLaT+8hfOArIZ*Qm!Qlu&4|UME5fAsLgeHu<5yXWY4ZOl`fx$dsb`GkU1VP_g zBGZz!z~W?bFZy@}II+T;*@*JwFLdrg{4O$>e-uLO{2!+r|3;DVk01n92l;uF)%h4| zstj-tqd@~Yh$>^ZkkEJ@uR#eyY|>))!F#$M1VGgdX8|;-h^AQ~F;6-w){?cX$CI~jM)Vv6 z`2(I}C)LAm8`X177S?>{@CQksMH+LShm1K#fGGs z7^qT~?J$D7T$r}Pj;df0vzkOGk3UD>rF;nTb2smH<3ha%x-p5MuOP`6;q?2+y?CA6 z)=Y)9V#iG>6h@TIG<_0945fVzZyNulO!Qisd!i(0bbTuOVooOs#$Wg=q7_X2Z13_T zE$(eYJ=kZQXc@Z7it?j=XWhX;%`_a4WuK4)_h$MlYLiL9-)w{!ARD38E(%7xDUF`4 zSJa{QK{)&cL2pf#cIRE3YKHQ*n8I-zL9;+w@k`|g(o-y`eLp9 zP8wNye}URvStw?GSVM-3EnIo!)&+ZPQi|0z9?X1K@nk5|ZZPS(k)0h9lWfB1gtLp5D=p#(Fg6u(`e^46PZ0H+7Y{nxsed$%mwm zs0hKpT)8kQOz5WUQi&hP)kO}o9zSPl>iJF0 zIQQ1`g|DXsh)_6o5!_tMdMaLUmG7|_nY<8e&D+3z=quT@RCQ8#je0DH#J z`7sZp%l=c1o{+@zQgo?&KfePy(f_4NWv)Wf%p~HHj38Nn8#6-abN{w{nF1N4zk_!i zL$BUYqPFDuOitGW507yfYVzt)3(}j+$Q2WFgtFzHdjk*yY{|sK@@v~MuT@Kes=V*p z7d%tbR4AA|25b)+Rf>brkO>;tGwB0*t$~WwS|OTWHI8J5YGPN1@wjk%qI-ejF%>a4 zuE3{Oz3s^u7E3zor%aaot1H!LEAIIj4Ml0c_kGcn6=>$EnDL7 z4CI{a6%dht1VkioL`<5=UFgxMJ4KFfzq`wrmrMF+@U5{!4W5JxJ1+j_A_VxW$5q*R zDY2!ZSPA!MgD!5KC^gpkyMNW+?Jl)(qFl)j7Y?(rP7r>a6CO1UJ86Uq8xni)hs&`FqA0M8uE&m?1GSo zr}|tflD8nqkN-;(JpjHxCml0@eXh$s^2$M9C4_rr;|;oAqA+Z>t~%}MV~SR&;a)$c z>N3a$qDCr>o`Yarkoke3+_KAy+_Edp?3qO~&FC=$)E-6GmyM*?3$OU|> zSA^L6=#x97m|e>CVhi?>=iJ?BdS*>h^=WI|-NtmX8bL6;*X-;{WHHN-upbSR~eqcpA? za8J(|If!E+1PX*p@uOhLuVunpX9q(#=ND-u?sjWRT1JuY z69|r}Mcda4k6lsOA&yNPJ7>=~I<&={-F+O@&ep<{tN1lj610tX+21UQiN~npZI(6d z-ux`Z5eCBnfx!(_(zYt9c%bq-R*Y&=7^Sxtmj}B>B;@}Jmd|${!LV>J(tA$e{uI#!F6s~wx(@a z%*?WwnOPPyGcz-@WHB={Gcz+YGcz+wmfYJX^HgPKRiE2+t8RBhOZ#EReq1yDHP)K{ z7~jk#_CCDw&QboAp!H7F@oIg4+GSj=72y{5KuJ!Zyn+^|oTuErdRBQkNTnqF6ExwO zWaCvEMIE}Zf~l~gO}=q_BZb{vGNa-UI!6&lh!j&S0eer8o4E7~q(mP09o!Iv3XNg} zl3NUzra9o#G%-RmhFU-(S)Fw7Bt`{@oLM(}a1Z?Kkg7^eckr8Y+NmEHHMLce5)GJb#aB>Uy8eXc$p&fK z2dcm(Dotp5h+FELPZD>Zkz97!YsUnP$=WEWh@ZWVzQ1(KpZd;T`a}z3)#eKjgN;2X z8ksp)2?koBiFy@vW3@DMx1Q!s6Z<;?7vWhA_Luw?causK!_rB;$`MAEtcGOFEQn33 zc=3Fx_TFW&x}#XvQ|?vuaQud^`U`Sl6Ay(G1V+W9suhWKYF6orenc8YM&Qal)OF%h z2Ga)qN5%_B3IJ}x3dFn_QmI>fG00^l{DB$tx*3&G8EC(KjTlpomgTTcvro^eyWt8{ zpr`U8k%XRRPxR^FzFAWfrZX{eMT2y;I)Nz#lS_0=eZ(-ggwh%nsWv9qsHS#6tsg0G z?m6Kob*?|XOy^`cVaTindw;mr6TK`(>BUC!ZcJPD6h~$5uzB9n)<(o=U4Zc$+|>`i z2{iaU0SUMoL}WAA!s3qP!bf9V>p>JmHjB%u#;rf73CgmZJ(&@_z%)F?LnGVZ^sL`O zKyAa=`(-$ws@xFn=HVg3Du9e;q))4KZa7u3h{8~ZcLi%%g;0h@cE75okBc~b^XFu3 zd`JC#oP$bOch>@76SndG>ahI3V^#h8VfjC^sx~NX$zv)aeNeAd6KZCE< S5v=( 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�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°6Z;Ds*4t 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

0aWclhg@WnFuj0gUaStDA87D^3mr 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 z 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�+t0zJ(F$e^Fi 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�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

    upPOVaiR|EwgAd9*=m5Ek* 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

    f_@E^Q{iNQ04G)79J7^tj$>viGlUe84n@{jzo4 zKXUXTH}z2OzHZUPre(nAuuFkI^+R$>S1N5(sZ6}eSkzMcT{iCh+RfO0kx}n#)ggIw zLBptnzC+(*Fi;0KKs`gCo`FITj#<~UlSe8y5QTL%4`)&I`r|Nm&~x=V-~v4^&+u^S z9ns>LV5_=kc=~*|P3MD&D7<%g{e=joEgfB1Ps(iH+zgLKD-}rWLb5V?BpU+I!Z&SO zAYDy?nAW$qyqO3lTD!iO2<@-crzuqw;tx7RXS=pWs;H%mKeMhx!p`fTH?9-ie#!hp zCel$1Ba1%bARXbIfb&WKq3C^#yDCDL&=!c7`jO(-Zb+oFx1x>PG2k)x8kH$q8+C-u#54 z0r1&0nR&&PdxiUG!NaQBzWNQXc7!|<1eQ+yq8|tRn;lUnnH62+SrAaAj#o2^_w9$N zj0%YHxt$}s@lkg$<%x46%~0J9a2JR{BB63XtX zrE$4@Ug#&ZDO1c0qCuG|O@A+VlI-tn_EHL4(BC>nQiw#|cpztsPV~7B+giVCI)sGQ zZYHw;y`xxg;2Rb|=G-c-{ryS(%rgFQAEJ-6d6!C)Tk z*mi?}F}i{po0PzXCw=92q2N2*!fL5xNHf!jdc;!9 z#f|ckeKh_Xs>2D?%fP!DD?J-DJz)egdoi$Iq7xt4wLfQV&RAAiK~$BbXixBOoUxRH zk5|erVp1D5&)`_*4!8|rT1m%Gfu*%41#`b4J@lDGiC2v%A|Xx)B}6Ml zfFzNJxWn+#2d>cv07(#xq!U7s2S$;H-fPf=uq{=+$iLZ}<5~7~)_9*jd1?P2^5(yE zw86C;lvXtYg!%szc>cx7`rb%~^$+3dAKs>(3x*jk*z#x5Zh@gb?7K)5wvtt%8-$#Q z9*Sx?_JTSCS@WSO=O#s?d}2&z0E7}Z3J%I&e}Ylah+aAbZ=_~z*X@i@vEVM}NwC^t zRM(B)&6B{*{k8WqC-CpvCZ&H+8}0~msaW`49VVM9VZwnW?#-S7R^vzdVEq?$AYoc6 z2Cd@6u(#2}VX{xAmJ_dhUlXQ9v9>a($6u8lA+=BWyuoRC?p~6m>}Rq;XL=SE?r-|1 zN;_S=S$ZDN&92<>jbYbo_~I4SQnfjSEQ_CK5>=NOk~_}7$&h2Ob#q;YIT*HoM5bM4 z=W_6GE)k!^$a`0Mzu5K{ppMq40U2CHmXB)_Y_>tVhE)W$obE^GIgRiFj9S;r@=iI?5Q zjAO*fbx_5}DqPxPJ#nD7lmtaj8nC#@I%1gVHFuU?E(wYG9Z+zKIY#{c4urQK$`x02 zYHh9z<=ZTnnZ>3x*+S2#j4+Y_^Ew|J%rrO2groXU`7qWWU9@MnYV3j=TCV5?DAI2u zfwujr_go7NLKHF_UC}JaouI-{mCN}$940GV5%uB1&_-^mx-~nJW^C1jg}UITP&1$M zee!5{d7=JJjc#Pxm&zIrpigu;lCQ*|rw^H9!zM0A7g(AK=eDA6>hV?Wd)v2>4GBue zJy&H18Io-$9L=gmvWRo&NW_x9`_e$vL5|f(srQ zvnR;27u^|6;Q4-n#iLJ;^Hx8UM`>GRvl7Nf#yUL zl`=E}fv^OK6>NEH|6KhBy`1CnvB}j0k8)I5xLLEu5b84atd1_C+tHd zIB4Bp-%}|15NErkqsXgqv7VE>G;*vMM*X9(2B=|Qu&I{QBc_>xWKloRRH$=v0m@mA z^N#r_r+7`#E)PV+Rk$8TRHOb7Nw<(#Ucr)H^|4!L{wS|E;1E0YEgcYEr}u_~$8>9f z3#S7HoM|iX$gmNU0!UhSrreB0qA3GM)9IPf)aXm-{P@y06n}~$b=8P9|5StG*tOBjJ}|Ie_H>27dT68eM#YEtB7Ey%BO^x7Gh2X3mN8I_YtmP@@Z_iMgmpQrK8?arsCNuh5vj!Pk8E2{p) zHW-5#n9asnsOzw^;XeT24*61=nK>57IXU!bhG`aj`vZ2E6gDVgRg{0j_q3EQ&m)DgORZB!W;k>}JGAs>T$(Ej)qvekFv7*2sgLymPihqJ5(Y6k#PxW_P9LixemX z!mdjmvQeSuWGhMA*#Uxz3ZnZcW+gFJbCXOgOIAvBUGjmGojw4DGS(9!c`CcPLMxfV zD!rIXr8Sbq3DyM3tGTYS#)>4#ni7D4F;Gmh9pTx-fjyYk6cBPKi)~%tqfFfJ?GF`Nb?aM5z!+8(1n5HL#dIrum1F zjI=E8Zw}S2r-5=rE5i57`9r%E2 zQ>NcmVFa$>ZaIQJQT|WbUS({=BIzMxRjz`u6G2Vk^M%WU8~d#Y5oT7GG0y1lXnNX| z->>|fXEQlJxhz{5NT{J00_clyZBcN_VymM`!bcgA(h`uW@n`S)N%kqd$XFE|E`r43_P|g@&SP#x6ld>AB8sbtS=omnLF~ttLHE{gk31i2D>#cgct{ zd&Qri5@V$GQOr?--o#Gne@UPhcN~2j*PLSUwAO##MeY6cOTgbrB~wvM2wy4?3JtD_ z@bEnIuA7={`EJK z>gcT$fUM>tOt>j%+&I zE2+Lk(}`cB(B|Wz>*?&HQ|8yy*2?L8Jm+5a0D%ir2i5H!I9$8_*}Zm{V^7tHO3~Ln zFitMwFASJ93rFblZ!q1)bY=NRC~zx61{_8RnH41=_}d}c7gPR#=s{O+bj8ta^)e_e7*{o=t#<|y6b@K+~fQ1}*6@upTwWWL@{ zZuN$L9i5?JBDN?zb0dZ+j=YzC&xx+@caaa~Z7Z)vUC*D_lVIko!OnY4w0VTCye@bx zQr*sKx@)Xt_)+os{Z?N2gR1hn=yhHd00=#sR@Na{%qx0LW8viQbx?59oz_0dNK@X9 zVhUM1gx&n z3-+vl1XoSsESul?aUDkwe0xH#F<)-8CSHpRM|7#q4c6dxU@Qq{PD${$tN5wq;(Pd< zTe_UvAC_B(&`*3M?~pbd2cf+Fa|*?2z2qdQR6PdR6wl)KsaDUJ|Kt}> zFKQn=pukNc+W+L2-iLpCln`2Cs9`And*S*|a!I9yK}lo$LHAE`0jjHsVSRG1nl@yO zLPyx31V+G&l4nhVfS{l;;gN^tL-hK$OS_HO35x}}P!ir!){pbf%yRQeQ1S289W zQl+Z#YvP-}Tx1Ow9Tyb>rl;^(GQI`mtKEEUe*Jv{7<_HcZ@%nJjK+bu?EXN+Al?hb zMB&)q5dE_{76X`=WVgH8BOj8>&ic*)!y#pNbtL{s2tFC&Le*>%hO4$RO46>|8s_fi ztr+C(dCre{^@K#&H;HeD?_g95i|92o5)|VR4*7Ju)W5;o*B<8-JIw2Wr_g#s8ib^Q zQeRr$8;q5PRTHku)V8Z!6`rHL&-0qWlc08C{xX=rSW(OQT(JFIZcA zq!AZUOfg`eNNSTX)EJGb%%!&vjg2nJdYHvS{Tfb2N{$?ao>#1=9GtVPWU=`yn~NN;*vgNS!J--RzYdy zmT@Dhd03oIzby1kr)JuL(qc7fR1_6#)QQmg6m{YCVh1<2D5^e(oo-bOb(DRlWb35< z)s0?FN}ZSZ?C_s|^Yq^xxk{xf(TqIY#YOeKR`aI9ry3%qt(|D&D<<5SQd7-*5ajo1 zwRr$6xF+HJ$b2TfPO*BGhotonUv=LH&aoHIJH(HUo%ex^$BruK>kNY-l{Pr-ZfQuC z*a^l7H^n@3xBp0&rF2V6Wd5_8EP5Wz0>Dj}hK(WqEsa?R*v}5MP4p#B>Xu_a^O@ac#6@NpT(nDCO?9XBH+FI9FU@DsA=^aBhh zV6_xiMrL}d{TA}d2r)^NTy9U6K232RtRNFVUDnQ8o+kwGdzNkBCQo^2pKzZNA$9u) z9UIfTC{VkL&5frF9852ZU^+qMe#v)JuIkav^Xgb)Z}?OWH62*2PKX>HK@!D8B&?4R zy`FnQ$vw0T3BQ6>fQr5Ql&B*Ma06Vo%{;gTUAK*%{dalb70T+ayy3b>Zld6~t)q2} z4|J@aO}#o0q6r>;rm5KDdx~$J@_@KS7)Z2LE^3Rzpz?`&&>Y-VG!e*L+SCG%ZV>N^P`IWy(KEth3ib7+N z2hD0ce$X8FH%su`RtTTwBp=$PsJcU$=HxfDOVTAbwEB!U`OIWlPni?V zNilR|FNUfSxUc#*ryUF%RzZN$8P~{Di(I}Fd*zyds4J6vk<|bIuK}?jqMiEhEOM*G zK(s8~nv|k%yFDm;8B^S6%=0~T8+q3=x zC$yjQeIDzqSXtAf&zMY~a?$4Dw*;(;ooiSuOk1%$a6{jjxJREdq|F&)pCe8p-SPmS z8aOV+yUxkpKL$649Tx%LG4NaoChIs*88o4#({W8Ff^gI$xy9{$)gc6EhLzPVm63~4 zX^V_on63jVjwW4YmF($8^jxbzcM!nD;D1}y|xvcl+>!u8n+Xta{V5;<+9 zk}wbO61Alg<4Btliro?qD5QRnQVAwH9O`5C_3{u)m3)%l~ z?L?ehJp)l3jxlqS*p;d=*O8c(Oe_;%^ge3)F10b_h_--jCQ5`p8;Q&Pz8BrT|5cd# zcDF_=S5P(8=>D?R`ILRX$?)X&^mjWC9z-+7nVz=yh&b6Win6&4=(3e#K|h3WK??{3 zqwAYH6BTrE`=c1VS@_tB>aCmoTMNy$aD^t4LbOf+O(AlRiefEi z7h{m65ErdAOji-fiI}!`u}Y%x=C*vUNSf0ARQ(kVAR6KJvcAVex3);xoBMhM2hs0E zjFZMlVWJvk7n{+fA7ynbLAJ6%^8|2|PTK0FDxuR>g(vkAwz8>3iJW0xSKRNF9gu#q zkgN-|mH}v9##nnTI1~n0UG>lmezYiCBJ;4=-E|EV=R90Cl#FsqPb9AyaiK!j%lm$R%jIBJ zflD09vk;Dhnbl*Pa5DzL#@|<=5W+y7uMpd_k~Pim;Gx4a&wiY=Ebx?&|EF{+!<#Py zmQF4*4w~lM&8HEOKX_*+0O&024Zfx9Nrn+$CXnIhRxFzxYN%mfg>~=k(uAX$p@+;@ zVlmMr<&MHBvk~;r-let#5`I_mc&P;iIzz~!KOYSL1UI?+D}^zTjEj-@Vk`B!W4mB? zTBObJ+Ws`f6O#=MXpIiGc#KFTz{eh*VJI;50^4ATeV$RltdHIg1PnHC5@}PIX7^bN zMQ*-1bfbbXPwo5)ejU||MxmZd;7Ej!EYGs|&eG1<0CDIcs=*zYO1l2j!}R!b>&h@Nq4t5px45^ned|EJ_hMs!+Pd`w$(!iKOg(`a#RDeQc9 z{1G0dN@3?3U$1qiLr$M@zdAB7eki5xDH}0}>1LTJymXY}kt|}7RQ8mL1 zh?y?&K53>2p`>ArqhHV&)780oKoIE}i3DaH($2T~A4+?0s=?`vwF&y%d(;*X@-3Na zYutdGgr?E)TsFNw8KtnXz&oLX6CC<4n9AK9hcz7b@yWJ^{>pIm+_m}Rki|^C`m&;D zB6nsyJ=Hdw1qkj0ja@rWH|>|>1nsJF&=-s;A1j{T4oxC~vCl8h!ASd!Q1~pfeqA$C^3naxgub{y9Tc-IjP9F7FaBKg3ou;Me|;+RG^fR!stekLKl{ zv;bh$)C^K7pzt_t>gW@`o4eN<&@|IPSj`^+L*#iSr+UY*GoJDZTGBnDvP-7AfB4H3 zcgBLQJ&zt8xqVEVeFt@XOAwvsiFKvwvPo*<-m~&jO0~=Z2X8TU!vl~ai5dQYQ+dOU zu?Jt+nGw|L2O55V9r=up%z$!>g1k+!2Y?iPV}!j$=CvXckDzRBAsTnZFz%7a2XDeR zK!K&>bZQM*U39~Ja#2EwV!+hH7c!96-GLd8i}-}5c1($`xz$M=-Xi3<@WP0K_n0tt z?3>$UO||PafdjyD$NIRWqJln0x^$7}*q=n(pGIFx-eV}VUSsbH7?Ri>E3R=GflC*0 z9MGrL)SzKdeg7Qe?&Zj6QJw#fhJ7LDN(K%v?S%hN+DS!({5Q+A0P_g>e^bwYo&n5A zz@YrUJO^~P>fr1@JV(Ru#bgbh6UhXAKd93v-EbsScpwx$Z3FNH*1*y~ap4pWvt?|I z#EXO;0hznQ1sh379*VV}GcIb{y7vjU3xqGFxoV2E|zl*lUXr z@j^P~S`Y52IEazxh#zq;r7O56j1ncekfbTwCsP;@94ATwfEI`#M*%^ZBn>1@J*X?8 zJ@`rYLOVhHhcQ5`!aO5sa3uV=_h)LpdR0=>VSxx;#38AAyrz^fdPJ1uFLFnw2pK0$ z_qnu0&7^*>czu~YW{URg2XuKiQ+!$=!=ZLzWu+&wxtypeapb!2iqX_1x97F@_5)_y zi=sV1$Z>-JU=92F9-vvwhV!@i89RAOchB~IDYRo(@Nz?x77HQTG@c<>=2tXO!h*lH zmTS}Qw&o@z@Y4ZQqT$a}bb2hpJJ*px>fc-T;2DZ_%xGl=#z?-HPb{z^HhI08rB(r) zs9&1cF#`@ApzmDC7IqQAK@m{=DdXR%?`=}qx^}aHlP>DBUxFZ%sl%z{L@Er7r?BtoF(ZQ&bOn?q96sw;-`_T5F85r#1 zsbQ0DD&;_tGW0#Hk>6BUcV(qjA6S8+y@n(^ z4KsjNGxCTO?;wEaBbz@0SQbNh&dT&cqz4v%hq5Y^Xw8apAu8iqcB2p2n#IrO`8#F_ z?rKE01t-q$IhsP_of$7+o7i7<-s#{!HFZOC@FIfWw;21l`#%qVR4CB?IdT;}_w4rNiwdOc#>UO{l%e33fWSf)0wAbC9P_zQ`%|ow$$ngM5WjSV z!X$rE$!Ah>QDHaw?KWgQc?zSUMThuAClVX^?=IW`YO^_3a=N;8BeLnlb&NzGr>)uC z8*w!nwYhJn1=kRG!q@i+RQE%l=moSS_t^=<6@m5?atD3ti1vYxh}Vfjm8&UT0ap1f zKqERoU?E$MV%`4=q}m(Py~OSVeYHn<-T+O}8|DOieT){0lKsO@r#jRd0-46Ssw&k> z&V0SU1cjll^?o4y2y_~D1uja)s-BjfYTfcv{&WwnSO>h2K@SxMv_40qyX;IDj$-+)&u7OmeV^7d5?Il?iN<~3R?+^L% z!rm0T=B4tP#<{5_kg)KOF>PSYKc!{aFI8Wu_pjmD_PKVsoJ3rqbN0JjT*)>7RFHJ` z&5^Y+=DVaf0`f!*tOQW|SIu zu`qtjiDM%3nYy2#%(!J;TW@ntJT+ItpIq<0rU4>uxPo_)U8Ez@xAQ`Q>?C>agw0F+|TX9(^Nf)ukHqDV{DJTIINL zp2&fjH{~Z;U5+OH3xt|-_%~F?e-Mnt%<08QEm^Hot{+va_fyvvz>D9g#vzAv2zy?# zvw1y}!S50{sfO=oDvpzX*^NU5Tv#V!gTW6)83lO*yR_d*d7JODxx;r?&q=PWU`*~n3B0smt1^H2_H~G z;_0)!yHOc8w5AwlxkQ%QROboWtJ%+Wdfd{?S1C8}#N+6X_0Zjv^4_bP4);_Yvc}Az zxm9#qyyc~L8#u3-qF=9$Ff3<(EIgtsV3Blkyu){7Z8CBV_)=ObnQcR*>#1EBxYj z=sk1@fvqV9DAf=rTxwfYlQ`xu`?s#oeama#(Ydk3)K$RWE+|+^@&wDkm9!ys zB#Fp6SBGTAmoQJW)n#)|GXYHXdyT&t7xZm{bI#x3>0 z39gMPV@FWI$7x(1F#ute-i=48D`|7rSZC!BZU{htDumgdWb0aYUEi*IVP~}|Qte&Q z6r=rA_ojCN@;5(W`PJv!8M8E2tMzm@<8Q z^sTty*5*8VHkeJh#&Jebe3!=UR4mPgoU1H0h(QSw?k#4DW~Q43h;wkEKJy_AT}+~# zG$H_GdlO$3(xp8)(i56X(I*a032+vO9u%&>SR0c9Sc+m*3Zgdld}E)xmeM1*an?^3 zRp+wz`(TNqkHf|ZnrAeKJUK!Eh#FSE^nG>*?_FV=J050BgztB^-=$CL%b+s1hQx83 zW@c@^O8}JV$R9$NW|S{~Cev!CI+4;!DMxwpxN||y4x%ii76^(KwFr7cfl6{-rVmsMKCH_jMSiOF2FT|2SX$;9J+ZBCJpb{VHN1fF0OGKBP)wtOp&n~+ZTKoV$q^hY8GqFCM@ z67DYST!p{F{*YK7xgv= zSsBIS?u6RzmP9Ke>2xuB_8;mE0s?*yjc=o;*nGMHFvmizy+HS5d^+HqL)mGq zDvU;Tmz;Qmbo5?}4%iOQq35(#7Dl7IJ0;%wC-K->yOkLI3Uu_;+pE`0hObqee7DhlK0$`ZsM#W%+VoRJ97kOlk?-H2jEr(ZP#| ztroS~%N99T=M2#{fEoP}|G>NU-|y{q&@OWKo{(yvG1dYEGn5FX=&3gvpjs5}-s{-2 z^;BCiNz2k691f{B&Y_+{4_@jqYIH;1QVt#>@oR)b-oEYfC-WLC_NkRS+>zgEhxG~w ziG9EYefbhty`{lTZpfPN(%+%A3h9)nSn2ICI=Z`I(}w7|H-_Sq)#ZqN5Us_!;S%U|y& zuy;DZqsC&`<%RIM32&1=s3;NiguLZ5_k{iP--;vIrT{`7eG)ibAF5sLWM$i~nij8B z<^P0^N#iMsSjjI z#@+qLo>WFp5r5qANr`=+ynM=F3yy0%PE0}M+DhgE7J$2Vvn~^}KZ_0M!PHuvf~(?r zzkcccGuKa?H{j0B6{0>PbTDlPQX%t6yIkL25K?#%Ey~Q}$DYtePv;R{+5l<`qa*H- z|Ni{gBkraDU>^o8WA3>J4;;RnG-|D|$nu{K5AL?WIp@pP9ro65mMQ~uH389TB_$G0 zJ|$Csz{#_jM~z??4cRoqP99Dd8})Wm;(Xfc>20~gInovP=)J+(Kl8iJ!|gQ~K26s) zJ*U^Wzk^n46fb}pCq)_i@H0{am99B%c(ok2wVdA~$E>ohiFTAHCC=PhuCECP$t5|R zyFdnl%V<@*47qY%Co!qO6{mt*>Ir42Nxn$6Oh8H=;ZihO9Y|L|Ia|^6QUMQ!H{#MR zV~R{7@~t=iqg_@9-1TVasa@t+ne?$_^xNkMMIPh=z@iveZ5MWH%2;qjm7Wg&X4q#l zoy2&mej-yD%-4XP{X9_7ZgeMnks;j4V|3O~UZ$nEi3}J0sb~!6Uo#{%GmQlW2G0@A zT1om08XfdX$A8cAhY8O~i-<;=$<%0}5!|N{_YC7Ic;0MLwMYS_UecU`D628ydr%__ zwEP?wKx%|2Co5QY&QofHBquM}XRd~{RT7i5z~99P1x5;!tRURQ5hYS8jkEwL3W_2v zl}1(&?UF|7LZlb#?mma^Q97w>5w9w?n3)8hR#FpwQyMUo)+Q=qT zr2$~bP7BR9FWEfdFyD$FvbhBfdk%n;X80Bq=9qW?lo1* z)pK~IUGMVYdl>#rA4pq-54ejNY*p=?>9^=HJqy|uCy`};PZyK>Jpv^-ViBq)j>KXP zyD#7q0TAh8s!UQ$?(5AF5FvtAY z&&eU`B{SWD8b%jLNDc}bGQtr1iZnf$Zkf@XVLUAF_ zav4I+nT5&m3)71s2NW3)gw6(yoDltdU}Rp4jdmj}l3)~R?#J3^`o*Cj8Qq3gIj5sM zKZ(~yy~zXJDfQHk%YORl;Y`N&%|5tTp)U*LG{6I#m=CHJqs=O}W==wTk*7VAz!E*r za`H@V2D9wkQnq$8U4PmTeLG0ahe7?;ye{&(pZXJT>g?%vBmh9LynU}Z2=G_)5m3J+ zFh&P}R6WQ2j_eM%z8%&aH0Y!LWLCe`0PcuXduRK#SG(Wl16K8{@H_Ggt?GFiIN zT9*J}?Y+b4G2O$PJE$A*pZ@K=1WaIG!R@_yjvUXhR}hel=lp}4JGHI2@9^$H-6o~J zq3ylLz%4NMAO;7HXNoHbgFU+&2H?3d?Y#g800(Dyd#{EK7-Vw_OLLHUow*0QcLMH( z+`hi~V`vBP$7>JWtP>L&0!&f5UEA#_?mU7u8^GVSB(vPxgNVI#@0-9@R zUk?U{`z^-cr-0cG2HCw2L+)!t=jU&lJqm$?K7_3ILP&>pn!Pke@U?-~9&Epk*?vcO z8`2QKJ>6@2BqIg@^n55U_WO6h{g^w3!uqp(zITjE^bPx<;q4Ud!umy`RMrq*RMjC~ zV=|^p4o%t-+q#)d5VH-9;E#@TUApY&Iz>u z$dlMj=s^TzfpTX>d8UExQ-jOe*K&}vOO^DwSW(}qN_Vl5;zeS3=#b{0qTlK;> za=)X*m^HOQjH^rY$nG3Oy+HLt;OSWhtYG?tBzJBi{%DXeye(>Q{Npr1pEHkOUXk*k zObc!OJF!L$LWZF6IJ|em!23>RxHi85ayW>$8$)J_o0ec(JYCyyaY{63?-#%vbffV7t>%@K83i7!Y>spV$_8och`=y0w*y)92eb1ggO%N*P z6E@I3yet8zA%E2r_TUi*lrd{^zfKzeo|SOAa;NB(Yh#8^!S?9viSY17zSf!u^-YJL zHe&ZdOq+dj1oP7Gy&m|LUNs4bB-p3z4sLj7o&qW+kJs+ec86-+!k7)>rlSj}L6tP@ zc?wxHNm+0qM^Xh(@eGl$$rYK-{>;2~sy)&Z7Y6AX*LkM5-*11%**^T?leWFn-Vud; zk8d{dmd-?A*z5yE^iDS<5UBQUa=I!1lW(v+1|_T%l^H?KB|W|DXvzSu>r#c}SOe*QUO)e)A{fOxbo@D`k2#D#UhS)U(8qJv$1ZKUs_ zE~nNw(b;3F+SM+~{&37!1aM!SAYwibkA?tJ?Fw2kepyE3|iP--e z2r6M;?(m>Aghx1}OM#M!U|_Duy_|8%DgN-RMpZ-V~drYe$B1R>7J%ZPr79jl#wibc)D8v&07XC4JO{gKYqdHH)Jd;PV4 z`qCmhNX5Z!nD9>X*ah^;x3^s`gVw1}5 zP%$hm(ReX5Em{!_rk}_X7|=gw$v>n9gDz>=pZ}G&3V|sNjK})+ZBXrhTF3si;!K1= zZD|jM$@%X?5M(BxsFfmcXPW!~P@XX691a#B*G5W4Dp|2)ym*9Z6Gf*MWJ?Dw16u&P zFB>*HVWzd`mT0p9-{gBYNC6a+^>xHE@Tq38#kL*ff7!|Uihtd-C4`QU1R-#m>ZEw$ zIbOftzxupgX2|+BWyBPX^?*doNi)brHPr6`d#t9*840ZmM-<*ta`*%NdQ6T!nvooE zc*cjG*7yBHSvPerGV%#L)-%<6nY}vk{MT}&_#jI7O)DJwT28=088~T zOm$YI8kM$PfrW;Kr>dc;>68m~nB*%ko{e>vE&Zd_~PFS*L|Z zbH(*6muI#Ok2bwJ-m9y29|JzCPnZHg9A18nRSyMORZ!ul*=rZcSjtKWN_qw^`xDCz9eqi+Z52a0pBn>sdl53DB zRm#ne4y+N%$Cq;gA$`{DwQChJFU7aaiXpmB=5rNWCwB4HE^O$h2mCP8FQNb;cm^ZM z{%?EKrL4OBje?(wD>m-Qk=XDAJ8hv_8#4~5{h-J0&_=d$?j+9Z-tf-hGH3TVcbZ7) z{Ah(Z`n^){EjI-{1D{^%hWT26#mjZ6or|buNCv*uH@1DhRVH;<>sTG8GuLtS*6a

    6jD~o`7lNB7?8MlzV22J9cn!f8t7SdLWEtJH$%a9`#bpbCQ2e*QHb(^9O4`^{37>ny%*DpU>>1{eh);kK2gXOuY>c~ z1$Uw+(0whIT-4RLGk!%^)}c6NjE49h9e$y|d+;`h+r|7u=vzV*ZV7I;S6_lnfy&i} z+){KI2z){Ze<2F*wNSWI)vjhxnSPNJS=^eRpcNK=@DV>%Le?OEE`@O$SUx3a2 zOf(DnhG4RUG-!UIkS5E!cHZjmsy;Xf?=$87=BJ}1@j;LO2Ki5)DXApk>nTvUy7>PR zuKu_6ruPT_e;0-;6grGF2WK*bw1AlZ2WMb%gZfXDF73(|2?8L;Etj6ku9%Oe2(!Ry z3+3Jju0&&4_Z|E@j8%H+JY)LLv!BX>ibxC!U7lKZh2{3tk=8;qXdx7;9kc|U?e8S? z-7FdG8KgiZ(`Bn^)4YbKrySqE7rsuH+ffE!nz73tt(ZE#P=wSbSp+E_!m_z&lWwyY zNR#pcxqbB5?PUNXL@(bPliK);q}#@H-hBzWT=b&!=np??8}u0JOnz)f><_;QjK0;G zU>0jiOCZa7V5vyN{BS2bysffdGVGZ z=yKppiz{*|tN2+~w6As+L1~A#Q7JO~9W)4a~xiL)-G9 zUFA4>;pf||J^sOyPeC`i@Ji;xOD21b@>HcF>?RB_(~?mTce=t>PSU!Z!W%e02%c0y zrO+W=Si^v&Z+?>3qwTH#8s)I`yydpr_ zs_xkrv?N*n4r4Y%2ddQ4{d&=pVoRcW+Qke9G_R5=@Mg0DWlmc^k`vmr*7v34*iM0# zynnN^_ax;k#I9k6i$8WW86EvOuS1yXv7sw;M)+G)4n8t&BdLsVMh}uMDs-fRIS8&= z#JoKn5}{MwcTpu=t&%8OHNven6etCsFUl@3N~gZ%eF&mci{c!X3;$GZH`tp1 z=w#>qS-R4>eEde5kiXjO%%0adu!V~g@Bj{p($}m-WMe$eE2>u4l;Inq3EPw-A?8=R zof^7RGHZ(GNog?kg|2yOaU?WVuxEojBAqrz{mU&`n+i45TDYkE!WJjsn73oF{5;># zHz9!S@Hy4Oj&xg&ezK{x8_vL}P2wIzn(dV#GUCdV0d>dC$@}$F~;( zAC-q~SZOC>joB%jxp`x9{~ED|ip1m^O-$~(c;I#pn)}5`UZb9}n(cy3^oPCc@>2_M za6%81;u8A_4=6-cpQ2)J1+zmqfZ!Y)+Mv0Jimj(0jU#jgtrxd`j0yMN-a1YTx{bcHGJUiBV zW2Jf_q6-HjV;lp)v~a^?Y$+j7DbU<$V^Wyv4<;n#CD%fQ{YhPlU~QGhP?S%E*Bl7l z)*I;+sLB{@3EtM0>C4I#d`~RBuPqK{qr-OC_#(b+Ki>e`A6MPFA6Ek1*^o04PoPjn z^>}g~kx|J602L6Agd_RTC`*CZ?}`vHJlvRC^iH}H4vwt;CLU{X`{Q0P_OmvWS{w-uX_DmAtVI`=98!hYM#p9nX7$(mrQ@>kmJX#9r;f@U zm%U85ewdit%F@fhrfpS~E?yvjC^+0hA+Kji%{-lfuvNnymJXp`DtYpXk-)bl{?O?# zG;yf&26V_9Zr8Ok=cut*ZpPUsc+M?$5Vfw#DqB7r4{m8Hi7Z#$4}#493P$q$)Cc1C5o|}+c27W6bBl`=O1-2{;C1O#gQ82Cx5#kRn#MEz$66`RQDv5oO+7z&AxPyB`5cJkBSJP z0zB@;?Q+q%tnmY(*;3S4L);eMtc731d2Zj>jC}PX|NP2~Jao-WP~kGo;k(P29s{#( z2zfmu$!c|7q7$?S3Zit|UZGh9*p@Jq>C8$mg|GBku=e67=+c$wSC$3w40pkCabau%Q{ic z{hd@=%bQmzg#}^JKH)5iV)M+}8y-Qb_d|i~e#bSxYmxpqX_AC;& zFlx_h4DwS@6&fW^bgGuyB%-fIC{-lv^I6`OA+45uCoS~LsU2p53FLds>&DaXk}o5u*YXLqbFio!L%Yw)(P=*%^E9pM&K0##y}{7jl(e7tw&tai zpXbyb(=96%V+4}&&&9V@E0(o=gk#6POXAi|_VLad2Yd?MyvdXK6>}WhQYQUYW*79W z*;KCQn*4=`S13|A9*oxQ7{E30xX8d0bk-r*%5`7M!YGFk%b9c9@O5w&ackpb{k9r@ zH>%x`*#jX2#=&i`$(Rbe*Err-E#ZzRpVS@izNX>KT{80M(X^lc%x{)1joN-&0f;0cvIxN0QJ~0t=w9Ntgp@q37B#F{+7wb zxoKyYyIQKtMdWv|3tl%wR-uIi`B!+_e=5q4QMXYlpMb0ZXxRv(x`RpiI zH<$~1wJvO5G2fqg0Bg61ZMt8UK?Gz|Q&o$HOK%)wj`4OOyz>pJ&YYn&g_bS|lR*iL zt21=tO<^?xHDqg8x@mKdeXeBC)2`r`3N;@thz>vU@6n+rjf+CC3tJg&GLXuV$t+Ot zH>f+HUKKY7{;QqjY1XD;l9L7_$wJAdvDk}0Qk88_~ZWjZt?l}vf=d; z_-TWl3X7uU0|D8|8pe;q&fi`aQHv&VzwqBoA6Iy)hWWMm{w|!=b(eMQ<$UEri2-6$ zd&3W(@D~&tP{;~l&>1f@5E_Y0xR#8~tTJZmE{ zbdj=bynNh<0LGA$;jXk?#%KvyKh~uhl||PmiCdIJ?aIP8gpe)W2{DKrR-*;S!UYpa z7_Y*6dT>O06z_c1omA=)^;|FogC$29sj!L2ii&?iQel&jwZtdp6#vAe!WI*DF;RY4 zdG|muDJ9^kI8s?Prs9ZFsN-$%3D-IOQd|hE-mlo>2P9fTQV+_rM(H)13P5@i5#sL$ zV}LTF9h%k_rf>tTsLbqtVzh{fOm1myXEGPWp?cxP5C_Bv7r=7{luOQ~Tz_5ITY83kS1<`t}VL?|<%m^*n(AuU`sa z=+drj=n&H!Y9YYW=%9&U(@d*ip8rdl{Bs}dpJw2+o^cweG=*^*2*9GoInb#C?aMZ) zUarkn%90u!1SEttE>!({2^2M=rBslzXo1xR>H6>VpZ!;*{>0DUlzeua@wzy}r#Sb+ z_uxte>+UM3xu>3cTlT+p1oCs+weHTer6Yo-NRPL?>yJPEjyD>Pb9LYEHz@t(J5C0C zg7F**;vyJPv(j6`A^_eQD;J^y%{Q&J_&Sc=US*yF^0%HzV8_^@4om9}t9R%bUq-m`b6b70nf z-}{Sqd;dS)=E z886{VDD|TvWMq)=rl1rqp5`f)+8MKm(?Hmw-|Ok@&@r1j!}U~MGsRPm6lo>T5DPeG z96ic;$EhS3N{V3iAq%O70*hg=Qf7awNRsDBmHxIg8qLo@B;W0a*)L)$SIz2s0KUU% zxwgLkw159`{+jV8qLPU^=;<#?#7L!@LaxokO4H@a)5gYF{&b#7qABygQm1GfzrVj^ zkjYNZxb6*@8#;<7tY?uAiarTJKwuf=`{Sp#!bL$cSg@m@pKA@1lN({HA#Yc3e{V(g z071BzK_MEq_zS=~YVm#!b~zqoHwE;x5SGSTpRdyVhZ44GtLem{7(`0_eLVt$+|j6O z_G(N&zf6zp`ukH~CHt2y6HRTAgdxp)S>pDRexBN?^*?k}_Qw_^nnK_X#O7wmT)C58 zS7JRyn1BkS)Xcb<6UA8%ZsjTuzZ%XfC=t(gO6s$o+N+ih%Hp^GQlY-CX$&apM_6=@ zqw3RMd3jm|HBr%8r`7-w)=ASswXxEw>Jl-yZv=~C3hE5B5p*FUv(dv>v>6d_&rS0M z5vRubdQtOF87+1RCQk4nhwx~*~hB!fm{Mi zxjv5|>rCV)6xJ>9Azq+oIKn1oS5HKzzz_KbbO? zWdL?x@DA2&J**Snw^BOcR4^`M14q3&-nxoKBSDJ}&N6+B*J!kTgLp+1$BLdsWA6+| zr+8X8U8SWM)zAuqnYG@O(w-{@t+9S~>3l5T9-832!Ewd$bFAYQ$4Q*AAimz()9%(W zoG~QQs`Tt|V;|@_3m80>DAR_7E}}u0NrMYP{wAhfsJeE?_Nd<9#wNyq>>%{^(@>!_ z!LmJ3a?s@fR&OK#sK!@o!CNf4#*^*tg916tYLbBz-5i^G^hb%*e!ldJEp2?0zh)ADx7p=y}wnLL* zlc4(B)Uy1IMft_TE#a;RikD%Fmpv<}3eAVzO@kt`INx+t{>G6i;f%6!G%r`-Fp$_9 zMekwvZ^?}|*U(%stBSm4z;AM?F?LrOO*?C2{lhsK6R3R**o*7mp*Fc@;52>c6tc<2CY35E~;pS#=al!AhkiMM0{)52M&BFb#t)tL;vTJ_5g)T&N z`0@N9;h)-k)xWIohici?-cQd`HMzhSf7G)gVg`*2n1*HLK(;`qKx09T?Jxp2LRUJt zQ1oaL92rM}9-6>uNK@EBG&R&UVU}1U{vOD{2uLop4}`o3Beoulz;ei0*b?+{lGgMs ztiW{0dB_&Dxv%47Wt6QkTW*1Tuomd!q-k=F)II!x9k3TvX-bYLJrIH3aNU5kBe4i! zk7(d05do3-ynx>nAPQJi4pc43C|E4?V7Lr8GDsDns5(kPtSL)Qxjm6@ax>CVag4>2 zY(jJO8rF;tb(nq>$!L`nS`xJxMhZ-)3QmkY?RpDgdtSsHxqHxoFt9|obz!exNiaV* zCrEOt*s%9tIa$ybyJp7OS>^#!5EE2Ei5U_Bslw*mU*XgzW%{e6LHt31&%%yB*cMDO zudvuBNrdbIdI zoPlJ|0{>-1JPB7ut4A2}nKXW^O;LmAoo^?x3}m6pf%dK5vqdfwc^7~ zIz8xYWg9xgX1)O3?d?V!xFS$I=#}9qt*F_IguE!T+}~FGEuyR|!?iPQtGRZa*U`aI z5oOL|>kW;&+mzM7bA29eA?%XiJ&UTSm2BKhe#I9pAISa39J2?fWzQT7t{dO^5FTs9o+lRYVGxIV9F@ilxS%axQhOK zw(vUuZWl~5PJ(D`x5?`8+05F?bC_})43Mh}T`if0PY|Hj8u{)`8C!iGT!_%lq{i9q z*!Z2v=b(p7(>bvY`r%`(-0aiD!#Azw)frK>qk?R$aY`bHeQTVv^PLaUa`AQV1x&BS z^tbutb5~UC1@~#JUj^LUztUnfa2!aeGb&fGpqe;h6{@(NG3424`k142U)Q;1QcQ9WOr33<$Z|8yMnm#AIxXAxl+ zf&5$jou*s#&v*-Bxahb)B?qmd(RVJ9_#%6R9@Ri|$STM&wW&sg zK#y183moTHe&J}C^1H7+l7R}4nQ+ZtZ7G)|YqPhERsX>@xhdOFHxU&tn9g}+>2$#6 zka#2xx}l$uF3FiHsn`(r_yvA}ggNe+o#PdEOxuF(VTYVTeTZTq=b2jux=5)jxv^5`ZhkiGGHxvN&l1 zUzWRU8Yzk!n0q5OgV(3>DjK?RKbSnGj9!*M2N4!6d^FfEi|Cd{$hyRSrVXum-62Pp z!@k9l#k!<&&mUAT_YakA2|?T&6|)w5i8YAuBaHMH-XgSXT#*H5woQ(rTg^-nkb9nm z2-*gFw|=j|30QFC_@lgt6T`*FoQX)4Vle32caryMZ0nIeZ+Cs&tpaP~M&KvW=^F{_ zH-cKbeFuAsBhJHA1?CkCexewdY-Vm-Dqj=$%m9xQLbw{Si6tik4R2b(?eU^ZqV91p z#6$bV4~DgL)y=0d2loqMU$#yhU=EX)Cp)P-Fr?|+7CP3XSH0^b z0Df?83mAiG?S}FEN6N(I)D|)JfdsqlL=RqVU7OtRTdR@s0AMaJ_uiyD|FLcWSr6_% zo*=H20g){eH9|`q31s+ zCd0jJ9Pm(^PsA9Q=Mu67NF387z=f7vwC(3SLlPcQwg6{CyP@GDuAn++^}L6B)QQk3 z5Js~_<)oyvh-g?;Z{pg8+O9d)7|RV^EnZzR_(ZU?ODc*iz>NUXQNmtgc8W<8RU*zd zPzOB4JPMpGDkNRyoTXz2Zh39l5I3DOSxlL$KsA<4Y4lrXTA60xe zqQj3FWwo+=1{yvDo*S4PXhZzHQH|B#zjMmAK2~$^u}tMZb3q+IJy!H?>Md{9z!%k& z_a#whz946K>ly*?*=+ot^=cIMDrwOjaE*>f#yxQGbiSW{NcFka>hJb{`3f}YU+Ow^U_d4bY6hTTL`ssGhd35WDS}VukRo{l zC%RiB!i3-uz znQy`@&9mS_BvTphcKPbVZMvXcmK{glGJRy#`lgWVZYF;xW}3GSJ+N~AN2=osv`vF? zI4AZX=mzp;ou%j+oEuAQ-WU=;6sZmOaO;(P`@ZJwzBaUHo1ZMnKaC-qhX89E$UiBER%N;ALRJrbcFofNDx!B=h+I7jF9@~cGhtAN2;q*Bkf6+xQ$ z`##6>Pij^$)2pT1Sm$5YstH3on#dCm`BTs6h{kRd8KzVjR*SWWIzbHV0y?H8QuGtI zpssYHD&E<`CQC1j0QtC`_+u3gHi5{9q!HfHJ^c-N4KcXE1BvlH*73a`<9l*xBVg7f zYL+BwsWv+{%fy-1WwpzBCmF{84>j$e)=cZ^JxvHhX5D0V4SsKL(y;-YWVwu~~vJ zssyoJrk6&8{?gn+rOQI4U&6V9!nuACg1+I}@1LelYglK0q57QM9OLTcg+CIr>;V0U z?=q@xw76==FE~zD4`rE?6u$atJx~>(Cw?NqBEy_Y zaI%6};d>GU2;NELKIbdFO_%=sQ~H?&es%XYfJK6s;&Bdq*D;Kur@*5z>^;?oeU-Zy ziSE>eAts37b!48{{I0jEl_lXGym5??x~;z@sHtxkQfbd!f&aNxTxMNeZyhqZy_I|= zKi2xO_Xg)%TsK-qsb+pRex5KfOxNvI;^b$&LyMeXKu5l(Dmf5W5#B;3qE#^gwtjt< zc6cp_M^SZy$Su&EpZ1GTMmB`!vl`7z>GnxUpRg}<@-bH*=nX3^^v${p&-xaxr|;*o z@P#qsU?~3wK+~NzY+hwe)$e(juoU%1u^{~EA6|x2|F&+)QUzg5S+JD`vO%6idOtTQ zwc8Ff~lF~K25smJF*S1n>~jnHcd zjQe?YBE(QVj_F7u1}PMcJQ(`?+-`W;yLsh&#hL&*-|W4CL+0fuS>;;RWY!1!v4SC<@BebU{1;H_KaLe}>nSV> z`0EA+B6#`<{si(#`a%%=-!-uQJM@IWxwfZ|+Wei6yORSa)r;s7DF{|32aYe0o@Dd{ zf-DLmX@mtgZ9F(#M!IaLdmGwXeWhZKNvA3j1c4>d9=@Pq!!=NWxoWN7zO+!``j&lj zV6oBR&VR>Od%PC<=`) zB1)N%AdXD##GOD#Rv4~^j;l}_Ff2}%6fRHY zM3F!%UV_FGIXo>MOX_5c#m9s#S-&fjCTYf-fGe&@!j?1~A+AWq7By^3<{Umw$rd;4 zLq?6x6Ea*bu1H?*KisS5#;Xe?4@@2nVKq?lI8x}!l8@CdrBh_3AV@Xr-!_s(RgFu8 zUpoxd7rO0HO5rqLVtwi#TzL$3AD61T;NLGWCe+6bktK`yAg}3Dg5@;s@I%-SReC#AoEQSV28k7p+|Z|<4y&g z$!{qu(x9RAqn(o)o-AYcU#;yqf1=bYt-6epM5_bgDCn$WUDp6t-y}c4M?eByYiN;M z_1=(%QnJJLaE-xYjQQfDVXX!kNHI3{k=v>b%GhtQN|e?5nV2$=fdM%7x^>K*lZ&`0 zf9%EkNPnH@jxQ)vpb1;12UV&N(KLP`Kt;O%+9HD+q?)?b^E6tzIIl%a{ zH&I=skLR&4=h1g~p2x5dZo#y0N zyo{3YiBRSUWL`!%mbZ|RaT;w-HT%8%D-VjXdnrR$UNO1JBt&QhOC*Xt4qieu!W73$ zEzThLG>yoPtl=P(Ea1tGF(zP1)X+5Tl?a7GgW~gO#VpVe;Nq-w^cO~Fq`(8~R5-;* zwz$!&kv2%yYUcKJf4;%0JJDJo&Z?0EG)JrP)ocO$=hZ6R5RD_|V7j9k?k2E8ujKWD zLPq-!zx~u<1?m2LD48fieSjWws(Kt}YNn`puh|G(2~x3Mg+@X0;+*lSv}QuR-H#Ed z+YZ%M_(0%UI^-?3E=wH}#$!Ql39<$FL>P-suUu>Txm($u=`M(-y5E#Ld$%Y;g}a%-*q)4{`w2uCAm>{e6Gon zpe*cM`Llc!<|p#7YA&nb!kb4(T*3qz3Of$d<0~+W8b@k}TT+P>VW6>~ru7QU-wX2ygg%>4BtbG%3y|pxqJeSiOy%%G7 z+TwqJS|*SxWY1(7FQ;=j%2eiddB}E`zBpw^u(fP#;(Qv$EkKg0<+i;*FTKrA0Rek) z|K!rATYk1yJGgbkec77+rvd-qNYPSlFW}x;p^XCIx-Qo%wt+{vu_L!y?A8CWdHpg7T1ZW zq>RBy;7)*yX+pK4u8)<5Nl+v^Jx;0l%9ACX88i$B0*xI8i424A)cG!z0TCX=ffE>u9A9@OIe>yub(X;+q*9}oDnoTck?qlft;uny3tkUGtb;{RG|J(4T=JwT3yKrxJo0sAJ`p? zJwwd4-Q=21%Mxb5ig`MpTCv3n;s?05qVn-~eylocGd`Ma9*rSwHl0r~N?7HK0Iyco zPRrPW$-Kak)TyYbgDpZ$PfwHG=jY+8b>=fYo7OoXC&)(Rn)d|Ril>07jKuT1^Dkx`iuur%0wE8^tdje{KjIQ?MW$t?D9yLA+O5k#A+X66o%ij&QMh zH!Ac_u^GV*dfKs9A5^l?eFxTxqMJQ~WSf0uQfgq<-_f%9ZK;IZ`K0z(=X0;p+NJ%Z zQ!QN$y5@-Bcb}Y9uA>|!?~ayPAY#MVKN}Hv992dt5dpkuD{IuAg?oM@SMk<2>WMJ> z9u3K2i8ZM=RSEnIo>6e7cq3dgfL-c! zQ=*~e4S*0ZtqyUFM1v$U86TBF`1_&{2AYd(q7ep$bl?kN#mvu?VS!s+1v_kyEO+Pg z>0%NiTpy%d?pT2EAMnLKH3ND0%hqy9z$0d{?v_S52OjmfaE@jJ0$VEL>gP^`;8;B9 z_Kq@i+ixGt(aWK;E%X_i!K;Y(@ar2$kuxn`O#s(-sVgLC(;FNU9gfeJAE)@Xl3Bd^;$Pt6U2|`7T82{C)zJhO zeP3dAF>p-$o#T>aC9`Vv1wrE2+p!dmNh)kL%yEh~!#%%aX4}c76^vQjG2z(8yM_<@ z0F)GX#-TE4hP{9bTpVgTrj?}LzPj&{+d=HwA7#k<8>L4caPHdQ&Yqb+Mb7wIJb1Xa zzQbzfgY3E5hko`UX(nHA_3a-!9`S1wf&`6%$7Z(&>16c}X0mGf2typD=rh&_|Fb`# zmh6_c4e!#LgnEG?;arMZEgYs>Nh1J&Lh0wWeP9>MK<~d{HOu;{G?LxYwt_q|MWEY&&FHifk9!{etTC9t!&(#wF5wSM+~|Y`k$Wej=T5E0}0wU zw*0cFp%znlF6ViroyB8JQBCxNK5ZdGQDrj=#a`qz4Y#-3b{`#o7u#H8wb{u(7 z6YUt}+S-6oY?!$ndgS=?E7M1p4Z?DXhegrJ{yP7b6naudxOL}ZjgG@kt8nAf_y8es zgKJ8KG=IKcMkBELv#ZZ#?)1;b>Hl26-#>1g2o|8iPRlOyyf@~lJeJKIGJpeW zl0Q%O6GFdK7a_Eql3SqY+F()*mFUn`Oq3L96GPWg;9m!EISR`(y zBwJN@^|A|YGjOYQ!ZQ6G(J?0$V;tvs*H|NG@GV-WdDkLf-4hF*N>J?^kxLC!-%Ub) zPH(4@tf@-e)JV4C5h`{Sy-px%{sj7}L|SVLp4`dxs{T`PgRO7=*zu4g>pA3mbWETgv1aA6h$_$eo@ly`pDu`1;vn(c-vUW;WM zlA5ZQ6qmRugD0{lu6sg~#Xs6-zDLfyNETnUCwf6W{eB!U39K&K5CjA{$Q0&M3^bDk z+2|BzQr5VTk%{}LRcXV~qy(Fq@u|SS6I@YxlMy=?hDiRqFeY;s#; z6LdjJ#pX{FI-Zda$2sRgli`^8e3HN=7L^#3Qck~ORogy8ZyQ32yI(_mhPl6W*jz*4 ziDp%rQN5>gIuo_sVFI}QMv&7uYpSta+kcDcxdf2pEJLODH?)&PdAMPlp-&wL6700; z$IEpZV&9TqoI@~QbutZ;=WIef^&_$blV$7K6^Af+C)XV|A*JlZH9LWVpE`6n2chT{C+I*AN+k^W*4f4RJ>Lww{; zofv8m6%0`S8)3_x+h6fyw(xtsg?{BNdhf#0!%==q#SA`EvtyAx-|c}hCv;^UrSIy7 zo$8v+pyP#eO895=*pilioaqN^CYvZh#7=(#jSfMC$sl;y2VM}EO`wq_j4+u`pfMqg z*jY%R@%oUK5@-@Xq~!#fiVtZufu{FET1%i=`H(geXs(%e&hFz3%In;Eqdlur*O0J6 zmws$*4~Yp0B1JyB;PhJ>mGgccyh&$?$qi2c&=?LINX9MuyaZtieVNvNANI67`7BK; z4Z;dR0XaLRy$G)y9zo2%%M6Cuo{lS%nN3n&5u^78&TzVeC-&u*RlB3V-LPx(2}SAm zgBxs~;G0uw%pM$xy~DZcsatc;cNNamiHsa>)QM0~yx=_>ENM_YPaa*Sw7Lh`(_3iL zd(z`Eee~*?L?gaqm(!Tcj@mKg$ib zt=OhJHM@=^hnUiu8^f0{$SZ$eh(!@FM~%HdPkL)~U|)aHfZ_>vhPzlTZgl`}ck9Q# zG^0M8!{Y=^B|WM;a{Q8Hm(uvE#XOO2k?G8l&aTZ~dhL(d-+VOiMa$)jjtjYt3%X7t z6u|h5r*rEXUBt)|vKifUt1(be`Omen`v^pRLU`VR6We0Sy%9io?!7d9(I4xE?bdi{ zD%FASzD;xndN46?=!hz?ef(Yp7+Pzleje!8%eE(5T28s zfly4lF9&1qVci-9mZtr}3D2cIifDlFoI33#&O~Z8itwEE3>0T7^+M~`NL^d_hIsmW zs%ib7q120^)M-$xo2r-8%eRI6O(Vi*#)W*#T4aGJR}k?+{^3VmWb%KWXCP)HDQ{H1 zl}pwY!`|3tV!oBJrRjHn)OV>f5YQWY5AW8f$y)I*n(+MF8K}lo%KHoX6QJ;+>xsSB z{3!Zj@7>Qp4#rY1Fm8>2iPX!--L}*fzTxw&@GVVm48-0Oxi$X#XyfC|FiX>dA9sl8 z))*&{1VxjcFyUlYOcbY{a6wVbc7LclH(i<0Zl6~CjWhvinGEJyyqZ(9y0Q*XoE)Iy zaUMZT{I>AlH}F5j|F2sO_ZEFK3D))wNO%cawQx2ZrqO(z+c0RA&q)KoCvHW=;G}*M zZVAND0Tb9t46%G|#2^h;0^WXDZY8x|a}x?%w6Gq99mgfQiY;VT_~r=fC0fZoB9$+3 zQ92$vb3KB_J$^qRJE=~#8K*y8MzA9GYo#&{)`_y_sE5PZwx$hN3{WhPP}!_*DuvE0 zbBDUCru7_{&I+Ywykm3#!;0Iu=o0C9)j}qpn9&8yQ*&51gMATEmu>+=cK^lm;N=^} zs&fQ>VR(MwNGoNAl0GBWFTMdV(mpw4iosSUsTN6^Snn%E3PeK7d)kU2K!iooA$Os| z$gpb!#&4#Coh3?D?hf%tYp`_BIU4PtK3Pb+Tv51t1jgfsauc9b#cLHGg$7H@Y@^X~ z>5&zO%N5E0h)8B(O1K`RRDJ$Xl7Xd1_RwfcKa{C*MTpK3$)FGA1f}XqoA{{U$0v`_ zXtDLlii_lm#$6(k^FEYwl&bCR;vGUp!+y8nq-N*Hq>2Oa0!U(RpF__?5tnCK&9HkY zen5|708!g6b&whTs^L-Qjse{0oKX!d65zfr6R0yR`fZu*AZ&5+PTJSM-5?VlGJmVq z$QU#cP8E&@bn$RTjGyU-mBy^77Kc$-%`)OkRb-*?un-l zMzGFv-c7PgWnDa|!WE|w>oyvM8EzR+ExmnAfS^QC&+@2Iv&s_}m2&A{Wf)V(p>1B^ zR-CZ~O08z5`GYaX6gXpWgr{}-BZGU;4iBHP!OFR?UX0)`Xy0zQ$bJhPis}%$AB3q9 z6IxW=k>)#+10}C>cvHzXwk+$&N4nfs?M!9l_O1aTHn}yG>+b~A_B~CTkv5x=lrNcD zK)pksz`xYc<=wFJ85Go26w+(4q=T?Fm>*P>rvwqUE)?~1_e*a_bx#>XgMrwL-RJ^t z*j{HZM|B<3rVn{T7ZP!HVh-zJ6XtvjLswK+pMoV?>JuR}Jp6y2t?6{KXLZ6T_5k+% zWTuQ6mrb4@WKw(2B}G+n z@iEnFa_h@xB9vxd%nk~npg8=@~Whr?@F~;F{*Gv zH4vrfCG#*-Km*c^J1mU_qi@(KoH)4xw!{C)6M%t@a4>>>$Nuyw_WP$#$jWkGATd6{ ze!Tu09mrEb299h9qyUCGh5$2rev*tOIfZRtBz%%K zfg6X2^4G7@5Th2tgnUUBI9c*TIdBw#dEp(zOonA!8nP*oWKbeVBOU+E^{aWHeE_=J~XsBv)yX z4usvk-#`ACPgyL(kC{XTN4M5uw$O&dCrk1+-Mf8{8-kMLvYT(V3Mj)ufLWjzmu6U_ z**fDG4;EHf>DaFeCR$MFRtxNjpT^vMsc3vq2nD`5&%H`BBx;dtIWE?e<_}1AFexu% zL>x2f6WX=6Y1l;7m-1Ir2U>Ahueb3ReO^qwh~G#L$Ej-#M4m*joW$R)o;nnc;K+69 zJvLxMns2+|CO1qDh6!D;z>)Lh*FnzLEkUKQrf&Naw0=<%KaC1o$2UV5ejMQ;9d%;y z8xOz^KRsxcmR1skIxijM7qsWi#4Nzor45>OMgy=DP4p85j)njQ7v@` zX}4HwW+t`$3z|oNv{uV>nEFRF^A_&0n_>l(o{f9{I`HG0Iq;9`DkpL3q za=lmx`#0vim$iqC{2+NID_#&#)Uw(LTKpT*vD6)WfKk7v0js8UGYe5?>j5D$o1cK4 zKvVrKRaK7sTCi#?;mAowVSuAmT`!szVxC7c(}(Z-0A;J1hoBv!VN9HzTbSY&qV_W`Em6-Hh6 zZTkSqzIyTEIsu5B53n%0ivXnogR_JxZ}qjX7j?bRa(E);D-t5KG+nLc-+D}#Zvn}& zM$gKNv`G~7hBICTp$kMseS|uJW2%5rzBlZm6vfadcb8pHdCNqs7EU7;<04N1W`R>( zg87}RPHcw?o0JsA1o?9Nj8NSA8O^$^2uqp@8!GegA;$e=%VB!*d4 zG*0(1PBR^$E(>J+(1HwmC9VxjeoAi$YfKczx-tfLHft^1SfSbUv@bam>>zP^6x9=$ zyDFL;hs1r~|3h0DwZ|9tfD;L*n(Av@a$wAsh~uL}T$Tr9*ZNtk&YTB(+qzj3?&d2L)CVRx z0<`1Q)TfdT%#!oMS6v}!Fp6SUSHu#>f_e-;t$*xj(-3T*h-uS%t1ScG1pAk@)zTsg zBsjHL^IBm)w3G}vSv;zOSCc;jQ2S%ZW<)Wr$*L95na5-c$O}m?%FA8^>Jx&@hb$%a zOeGqEO3W4CIVE-dBvb;C)kq~pCGp^_+NPUdVP7J(Yp^CZ*tL!YTtCTml`0n053nw3 zpWfzp5zW3eDdM{$WwHZZuhi4ul@j|5O1U4WsEPh%;;f&^{kUTBF{=LFpH+;wj!_mi zc8eU@5cGLXX4A`&kUbWw1m>9FaF;G~mtplKBl%&*wOubMu)H>OO$kga%;Ov+|6L5N zo=SIE%Ic04{)s!phivQ`V)fchcQ_<99!YhWM_be&O-fo+x83)Hl^8#%dQ~k0Ca37B zv}|>D&Q8dc@Atc9tNFb%rjS&K!Egb4!4JYD{6%oY1N>8$tY6sh<+p3^>>mR1phO&1wgcgBSYr z`8chr2XgH$^fSDHIH}VY+yktuV3`b?Z5rCGIX`D#oFOlts9X)|NB(yMdHEH4$5{80 z%0=x4!J@mkRue(0UTXeHp$XA8Hx?S~EQEdb0w2X>=J0DumF`ht?Z9GA*-XZXald@K zWQ*Je?4(X2!wf}Bm=_V+xatMU&52}YhOddH_@&DJ~F>4_6wNM7pWYOkU0sn z=~mJ(>*}vif`1fF2DDRoCY|iWLA3qQeily%xUaI%zpm!qvfY=6#s4KypBid2q@rX< z#Lih-l13_%5tN}R&PAHYe=U5ZE&a_b>lor_zNSK78RfJ8UqTI{ja#+NkL-reANKNp znM#=dudOsgfCu~U(j&G|^CF=BFI)K|0*(*-VJi{9{-OvlU;&|zO*|h00w99%9*UKk z8Uha`E{-a`mOAEyK1Y^UCawDS^EXmKj#=|Ex#o@ud(y3_UwvFaAQh}i^z~UBTaLEu zs`Qs(%FOZcr+d9_9_PvNOQB5w0%y<`2h}AkZ^sQsptUfs1=&46u?M1J-lIzM0jcZ8O)t@s5KM z`>0M!N4eH^1^>d1UgrgUv7=Danhe}^_x#)~jvi%ptHdDMP=74%zOPxX8jxZXRx2hy z1TwKM=yRH3k4M6NP9WWh`fM28XgT_(IFS;@GGotaag0HUEaf4TbaRbP#36>Rr=J1qj}e>hek{_{y=;a8A1i} z5sFTvTRridr%b7yJ~)kTb`b^Xcb&gI@)JGeqbmI!PGal+oz46_9o?|@oEXjgGV*(C zhn6YlU0OqCy|wKMV1e>Ms&?Ud0eZHyTol6#%b{HpVc%$S`9PvT54zLG#!jQE1lmM zDxdwknRaQ$uO(JFtV{*ZA^m4g$}UM8PkZe(>!fPGD{sNn;>)M*fvT@Ow12<8ETR1k z&nxz=w*{OU`j%Dm7?0)f2kL2U^HMaVrb;GgA~;1@i*Vy$pmz>DC=~mi)hLS1*?-Lc znL)KNpeQV+zH3drlsGr2k#daHx4{%;cec`@DzUhhXk-yjK21->ZFQ^ilBK|!x1q$+Axe3_X;k?RHiO~YO-Fq-LJ^X4ceDiNx<_l(i;yl^TUkb z{*?QuI$v6mOYE|Sv#~&zsR=kVMnXeB8Mpx<+hezu$;<7~Q`qK+2)d<^^}V*6rrl{l zC?NBzN-eH26e&}C+tTC!7E?1B!yoQTS<6*pC_cxqKq3Ppd@{D~!mSQ&Y8J1CJ_G(& zHUrha|G{_?$kO~v*D>#m#8DNGy;Ony0&igY;I{n&&$Pu8K+cuf5JdRM%LVl$bc< zMtfimk%{fiL6ccqkMFv|GB55jE+6+(n->nk8zRbs|JD;BUZac4ND)_VkoRV~Qv2YJ za35~wv)F`Lr+q|y{!8Ur;P7Lk%ZmI^RkS8SfeVA86oUfW5^fQ{BICF6wnP^15kM>} zxT zK@|ME=9*c1>pN(n;%L=<{lQ|FwYhWvkW&;Edyo2Gg}g zx9<1`>Aqy_$#rq%|I?)pi7)!%F7&5UpMbn$95(}sXRmtOHbjVMZRe0&h3hIN2RZ8NyuX&O0CvhYwXB{qz>G<_!pjm-aW>ixzt%xNDuXWN8wyq zn@A75Jzd+iugTOO`|i_#@vYSgZ%7h_Ho}ce1+HCgh!b3s{Twc@OhYwPtk+ex<&)r5 z*G_FGF*%Ws&AJb8$l~?;=5f9)=6#FB>(6Z2hTZKD8#!E|$1ta?s!~Ba7e`Pi6-Ou# zk%GA=zpMP<4dM+$uEravF$|Jt*U*=|p^0hyd&D4kB{=_6PT3BCgnosKd1TkvWiDDV zoDTUl?fd8s^U4}&@y==6z*FPKQ%&Mv z{Ka_}<<{z=)i9g%N!rCG47O_D#)h{0*;E7=%RdIah^iC;D9SNF!RLQu_x}cYUtvDK zg6$Vkj;mi`y(1QYF41JqUc|UnM4`Mo*^Lep78lH#(1Xd{;y-H+e|XjE#H>?Aov|I8 zJGAScP`*3cgufql(cCS8RpSKc?v`p)hD49kLiU~u!>!aF$C1mo zJw|cLW5W~UKL!Lpk8SV&+*HKKcN2y zpu=DBievzUkvYH$oD{qWGSj1$Swxr~{lXys9&sf?NAXeT-KlahTA z_U8Z9X#11<1P%VK4XUGslFej0W*Iu~3|lb78rSV&B-FMcC{OWxluli3+uER9qC@5Aa} z(t9W41aYF#0U|IoaE%R+mbMhsuoRRCjYvq4jnLFFq~)aL#O36eVvL#jVTQ0hnn5{G zgGezH%b|v#J)%K+Q0^qlIflqR_+U&y+Ckhw-a+4j#Dn;tG9k%PWQmre4IMtM&Toja zB2lu%dO*M+kpJ488RNGBgh9bj@I;&`hWwvC=RQbnNOW;c z8Xn&9I7%alhN37Vd>v7?=)QAHYTC$O1?QNr-0b6N;t7a!LGhCK5{|w|@A3OkMlCV> zkw%N?fkj%Zz4FG~e$6QT6*a*>V1wkDv-7depc_fQ(%F&XI z`%aj7Fi|_;BxT5FOU+!*7NPr?*MK-qL*|O9vO_8>@FaHJX$2nlM>vH}e4A#PVRjT6 z1*1961GVsDRZg+XahIm`9`$RsoZiIKY$a;|d5-q&lc+4KA!Zej1-uRuMI@YNpLtRPX!aifSVWG|fS2 z3MnUO^%Z@!NR8Cy`;h6L<1tb?Wftk$Q~6S5skMkbT=&ujcVOUG`cX~svYq};%#;HF zKTB9@v7u@t8h>{$fze{&2qSG12eIZ_PLrK;A*(^;*CrRDGUr-}SVVdc>SFUc2FE|_N}ayH z$YY_9EShM3=x5V>Fc!9$uCmjH6KkLVrlZE{IZj+>n60nMQk8QY_HDpOK6|V)uM905 zO5@d?zSrut#!i}!LUM29$eNsUtNf07u)%^A@kqY$*FD$_Z>=kAN$lM)($;4(HIuTi zs$JBxYVQuv!4uJ1tkOAow8b?sualfTb(fV;C;*^ZKs)Fvl#Ex43=UxbNTurojA&bx z2?U4U3bK6T%Mw=Tv$Jzz$s*6QAe)o2U@y(kyg`3$C;)ve zJ5B8w<;?7!bBJutiU#Y$oNdPEjD3<}C|rZXnl;vWsR^UL-(UvN6Vjs6vq#EXNRiID zg{Oz+^pLFXl=YQ*{}gL8V1yV0?xfVzWD}t(dd$4^Xu!YvchHjA1*T|aB958WA_TH( zrzKEF-C*S>npa8dugrsvpd`ZT`_6rJwNFd*hNE zE3-EM@cY4#ccWgaL0PS<5l9})=&ob|6Mt+PN_%JpHpR`A$)30Sx9`&fD#s{1+cPO% za^9_Tj|bvjOa;`{E-Y+4=#G+q@CXas#6zOHjQlirEUBy2j*;3%EKkyLw)&xKc?};7 zT|mF&vYsCx6W&WN3~|syXg!GspDJ7f5L6xOnIb^GbVfpm!Y*iZ)r>(e6XIkXlv4kO zhiwu9f7?UEeMNw8+zki-sLJ#_ARuv_ZwevbC?|TPr@VkOjI{+KBA{`2ctOZ`eNQEz z|6Th4kLi&*5+1Wgih~>*`;VRVH+8 zO_{rzIp;RgMIyt@)#R-PD3e+W%=Vro?E2Q~*+N4OGBDaKjp&sH04=8iI*o<#rxqao zS{D-B-6LIar+a_6>bnki59hl^TXw_GDqbPEWRdu*cgO@mek)8toIU zJBxB6-BJzm%nSRmfH}D~k!=&ApSf3!BtFI<>@9_fr96ccDNYo<+hJm6h>`2vPw!d%yrlEKveS1nB zR0UOA&|xz&?FP1_a`P<+2Z}ui-<+n9cAx_b_dc{iiheI#i+fZyEwUkXJc=2|-iXl+ zCo^{4CyAld7r-^Tp1(ETptRVR#+3db_8#4!zldS>VXKysGcIrR{SU@^ck!X>H@7u_ zWXOt@QcGq{WJ9x~L`sgl<2N3(pUWMTI#cYTJLK6U?&LhtJxzF>2ipr1TaYhh+`%Jx z9xQibdg50K8Qv0EPsqQzqXVP;;>HA>6F_BsCJX}NfB>1b31!bnxEOEm>uv!IhvydR zI`B&Pse^4}U(0m$^$($tiL$LJ7ZcuIDu`CUaCT@Zfj68O%#0=zh6 z4;pt*>i|O=$|q|rv&lZhKK3&d^vJoRP8K(O;!|e6OEu$}@M7-Dw%72=zmJc86G}YE z@a|r`KTN-=_5ZAqjr5zu=|lcKhy9a1)Oe^}jj9Wg_Ga^!cC|Z*Yyi6D*MJp8K_J9C zb$(V54UZ>Q9eAzmwKE1#iXQ0F9yEq}(YuzLypQGm0{$c|J_~wczuYg?T&^ghrQHhNRI)fR}63&@MB*UIKdOZ{`^`a#)KdxfKR+y93o8 zMa8>QV!|#m6Rb$9(~Z{Wl2yDdl=?F`J!^W)2kh{Rt@^VL?Hdna0={xM1#y-S?gSqZ zBY}F@-?cU&Um?53=K_DCn~<@Uaw2v3P#;+`zH&m$%%!fdeF^N)MA}6Ou(FN=YE`wW zTVZ?omG!CMm#?l>tt$Idy`Zig6mL>NiP4KUR^{Nr2o(7w}N-5^fKt+?Rqm+7JuK4^veJSe%sXee+f|O$MjHYnG z*P^7RGTBVp1bwxnOw(D|!28T3RxR=gBuRksr`NZ*4{SCswYb}K);RDUgUreyqe+&q zyOvZgRchB{8&D@b`>7YAN&-}JvFA*ap1(YICb8;~M|%9>NV&YANuETKbf8v<#bTD~ zdi+^JI*}r^1XbLcT5O&{s{gR16lawti|p`nMU67%&urBw=&c}?NtfIY^IPEaZHDAr zB*`lpDTrax8~Z_-dcoy<)jmdQav_)kiVh+0CtPP(u66q&L9l!!N+YpG2v&g zrTOZbZ$LPotCuC{d(Si&RAS&8T9$l8#eS2h%otr{n@eSe(o=ocm&bOH#;%cZ2Mk-pV#%Q zORg2501!*+yXKQ=z}$)?C3y}Y(F$Uy3hO|s`Rdr_U`C7zVi~Gf3>UnkjVW#=_B~o1 zmWd8Dxfyv`0|p;$e+7KiV;fRD;li1oKs5N|v%uNo{+F z6Ir@RnsTYqFh(6Nxk-sp4F}Gp37bKk!Mm0umkihp!?N9g=)sxIdqo?UxztmznH84Gd5H8lLJO<}lf}Fxr0t z^bJo94qwG53Vb0E_(~!GK_Z}lc`7zOkyxFG^cF9@kN3U)A_3OC}_ zF)VIToEO&_SzyQWnGvs>oHD_)KOV^KSQOXVAXaU~q;4)EbBn3sLH3zZoj;tn3oKHi zx3a4SK*nJOnBbgZ-;*X%5k{0#>? zprkf+kAFiNLtCma^?)-4?R!;PQgukn(CAH`*?-y7!E9o?%G>+@AXC3+{Pp zmXf`hk%;9N`SLm&NZDZ(#ntkiLLK%m6!z4cDXpCFy_QaF+PcB$ON9e-MuqO*0OF2# zm$`632aGhkX>-25ED*8rv@{|ws421V6};DvSK!Azp~pR9$2|jzMS4MRPs*0_^nD*b zq5EPt?mkSE^LaZ1aK{6&#{=T`yX5z~=J&hk_q*!%yN}ykBgB_fDz|`t=6|tKApL~@ z^2LGWe;toO_<^5J)PIzGM4)#3XZ6cZRYnCx2=NjQN+wOtGpv<3s)N^544i;40uqwg z&`4__QajB_OVYh!Vz4(Dzx#Bi3ZKskN-R}-^M1Q0&vd1`pOgg_f0l1~z_MCwtIDQHVKC6JO{zP_{mhJID(k`)$!a3 zcaf#1TWVU8-j{Go_E%HwdF8Prd?%B@4pyu}dej;>Y8jk%f3X|u^0mYOHhC|p84|v| zLEdI-CejXNVqv^gbIzcKXR1?mClIRet+FC4YI?E@$UxJIuX<))8`1!$lZj?-3Nvov zaj2)&op*|gn%B@@=8g0lwu3F_bnYoSt)LVFq7q9xsM(7JAlNskUCSxVu9iXOc+4pd zoTX@~>D*0%Rq%Gxu;zJu5yWQ$RzCdDh&0=B;xA86A>c#7g12)!ZRk z!xK_9*yr=MOm8>*eIGBIV~i+#C(3lQnA2f6uy*udMzjM%@+nC~KY6q$(zT9rIwHGP zz1Sz#)q!)r+$`nqdMvPZ?8G(k5^uKqD1oEcwL|hL@asm(T#0DMlw|7^k%QEUGVuln zJS%ybOth;&!X-sGE^xL)tYZuJn0*>B-~Uf#jR@_5Oz1PWWclBfwf|dT?Qfn@Yku9ymvyBudgY`(zc-m|01>(tIv2VZIQm&okPYYq7YUHf z#at?%%1mo%wZXJX~lFRZk`JRo#b`FCZL5v

    )!V=$_UZt{{6V9@vMD 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
  1. w!HDz;0j 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
    ;-sYQ73`oR}N0~OS*PEis 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
  2. gDUK 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%0D+^k=fh1O@7ze+0{-1%~}R$FHN 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 p1?KSy@V) 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 getCapacityByClusterPodZone(Long zoneId, Long podId, Long clusterId){ - return _capacityDao.findByClusterPodZone(zoneId,podId,clusterId); - } - - public static List findNonSharedStorageForClusterPodZone(Long zoneId, Long podId, Long clusterId){ - return _capacityDao.findNonSharedStorageForClusterPodZone(zoneId,podId,clusterId); - } - - public static List getCapacityByPod(){ - return null; - - } - - public static Long getPodIdForVlan(long vlanDbId) { - return _networkMgr.getPodIdForVlan(vlanDbId); - } - - public static String getVersion() { - return _ms.getVersion(); - } - - public static List searchForUserVMs(Criteria c, List permittedAccounts) { - return _userVmMgr.searchForUserVMs(c, _accountDao.findById(Account.ACCOUNT_ID_SYSTEM), null, false, permittedAccounts, false, null, null); - } - - public static List searchForStoragePools(Criteria c) { - return _ms.searchForStoragePools(c); - } - - // /////////////////////////////////////////////////////////// - // Manager methods // - // /////////////////////////////////////////////////////////// - - public static long findCorrectResourceLimit(ResourceType type, long accountId) { - AccountVO account = _accountDao.findById(accountId); - - if (account == null) { - return -1; - } - - return _resourceLimitMgr.findCorrectResourceLimitForAccount(account, type); - } - - public static AsyncJobVO findInstancePendingAsyncJob(String instanceType, long instanceId) { - return _asyncMgr.findInstancePendingAsyncJob(instanceType, instanceId); - } - - public static long getResourceCount(ResourceType type, long accountId) { - AccountVO account = _accountDao.findById(accountId); - - if (account == null) { - return -1; - } - - return _resourceLimitMgr.getResourceCount(account, type); - } - - public static String getSecurityGroupsNamesForVm(long vmId) { - return _securityGroupMgr.getSecurityGroupsNamesForVm(vmId); - } - - public static List getSecurityGroupsForVm(long vmId) { - return _securityGroupMgr.getSecurityGroupsForVm(vmId); - } - - public static String getSnapshotIntervalTypes(long snapshotId) { - SnapshotVO snapshot = _snapshotDao.findById(snapshotId); - return snapshot.getType().name(); - } - - public static String getStoragePoolTags(long poolId) { - return _storageMgr.getStoragePoolTags(poolId); - } - - public static boolean isLocalStorageActiveOnHost(Host host) { - return _storageMgr.isLocalStorageActiveOnHost(host); - } - - public static InstanceGroupVO findInstanceGroupForVM(long vmId) { - return _userVmMgr.getGroupForVm(vmId); - } - - // /////////////////////////////////////////////////////////// - // Misc methods // - // /////////////////////////////////////////////////////////// - - public static HostStats getHostStatistics(long hostId) { - return _statsCollector.getHostStats(hostId); - } - - public static StorageStats getStoragePoolStatistics(long id) { - return _statsCollector.getStoragePoolStats(id); - } - - public static VmStats getVmStatistics(long hostId) { - return _statsCollector.getVmStats(hostId); - } - - public static StorageStats getSecondaryStorageStatistics(long id) { - return _statsCollector.getStorageStats(id); - } - - public static CapacityVO getStoragePoolUsedStats(Long poolId, Long clusterId, Long podId, Long zoneId){ - return _storageMgr.getStoragePoolUsedStats(poolId, clusterId, podId, zoneId); - } - - public static CapacityVO getSecondaryStorageUsedStats(Long hostId, Long zoneId){ - return _storageMgr.getSecondaryStorageUsedStats(hostId, zoneId); - } - - // /////////////////////////////////////////////////////////// - // Dao methods // - // /////////////////////////////////////////////////////////// - - public static Account findAccountById(Long accountId) { - return _accountDao.findByIdIncludingRemoved(accountId); - } - - public static Account findAccountByIdIncludingRemoved(Long accountId) { - return _accountDao.findByIdIncludingRemoved(accountId); - } - - public static Account findAccountByNameDomain(String accountName, Long domainId) { - return _accountDao.findActiveAccount(accountName, domainId); - } - - public static ClusterVO findClusterById(long clusterId) { - return _clusterDao.findById(clusterId); - } - - public static DiskOfferingVO findDiskOfferingById(Long diskOfferingId) { - return _diskOfferingDao.findByIdIncludingRemoved(diskOfferingId); - } - - public static DomainVO findDomainById(Long domainId) { - return _domainDao.findByIdIncludingRemoved(domainId); - } - - public static DomainVO findDomainByIdIncludingRemoved(Long domainId) { - return _domainDao.findByIdIncludingRemoved(domainId); - } - - public static DomainRouterVO findDomainRouterById(Long routerId) { - return _domainRouterDao.findByIdIncludingRemoved(routerId); - } - - public static GuestOS findGuestOSById(Long id) { - return _guestOSDao.findByIdIncludingRemoved(id); - } - - public static GuestOS findGuestOSByDisplayName(String displayName) { - return _guestOSDao.listByDisplayName(displayName); - } - - public static HostVO findHostById(Long hostId) { - return _hostDao.findByIdIncludingRemoved(hostId); - } - - public static IPAddressVO findIpAddressById(long addressId) { - return _ipAddressDao.findById(addressId); - } - - public static GuestOSCategoryVO getHostGuestOSCategory(long hostId) { - Long guestOSCategoryID = _resourceMgr.getGuestOSCategoryId(hostId); - - if (guestOSCategoryID != null) { - return _guestOSCategoryDao.findById(guestOSCategoryID); - } else { - return null; - } - } - - public static String getHostTags(long hostId) { - return _resourceMgr.getHostTags(hostId); - } - - public static LoadBalancerVO findLoadBalancerById(Long loadBalancerId) { - return _loadBalancerDao.findById(loadBalancerId); - } - - public static NetworkRuleConfigVO findNetworkRuleById(Long ruleId) { - return _networkRuleConfigDao.findById(ruleId); - } - - public static SecurityGroup findSecurityGroupById(Long groupId) { - return _securityGroupDao.findById(groupId); - } - - public static HostPodVO findPodById(Long podId) { - return _podDao.findById(podId); - } - - public static VolumeVO findRootVolume(long vmId) { - List volumes = _volumeDao.findByInstanceAndType(vmId, Type.ROOT); - if (volumes != null && volumes.size() == 1) { - return volumes.get(0); - } else { - return null; - } - } - - public static ServiceOffering findServiceOfferingById(Long serviceOfferingId) { - return _serviceOfferingDao.findByIdIncludingRemoved(serviceOfferingId); - } - - public static Snapshot findSnapshotById(long snapshotId) { - SnapshotVO snapshot = _snapshotDao.findById(snapshotId); - if (snapshot != null && snapshot.getRemoved() == null && snapshot.getStatus() == Snapshot.Status.BackedUp) { - return snapshot; - } else { - return null; - } - } - - public static StoragePoolVO findStoragePoolById(Long storagePoolId) { - return _storagePoolDao.findByIdIncludingRemoved(storagePoolId); - } - - public static VMTemplateVO findTemplateById(Long templateId) { - VMTemplateVO template = _templateDao.findByIdIncludingRemoved(templateId); - if(template != null) { - Map details = _templateDetailsDao.findDetails(templateId); - if(details != null && !details.isEmpty()) - template.setDetails(details); - } - return template; - } - - public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId) { - return findTemplateHostRef(templateId, zoneId, false); - } - - public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId, boolean readyOnly) { - VMTemplateVO vmTemplate = findTemplateById(templateId); - if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) { - List res = _templateHostDao.listByTemplateId(templateId); - return res.size() == 0 ? null : res.get(0); - } else { - return _storageMgr.getTemplateHostRef(zoneId, templateId, readyOnly); - } - } - - - public static VolumeHostVO findVolumeHostRef(long volumeId, long zoneId) { - return _volumeHostDao.findVolumeByZone(volumeId, zoneId); - } - - public static VMTemplateSwiftVO findTemplateSwiftRef(long templateId) { - return _templateSwiftDao.findOneByTemplateId(templateId); - } - - public static UploadVO findUploadById(Long id) { - return _uploadDao.findById(id); - } - - public static User findUserById(Long userId) { - return _userDao.findById(userId); - } - - public static UserVm findUserVmById(Long vmId) { - return _userVmDao.findById(vmId); - } - - public static VlanVO findVlanById(long vlanDbId) { - return _vlanDao.findById(vlanDbId); - } - - public static VolumeVO findVolumeById(Long volumeId) { - return _volumeDao.findByIdIncludingRemoved(volumeId); - } - - public static Site2SiteVpnGatewayVO findVpnGatewayById(Long vpnGatewayId) { - return _site2SiteVpnGatewayDao.findById(vpnGatewayId); - } - - public static Site2SiteCustomerGatewayVO findCustomerGatewayById(Long customerGatewayId) { - return _site2SiteCustomerGatewayDao.findById(customerGatewayId); - } - - public static List listUsersByAccount(long accountId) { - return _userDao.listByAccount(accountId); - } - - public static DataCenterVO findZoneById(Long zoneId) { - return _zoneDao.findById(zoneId); - } - - public static Long getAccountIdForVlan(long vlanDbId) { - List accountVlanMaps = _accountVlanMapDao.listAccountVlanMapsByVlan(vlanDbId); - if (accountVlanMaps.isEmpty()) { - return null; - } else { - return accountVlanMaps.get(0).getAccountId(); - } - } - - public static HypervisorType getVolumeHyperType(long volumeId) { - return _volumeDao.getHypervisorType(volumeId); - } - - public static HypervisorType getHypervisorTypeFromFormat(ImageFormat format){ - return _storageMgr.getHypervisorTypeFromFormat(format); - } - - public static List listTemplateHostBy(long templateId, Long zoneId, boolean readyOnly) { - if (zoneId != null) { - VMTemplateVO vmTemplate = findTemplateById(templateId); - if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) { - return _templateHostDao.listByTemplateId(templateId); - } else { - return _templateHostDao.listByZoneTemplate(zoneId, templateId, readyOnly); - } - } else { - return _templateHostDao.listByOnlyTemplateId(templateId); - } - } - - public static List listUserStatsBy(Long accountId) { - return _userStatsDao.listBy(accountId); - } - - public static List listUserVMsByHostId(long hostId) { - return _userVmDao.listByHostId(hostId); - } - - public static List listZones() { - return _zoneDao.listAll(); - } - - public static boolean volumeIsOnSharedStorage(long volumeId) { - // Check that the volume is valid - VolumeVO volume = _volumeDao.findById(volumeId); - if (volume == null) { - throw new InvalidParameterValueException("Please specify a valid volume ID.", null); - } - - return _storageMgr.volumeOnSharedStoragePool(volume); - } - - public static List getNics(VirtualMachine vm) { - return _networkMgr.getNicProfiles(vm); - } - - public static NetworkProfile getNetworkProfile(long networkId) { - return _networkMgr.convertNetworkToNetworkProfile(networkId); - } - - public static NetworkOfferingVO findNetworkOfferingById(long networkOfferingId) { - return _networkOfferingDao.findByIdIncludingRemoved(networkOfferingId); - } - - public static List listVlanByNetworkId(long networkId) { - return _vlanDao.listVlansByNetworkId(networkId); - } - - public static NetworkVO findNetworkById(long id) { - return _networkDao.findById(id); - } - - public static Map> getNetworkCapabilities(long networkId, long zoneId) { - return _networkMgr.getNetworkCapabilities(networkId); - } - - public static long getPublicNetworkIdByZone(long zoneId) { - return _networkMgr.getSystemNetworkByZoneAndTrafficType(zoneId, TrafficType.Public).getId(); - } - - public static Long getVlanNetworkId(long vlanId) { - VlanVO vlan = _vlanDao.findById(vlanId); - if (vlan != null) { - return vlan.getNetworkId(); - } else { - return null; - } - } - - public static Integer getNetworkRate(long networkOfferingId) { - return _configMgr.getNetworkOfferingNetworkRate(networkOfferingId); - } - - public static Account getVlanAccount(long vlanId) { - return _configMgr.getVlanAccount(vlanId); - } - - public static boolean isSecurityGroupEnabledInZone(long zoneId) { - DataCenterVO dc = _zoneDao.findById(zoneId); - if (dc == null) { - return false; - } else { - return dc.isSecurityGroupEnabled(); - } - } - - public static Long getDedicatedNetworkDomain(long networkId) { - return _networkMgr.getDedicatedNetworkDomain(networkId); - } - - public static float getCpuOverprovisioningFactor() { - String opFactor = _configDao.getValue(Config.CPUOverprovisioningFactor.key()); - float cpuOverprovisioningFactor = NumbersUtil.parseFloat(opFactor, 1); - return cpuOverprovisioningFactor; - } - - public static boolean isExtractionDisabled(){ - String disableExtractionString = _configDao.getValue(Config.DisableExtraction.toString()); - boolean disableExtraction = (disableExtractionString == null) ? false : Boolean.parseBoolean(disableExtractionString); - return disableExtraction; - } - - public static SecurityGroup getSecurityGroup(String groupName, long ownerId) { - return _securityGroupMgr.getSecurityGroup(groupName, ownerId); - } - - public static ConsoleProxyVO findConsoleProxy(long id) { - return _consoleProxyDao.findById(id); - } - - public static List findFirewallSourceCidrs(long id){ - return _firewallCidrsDao.getSourceCidrs(id); - } - - public static Hashtable listVmDetails(Hashtable vmData){ - return _userVmDao.listVmDetails(vmData); - } - - public static Account getProjectOwner(long projectId) { - return _projectMgr.getProjectOwner(projectId); - } - - public static Project findProjectByProjectAccountId(long projectAccountId) { - return _projectMgr.findByProjectAccountId(projectAccountId); - } - - public static Project findProjectById(long projectId) { - return _projectMgr.getProject(projectId); - } - - public static long getProjectOwnwerId(long projectId) { - return _projectMgr.getProjectOwner(projectId).getId(); - } - - public static Map getAccountDetails(long accountId) { - Map details = _accountDetailsDao.findDetails(accountId); - return details.isEmpty() ? null : details; - } - - public static Map> listNetworkOfferingServices(long networkOfferingId) { - return _networkMgr.getNetworkOfferingServiceProvidersMap(networkOfferingId); - } - - public static List getElementServices(Provider provider) { - return _networkMgr.getElementServices(provider); - } - - public static List getProvidersForService(Service service) { - return _networkMgr.listSupportedNetworkServiceProviders(service.getName()); - } - - public static boolean canElementEnableIndividualServices(Provider serviceProvider) { - return _networkMgr.canElementEnableIndividualServices(serviceProvider); - } - - public static Pair getDomainNetworkDetails(long networkId) { - NetworkDomainVO map = _networkDomainDao.getDomainNetworkMapByNetworkId(networkId); - - boolean subdomainAccess = (map.isSubdomainAccess() != null) ? map.isSubdomainAccess() : _networkMgr.getAllowSubdomainAccessGlobal(); - - return new Pair(map.getDomainId(), subdomainAccess); - } - - public static long countFreePublicIps() { - return _ipAddressDao.countFreePublicIPs(); - } - - public static long findDefaultRouterServiceOffering() { - ServiceOfferingVO serviceOffering = _serviceOfferingDao.findByName(ServiceOffering.routerDefaultOffUniqueName); - return serviceOffering.getId(); - } - - public static IpAddress findIpByAssociatedVmId(long vmId) { - return _ipAddressDao.findByAssociatedVmId(vmId); - } - - public static String getHaTag() { - return _haMgr.getHaTag(); - } - - public static String getUuid(String resourceId, TaggedResourceType resourceType) { - return _taggedResourceService.getUuid(resourceId, resourceType); - } - - public static Map> listVpcOffServices(long vpcOffId) { - return _vpcMgr.getVpcOffSvcProvidersMap(vpcOffId); - } - - public static List listVpcNetworks(long vpcId) { - return _networkMgr.listNetworksByVpc(vpcId); - } - - public static boolean canUseForDeploy(Network network) { - return _networkMgr.canUseForDeploy(network); - } - - public static List listByResourceTypeAndId(TaggedResourceType type, long resourceId) { - return _taggedResourceService.listByResourceTypeAndId(type, resourceId); - } - - public static boolean isOfferingForVpc(NetworkOffering offering) { - boolean vpcProvider = _configMgr.isOfferingForVpc(offering); - return vpcProvider; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api; + +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.cloud.async.AsyncJobManager; +import com.cloud.async.AsyncJobVO; +import com.cloud.capacity.CapacityVO; +import com.cloud.capacity.dao.CapacityDao; +import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; +import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationService; +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.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Vlan; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.AccountVlanMapDao; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.ha.HighAvailabilityManager; +import com.cloud.host.Host; +import com.cloud.host.HostStats; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; +import com.cloud.network.LoadBalancerVO; +import com.cloud.network.Network; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.NetworkDomainVO; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkProfile; +import com.cloud.network.NetworkRuleConfigVO; +import com.cloud.network.NetworkVO; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.Site2SiteCustomerGatewayVO; +import com.cloud.network.Site2SiteVpnGatewayVO; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScalePolicyConditionMapVO; +import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO; +import com.cloud.network.as.CounterVO; +import com.cloud.network.as.ConditionVO; +import com.cloud.network.as.dao.AutoScalePolicyConditionMapDao; +import com.cloud.network.as.dao.AutoScalePolicyDao; +import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDao; +import com.cloud.network.as.dao.CounterDao; +import com.cloud.network.as.dao.ConditionDao; +import com.cloud.network.dao.FirewallRulesCidrsDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDomainDao; +import com.cloud.network.dao.NetworkRuleConfigDao; +import com.cloud.network.dao.Site2SiteCustomerGatewayDao; +import com.cloud.network.dao.Site2SiteVpnGatewayDao; +import com.cloud.network.security.SecurityGroup; +import com.cloud.network.security.SecurityGroupManager; +import com.cloud.network.security.SecurityGroupVO; +import com.cloud.network.security.dao.SecurityGroupDao; +import com.cloud.network.vpc.VpcManager; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.ServiceOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectService; +import com.cloud.resource.ResourceManager; +import com.cloud.server.Criteria; +import com.cloud.server.ManagementServer; +import com.cloud.server.ResourceTag; +import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.server.StatsCollector; +import com.cloud.server.TaggedResourceService; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.GuestOS; +import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.storage.Snapshot; +import com.cloud.storage.SnapshotVO; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageManager; +import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.StorageStats; +import com.cloud.storage.UploadVO; +import com.cloud.storage.VMTemplateHostVO; +import com.cloud.storage.VMTemplateSwiftVO; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume.Type; +import com.cloud.storage.VolumeHostVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.GuestOSCategoryDao; +import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.StoragePoolDao; +import com.cloud.storage.dao.UploadDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateDetailsDao; +import com.cloud.storage.dao.VMTemplateHostDao; +import com.cloud.storage.dao.VMTemplateSwiftDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeHostDao; +import com.cloud.user.Account; +import com.cloud.user.AccountDetailsDao; +import com.cloud.user.AccountVO; +import com.cloud.user.ResourceLimitService; +import com.cloud.user.User; +import com.cloud.user.UserStatisticsVO; +import com.cloud.user.UserVO; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.uservm.UserVm; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.vm.ConsoleProxyVO; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.InstanceGroupVO; +import com.cloud.vm.NicProfile; +import com.cloud.vm.UserVmManager; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VmStats; +import com.cloud.vm.dao.ConsoleProxyDao; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.UserVmDao; +import com.cloud.vm.dao.UserVmData; +import com.cloud.vm.dao.VMInstanceDao; + +public class ApiDBUtils { + private static ManagementServer _ms; + public static AsyncJobManager _asyncMgr; + private static SecurityGroupManager _securityGroupMgr; + private static StorageManager _storageMgr; + private static UserVmManager _userVmMgr; + private static NetworkManager _networkMgr; + private static StatsCollector _statsCollector; + + private static AccountDao _accountDao; + private static AccountVlanMapDao _accountVlanMapDao; + private static ClusterDao _clusterDao; + private static CapacityDao _capacityDao; + private static DiskOfferingDao _diskOfferingDao; + private static DomainDao _domainDao; + private static DomainRouterDao _domainRouterDao; + private static GuestOSDao _guestOSDao; + private static GuestOSCategoryDao _guestOSCategoryDao; + private static HostDao _hostDao; + private static IPAddressDao _ipAddressDao; + private static LoadBalancerDao _loadBalancerDao; + private static SecurityGroupDao _securityGroupDao; + private static NetworkRuleConfigDao _networkRuleConfigDao; + private static HostPodDao _podDao; + private static ServiceOfferingDao _serviceOfferingDao; + private static SnapshotDao _snapshotDao; + private static StoragePoolDao _storagePoolDao; + private static VMTemplateDao _templateDao; + private static VMTemplateDetailsDao _templateDetailsDao; + private static VMTemplateHostDao _templateHostDao; + private static VMTemplateSwiftDao _templateSwiftDao; + private static UploadDao _uploadDao; + private static UserDao _userDao; + private static UserStatisticsDao _userStatsDao; + private static UserVmDao _userVmDao; + private static VlanDao _vlanDao; + private static VolumeDao _volumeDao; + private static Site2SiteVpnGatewayDao _site2SiteVpnGatewayDao; + private static Site2SiteCustomerGatewayDao _site2SiteCustomerGatewayDao; + private static VolumeHostDao _volumeHostDao; + private static DataCenterDao _zoneDao; + private static NetworkOfferingDao _networkOfferingDao; + private static NetworkDao _networkDao; + private static ConfigurationService _configMgr; + private static ConfigurationDao _configDao; + private static ConsoleProxyDao _consoleProxyDao; + private static FirewallRulesCidrsDao _firewallCidrsDao; + private static VMInstanceDao _vmDao; + private static ResourceLimitService _resourceLimitMgr; + private static ProjectService _projectMgr; + private static ResourceManager _resourceMgr; + private static AccountDetailsDao _accountDetailsDao; + private static NetworkDomainDao _networkDomainDao; + private static HighAvailabilityManager _haMgr; + private static TaggedResourceService _taggedResourceService; + private static VpcManager _vpcMgr; + private static ConditionDao _asConditionDao; + private static AutoScalePolicyConditionMapDao _asPolicyConditionMapDao; + private static AutoScaleVmGroupPolicyMapDao _asVmGroupPolicyMapDao; + private static AutoScalePolicyDao _asPolicyDao; + private static CounterDao _counterDao; + + static { + _ms = (ManagementServer) ComponentLocator.getComponent(ManagementServer.Name); + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + _asyncMgr = locator.getManager(AsyncJobManager.class); + _securityGroupMgr = locator.getManager(SecurityGroupManager.class); + _storageMgr = locator.getManager(StorageManager.class); + _userVmMgr = locator.getManager(UserVmManager.class); + _networkMgr = locator.getManager(NetworkManager.class); + _configMgr = locator.getManager(ConfigurationService.class); + + _accountDao = locator.getDao(AccountDao.class); + _accountVlanMapDao = locator.getDao(AccountVlanMapDao.class); + _clusterDao = locator.getDao(ClusterDao.class); + _capacityDao = locator.getDao(CapacityDao.class); + _diskOfferingDao = locator.getDao(DiskOfferingDao.class); + _domainDao = locator.getDao(DomainDao.class); + _domainRouterDao = locator.getDao(DomainRouterDao.class); + _guestOSDao = locator.getDao(GuestOSDao.class); + _guestOSCategoryDao = locator.getDao(GuestOSCategoryDao.class); + _hostDao = locator.getDao(HostDao.class); + _ipAddressDao = locator.getDao(IPAddressDao.class); + _loadBalancerDao = locator.getDao(LoadBalancerDao.class); + _networkRuleConfigDao = locator.getDao(NetworkRuleConfigDao.class); + _podDao = locator.getDao(HostPodDao.class); + _serviceOfferingDao = locator.getDao(ServiceOfferingDao.class); + _snapshotDao = locator.getDao(SnapshotDao.class); + _storagePoolDao = locator.getDao(StoragePoolDao.class); + _templateDao = locator.getDao(VMTemplateDao.class); + _templateDetailsDao = locator.getDao(VMTemplateDetailsDao.class); + _templateHostDao = locator.getDao(VMTemplateHostDao.class); + _templateSwiftDao = locator.getDao(VMTemplateSwiftDao.class); + _uploadDao = locator.getDao(UploadDao.class); + _userDao = locator.getDao(UserDao.class); + _userStatsDao = locator.getDao(UserStatisticsDao.class); + _userVmDao = locator.getDao(UserVmDao.class); + _vlanDao = locator.getDao(VlanDao.class); + _volumeDao = locator.getDao(VolumeDao.class); + _site2SiteVpnGatewayDao = locator.getDao(Site2SiteVpnGatewayDao.class); + _site2SiteCustomerGatewayDao = locator.getDao(Site2SiteCustomerGatewayDao.class); + _volumeHostDao = locator.getDao(VolumeHostDao.class); + _zoneDao = locator.getDao(DataCenterDao.class); + _securityGroupDao = locator.getDao(SecurityGroupDao.class); + _networkOfferingDao = locator.getDao(NetworkOfferingDao.class); + _networkDao = locator.getDao(NetworkDao.class); + _configDao = locator.getDao(ConfigurationDao.class); + _consoleProxyDao = locator.getDao(ConsoleProxyDao.class); + _firewallCidrsDao = locator.getDao(FirewallRulesCidrsDao.class); + _vmDao = locator.getDao(VMInstanceDao.class); + _resourceLimitMgr = locator.getManager(ResourceLimitService.class); + _projectMgr = locator.getManager(ProjectService.class); + _resourceMgr = locator.getManager(ResourceManager.class); + _accountDetailsDao = locator.getDao(AccountDetailsDao.class); + _networkDomainDao = locator.getDao(NetworkDomainDao.class); + _haMgr = locator.getManager(HighAvailabilityManager.class); + _taggedResourceService = locator.getManager(TaggedResourceService.class); + _vpcMgr = locator.getManager(VpcManager.class); + _asConditionDao = locator.getDao(ConditionDao.class); + _asPolicyDao = locator.getDao(AutoScalePolicyDao.class); + _asPolicyConditionMapDao = locator.getDao(AutoScalePolicyConditionMapDao.class); + _counterDao = locator.getDao(CounterDao.class); + _asVmGroupPolicyMapDao = locator.getDao(AutoScaleVmGroupPolicyMapDao.class); + _asVmGroupPolicyMapDao = locator.getDao(AutoScaleVmGroupPolicyMapDao.class); + _counterDao = locator.getDao(CounterDao.class); + + // Note: stats collector should already have been initialized by this time, otherwise a null instance is + // returned + _statsCollector = StatsCollector.getInstance(); + } + + // /////////////////////////////////////////////////////////// + // ManagementServer methods // + // /////////////////////////////////////////////////////////// + + public static VMInstanceVO findVMInstanceById(long vmId) { + return _vmDao.findById(vmId); + } + + public static long getMemoryOrCpuCapacitybyHost(Long hostId, short capacityType) { + // TODO: This method is for the API only, but it has configuration values (ramSize for system vms) + // so if this Utils class can have some kind of config rather than a static initializer (maybe from + // management server instantiation?) then maybe the management server method can be moved entirely + // into this utils class. + return _ms.getMemoryOrCpuCapacityByHost(hostId,capacityType); + } + + public static long getStorageCapacitybyPool(Long poolId, short capacityType) { + // TODO: This method is for the API only, but it has configuration values (ramSize for system vms) + // so if this Utils class can have some kind of config rather than a static initializer (maybe from + // management server instantiation?) then maybe the management server method can be moved entirely + // into this utils class. + return _ms.getMemoryOrCpuCapacityByHost(poolId, capacityType); + } + + public static List getCapacityByClusterPodZone(Long zoneId, Long podId, Long clusterId){ + return _capacityDao.findByClusterPodZone(zoneId,podId,clusterId); + } + + public static List findNonSharedStorageForClusterPodZone(Long zoneId, Long podId, Long clusterId){ + return _capacityDao.findNonSharedStorageForClusterPodZone(zoneId,podId,clusterId); + } + + public static List getCapacityByPod(){ + return null; + + } + + public static Long getPodIdForVlan(long vlanDbId) { + return _networkMgr.getPodIdForVlan(vlanDbId); + } + + public static String getVersion() { + return _ms.getVersion(); + } + + public static List searchForUserVMs(Criteria c, List permittedAccounts) { + return _userVmMgr.searchForUserVMs(c, _accountDao.findById(Account.ACCOUNT_ID_SYSTEM), null, false, permittedAccounts, false, null, null); + } + + public static List searchForStoragePools(Criteria c) { + return _ms.searchForStoragePools(c); + } + + // /////////////////////////////////////////////////////////// + // Manager methods // + // /////////////////////////////////////////////////////////// + + public static long findCorrectResourceLimit(ResourceType type, long accountId) { + AccountVO account = _accountDao.findById(accountId); + + if (account == null) { + return -1; + } + + return _resourceLimitMgr.findCorrectResourceLimitForAccount(account, type); + } + + public static AsyncJobVO findInstancePendingAsyncJob(String instanceType, long instanceId) { + return _asyncMgr.findInstancePendingAsyncJob(instanceType, instanceId); + } + + public static long getResourceCount(ResourceType type, long accountId) { + AccountVO account = _accountDao.findById(accountId); + + if (account == null) { + return -1; + } + + return _resourceLimitMgr.getResourceCount(account, type); + } + + public static String getSecurityGroupsNamesForVm(long vmId) { + return _securityGroupMgr.getSecurityGroupsNamesForVm(vmId); + } + + public static List getSecurityGroupsForVm(long vmId) { + return _securityGroupMgr.getSecurityGroupsForVm(vmId); + } + + public static String getSnapshotIntervalTypes(long snapshotId) { + SnapshotVO snapshot = _snapshotDao.findById(snapshotId); + return snapshot.getType().name(); + } + + public static String getStoragePoolTags(long poolId) { + return _storageMgr.getStoragePoolTags(poolId); + } + + public static boolean isLocalStorageActiveOnHost(Host host) { + return _storageMgr.isLocalStorageActiveOnHost(host); + } + + public static InstanceGroupVO findInstanceGroupForVM(long vmId) { + return _userVmMgr.getGroupForVm(vmId); + } + + // /////////////////////////////////////////////////////////// + // Misc methods // + // /////////////////////////////////////////////////////////// + + public static HostStats getHostStatistics(long hostId) { + return _statsCollector.getHostStats(hostId); + } + + public static StorageStats getStoragePoolStatistics(long id) { + return _statsCollector.getStoragePoolStats(id); + } + + public static VmStats getVmStatistics(long hostId) { + return _statsCollector.getVmStats(hostId); + } + + public static StorageStats getSecondaryStorageStatistics(long id) { + return _statsCollector.getStorageStats(id); + } + + public static CapacityVO getStoragePoolUsedStats(Long poolId, Long clusterId, Long podId, Long zoneId){ + return _storageMgr.getStoragePoolUsedStats(poolId, clusterId, podId, zoneId); + } + + public static CapacityVO getSecondaryStorageUsedStats(Long hostId, Long zoneId){ + return _storageMgr.getSecondaryStorageUsedStats(hostId, zoneId); + } + + // /////////////////////////////////////////////////////////// + // Dao methods // + // /////////////////////////////////////////////////////////// + + public static Account findAccountById(Long accountId) { + return _accountDao.findByIdIncludingRemoved(accountId); + } + + public static Account findAccountByIdIncludingRemoved(Long accountId) { + return _accountDao.findByIdIncludingRemoved(accountId); + } + + public static Account findAccountByNameDomain(String accountName, Long domainId) { + return _accountDao.findActiveAccount(accountName, domainId); + } + + public static ClusterVO findClusterById(long clusterId) { + return _clusterDao.findById(clusterId); + } + + public static DiskOfferingVO findDiskOfferingById(Long diskOfferingId) { + return _diskOfferingDao.findByIdIncludingRemoved(diskOfferingId); + } + + public static DomainVO findDomainById(Long domainId) { + return _domainDao.findByIdIncludingRemoved(domainId); + } + + public static DomainVO findDomainByIdIncludingRemoved(Long domainId) { + return _domainDao.findByIdIncludingRemoved(domainId); + } + + public static DomainRouterVO findDomainRouterById(Long routerId) { + return _domainRouterDao.findByIdIncludingRemoved(routerId); + } + + public static GuestOS findGuestOSById(Long id) { + return _guestOSDao.findByIdIncludingRemoved(id); + } + + public static GuestOS findGuestOSByDisplayName(String displayName) { + return _guestOSDao.listByDisplayName(displayName); + } + + public static HostVO findHostById(Long hostId) { + return _hostDao.findByIdIncludingRemoved(hostId); + } + + public static IPAddressVO findIpAddressById(long addressId) { + return _ipAddressDao.findById(addressId); + } + + public static GuestOSCategoryVO getHostGuestOSCategory(long hostId) { + Long guestOSCategoryID = _resourceMgr.getGuestOSCategoryId(hostId); + + if (guestOSCategoryID != null) { + return _guestOSCategoryDao.findById(guestOSCategoryID); + } else { + return null; + } + } + + public static String getHostTags(long hostId) { + return _resourceMgr.getHostTags(hostId); + } + + public static LoadBalancerVO findLoadBalancerById(Long loadBalancerId) { + return _loadBalancerDao.findById(loadBalancerId); + } + + public static NetworkRuleConfigVO findNetworkRuleById(Long ruleId) { + return _networkRuleConfigDao.findById(ruleId); + } + + public static SecurityGroup findSecurityGroupById(Long groupId) { + return _securityGroupDao.findById(groupId); + } + + public static HostPodVO findPodById(Long podId) { + return _podDao.findById(podId); + } + + public static VolumeVO findRootVolume(long vmId) { + List volumes = _volumeDao.findByInstanceAndType(vmId, Type.ROOT); + if (volumes != null && volumes.size() == 1) { + return volumes.get(0); + } else { + return null; + } + } + + public static ServiceOffering findServiceOfferingById(Long serviceOfferingId) { + return _serviceOfferingDao.findByIdIncludingRemoved(serviceOfferingId); + } + + public static Snapshot findSnapshotById(long snapshotId) { + SnapshotVO snapshot = _snapshotDao.findById(snapshotId); + if (snapshot != null && snapshot.getRemoved() == null && snapshot.getStatus() == Snapshot.Status.BackedUp) { + return snapshot; + } else { + return null; + } + } + + public static StoragePoolVO findStoragePoolById(Long storagePoolId) { + return _storagePoolDao.findByIdIncludingRemoved(storagePoolId); + } + + public static VMTemplateVO findTemplateById(Long templateId) { + VMTemplateVO template = _templateDao.findByIdIncludingRemoved(templateId); + if(template != null) { + Map details = _templateDetailsDao.findDetails(templateId); + if(details != null && !details.isEmpty()) + template.setDetails(details); + } + return template; + } + + public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId) { + return findTemplateHostRef(templateId, zoneId, false); + } + + public static VMTemplateHostVO findTemplateHostRef(long templateId, long zoneId, boolean readyOnly) { + VMTemplateVO vmTemplate = findTemplateById(templateId); + if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) { + List res = _templateHostDao.listByTemplateId(templateId); + return res.size() == 0 ? null : res.get(0); + } else { + return _storageMgr.getTemplateHostRef(zoneId, templateId, readyOnly); + } + } + + public static VolumeHostVO findVolumeHostRef(long volumeId, long zoneId) { + return _volumeHostDao.findVolumeByZone(volumeId, zoneId); + } + + public static VMTemplateSwiftVO findTemplateSwiftRef(long templateId) { + return _templateSwiftDao.findOneByTemplateId(templateId); + } + + public static UploadVO findUploadById(Long id) { + return _uploadDao.findById(id); + } + + public static User findUserById(Long userId) { + return _userDao.findById(userId); + } + + public static UserVm findUserVmById(Long vmId) { + return _userVmDao.findById(vmId); + } + + public static VlanVO findVlanById(long vlanDbId) { + return _vlanDao.findById(vlanDbId); + } + + public static VolumeVO findVolumeById(Long volumeId) { + return _volumeDao.findByIdIncludingRemoved(volumeId); + } + + public static Site2SiteVpnGatewayVO findVpnGatewayById(Long vpnGatewayId) { + return _site2SiteVpnGatewayDao.findById(vpnGatewayId); + } + + public static Site2SiteCustomerGatewayVO findCustomerGatewayById(Long customerGatewayId) { + return _site2SiteCustomerGatewayDao.findById(customerGatewayId); + } + + public static List listUsersByAccount(long accountId) { + return _userDao.listByAccount(accountId); + } + + public static DataCenterVO findZoneById(Long zoneId) { + return _zoneDao.findById(zoneId); + } + + public static Long getAccountIdForVlan(long vlanDbId) { + List accountVlanMaps = _accountVlanMapDao.listAccountVlanMapsByVlan(vlanDbId); + if (accountVlanMaps.isEmpty()) { + return null; + } else { + return accountVlanMaps.get(0).getAccountId(); + } + } + + public static HypervisorType getVolumeHyperType(long volumeId) { + return _volumeDao.getHypervisorType(volumeId); + } + + public static HypervisorType getHypervisorTypeFromFormat(ImageFormat format){ + return _storageMgr.getHypervisorTypeFromFormat(format); + } + + public static List listTemplateHostBy(long templateId, Long zoneId, boolean readyOnly) { + if (zoneId != null) { + VMTemplateVO vmTemplate = findTemplateById(templateId); + if (vmTemplate.getHypervisorType() == HypervisorType.BareMetal) { + return _templateHostDao.listByTemplateId(templateId); + } else { + return _templateHostDao.listByZoneTemplate(zoneId, templateId, readyOnly); + } + } else { + return _templateHostDao.listByOnlyTemplateId(templateId); + } + } + + public static List listUserStatsBy(Long accountId) { + return _userStatsDao.listBy(accountId); + } + + public static List listUserVMsByHostId(long hostId) { + return _userVmDao.listByHostId(hostId); + } + + public static List listZones() { + return _zoneDao.listAll(); + } + + public static boolean volumeIsOnSharedStorage(long volumeId) { + // Check that the volume is valid + VolumeVO volume = _volumeDao.findById(volumeId); + if (volume == null) { + throw new InvalidParameterValueException("Please specify a valid volume ID.", null); + } + + return _storageMgr.volumeOnSharedStoragePool(volume); + } + + public static List getNics(VirtualMachine vm) { + return _networkMgr.getNicProfiles(vm); + } + + public static NetworkProfile getNetworkProfile(long networkId) { + return _networkMgr.convertNetworkToNetworkProfile(networkId); + } + + public static NetworkOfferingVO findNetworkOfferingById(long networkOfferingId) { + return _networkOfferingDao.findByIdIncludingRemoved(networkOfferingId); + } + + public static List listVlanByNetworkId(long networkId) { + return _vlanDao.listVlansByNetworkId(networkId); + } + + public static NetworkVO findNetworkById(long id) { + return _networkDao.findById(id); + } + + public static Map> getNetworkCapabilities(long networkId, long zoneId) { + return _networkMgr.getNetworkCapabilities(networkId); + } + + public static long getPublicNetworkIdByZone(long zoneId) { + return _networkMgr.getSystemNetworkByZoneAndTrafficType(zoneId, TrafficType.Public).getId(); + } + + public static Long getVlanNetworkId(long vlanId) { + VlanVO vlan = _vlanDao.findById(vlanId); + if (vlan != null) { + return vlan.getNetworkId(); + } else { + return null; + } + } + + public static Integer getNetworkRate(long networkOfferingId) { + return _configMgr.getNetworkOfferingNetworkRate(networkOfferingId); + } + + public static Account getVlanAccount(long vlanId) { + return _configMgr.getVlanAccount(vlanId); + } + + public static boolean isSecurityGroupEnabledInZone(long zoneId) { + DataCenterVO dc = _zoneDao.findById(zoneId); + if (dc == null) { + return false; + } else { + return dc.isSecurityGroupEnabled(); + } + } + + public static Long getDedicatedNetworkDomain(long networkId) { + return _networkMgr.getDedicatedNetworkDomain(networkId); + } + + public static float getCpuOverprovisioningFactor() { + String opFactor = _configDao.getValue(Config.CPUOverprovisioningFactor.key()); + float cpuOverprovisioningFactor = NumbersUtil.parseFloat(opFactor, 1); + return cpuOverprovisioningFactor; + } + + public static boolean isExtractionDisabled(){ + String disableExtractionString = _configDao.getValue(Config.DisableExtraction.toString()); + boolean disableExtraction = (disableExtractionString == null) ? false : Boolean.parseBoolean(disableExtractionString); + return disableExtraction; + } + + public static SecurityGroup getSecurityGroup(String groupName, long ownerId) { + return _securityGroupMgr.getSecurityGroup(groupName, ownerId); + } + + public static ConsoleProxyVO findConsoleProxy(long id) { + return _consoleProxyDao.findById(id); + } + + public static List findFirewallSourceCidrs(long id){ + return _firewallCidrsDao.getSourceCidrs(id); + } + + public static Hashtable listVmDetails(Hashtable vmData){ + return _userVmDao.listVmDetails(vmData); + } + + public static Account getProjectOwner(long projectId) { + return _projectMgr.getProjectOwner(projectId); + } + + public static Project findProjectByProjectAccountId(long projectAccountId) { + return _projectMgr.findByProjectAccountId(projectAccountId); + } + + public static Project findProjectById(long projectId) { + return _projectMgr.getProject(projectId); + } + + public static long getProjectOwnwerId(long projectId) { + return _projectMgr.getProjectOwner(projectId).getId(); + } + + public static Map getAccountDetails(long accountId) { + Map details = _accountDetailsDao.findDetails(accountId); + return details.isEmpty() ? null : details; + } + + public static Map> listNetworkOfferingServices(long networkOfferingId) { + return _networkMgr.getNetworkOfferingServiceProvidersMap(networkOfferingId); + } + + public static List getElementServices(Provider provider) { + return _networkMgr.getElementServices(provider); + } + + public static List getProvidersForService(Service service) { + return _networkMgr.listSupportedNetworkServiceProviders(service.getName()); + } + + public static boolean canElementEnableIndividualServices(Provider serviceProvider) { + return _networkMgr.canElementEnableIndividualServices(serviceProvider); + } + + public static Pair getDomainNetworkDetails(long networkId) { + NetworkDomainVO map = _networkDomainDao.getDomainNetworkMapByNetworkId(networkId); + + boolean subdomainAccess = (map.isSubdomainAccess() != null) ? map.isSubdomainAccess() : _networkMgr.getAllowSubdomainAccessGlobal(); + + return new Pair(map.getDomainId(), subdomainAccess); + } + + public static long countFreePublicIps() { + return _ipAddressDao.countFreePublicIPs(); + } + + public static long findDefaultRouterServiceOffering() { + ServiceOfferingVO serviceOffering = _serviceOfferingDao.findByName(ServiceOffering.routerDefaultOffUniqueName); + return serviceOffering.getId(); + } + + public static IpAddress findIpByAssociatedVmId(long vmId) { + return _ipAddressDao.findByAssociatedVmId(vmId); + } + + public static String getHaTag() { + return _haMgr.getHaTag(); + } + + public static String getUuid(String resourceId, TaggedResourceType resourceType) { + return _taggedResourceService.getUuid(resourceId, resourceType); + } + + public static Map> listVpcOffServices(long vpcOffId) { + return _vpcMgr.getVpcOffSvcProvidersMap(vpcOffId); + } + + public static List listVpcNetworks(long vpcId) { + return _networkMgr.listNetworksByVpc(vpcId); + } + + public static boolean canUseForDeploy(Network network) { + return _networkMgr.canUseForDeploy(network); + } + + public static List getAutoScalePolicyConditions(long policyId) + { + List vos = _asPolicyConditionMapDao.listByAll(policyId, null); + ArrayList conditions = new ArrayList(vos.size()); + for (AutoScalePolicyConditionMapVO vo : vos) { + conditions.add(_asConditionDao.findById(vo.getConditionId())); + } + + return conditions; + } + + public static List listByResourceTypeAndId(TaggedResourceType type, long resourceId) { + return _taggedResourceService.listByResourceTypeAndId(type, resourceId); + } + + public static boolean isOfferingForVpc(NetworkOffering offering) { + boolean vpcProvider = _configMgr.isOfferingForVpc(offering); + return vpcProvider; + } + + public static void getAutoScaleVmGroupPolicies(long vmGroupId, List scaleUpPolicies, List scaleDownPolicies) + { + List vos = _asVmGroupPolicyMapDao.listByVmGroupId(vmGroupId); + for (AutoScaleVmGroupPolicyMapVO vo : vos) { + AutoScalePolicy autoScalePolicy = _asPolicyDao.findById(vo.getPolicyId()); + if(autoScalePolicy.getAction().equals("scaleup")) + scaleUpPolicies.add(autoScalePolicy); + else + scaleDownPolicies.add(autoScalePolicy); + } + } + + public static CounterVO getCounter(long counterId) { + return _counterDao.findById(counterId); + } +} diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index d7fc489e8fa..d63732c8410 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -1,3872 +1,4030 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.api; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; - -import org.apache.log4j.Logger; - -import com.cloud.acl.ControlledEntity; -import com.cloud.acl.ControlledEntity.ACLType; -import com.cloud.api.ApiConstants.HostDetails; -import com.cloud.api.ApiConstants.VMDetails; -import com.cloud.api.commands.QueryAsyncJobResultCmd; -import com.cloud.api.response.AccountResponse; -import com.cloud.api.response.ApiResponseSerializer; -import com.cloud.api.response.AsyncJobResponse; -import com.cloud.api.response.CapabilityResponse; -import com.cloud.api.response.CapacityResponse; -import com.cloud.api.response.ClusterResponse; -import com.cloud.api.response.ConfigurationResponse; -import com.cloud.api.response.ControlledEntityResponse; -import com.cloud.api.response.CreateCmdResponse; -import com.cloud.api.response.DiskOfferingResponse; -import com.cloud.api.response.DomainResponse; -import com.cloud.api.response.DomainRouterResponse; -import com.cloud.api.response.EventResponse; -import com.cloud.api.response.ExtractResponse; -import com.cloud.api.response.FirewallResponse; -import com.cloud.api.response.FirewallRuleResponse; -import com.cloud.api.response.HostResponse; -import com.cloud.api.response.HypervisorCapabilitiesResponse; -import com.cloud.api.response.IPAddressResponse; -import com.cloud.api.response.InstanceGroupResponse; -import com.cloud.api.response.IpForwardingRuleResponse; -import com.cloud.api.response.LBStickinessPolicyResponse; -import com.cloud.api.response.LBStickinessResponse; -import com.cloud.api.response.LDAPConfigResponse; -import com.cloud.api.response.ListResponse; -import com.cloud.api.response.LoadBalancerResponse; -import com.cloud.api.response.NetworkACLResponse; -import com.cloud.api.response.NetworkOfferingResponse; -import com.cloud.api.response.NetworkResponse; -import com.cloud.api.response.NicResponse; -import com.cloud.api.response.PhysicalNetworkResponse; -import com.cloud.api.response.PodResponse; -import com.cloud.api.response.PrivateGatewayResponse; -import com.cloud.api.response.ProjectAccountResponse; -import com.cloud.api.response.ProjectInvitationResponse; -import com.cloud.api.response.ProjectResponse; -import com.cloud.api.response.ProviderResponse; -import com.cloud.api.response.RemoteAccessVpnResponse; -import com.cloud.api.response.ResourceCountResponse; -import com.cloud.api.response.ResourceLimitResponse; -import com.cloud.api.response.ResourceTagResponse; -import com.cloud.api.response.SecurityGroupResponse; -import com.cloud.api.response.SecurityGroupResultObject; -import com.cloud.api.response.SecurityGroupRuleResponse; -import com.cloud.api.response.SecurityGroupRuleResultObject; -import com.cloud.api.response.ServiceOfferingResponse; -import com.cloud.api.response.ServiceResponse; -import com.cloud.api.response.Site2SiteCustomerGatewayResponse; -import com.cloud.api.response.Site2SiteVpnConnectionResponse; -import com.cloud.api.response.Site2SiteVpnGatewayResponse; -import com.cloud.api.response.SnapshotPolicyResponse; -import com.cloud.api.response.SnapshotResponse; -import com.cloud.api.response.StaticRouteResponse; -import com.cloud.api.response.StorageNetworkIpRangeResponse; -import com.cloud.api.response.StoragePoolResponse; -import com.cloud.api.response.SwiftResponse; -import com.cloud.api.response.SystemVmInstanceResponse; -import com.cloud.api.response.SystemVmResponse; -import com.cloud.api.response.TemplatePermissionsResponse; -import com.cloud.api.response.TemplateResponse; -import com.cloud.api.response.TrafficTypeResponse; -import com.cloud.api.response.UserResponse; -import com.cloud.api.response.UserVmResponse; -import com.cloud.api.response.VirtualRouterProviderResponse; -import com.cloud.api.response.VlanIpRangeResponse; -import com.cloud.api.response.VolumeResponse; -import com.cloud.api.response.VpcOfferingResponse; -import com.cloud.api.response.VpcResponse; -import com.cloud.api.response.VpnUsersResponse; -import com.cloud.api.response.ZoneResponse; -import com.cloud.async.AsyncJob; -import com.cloud.capacity.Capacity; -import com.cloud.capacity.CapacityVO; -import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; -import com.cloud.configuration.Configuration; -import com.cloud.configuration.Resource.ResourceOwnerType; -import com.cloud.configuration.Resource.ResourceType; -import com.cloud.configuration.ResourceCount; -import com.cloud.configuration.ResourceLimit; -import com.cloud.dc.ClusterVO; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; -import com.cloud.dc.Pod; -import com.cloud.dc.StorageNetworkIpRange; -import com.cloud.dc.Vlan; -import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.VlanVO; -import com.cloud.domain.Domain; -import com.cloud.event.Event; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.host.Host; -import com.cloud.host.HostStats; -import com.cloud.host.HostVO; -import com.cloud.hypervisor.HypervisorCapabilities; -import com.cloud.network.IPAddressVO; -import com.cloud.network.IpAddress; -import com.cloud.network.Network; -import com.cloud.network.Network.Capability; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.network.NetworkProfile; -import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PhysicalNetwork; -import com.cloud.network.PhysicalNetworkServiceProvider; -import com.cloud.network.PhysicalNetworkTrafficType; -import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.Site2SiteCustomerGateway; -import com.cloud.network.Site2SiteCustomerGatewayVO; -import com.cloud.network.Site2SiteVpnConnection; -import com.cloud.network.Site2SiteVpnGateway; -import com.cloud.network.Site2SiteVpnGatewayVO; -import com.cloud.network.VirtualRouterProvider; -import com.cloud.network.VpnUser; -import com.cloud.network.router.VirtualRouter; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.LoadBalancer; -import com.cloud.network.rules.PortForwardingRule; -import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.StickinessPolicy; -import com.cloud.network.security.SecurityGroup; -import com.cloud.network.security.SecurityGroupRules; -import com.cloud.network.security.SecurityGroupVO; -import com.cloud.network.security.SecurityRule; -import com.cloud.network.security.SecurityRule.SecurityRuleType; -import com.cloud.network.vpc.PrivateGateway; -import com.cloud.network.vpc.StaticRoute; -import com.cloud.network.vpc.Vpc; -import com.cloud.network.vpc.VpcOffering; -import com.cloud.offering.DiskOffering; -import com.cloud.offering.NetworkOffering; -import com.cloud.offering.ServiceOffering; -import com.cloud.org.Cluster; -import com.cloud.projects.Project; -import com.cloud.projects.ProjectAccount; -import com.cloud.projects.ProjectInvitation; -import com.cloud.server.Criteria; -import com.cloud.server.ResourceTag; -import com.cloud.server.ResourceTag.TaggedResourceType; -import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.GuestOS; -import com.cloud.storage.GuestOSCategoryVO; -import com.cloud.storage.Snapshot; -import com.cloud.storage.Storage; -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.Storage.StoragePoolType; -import com.cloud.storage.Storage.TemplateType; -import com.cloud.storage.StoragePool; -import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.StorageStats; -import com.cloud.storage.Swift; -import com.cloud.storage.UploadVO; -import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.storage.VMTemplateSwiftVO; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Volume; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.snapshot.SnapshotPolicy; -import com.cloud.template.VirtualMachineTemplate; -import com.cloud.test.PodZoneConfig; -import com.cloud.user.Account; -import com.cloud.user.User; -import com.cloud.user.UserAccount; -import com.cloud.user.UserContext; -import com.cloud.user.UserStatisticsVO; -import com.cloud.user.UserVO; -import com.cloud.uservm.UserVm; -import com.cloud.utils.Pair; -import com.cloud.utils.StringUtils; -import com.cloud.utils.net.NetUtils; -import com.cloud.vm.ConsoleProxyVO; -import com.cloud.vm.InstanceGroup; -import com.cloud.vm.InstanceGroupVO; -import com.cloud.vm.NicProfile; -import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.VirtualMachine.Type; -import com.cloud.vm.VmStats; -import com.cloud.vm.dao.UserVmData; -import com.cloud.vm.dao.UserVmData.NicData; -import com.cloud.vm.dao.UserVmData.SecurityGroupData; - -public class ApiResponseHelper implements ResponseGenerator { - - public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class); - private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##"); - - @Override - public UserResponse createUserResponse(User user) { - UserResponse userResponse = new UserResponse(); - Account account = ApiDBUtils.findAccountById(user.getAccountId()); - userResponse.setAccountName(account.getAccountName()); - userResponse.setAccountType(account.getType()); - userResponse.setCreated(user.getCreated()); - userResponse.setDomainId(account.getDomainId()); - userResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); - userResponse.setEmail(user.getEmail()); - userResponse.setFirstname(user.getFirstname()); - userResponse.setId(user.getId()); - userResponse.setLastname(user.getLastname()); - userResponse.setState(user.getState().toString()); - userResponse.setTimezone(user.getTimezone()); - userResponse.setUsername(user.getUsername()); - userResponse.setApiKey(user.getApiKey()); - userResponse.setSecretKey(user.getSecretKey()); - userResponse.setObjectName("user"); - - return userResponse; - } - - // this method is used for response generation via createAccount (which creates an account + user) - @Override - public AccountResponse createUserAccountResponse(UserAccount user) { - return createAccountResponse(ApiDBUtils.findAccountById(user.getAccountId())); - } - - @Override - public AccountResponse createAccountResponse(Account account) { - boolean accountIsAdmin = (account.getType() == Account.ACCOUNT_TYPE_ADMIN); - AccountResponse accountResponse = new AccountResponse(); - accountResponse.setId(account.getId()); - accountResponse.setName(account.getAccountName()); - accountResponse.setAccountType(account.getType()); - accountResponse.setDomainId(account.getDomainId()); - accountResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); - accountResponse.setState(account.getState().toString()); - accountResponse.setNetworkDomain(account.getNetworkDomain()); - accountResponse.setDefaultZone(account.getDefaultZoneId()); - - // get network stat - List stats = ApiDBUtils.listUserStatsBy(account.getId()); - if (stats == null) { - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for user stats"); - } - - Long bytesSent = 0L; - Long bytesReceived = 0L; - for (UserStatisticsVO stat : stats) { - Long rx = stat.getNetBytesReceived() + stat.getCurrentBytesReceived(); - Long tx = stat.getNetBytesSent() + stat.getCurrentBytesSent(); - bytesReceived = bytesReceived + Long.valueOf(rx); - bytesSent = bytesSent + Long.valueOf(tx); - } - accountResponse.setBytesReceived(bytesReceived); - accountResponse.setBytesSent(bytesSent); - - // Get resource limits and counts - - Long vmLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.user_vm, account.getId()); - String vmLimitDisplay = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit); - Long vmTotal = ApiDBUtils.getResourceCount(ResourceType.user_vm, account.getId()); - String vmAvail = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit - vmTotal); - accountResponse.setVmLimit(vmLimitDisplay); - accountResponse.setVmTotal(vmTotal); - accountResponse.setVmAvailable(vmAvail); - - Long ipLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.public_ip, account.getId()); - String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit); - Long ipTotal = ApiDBUtils.getResourceCount(ResourceType.public_ip, account.getId()); - - Long ips = ipLimit - ipTotal; - // check how many free ips are left, and if it's less than max allowed number of ips from account - use this - // value - Long ipsLeft = ApiDBUtils.countFreePublicIps(); - boolean unlimited = true; - if (ips.longValue() > ipsLeft.longValue()) { - ips = ipsLeft; - unlimited = false; - } - - String ipAvail = ((accountIsAdmin || ipLimit == -1) && unlimited) ? "Unlimited" : String.valueOf(ips); - - accountResponse.setIpLimit(ipLimitDisplay); - accountResponse.setIpTotal(ipTotal); - accountResponse.setIpAvailable(ipAvail); - - Long volumeLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.volume, account.getId()); - String volumeLimitDisplay = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit); - Long volumeTotal = ApiDBUtils.getResourceCount(ResourceType.volume, account.getId()); - String volumeAvail = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit - volumeTotal); - accountResponse.setVolumeLimit(volumeLimitDisplay); - accountResponse.setVolumeTotal(volumeTotal); - accountResponse.setVolumeAvailable(volumeAvail); - - Long snapshotLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.snapshot, account.getId()); - String snapshotLimitDisplay = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit); - Long snapshotTotal = ApiDBUtils.getResourceCount(ResourceType.snapshot, account.getId()); - String snapshotAvail = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit - snapshotTotal); - accountResponse.setSnapshotLimit(snapshotLimitDisplay); - accountResponse.setSnapshotTotal(snapshotTotal); - accountResponse.setSnapshotAvailable(snapshotAvail); - - Long templateLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.template, account.getId()); - String templateLimitDisplay = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit); - Long templateTotal = ApiDBUtils.getResourceCount(ResourceType.template, account.getId()); - String templateAvail = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit - templateTotal); - accountResponse.setTemplateLimit(templateLimitDisplay); - accountResponse.setTemplateTotal(templateTotal); - accountResponse.setTemplateAvailable(templateAvail); - - // Get stopped and running VMs - int vmStopped = 0; - int vmRunning = 0; - - List permittedAccounts = new ArrayList(); - permittedAccounts.add(account.getId()); - - List virtualMachines = ApiDBUtils.searchForUserVMs(new Criteria(), permittedAccounts); - - // get Running/Stopped VMs - for (Iterator iter = virtualMachines.iterator(); iter.hasNext();) { - // count how many stopped/running vms we have - UserVm vm = iter.next(); - - if (vm.getState() == State.Stopped) { - vmStopped++; - } else if (vm.getState() == State.Running) { - vmRunning++; - } - } - - accountResponse.setVmStopped(vmStopped); - accountResponse.setVmRunning(vmRunning); - accountResponse.setObjectName("account"); - - //get resource limits for projects - Long projectLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.project, account.getId()); - String projectLimitDisplay = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit); - Long projectTotal = ApiDBUtils.getResourceCount(ResourceType.project, account.getId()); - String projectAvail = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit - projectTotal); - accountResponse.setProjectLimit(projectLimitDisplay); - accountResponse.setProjectTotal(projectTotal); - accountResponse.setProjectAvailable(projectAvail); - - //get resource limits for networks - Long networkLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.network, account.getId()); - String networkLimitDisplay = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit); - Long networkTotal = ApiDBUtils.getResourceCount(ResourceType.network, account.getId()); - String networkAvail = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit - networkTotal); - accountResponse.setNetworkLimit(networkLimitDisplay); - accountResponse.setNetworkTotal(networkTotal); - accountResponse.setNetworkAvailable(networkAvail); - - // adding all the users for an account as part of the response obj - List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId()); - List userResponseList = new ArrayList(); - for (UserVO user : usersForAccount) { - UserResponse userResponse = createUserResponse(user); - userResponseList.add(userResponse); - } - - accountResponse.setUsers(userResponseList); - accountResponse.setDetails(ApiDBUtils.getAccountDetails(account.getId())); - return accountResponse; - } - - @Override - public UserResponse createUserResponse(UserAccount user) { - UserResponse userResponse = new UserResponse(); - userResponse.setAccountName(user.getAccountName()); - userResponse.setAccountType(user.getType()); - userResponse.setCreated(user.getCreated()); - userResponse.setDomainId(user.getDomainId()); - userResponse.setDomainName(ApiDBUtils.findDomainById(user.getDomainId()).getName()); - userResponse.setEmail(user.getEmail()); - userResponse.setFirstname(user.getFirstname()); - userResponse.setId(user.getId()); - userResponse.setLastname(user.getLastname()); - userResponse.setState(user.getState()); - userResponse.setTimezone(user.getTimezone()); - userResponse.setUsername(user.getUsername()); - userResponse.setApiKey(user.getApiKey()); - userResponse.setSecretKey(user.getSecretKey()); - userResponse.setAccountId((user.getAccountId())); - userResponse.setObjectName("user"); - - return userResponse; - } - - @Override - public DomainResponse createDomainResponse(Domain domain) { - DomainResponse domainResponse = new DomainResponse(); - domainResponse.setDomainName(domain.getName()); - domainResponse.setId(domain.getId()); - domainResponse.setLevel(domain.getLevel()); - domainResponse.setNetworkDomain(domain.getNetworkDomain()); - domainResponse.setParentDomainId(domain.getParent()); - StringBuilder domainPath = new StringBuilder("ROOT"); - (domainPath.append(domain.getPath())).deleteCharAt(domainPath.length() - 1); - domainResponse.setPath(domainPath.toString()); - if (domain.getParent() != null) { - domainResponse.setParentDomainName(ApiDBUtils.findDomainById(domain.getParent()).getName()); - } - if (domain.getChildCount() > 0) { - domainResponse.setHasChild(true); - } - domainResponse.setObjectName("domain"); - return domainResponse; - } - - @Override - public DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering) { - DiskOfferingResponse diskOfferingResponse = new DiskOfferingResponse(); - diskOfferingResponse.setId(offering.getId()); - diskOfferingResponse.setName(offering.getName()); - diskOfferingResponse.setDisplayText(offering.getDisplayText()); - diskOfferingResponse.setCreated(offering.getCreated()); - diskOfferingResponse.setDiskSize(offering.getDiskSize() / (1024 * 1024 * 1024)); - if (offering.getDomainId() != null) { - diskOfferingResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName()); - diskOfferingResponse.setDomainId(offering.getDomainId()); - } - diskOfferingResponse.setTags(offering.getTags()); - diskOfferingResponse.setCustomized(offering.isCustomized()); - diskOfferingResponse.setObjectName("diskoffering"); - return diskOfferingResponse; - } - - @Override - public ResourceLimitResponse createResourceLimitResponse(ResourceLimit limit) { - ResourceLimitResponse resourceLimitResponse = new ResourceLimitResponse(); - if (limit.getResourceOwnerType() == ResourceOwnerType.Domain) { - populateDomain(resourceLimitResponse, limit.getOwnerId()); - } else if (limit.getResourceOwnerType() == ResourceOwnerType.Account) { - Account accountTemp = ApiDBUtils.findAccountById(limit.getOwnerId()); - populateAccount(resourceLimitResponse, limit.getOwnerId()); - populateDomain(resourceLimitResponse, accountTemp.getDomainId()); - } - resourceLimitResponse.setResourceType(Integer.valueOf(limit.getType().getOrdinal()).toString()); - resourceLimitResponse.setMax(limit.getMax()); - resourceLimitResponse.setObjectName("resourcelimit"); - - return resourceLimitResponse; - } - - @Override - public ResourceCountResponse createResourceCountResponse(ResourceCount resourceCount) { - ResourceCountResponse resourceCountResponse = new ResourceCountResponse(); - - if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Account) { - Account accountTemp = ApiDBUtils.findAccountById(resourceCount.getOwnerId()); - if (accountTemp != null) { - populateAccount(resourceCountResponse, accountTemp.getId()); - populateDomain(resourceCountResponse, accountTemp.getDomainId()); - } - } else if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Domain) { - populateDomain(resourceCountResponse, resourceCount.getOwnerId()); - } - - resourceCountResponse.setResourceType(Integer.valueOf(resourceCount.getType().getOrdinal()).toString()); - resourceCountResponse.setResourceCount(resourceCount.getCount()); - resourceCountResponse.setObjectName("resourcecount"); - return resourceCountResponse; - } - - @Override - public ServiceOfferingResponse createServiceOfferingResponse(ServiceOffering offering) { - ServiceOfferingResponse offeringResponse = new ServiceOfferingResponse(); - offeringResponse.setId(offering.getId()); - offeringResponse.setName(offering.getName()); - offeringResponse.setIsSystemOffering(offering.getSystemUse()); - offeringResponse.setDefaultUse(offering.getDefaultUse()); - offeringResponse.setSystemVmType(offering.getSystemVmType()); - offeringResponse.setDisplayText(offering.getDisplayText()); - offeringResponse.setCpuNumber(offering.getCpu()); - offeringResponse.setCpuSpeed(offering.getSpeed()); - offeringResponse.setMemory(offering.getRamSize()); - offeringResponse.setCreated(offering.getCreated()); - offeringResponse.setStorageType(offering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString()); - offeringResponse.setOfferHa(offering.getOfferHA()); - offeringResponse.setLimitCpuUse(offering.getLimitCpuUse()); - offeringResponse.setTags(offering.getTags()); - if (offering.getDomainId() != null) { - offeringResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName()); - offeringResponse.setDomainId(offering.getDomainId()); - } - offeringResponse.setNetworkRate(offering.getRateMbps()); - offeringResponse.setHostTag(offering.getHostTag()); - offeringResponse.setObjectName("serviceoffering"); - - return offeringResponse; - } - - @Override - public ConfigurationResponse createConfigurationResponse(Configuration cfg) { - ConfigurationResponse cfgResponse = new ConfigurationResponse(); - cfgResponse.setCategory(cfg.getCategory()); - cfgResponse.setDescription(cfg.getDescription()); - cfgResponse.setName(cfg.getName()); - cfgResponse.setValue(cfg.getValue()); - cfgResponse.setObjectName("configuration"); - - return cfgResponse; - } - - @Override - public SnapshotResponse createSnapshotResponse(Snapshot snapshot) { - SnapshotResponse snapshotResponse = new SnapshotResponse(); - snapshotResponse.setId(snapshot.getId()); - - populateOwner(snapshotResponse, snapshot); - - VolumeVO volume = findVolumeById(snapshot.getVolumeId()); - String snapshotTypeStr = snapshot.getType().name(); - snapshotResponse.setSnapshotType(snapshotTypeStr); - snapshotResponse.setVolumeId(snapshot.getVolumeId()); - if (volume != null) { - snapshotResponse.setVolumeName(volume.getName()); - snapshotResponse.setVolumeType(volume.getVolumeType().name()); - } - snapshotResponse.setCreated(snapshot.getCreated()); - snapshotResponse.setName(snapshot.getName()); - snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId())); - snapshotResponse.setState(snapshot.getStatus()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Snapshot, snapshot.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - snapshotResponse.setTags(tagResponses); - - snapshotResponse.setObjectName("snapshot"); - return snapshotResponse; - } - - @Override - public SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy) { - SnapshotPolicyResponse policyResponse = new SnapshotPolicyResponse(); - policyResponse.setId(policy.getId()); - policyResponse.setVolumeId(policy.getVolumeId()); - policyResponse.setSchedule(policy.getSchedule()); - policyResponse.setIntervalType(policy.getInterval()); - policyResponse.setMaxSnaps(policy.getMaxSnaps()); - policyResponse.setTimezone(policy.getTimezone()); - policyResponse.setObjectName("snapshotpolicy"); - - return policyResponse; - } - - @Override - public HostResponse createHostResponse(Host host) { - return createHostResponse(host, EnumSet.of(HostDetails.all)); - } - - @Override - public HostResponse createHostResponse(Host host, EnumSet details) { - HostResponse hostResponse = new HostResponse(); - hostResponse.setId(host.getId()); - hostResponse.setCapabilities(host.getCapabilities()); - hostResponse.setClusterId(host.getClusterId()); - hostResponse.setCpuNumber(host.getCpus()); - hostResponse.setZoneId(host.getDataCenterId()); - hostResponse.setDisconnectedOn(host.getDisconnectedOn()); - hostResponse.setHypervisor(host.getHypervisorType()); - hostResponse.setHostType(host.getType()); - hostResponse.setLastPinged(new Date(host.getLastPinged())); - hostResponse.setManagementServerId(host.getManagementServerId()); - hostResponse.setName(host.getName()); - hostResponse.setPodId(host.getPodId()); - hostResponse.setRemoved(host.getRemoved()); - hostResponse.setCpuSpeed(host.getSpeed()); - hostResponse.setState(host.getStatus()); - hostResponse.setIpAddress(host.getPrivateIpAddress()); - hostResponse.setVersion(host.getVersion()); - hostResponse.setCreated(host.getCreated()); - - if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity) - || details.contains(HostDetails.stats) || details.contains(HostDetails.events)) { - - GuestOSCategoryVO guestOSCategory = ApiDBUtils.getHostGuestOSCategory(host.getId()); - if (guestOSCategory != null) { - hostResponse.setOsCategoryId(guestOSCategory.getId()); - hostResponse.setOsCategoryName(guestOSCategory.getName()); - } - hostResponse.setZoneName(ApiDBUtils.findZoneById(host.getDataCenterId()).getName()); - - if (host.getPodId() != null) { - HostPodVO pod = ApiDBUtils.findPodById(host.getPodId()); - if (pod != null) { - hostResponse.setPodName(pod.getName()); - } - } - - if (host.getClusterId() != null) { - ClusterVO cluster = ApiDBUtils.findClusterById(host.getClusterId()); - hostResponse.setClusterName(cluster.getName()); - hostResponse.setClusterType(cluster.getClusterType().toString()); - } - } - - DecimalFormat decimalFormat = new DecimalFormat("#.##"); - if (host.getType() == Host.Type.Routing) { - if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)) { - // set allocated capacities - Long mem = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_MEMORY); - Long cpu = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_CPU); - - hostResponse.setMemoryAllocated(mem); - hostResponse.setMemoryTotal(host.getTotalMemory()); - String hostTags = ApiDBUtils.getHostTags(host.getId()); - hostResponse.setHostTags(hostTags); - - String haTag = ApiDBUtils.getHaTag(); - if (haTag != null && !haTag.isEmpty() && hostTags != null && !hostTags.isEmpty()) { - if (haTag.equalsIgnoreCase(hostTags)) { - hostResponse.setHaHost(true); - } else { - hostResponse.setHaHost(false); - } - } else { - hostResponse.setHaHost(false); - } - - hostResponse.setHypervisorVersion(host.getHypervisorVersion()); - - String cpuAlloc = decimalFormat.format(((float) cpu / (float) (host.getCpus() * host.getSpeed())) * 100f) + "%"; - hostResponse.setCpuAllocated(cpuAlloc); - String cpuWithOverprovisioning = new Float(host.getCpus() * host.getSpeed() * ApiDBUtils.getCpuOverprovisioningFactor()).toString(); - hostResponse.setCpuWithOverprovisioning(cpuWithOverprovisioning); - } - - if (details.contains(HostDetails.all) || details.contains(HostDetails.stats)) { - // set CPU/RAM/Network stats - String cpuUsed = null; - HostStats hostStats = ApiDBUtils.getHostStatistics(host.getId()); - if (hostStats != null) { - float cpuUtil = (float) hostStats.getCpuUtilization(); - cpuUsed = decimalFormat.format(cpuUtil) + "%"; - hostResponse.setCpuUsed(cpuUsed); - hostResponse.setMemoryUsed((new Double(hostStats.getUsedMemory())).longValue()); - hostResponse.setNetworkKbsRead((new Double(hostStats.getNetworkReadKBs())).longValue()); - hostResponse.setNetworkKbsWrite((new Double(hostStats.getNetworkWriteKBs())).longValue()); - - } - } - - } else if (host.getType() == Host.Type.SecondaryStorage) { - StorageStats secStorageStats = ApiDBUtils.getSecondaryStorageStatistics(host.getId()); - if (secStorageStats != null) { - hostResponse.setDiskSizeTotal(secStorageStats.getCapacityBytes()); - hostResponse.setDiskSizeAllocated(secStorageStats.getByteUsed()); - } - } - - hostResponse.setLocalStorageActive(ApiDBUtils.isLocalStorageActiveOnHost(host)); - - if (details.contains(HostDetails.all) || details.contains(HostDetails.events)) { - Set possibleEvents = host.getStatus().getPossibleEvents(); - if ((possibleEvents != null) && !possibleEvents.isEmpty()) { - String events = ""; - Iterator iter = possibleEvents.iterator(); - while (iter.hasNext()) { - com.cloud.host.Status.Event event = iter.next(); - events += event.toString(); - if (iter.hasNext()) { - events += "; "; - } - } - hostResponse.setEvents(events); - } - } - - hostResponse.setResourceState(host.getResourceState().toString()); - hostResponse.setObjectName("host"); - - return hostResponse; - } - - @Override - public SwiftResponse createSwiftResponse(Swift swift) { - SwiftResponse swiftResponse = new SwiftResponse(); - swiftResponse.setId(swift.getId()); - swiftResponse.setUrl(swift.getUrl()); - swiftResponse.setAccount(swift.getAccount()); - swiftResponse.setUsername(swift.getUserName()); - swiftResponse.setObjectName("swift"); - return swiftResponse; - } - - @Override - public VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan) { - Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId()); - - VlanIpRangeResponse vlanResponse = new VlanIpRangeResponse(); - vlanResponse.setId(vlan.getId()); - vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork)); - vlanResponse.setVlan(vlan.getVlanTag()); - vlanResponse.setZoneId(vlan.getDataCenterId()); - - if (podId != null) { - HostPodVO pod = ApiDBUtils.findPodById(podId); - vlanResponse.setPodId(podId); - if (pod != null) { - vlanResponse.setPodName(pod.getName()); - } - } - - vlanResponse.setGateway(vlan.getVlanGateway()); - vlanResponse.setNetmask(vlan.getVlanNetmask()); - - // get start ip and end ip of corresponding vlan - String ipRange = vlan.getIpRange(); - String[] range = ipRange.split("-"); - vlanResponse.setStartIp(range[0]); - vlanResponse.setEndIp(range[1]); - - vlanResponse.setNetworkId(vlan.getNetworkId()); - Account owner = ApiDBUtils.getVlanAccount(vlan.getId()); - if (owner != null) { - populateAccount(vlanResponse, owner.getId()); - populateDomain(vlanResponse, owner.getDomainId()); - } - - vlanResponse.setPhysicalNetworkId(vlan.getPhysicalNetworkId()); - - vlanResponse.setObjectName("vlan"); - return vlanResponse; - } - - @Override - public IPAddressResponse createIPAddressResponse(IpAddress ipAddr) { - VlanVO vlan = ApiDBUtils.findVlanById(ipAddr.getVlanId()); - boolean forVirtualNetworks = vlan.getVlanType().equals(VlanType.VirtualNetwork); - long zoneId = ipAddr.getDataCenterId(); - - IPAddressResponse ipResponse = new IPAddressResponse(); - ipResponse.setId(ipAddr.getId()); - ipResponse.setIpAddress(ipAddr.getAddress().toString()); - if (ipAddr.getAllocatedTime() != null) { - ipResponse.setAllocated(ipAddr.getAllocatedTime()); - } - ipResponse.setZoneId(zoneId); - ipResponse.setZoneName(ApiDBUtils.findZoneById(ipAddr.getDataCenterId()).getName()); - ipResponse.setSourceNat(ipAddr.isSourceNat()); - ipResponse.setIsSystem(ipAddr.getSystem()); - - // get account information - if (ipAddr.getAllocatedToAccountId() != null) { - populateOwner(ipResponse, ipAddr); - } - - ipResponse.setForVirtualNetwork(forVirtualNetworks); - ipResponse.setStaticNat(ipAddr.isOneToOneNat()); - - if (ipAddr.getAssociatedWithVmId() != null) { - UserVm vm = ApiDBUtils.findUserVmById(ipAddr.getAssociatedWithVmId()); - ipResponse.setVirtualMachineId(vm.getId()); - ipResponse.setVirtualMachineName(vm.getHostName()); - if (vm.getDisplayName() != null) { - ipResponse.setVirtualMachineDisplayName(vm.getDisplayName()); - } else { - ipResponse.setVirtualMachineDisplayName(vm.getHostName()); - } - } - - ipResponse.setAssociatedNetworkId(ipAddr.getAssociatedWithNetworkId()); - ipResponse.setVpcId(ipAddr.getVpcId()); - - // Network id the ip is associated with (if associated networkId is null, try to get this information from vlan) - Long vlanNetworkId = ApiDBUtils.getVlanNetworkId(ipAddr.getVlanId()); - - // Network id the ip belongs to - Long networkId; - if (vlanNetworkId != null) { - networkId = vlanNetworkId; - } else { - networkId = ApiDBUtils.getPublicNetworkIdByZone(zoneId); - } - - ipResponse.setNetworkId(networkId); - ipResponse.setState(ipAddr.getState().toString()); - ipResponse.setPhysicalNetworkId(ipAddr.getPhysicalNetworkId()); - - // show this info to admin only - Account account = UserContext.current().getCaller(); - if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) { - ipResponse.setVlanId(ipAddr.getVlanId()); - ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddr.getVlanId()).getVlanTag()); - } - - if (ipAddr.getSystem()) { - if (ipAddr.isOneToOneNat()) { - ipResponse.setPurpose(IpAddress.Purpose.StaticNat.toString()); - } else { - ipResponse.setPurpose(IpAddress.Purpose.Lb.toString()); - } - } - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.PublicIpAddress, ipAddr.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - ipResponse.setTags(tagResponses); - - ipResponse.setObjectName("ipaddress"); - return ipResponse; - } - - @Override - public LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer) { - LoadBalancerResponse lbResponse = new LoadBalancerResponse(); - lbResponse.setId(loadBalancer.getId()); - lbResponse.setName(loadBalancer.getName()); - lbResponse.setDescription(loadBalancer.getDescription()); - List cidrs = ApiDBUtils.findFirewallSourceCidrs(loadBalancer.getId()); - lbResponse.setCidrList(StringUtils.join(cidrs, ",")); - - IPAddressVO publicIp = ApiDBUtils.findIpAddressById(loadBalancer.getSourceIpAddressId()); - lbResponse.setPublicIpId(publicIp.getId()); - lbResponse.setPublicIp(publicIp.getAddress().addr()); - lbResponse.setPublicPort(Integer.toString(loadBalancer.getSourcePortStart())); - lbResponse.setPrivatePort(Integer.toString(loadBalancer.getDefaultPortStart())); - lbResponse.setAlgorithm(loadBalancer.getAlgorithm()); - FirewallRule.State state = loadBalancer.getState(); - String stateToSet = state.toString(); - if (state.equals(FirewallRule.State.Revoke)) { - stateToSet = "Deleting"; - } - lbResponse.setState(stateToSet); - populateOwner(lbResponse, loadBalancer); - lbResponse.setZoneId(publicIp.getDataCenterId()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, loadBalancer.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - lbResponse.setTags(tagResponses); - - lbResponse.setObjectName("loadbalancer"); - return lbResponse; - } - - @Override - public PodResponse createPodResponse(Pod pod, Boolean showCapacities) { - String[] ipRange = new String[2]; - if (pod.getDescription() != null && pod.getDescription().length() > 0) { - ipRange = pod.getDescription().split("-"); - } else { - ipRange[0] = pod.getDescription(); - } - - PodResponse podResponse = new PodResponse(); - podResponse.setId(pod.getId()); - podResponse.setName(pod.getName()); - podResponse.setZoneId(pod.getDataCenterId()); - podResponse.setZoneName(PodZoneConfig.getZoneName(pod.getDataCenterId())); - podResponse.setNetmask(NetUtils.getCidrNetmask(pod.getCidrSize())); - podResponse.setStartIp(ipRange[0]); - podResponse.setEndIp(((ipRange.length > 1) && (ipRange[1] != null)) ? ipRange[1] : ""); - podResponse.setGateway(pod.getGateway()); - podResponse.setAllocationState(pod.getAllocationState().toString()); - if (showCapacities != null && showCapacities) { - List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, pod.getId(), null); - Set capacityResponses = new HashSet(); - float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); - - for (SummedCapacity capacity : capacities) { - CapacityResponse capacityResponse = new CapacityResponse(); - capacityResponse.setCapacityType(capacity.getCapacityType()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); - if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { - capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor))); - } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { - List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, pod.getId(), null); - capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); - } else { - capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); - } - if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); - } else { - capacityResponse.setPercentUsed(s_percentFormat.format(0L)); - } - capacityResponses.add(capacityResponse); - } - // Do it for stats as well. - capacityResponses.addAll(getStatsCapacityresponse(null, null, pod.getId(), pod.getDataCenterId())); - podResponse.setCapacitites(new ArrayList(capacityResponses)); - } - podResponse.setObjectName("pod"); - return podResponse; - } - - @Override - public ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities) { - Account account = UserContext.current().getCaller(); - ZoneResponse zoneResponse = new ZoneResponse(); - zoneResponse.setId(dataCenter.getId()); - zoneResponse.setName(dataCenter.getName()); - zoneResponse.setSecurityGroupsEnabled(ApiDBUtils.isSecurityGroupEnabledInZone(dataCenter.getId())); - - if ((dataCenter.getDescription() != null) && !dataCenter.getDescription().equalsIgnoreCase("null")) { - zoneResponse.setDescription(dataCenter.getDescription()); - } - - if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) { - zoneResponse.setDns1(dataCenter.getDns1()); - zoneResponse.setDns2(dataCenter.getDns2()); - zoneResponse.setInternalDns1(dataCenter.getInternalDns1()); - zoneResponse.setInternalDns2(dataCenter.getInternalDns2()); - // FIXME zoneResponse.setVlan(dataCenter.get.getVnet()); - zoneResponse.setGuestCidrAddress(dataCenter.getGuestNetworkCidr()); - } - - if (showCapacities != null && showCapacities) { - List capacities = ApiDBUtils.getCapacityByClusterPodZone(dataCenter.getId(), null, null); - Set capacityResponses = new HashSet(); - float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); - - for (SummedCapacity capacity : capacities) { - CapacityResponse capacityResponse = new CapacityResponse(); - capacityResponse.setCapacityType(capacity.getCapacityType()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); - if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { - capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor))); - } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { - List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(dataCenter.getId(), null, null); - capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); - } else { - capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); - } - if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); - } else { - capacityResponse.setPercentUsed(s_percentFormat.format(0L)); - } - capacityResponses.add(capacityResponse); - } - // Do it for stats as well. - capacityResponses.addAll(getStatsCapacityresponse(null, null, null, dataCenter.getId())); - - zoneResponse.setCapacitites(new ArrayList(capacityResponses)); - } - - // set network domain info - zoneResponse.setDomain(dataCenter.getDomain()); - - // set domain info - Long domainId = dataCenter.getDomainId(); - if (domainId != null) { - Domain domain = ApiDBUtils.findDomainById(domainId); - zoneResponse.setDomainId(domain.getId()); - zoneResponse.setDomainName(domain.getName()); - } - - zoneResponse.setType(dataCenter.getNetworkType().toString()); - zoneResponse.setAllocationState(dataCenter.getAllocationState().toString()); - zoneResponse.setZoneToken(dataCenter.getZoneToken()); - zoneResponse.setDhcpProvider(dataCenter.getDhcpProvider()); - zoneResponse.setObjectName("zone"); - return zoneResponse; - } - - private List getStatsCapacityresponse(Long poolId, Long clusterId, Long podId, Long zoneId) { - List capacities = new ArrayList(); - capacities.add(ApiDBUtils.getStoragePoolUsedStats(poolId, clusterId, podId, zoneId)); - if (clusterId == null && podId == null) { - capacities.add(ApiDBUtils.getSecondaryStorageUsedStats(poolId, zoneId)); - } - - List capacityResponses = new ArrayList(); - for (CapacityVO capacity : capacities) { - CapacityResponse capacityResponse = new CapacityResponse(); - capacityResponse.setCapacityType(capacity.getCapacityType()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); - capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); - if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); - } else { - capacityResponse.setPercentUsed(s_percentFormat.format(0L)); - } - capacityResponses.add(capacityResponse); - } - - return capacityResponses; - } - - @Override - public VolumeResponse createVolumeResponse(Volume volume) { - VolumeResponse volResponse = new VolumeResponse(); - volResponse.setId(volume.getId()); - - if (volume.getName() != null) { - volResponse.setName(volume.getName()); - } else { - volResponse.setName(""); - } - - volResponse.setZoneId(volume.getDataCenterId()); - volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName()); - - volResponse.setVolumeType(volume.getVolumeType().toString()); - volResponse.setDeviceId(volume.getDeviceId()); - - Long instanceId = volume.getInstanceId(); - if (instanceId != null && volume.getState() != Volume.State.Destroy) { - VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); - if (vm != null) { - volResponse.setVirtualMachineId(vm.getId()); - volResponse.setVirtualMachineName(vm.getHostName()); - UserVm userVm = ApiDBUtils.findUserVmById(vm.getId()); - if (userVm != null) { - if (userVm.getDisplayName() != null) { - volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); - } else { - volResponse.setVirtualMachineDisplayName(userVm.getHostName()); - } - volResponse.setVirtualMachineState(vm.getState().toString()); - } else { - s_logger.error("User Vm with Id: " + instanceId + " does not exist for volume " + volume.getId()); - } - } else { - s_logger.error("Vm with Id: " + instanceId + " does not exist for volume " + volume.getId()); - } - } - - // Show the virtual size of the volume - volResponse.setSize(volume.getSize()); - - volResponse.setCreated(volume.getCreated()); - volResponse.setState(volume.getState().toString()); - if(volume.getState() == Volume.State.UploadOp){ - com.cloud.storage.VolumeHostVO volumeHostRef = ApiDBUtils.findVolumeHostRef(volume.getId(), volume.getDataCenterId()); - volResponse.setSize(volumeHostRef.getSize()); - volResponse.setCreated(volumeHostRef.getCreated()); - Account caller = UserContext.current().getCaller(); - if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) - volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volumeHostRef.getFormat()).toString()); - if (volumeHostRef.getDownloadState() != Status.DOWNLOADED) { - String volumeStatus = "Processing"; - if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (volumeHostRef.getDownloadPercent() == 100) { - volumeStatus = "Checking Volume"; - } else { - volumeStatus = volumeHostRef.getDownloadPercent() + "% Uploaded"; - } - volResponse.setState("Uploading"); - } else { - volumeStatus = volumeHostRef.getErrorString(); - if(volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.NOT_DOWNLOADED){ - volResponse.setState("UploadNotStarted"); - }else { - volResponse.setState("UploadError"); - } - } - volResponse.setStatus(volumeStatus); - } else if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - volResponse.setStatus("Upload Complete"); - volResponse.setState("Uploaded"); - } else { - volResponse.setStatus("Successfully Installed"); - } - } - - populateOwner(volResponse, volume); - - String storageType; - try { - if (volume.getPoolId() == null) { - if (volume.getState() == Volume.State.Allocated || volume.getState() == Volume.State.UploadOp) { - /* set it as shared, so the UI can attach it to VM */ - storageType = "shared"; - } else { - storageType = "unknown"; - } - } else { - storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? ServiceOffering.StorageType.shared.toString() : ServiceOffering.StorageType.local.toString(); - } - } catch (InvalidParameterValueException e) { - s_logger.error(e.getMessage(), e); - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID"); - } - - volResponse.setStorageType(storageType); - if (volume.getVolumeType().equals(Volume.Type.ROOT)) { - volResponse.setServiceOfferingId(volume.getDiskOfferingId()); - } else { - volResponse.setDiskOfferingId(volume.getDiskOfferingId()); - } - - DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); - if (volume.getVolumeType().equals(Volume.Type.ROOT)) { - volResponse.setServiceOfferingName(diskOffering.getName()); - volResponse.setServiceOfferingDisplayText(diskOffering.getDisplayText()); - } else { - volResponse.setDiskOfferingName(diskOffering.getName()); - volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText()); - } - - Long poolId = volume.getPoolId(); - String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName(); - volResponse.setStoragePoolName(poolName); - // volResponse.setSourceId(volume.getSourceId()); - // if (volume.getSourceType() != null) { - // volResponse.setSourceType(volume.getSourceType().toString()); - // } - - // return hypervisor for ROOT and Resource domain only - Account caller = UserContext.current().getCaller(); - if ((caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) && volume.getState() != Volume.State.UploadOp) { - volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); - } - - volResponse.setAttached(volume.getAttached()); - volResponse.setDestroyed(volume.getState() == Volume.State.Destroy); - boolean isExtractable = true; - if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont have any template dependence. - VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); - if (template != null) { // For ISO based volumes template = null and we allow extraction of all ISO based volumes - isExtractable = template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM; - } - } - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Volume, volume.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - volResponse.setTags(tagResponses); - - volResponse.setExtractable(isExtractable); - volResponse.setObjectName("volume"); - return volResponse; - } - - @Override - public InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group) { - InstanceGroupResponse groupResponse = new InstanceGroupResponse(); - groupResponse.setId(group.getId()); - groupResponse.setName(group.getName()); - groupResponse.setCreated(group.getCreated()); - - populateOwner(groupResponse, group); - - groupResponse.setObjectName("instancegroup"); - return groupResponse; - } - - @Override - public StoragePoolResponse createStoragePoolResponse(StoragePool pool) { - StoragePoolResponse poolResponse = new StoragePoolResponse(); - poolResponse.setId(pool.getId()); - poolResponse.setName(pool.getName()); - poolResponse.setState(pool.getStatus()); - poolResponse.setPath(pool.getPath()); - poolResponse.setIpAddress(pool.getHostAddress()); - poolResponse.setZoneId(pool.getDataCenterId()); - poolResponse.setZoneName(ApiDBUtils.findZoneById(pool.getDataCenterId()).getName()); - if (pool.getPoolType() != null) { - poolResponse.setType(pool.getPoolType().toString()); - } - if (pool.getPodId() != null) { - poolResponse.setPodId(pool.getPodId()); - HostPodVO pod = ApiDBUtils.findPodById(pool.getPodId()); - if (pod != null) { - poolResponse.setPodName(pod.getName()); - } - } - if (pool.getCreated() != null) { - poolResponse.setCreated(pool.getCreated()); - } - - StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId()); - long allocatedSize = ApiDBUtils.getStorageCapacitybyPool(pool.getId(), Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED); - poolResponse.setDiskSizeTotal(pool.getCapacityBytes()); - poolResponse.setDiskSizeAllocated(allocatedSize); - - if (stats != null) { - Long used = stats.getByteUsed(); - poolResponse.setDiskSizeUsed(used); - } - - if (pool.getClusterId() != null) { - ClusterVO cluster = ApiDBUtils.findClusterById(pool.getClusterId()); - poolResponse.setClusterId(cluster.getId()); - poolResponse.setClusterName(cluster.getName()); - } - poolResponse.setTags(ApiDBUtils.getStoragePoolTags(pool.getId())); - poolResponse.setObjectName("storagepool"); - return poolResponse; - } - - @Override - public ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities) { - ClusterResponse clusterResponse = new ClusterResponse(); - clusterResponse.setId(cluster.getId()); - clusterResponse.setName(cluster.getName()); - clusterResponse.setPodId(cluster.getPodId()); - clusterResponse.setZoneId(cluster.getDataCenterId()); - clusterResponse.setHypervisorType(cluster.getHypervisorType().toString()); - clusterResponse.setClusterType(cluster.getClusterType().toString()); - clusterResponse.setAllocationState(cluster.getAllocationState().toString()); - clusterResponse.setManagedState(cluster.getManagedState().toString()); - HostPodVO pod = ApiDBUtils.findPodById(cluster.getPodId()); - if (pod != null) { - clusterResponse.setPodName(pod.getName()); - } - DataCenterVO zone = ApiDBUtils.findZoneById(cluster.getDataCenterId()); - clusterResponse.setZoneName(zone.getName()); - if (showCapacities != null && showCapacities) { - List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, null, cluster.getId()); - Set capacityResponses = new HashSet(); - float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); - - for (SummedCapacity capacity : capacities) { - CapacityResponse capacityResponse = new CapacityResponse(); - capacityResponse.setCapacityType(capacity.getCapacityType()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); - - if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { - capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor))); - } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { - List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, null, cluster.getId()); - capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); - capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); - } else { - capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); - } - if (capacityResponse.getCapacityTotal() != 0) { - capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); - } else { - capacityResponse.setPercentUsed(s_percentFormat.format(0L)); - } - capacityResponses.add(capacityResponse); - } - // Do it for stats as well. - capacityResponses.addAll(getStatsCapacityresponse(null, cluster.getId(), pod.getId(), pod.getDataCenterId())); - clusterResponse.setCapacitites(new ArrayList(capacityResponses)); - } - clusterResponse.setObjectName("cluster"); - return clusterResponse; - } - - @Override - public FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule) { - FirewallRuleResponse response = new FirewallRuleResponse(); - response.setId(fwRule.getId()); - response.setPrivateStartPort(Integer.toString(fwRule.getDestinationPortStart())); - response.setPrivateEndPort(Integer.toString(fwRule.getDestinationPortEnd())); - response.setProtocol(fwRule.getProtocol()); - response.setPublicStartPort(Integer.toString(fwRule.getSourcePortStart())); - response.setPublicEndPort(Integer.toString(fwRule.getSourcePortEnd())); - List cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId()); - response.setCidrList(StringUtils.join(cidrs, ",")); - - IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId()); - response.setPublicIpAddressId(ip.getId()); - response.setPublicIpAddress(ip.getAddress().addr()); - - if (ip != null && fwRule.getDestinationIpAddress() != null) { - UserVm vm = ApiDBUtils.findUserVmById(fwRule.getVirtualMachineId()); - if (vm != null) { - response.setVirtualMachineId(vm.getId()); - response.setVirtualMachineName(vm.getHostName()); - - if (vm.getDisplayName() != null) { - response.setVirtualMachineDisplayName(vm.getDisplayName()); - } else { - response.setVirtualMachineDisplayName(vm.getHostName()); - } - } - } - FirewallRule.State state = fwRule.getState(); - String stateToSet = state.toString(); - if (state.equals(FirewallRule.State.Revoke)) { - stateToSet = "Deleting"; - } - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.PortForwardingRule, fwRule.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setState(stateToSet); - response.setObjectName("portforwardingrule"); - return response; - } - - @Override - public IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule) { - IpForwardingRuleResponse response = new IpForwardingRuleResponse(); - response.setId(fwRule.getId()); - response.setProtocol(fwRule.getProtocol()); - - IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId()); - response.setPublicIpAddressId(ip.getId()); - response.setPublicIpAddress(ip.getAddress().addr()); - - if (ip != null && fwRule.getDestIpAddress() != null) { - UserVm vm = ApiDBUtils.findUserVmById(ip.getAssociatedWithVmId()); - if (vm != null) {// vm might be destroyed - response.setVirtualMachineId(vm.getId()); - response.setVirtualMachineName(vm.getHostName()); - if (vm.getDisplayName() != null) { - response.setVirtualMachineDisplayName(vm.getDisplayName()); - } else { - response.setVirtualMachineDisplayName(vm.getHostName()); - } - } - } - FirewallRule.State state = fwRule.getState(); - String stateToSet = state.toString(); - if (state.equals(FirewallRule.State.Revoke)) { - stateToSet = "Deleting"; - } - - response.setStartPort(fwRule.getSourcePortStart()); - response.setEndPort(fwRule.getSourcePortEnd()); - response.setProtocol(fwRule.getProtocol()); - response.setState(stateToSet); - response.setObjectName("ipforwardingrule"); - return response; - } - - @Override - public List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms) { - Account caller = UserContext.current().getCaller(); - Map dataCenters = new HashMap(); - Map hosts = new HashMap(); - Map templates = new HashMap(); - Map serviceOfferings = new HashMap(); - Map networks = new HashMap(); - - List vmResponses = new ArrayList(); - - for (UserVm userVm : userVms) { - UserVmResponse userVmResponse = new UserVmResponse(); - Account acct = ApiDBUtils.findAccountById(Long.valueOf(userVm.getAccountId())); - if (acct != null) { - userVmResponse.setAccountName(acct.getAccountName()); - userVmResponse.setDomainId(acct.getDomainId()); - userVmResponse.setDomainName(ApiDBUtils.findDomainById(acct.getDomainId()).getName()); - } - - userVmResponse.setId(userVm.getId()); - userVmResponse.setName(userVm.getHostName()); - userVmResponse.setCreated(userVm.getCreated()); - - userVmResponse.setHaEnable(userVm.isHaEnabled()); - - if (userVm.getDisplayName() != null) { - userVmResponse.setDisplayName(userVm.getDisplayName()); - } else { - userVmResponse.setDisplayName(userVm.getHostName()); - } - - if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { - userVmResponse.setInstanceName(userVm.getInstanceName()); - } - - - if (userVm.getPassword() != null) { - userVmResponse.setPassword(userVm.getPassword()); - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.group)) { - InstanceGroupVO group = ApiDBUtils.findInstanceGroupForVM(userVm.getId()); - if (group != null) { - userVmResponse.setGroup(group.getName()); - userVmResponse.setGroupId(group.getId()); - } - - } - - // Data Center Info - DataCenter zone = dataCenters.get(userVm.getDataCenterIdToDeployIn()); - if (zone == null) { - zone = ApiDBUtils.findZoneById(userVm.getDataCenterIdToDeployIn()); - dataCenters.put(zone.getId(), zone); - } - - userVmResponse.setZoneId(zone.getId()); - userVmResponse.setZoneName(zone.getName()); - - // if user is an admin, display host id - if (((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN)) && (userVm.getHostId() != null)) { - Host host = hosts.get(userVm.getHostId()); - - if (host == null) { - host = ApiDBUtils.findHostById(userVm.getHostId()); - hosts.put(host.getId(), host); - } - - userVmResponse.setHostId(host.getId()); - userVmResponse.setHostName(host.getName()); - } - - if (userVm.getState() != null) { - if (userVm.getHostId() != null) { - Host host = hosts.get(userVm.getHostId()); - - if (host == null) { - host = ApiDBUtils.findHostById(userVm.getHostId()); - hosts.put(host.getId(), host); - } - if (host.getStatus() != com.cloud.host.Status.Up) { - userVmResponse.setState(VirtualMachine.State.Unknown.toString()); - } else { - userVmResponse.setState(userVm.getState().toString()); - } - } else { - userVmResponse.setState(userVm.getState().toString()); - } - } - - if (userVm.getHypervisorType() != null) { - userVmResponse.setHypervisor(userVm.getHypervisorType().toString()); - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.tmpl)) { - // Template Info - VMTemplateVO template = templates.get(userVm.getTemplateId()); - if (template == null) { - template = ApiDBUtils.findTemplateById(userVm.getTemplateId()); - if (template != null) { - templates.put(template.getId(), template); - } - } - - if (template != null) { - userVmResponse.setTemplateId(userVm.getTemplateId()); - userVmResponse.setTemplateName(template.getName()); - userVmResponse.setTemplateDisplayText(template.getDisplayText()); - userVmResponse.setPasswordEnabled(template.getEnablePassword()); - } else { - userVmResponse.setTemplateId(-1L); - userVmResponse.setTemplateName("ISO Boot"); - userVmResponse.setTemplateDisplayText("ISO Boot"); - userVmResponse.setPasswordEnabled(false); - } - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.iso)) { - // ISO Info - VMTemplateVO iso = templates.get(userVm.getIsoId()); - if (iso == null) { - iso = ApiDBUtils.findTemplateById(userVm.getIsoId()); - if (iso != null) { - templates.put(iso.getId(), iso); - } - } - - if (iso != null) { - userVmResponse.setIsoId(iso.getId()); - userVmResponse.setIsoName(iso.getName()); - } - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.servoff)) { - // Service Offering Info - ServiceOffering offering = serviceOfferings.get(userVm.getServiceOfferingId()); - - if (offering == null) { - offering = ApiDBUtils.findServiceOfferingById(userVm.getServiceOfferingId()); - serviceOfferings.put(offering.getId(), offering); - } - - userVmResponse.setServiceOfferingId(offering.getId()); - userVmResponse.setServiceOfferingName(offering.getName()); - userVmResponse.setCpuNumber(offering.getCpu()); - userVmResponse.setCpuSpeed(offering.getSpeed()); - userVmResponse.setMemory(offering.getRamSize()); - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.volume)) { - VolumeVO rootVolume = ApiDBUtils.findRootVolume(userVm.getId()); - if (rootVolume != null) { - userVmResponse.setRootDeviceId(rootVolume.getDeviceId()); - String rootDeviceType = "Not created"; - if (rootVolume.getPoolId() != null) { - StoragePoolVO storagePool = ApiDBUtils.findStoragePoolById(rootVolume.getPoolId()); - rootDeviceType = storagePool.getPoolType().toString(); - } - userVmResponse.setRootDeviceType(rootDeviceType); - } - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.stats)) { - // stats calculation - DecimalFormat decimalFormat = new DecimalFormat("#.##"); - String cpuUsed = null; - VmStats vmStats = ApiDBUtils.getVmStatistics(userVm.getId()); - if (vmStats != null) { - float cpuUtil = (float) vmStats.getCPUUtilization(); - cpuUsed = decimalFormat.format(cpuUtil) + "%"; - userVmResponse.setCpuUsed(cpuUsed); - - Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs()); - userVmResponse.setNetworkKbsRead(networkKbRead.longValue()); - - Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs()); - userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue()); - } - } - - userVmResponse.setGuestOsId(userVm.getGuestOSId()); - - if (details.contains(VMDetails.all) || details.contains(VMDetails.secgrp)) { - // security groups - list only when zone is security group enabled - if (zone.isSecurityGroupEnabled()) { - List securityGroups = ApiDBUtils.getSecurityGroupsForVm(userVm.getId()); - List securityGroupResponse = new ArrayList(); - for (SecurityGroupVO grp : securityGroups) { - SecurityGroupResponse resp = new SecurityGroupResponse(); - resp.setId(grp.getId()); - resp.setName(grp.getName()); - resp.setDescription(grp.getDescription()); - resp.setObjectName("securitygroup"); - securityGroupResponse.add(resp); - } - userVmResponse.setSecurityGroupList(securityGroupResponse); - } - } - - if (details.contains(VMDetails.all) || details.contains(VMDetails.nics)) { - List nicProfiles = ApiDBUtils.getNics(userVm); - List nicResponses = new ArrayList(); - for (NicProfile singleNicProfile : nicProfiles) { - NicResponse nicResponse = new NicResponse(); - nicResponse.setId(singleNicProfile.getId()); - nicResponse.setIpaddress(singleNicProfile.getIp4Address()); - nicResponse.setGateway(singleNicProfile.getGateway()); - nicResponse.setNetmask(singleNicProfile.getNetmask()); - nicResponse.setNetworkid(singleNicProfile.getNetworkId()); - if (acct.getType() == Account.ACCOUNT_TYPE_ADMIN) { - if (singleNicProfile.getBroadCastUri() != null) { - nicResponse.setBroadcastUri(singleNicProfile.getBroadCastUri().toString()); - } - if (singleNicProfile.getIsolationUri() != null) { - nicResponse.setIsolationUri(singleNicProfile.getIsolationUri().toString()); - } - } - - // Long networkId = singleNicProfile.getNetworkId(); - Network network = networks.get(singleNicProfile.getNetworkId()); - if (network == null) { - network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId()); - networks.put(singleNicProfile.getNetworkId(), network); - } - - nicResponse.setTrafficType(network.getTrafficType().toString()); - nicResponse.setType(network.getGuestType().toString()); - nicResponse.setIsDefault(singleNicProfile.isDefaultNic()); - nicResponse.setObjectName("nic"); - nicResponses.add(nicResponse); - } - userVmResponse.setNics(nicResponses); - } - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, userVm.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - userVmResponse.setTags(tagResponses); - - IpAddress ip = ApiDBUtils.findIpByAssociatedVmId(userVm.getId()); - if (ip != null) { - userVmResponse.setPublicIpId(ip.getId()); - userVmResponse.setPublicIp(ip.getAddress().addr()); - } - - userVmResponse.setObjectName(objectName); - vmResponses.add(userVmResponse); - } - - return vmResponses; - } - - @Override - public List createUserVmResponse(String objectName, UserVm... userVms) { - Account caller = UserContext.current().getCaller(); - boolean caller_is_admin = ((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN)); - - Hashtable vmDataList = new Hashtable(); - // Initialise the vmdatalist with the input data - for (UserVm userVm : userVms) { - UserVmData userVmData = newUserVmData(userVm); - vmDataList.put(userVm.getId(), userVmData); - } - - vmDataList = ApiDBUtils.listVmDetails(vmDataList); - - // initialize vmresponse from vmdatalist - List vmResponses = new ArrayList(); - DecimalFormat decimalFormat = new DecimalFormat("#.##"); - for (UserVmData uvd : vmDataList.values()) { - UserVmResponse userVmResponse = newUserVmResponse(uvd, caller_is_admin); - - // stats calculation - String cpuUsed = null; - // VmStats vmStats = ApiDBUtils.getVmStatistics(userVmResponse.getId()); - VmStats vmStats = ApiDBUtils.getVmStatistics(uvd.getId()); - if (vmStats != null) { - float cpuUtil = (float) vmStats.getCPUUtilization(); - cpuUsed = decimalFormat.format(cpuUtil) + "%"; - userVmResponse.setCpuUsed(cpuUsed); - - Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs()); - userVmResponse.setNetworkKbsRead(networkKbRead.longValue()); - - Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs()); - userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue()); - } - userVmResponse.setObjectName(objectName); - - vmResponses.add(userVmResponse); - } - return vmResponses; - } - - @Override - public DomainRouterResponse createDomainRouterResponse(VirtualRouter router) { - Account caller = UserContext.current().getCaller(); - Map serviceOfferings = new HashMap(); - - DomainRouterResponse routerResponse = new DomainRouterResponse(); - routerResponse.setId(router.getId()); - routerResponse.setZoneId(router.getDataCenterIdToDeployIn()); - routerResponse.setName(router.getHostName()); - routerResponse.setTemplateId(router.getTemplateId()); - routerResponse.setCreated(router.getCreated()); - routerResponse.setState(router.getState()); - routerResponse.setIsRedundantRouter(router.getIsRedundantRouter()); - routerResponse.setRedundantState(router.getRedundantState().toString()); - - if (caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { - if (router.getHostId() != null) { - routerResponse.setHostId(router.getHostId()); - routerResponse.setHostName(ApiDBUtils.findHostById(router.getHostId()).getName()); - } - routerResponse.setPodId(router.getPodIdToDeployIn()); - List nicProfiles = ApiDBUtils.getNics(router); - for (NicProfile singleNicProfile : nicProfiles) { - Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId()); - if (network != null) { - if (network.getTrafficType() == TrafficType.Public) { - routerResponse.setPublicIp(singleNicProfile.getIp4Address()); - routerResponse.setPublicMacAddress(singleNicProfile.getMacAddress()); - routerResponse.setPublicNetmask(singleNicProfile.getNetmask()); - routerResponse.setGateway(singleNicProfile.getGateway()); - routerResponse.setPublicNetworkId(singleNicProfile.getNetworkId()); - } else if (network.getTrafficType() == TrafficType.Control) { - routerResponse.setLinkLocalIp(singleNicProfile.getIp4Address()); - routerResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress()); - routerResponse.setLinkLocalNetmask(singleNicProfile.getNetmask()); - routerResponse.setLinkLocalNetworkId(singleNicProfile.getNetworkId()); - } else if (network.getTrafficType() == TrafficType.Guest) { - routerResponse.setGuestIpAddress(singleNicProfile.getIp4Address()); - routerResponse.setGuestMacAddress(singleNicProfile.getMacAddress()); - routerResponse.setGuestNetmask(singleNicProfile.getNetmask()); - routerResponse.setGuestNetworkId(singleNicProfile.getNetworkId()); - routerResponse.setNetworkDomain(network.getNetworkDomain()); - } - } - } - } - - // Service Offering Info - ServiceOffering offering = serviceOfferings.get(router.getServiceOfferingId()); - - if (offering == null) { - offering = ApiDBUtils.findServiceOfferingById(router.getServiceOfferingId()); - serviceOfferings.put(offering.getId(), offering); - } - routerResponse.setServiceOfferingId(offering.getId()); - routerResponse.setServiceOfferingName(offering.getName()); - - populateOwner(routerResponse, router); - - DataCenter zone = ApiDBUtils.findZoneById(router.getDataCenterIdToDeployIn()); - if (zone != null) { - routerResponse.setZoneName(zone.getName()); - routerResponse.setDns1(zone.getDns1()); - routerResponse.setDns2(zone.getDns2()); - } - - routerResponse.setVpcId(router.getVpcId()); - - routerResponse.setObjectName("domainrouter"); - return routerResponse; - } - - @Override - public SystemVmResponse createSystemVmResponse(VirtualMachine vm) { - SystemVmResponse vmResponse = new SystemVmResponse(); - if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) { - // SystemVm vm = (SystemVm) systemVM; - vmResponse.setId(vm.getId()); - vmResponse.setObjectId(vm.getId()); - vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); - vmResponse.setZoneId(vm.getDataCenterIdToDeployIn()); - - vmResponse.setName(vm.getHostName()); - vmResponse.setPodId(vm.getPodIdToDeployIn()); - vmResponse.setTemplateId(vm.getTemplateId()); - vmResponse.setCreated(vm.getCreated()); - - if (vm.getHostId() != null) { - vmResponse.setHostId(vm.getHostId()); - vmResponse.setHostName(ApiDBUtils.findHostById(vm.getHostId()).getName()); - } - - if (vm.getState() != null) { - vmResponse.setState(vm.getState().toString()); - } - - // for console proxies, add the active sessions - if (vm.getType() == Type.ConsoleProxy) { - ConsoleProxyVO proxy = ApiDBUtils.findConsoleProxy(vm.getId()); - // proxy can be already destroyed - if (proxy != null) { - vmResponse.setActiveViewerSessions(proxy.getActiveSession()); - } - } - - DataCenter zone = ApiDBUtils.findZoneById(vm.getDataCenterIdToDeployIn()); - if (zone != null) { - vmResponse.setZoneName(zone.getName()); - vmResponse.setDns1(zone.getDns1()); - vmResponse.setDns2(zone.getDns2()); - } - - List nicProfiles = ApiDBUtils.getNics(vm); - for (NicProfile singleNicProfile : nicProfiles) { - Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId()); - if (network != null) { - if (network.getTrafficType() == TrafficType.Management) { - vmResponse.setPrivateIp(singleNicProfile.getIp4Address()); - vmResponse.setPrivateMacAddress(singleNicProfile.getMacAddress()); - vmResponse.setPrivateNetmask(singleNicProfile.getNetmask()); - } else if (network.getTrafficType() == TrafficType.Control) { - vmResponse.setLinkLocalIp(singleNicProfile.getIp4Address()); - vmResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress()); - vmResponse.setLinkLocalNetmask(singleNicProfile.getNetmask()); - } else if (network.getTrafficType() == TrafficType.Public || network.getTrafficType() == TrafficType.Guest) { - /*In basic zone, public ip has TrafficType.Guest*/ - vmResponse.setPublicIp(singleNicProfile.getIp4Address()); - vmResponse.setPublicMacAddress(singleNicProfile.getMacAddress()); - vmResponse.setPublicNetmask(singleNicProfile.getNetmask()); - vmResponse.setGateway(singleNicProfile.getGateway()); - } - } - } - } - vmResponse.setObjectName("systemvm"); - return vmResponse; - } - - @Override - public Host findHostById(Long hostId) { - return ApiDBUtils.findHostById(hostId); - } - - @Override - public User findUserById(Long userId) { - return ApiDBUtils.findUserById(userId); - } - - @Override - public UserVm findUserVmById(Long vmId) { - return ApiDBUtils.findUserVmById(vmId); - - } - - @Override - public VolumeVO findVolumeById(Long volumeId) { - return ApiDBUtils.findVolumeById(volumeId); - } - - @Override - public Account findAccountByNameDomain(String accountName, Long domainId) { - return ApiDBUtils.findAccountByNameDomain(accountName, domainId); - } - - @Override - public VirtualMachineTemplate findTemplateById(Long templateId) { - return ApiDBUtils.findTemplateById(templateId); - } - - @Override - public VpnUsersResponse createVpnUserResponse(VpnUser vpnUser) { - VpnUsersResponse vpnResponse = new VpnUsersResponse(); - vpnResponse.setId(vpnUser.getId()); - vpnResponse.setUserName(vpnUser.getUsername()); - - populateOwner(vpnResponse, vpnUser); - - vpnResponse.setObjectName("vpnuser"); - return vpnResponse; - } - - @Override - public RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn) { - RemoteAccessVpnResponse vpnResponse = new RemoteAccessVpnResponse(); - vpnResponse.setPublicIpId(vpn.getServerAddressId()); - vpnResponse.setPublicIp(ApiDBUtils.findIpAddressById(vpn.getServerAddressId()).getAddress().addr()); - vpnResponse.setIpRange(vpn.getIpRange()); - vpnResponse.setPresharedKey(vpn.getIpsecPresharedKey()); - vpnResponse.setDomainId(vpn.getDomainId()); - - populateOwner(vpnResponse, vpn); - - vpnResponse.setState(vpn.getState().toString()); - vpnResponse.setObjectName("remoteaccessvpn"); - - return vpnResponse; - } - - @Override - public TemplateResponse createIsoResponse(VirtualMachineTemplate result) { - TemplateResponse response = new TemplateResponse(); - response.setId(result.getId()); - response.setName(result.getName()); - response.setDisplayText(result.getDisplayText()); - response.setPublic(result.isPublicTemplate()); - response.setCreated(result.getCreated()); - response.setFormat(result.getFormat()); - response.setOsTypeId(result.getGuestOSId()); - response.setOsTypeName(ApiDBUtils.findGuestOSById(result.getGuestOSId()).getDisplayName()); - response.setDetails(result.getDetails()); - Account caller = UserContext.current().getCaller(); - - if (result.getFormat() == ImageFormat.ISO) { // Templates are always bootable - response.setBootable(result.isBootable()); - } else { - response.setHypervisor(result.getHypervisorType().toString());// hypervisors are associated with templates - } - - // add account ID and name - Account owner = ApiDBUtils.findAccountById(result.getAccountId()); - populateAccount(response, owner.getId()); - populateDomain(response, owner.getDomainId()); - - //set tag information - List tags = null; - if (result.getFormat() == ImageFormat.ISO) { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, result.getId()); - } else { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Template, result.getId()); - } - - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setObjectName("iso"); - return response; - } - - @Override - public List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly) { - if (zoneId == null || zoneId == -1) { - List responses = new ArrayList(); - List dcs = new ArrayList(); - responses = createSwiftTemplateResponses(templateId); - if (!responses.isEmpty()) { - return responses; - } - dcs.addAll(ApiDBUtils.listZones()); - for (DataCenterVO dc : dcs) { - responses.addAll(createTemplateResponses(templateId, dc.getId(), readyOnly)); - } - return responses; - } else { - return createTemplateResponses(templateId, zoneId.longValue(), readyOnly); - } - } - - private List createSwiftTemplateResponses(long templateId) { - VirtualMachineTemplate template = findTemplateById(templateId); - List responses = new ArrayList(); - VMTemplateSwiftVO templateSwiftRef = ApiDBUtils.findTemplateSwiftRef(templateId); - if (templateSwiftRef == null) { - return responses; - } - - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getId()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setCreated(templateSwiftRef.getCreated()); - - templateResponse.setReady(true); - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setCrossZones(template.isCrossZones()); - templateResponse.setFormat(template.getFormat()); - templateResponse.setDetails(template.getDetails()); - if (template.getTemplateType() != null) { - templateResponse.setTemplateType(template.getTemplateType().toString()); - } - - templateResponse.setHypervisor(template.getHypervisorType().toString()); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getId()); - templateResponse.setOsTypeName(os.getDisplayName()); - } else { - templateResponse.setOsTypeId(-1L); - templateResponse.setOsTypeName(""); - } - - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId()); - populateAccount(templateResponse, account.getId()); - populateDomain(templateResponse, account.getDomainId()); - - Account caller = UserContext.current().getCaller(); - boolean isAdmin = false; - if (BaseCmd.isAdmin(caller.getType())) { - isAdmin = true; - } - - // If the user is an Admin, add the template download status - if (isAdmin || caller.getId() == template.getAccountId()) { - // add download status - templateResponse.setStatus("Successfully Installed"); - } - - Long templateSize = templateSwiftRef.getSize(); - if (templateSize > 0) { - templateResponse.setSize(templateSize); - } - - templateResponse.setChecksum(template.getChecksum()); - templateResponse.setSourceTemplateId(template.getSourceTemplateId()); - - templateResponse.setChecksum(template.getChecksum()); - - templateResponse.setTemplateTag(template.getTemplateTag()); - - templateResponse.setObjectName("template"); - responses.add(templateResponse); - return responses; - } - - @Override - public List createTemplateResponses(long templateId, long zoneId, boolean readyOnly) { - VirtualMachineTemplate template = findTemplateById(templateId); - List responses = new ArrayList(); - VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(templateId, zoneId, readyOnly); - if (templateHostRef == null) { - return responses; - } - - HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId()); - if (host.getType() == Host.Type.LocalSecondaryStorage && host.getStatus() != com.cloud.host.Status.Up) { - return responses; - } - - TemplateResponse templateResponse = new TemplateResponse(); - templateResponse.setId(template.getId()); - templateResponse.setName(template.getName()); - templateResponse.setDisplayText(template.getDisplayText()); - templateResponse.setPublic(template.isPublicTemplate()); - templateResponse.setCreated(templateHostRef.getCreated()); - - templateResponse.setReady(templateHostRef.getDownloadState() == Status.DOWNLOADED); - templateResponse.setFeatured(template.isFeatured()); - templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); - templateResponse.setPasswordEnabled(template.getEnablePassword()); - templateResponse.setCrossZones(template.isCrossZones()); - templateResponse.setFormat(template.getFormat()); - if (template.getTemplateType() != null) { - templateResponse.setTemplateType(template.getTemplateType().toString()); - } - - templateResponse.setHypervisor(template.getHypervisorType().toString()); - templateResponse.setDetails(template.getDetails()); - - GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); - if (os != null) { - templateResponse.setOsTypeId(os.getId()); - templateResponse.setOsTypeName(os.getDisplayName()); - } else { - templateResponse.setOsTypeId(-1L); - templateResponse.setOsTypeName(""); - } - - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId()); - populateAccount(templateResponse, account.getId()); - populateDomain(templateResponse, account.getDomainId()); - - DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId); - - // Add the zone ID - templateResponse.setZoneId(zoneId); - templateResponse.setZoneName(datacenter.getName()); - - boolean isAdmin = false; - Account caller = UserContext.current().getCaller(); - if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { - isAdmin = true; - } - - // If the user is an Admin, add the template download status - if (isAdmin || caller.getId() == template.getAccountId()) { - // add download status - if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { - String templateStatus = "Processing"; - if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (templateHostRef.getDownloadPercent() == 100) { - templateStatus = "Installing Template"; - } else { - templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; - } - } else { - templateStatus = templateHostRef.getErrorString(); - } - templateResponse.setStatus(templateStatus); - } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - templateResponse.setStatus("Download Complete"); - } else { - templateResponse.setStatus("Successfully Installed"); - } - } - - Long templateSize = templateHostRef.getSize(); - if (templateSize > 0) { - templateResponse.setSize(templateSize); - } - - templateResponse.setChecksum(template.getChecksum()); - templateResponse.setSourceTemplateId(template.getSourceTemplateId()); - - templateResponse.setChecksum(template.getChecksum()); - - templateResponse.setTemplateTag(template.getTemplateTag()); - - //set tag information - List tags = null; - if (template.getFormat() == ImageFormat.ISO) { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, template.getId()); - } else { - tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Template, template.getId()); - } - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - templateResponse.setTags(tagResponses); - - templateResponse.setObjectName("template"); - responses.add(templateResponse); - return responses; - } - - @Override - public List createIsoResponses(long isoId, Long zoneId, boolean readyOnly) { - - List isoResponses = new ArrayList(); - VirtualMachineTemplate iso = findTemplateById(isoId); - if (iso.getTemplateType() == TemplateType.PERHOST) { - TemplateResponse isoResponse = new TemplateResponse(); - isoResponse.setId(iso.getId()); - isoResponse.setName(iso.getName()); - isoResponse.setDisplayText(iso.getDisplayText()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); - isoResponse.setReady(true); - isoResponse.setBootable(iso.isBootable()); - isoResponse.setFeatured(iso.isFeatured()); - isoResponse.setCrossZones(iso.isCrossZones()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setCreated(iso.getCreated()); - isoResponse.setChecksum(iso.getChecksum()); - isoResponse.setPasswordEnabled(false); - isoResponse.setDetails(iso.getDetails()); - - // add account ID and name - Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); - populateAccount(isoResponse, owner.getId()); - populateDomain(isoResponse, owner.getDomainId()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - isoResponse.setTags(tagResponses); - - isoResponse.setObjectName("iso"); - isoResponses.add(isoResponse); - return isoResponses; - } else { - if (zoneId == null || zoneId == -1) { - isoResponses = createSwiftIsoResponses(iso); - if (!isoResponses.isEmpty()) { - return isoResponses; - } - List dcs = new ArrayList(); - dcs.addAll(ApiDBUtils.listZones()); - for (DataCenterVO dc : dcs) { - isoResponses.addAll(createIsoResponses(iso, dc.getId(), readyOnly)); - } - return isoResponses; - } else { - return createIsoResponses(iso, zoneId, readyOnly); - } - } - } - - private List createSwiftIsoResponses(VirtualMachineTemplate iso) { - long isoId = iso.getId(); - List isoResponses = new ArrayList(); - VMTemplateSwiftVO isoSwift = ApiDBUtils.findTemplateSwiftRef(isoId); - if (isoSwift == null) { - return isoResponses; - } - TemplateResponse isoResponse = new TemplateResponse(); - isoResponse.setId(iso.getId()); - isoResponse.setName(iso.getName()); - isoResponse.setDisplayText(iso.getDisplayText()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); - isoResponse.setCreated(isoSwift.getCreated()); - isoResponse.setReady(true); - isoResponse.setBootable(iso.isBootable()); - isoResponse.setFeatured(iso.isFeatured()); - isoResponse.setCrossZones(iso.isCrossZones()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setChecksum(iso.getChecksum()); - isoResponse.setDetails(iso.getDetails()); - - // TODO: implement - GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); - if (os != null) { - isoResponse.setOsTypeId(os.getId()); - isoResponse.setOsTypeName(os.getDisplayName()); - } else { - isoResponse.setOsTypeId(-1L); - isoResponse.setOsTypeName(""); - } - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); - populateAccount(isoResponse, account.getId()); - populateDomain(isoResponse, account.getDomainId()); - boolean isAdmin = false; - if ((account == null) || BaseCmd.isAdmin(account.getType())) { - isAdmin = true; - } - - // If the user is an admin, add the template download status - if (isAdmin || account.getId() == iso.getAccountId()) { - // add download status - isoResponse.setStatus("Successfully Installed"); - } - Long isoSize = isoSwift.getSize(); - if (isoSize > 0) { - isoResponse.setSize(isoSize); - } - isoResponse.setObjectName("iso"); - isoResponses.add(isoResponse); - return isoResponses; - } - - @Override - public List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly) { - long isoId = iso.getId(); - List isoResponses = new ArrayList(); - VMTemplateHostVO isoHost = ApiDBUtils.findTemplateHostRef(isoId, zoneId, readyOnly); - if (isoHost == null) { - return isoResponses; - } - TemplateResponse isoResponse = new TemplateResponse(); - isoResponse.setId(iso.getId()); - isoResponse.setName(iso.getName()); - isoResponse.setDisplayText(iso.getDisplayText()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); - isoResponse.setCreated(isoHost.getCreated()); - isoResponse.setReady(isoHost.getDownloadState() == Status.DOWNLOADED); - isoResponse.setBootable(iso.isBootable()); - isoResponse.setFeatured(iso.isFeatured()); - isoResponse.setCrossZones(iso.isCrossZones()); - isoResponse.setPublic(iso.isPublicTemplate()); - isoResponse.setChecksum(iso.getChecksum()); - isoResponse.setDetails(iso.getDetails()); - - // TODO: implement - GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); - if (os != null) { - isoResponse.setOsTypeId(os.getId()); - isoResponse.setOsTypeName(os.getDisplayName()); - } else { - isoResponse.setOsTypeId(-1L); - isoResponse.setOsTypeName(""); - } - - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); - populateAccount(isoResponse, account.getId()); - populateDomain(isoResponse, account.getDomainId()); - - Account caller = UserContext.current().getCaller(); - boolean isAdmin = false; - if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { - isAdmin = true; - } - // Add the zone ID - DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId); - isoResponse.setZoneId(zoneId); - isoResponse.setZoneName(datacenter.getName()); - - // If the user is an admin, add the template download status - if (isAdmin || caller.getId() == iso.getAccountId()) { - // add download status - if (isoHost.getDownloadState() != Status.DOWNLOADED) { - String isoStatus = "Processing"; - if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { - isoStatus = "Download Complete"; - } else if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { - if (isoHost.getDownloadPercent() == 100) { - isoStatus = "Installing ISO"; - } else { - isoStatus = isoHost.getDownloadPercent() + "% Downloaded"; - } - } else { - isoStatus = isoHost.getErrorString(); - } - isoResponse.setStatus(isoStatus); - } else { - isoResponse.setStatus("Successfully Installed"); - } - } - - Long isoSize = isoHost.getSize(); - if (isoSize > 0) { - isoResponse.setSize(isoSize); - } - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); - - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - isoResponse.setTags(tagResponses); - - isoResponse.setObjectName("iso"); - isoResponses.add(isoResponse); - return isoResponses; - } - - @Override - public ListResponse createSecurityGroupResponses( - List networkGroups) { - List groupResultObjs = SecurityGroupResultObject - .transposeNetworkGroups(networkGroups); - - ListResponse response = new ListResponse(); - List netGrpResponses = new ArrayList(); - for (SecurityGroupResultObject networkGroup : groupResultObjs) { - SecurityGroupResponse netGrpResponse = new SecurityGroupResponse(); - netGrpResponse.setId(networkGroup.getId()); - netGrpResponse.setName(networkGroup.getName()); - netGrpResponse.setDescription(networkGroup.getDescription()); - - populateOwner(netGrpResponse, networkGroup); - - List securityGroupRules = networkGroup - .getSecurityGroupRules(); - if ((securityGroupRules != null) && !securityGroupRules.isEmpty()) { - List ingressRulesResponse = new ArrayList(); - List egressRulesResponse = new ArrayList(); - for (SecurityGroupRuleResultObject securityGroupRule : securityGroupRules) { - SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse(); - ruleData.setRuleId(securityGroupRule.getId()); - ruleData.setProtocol(securityGroupRule.getProtocol()); - - if ("icmp".equalsIgnoreCase(securityGroupRule.getProtocol())) { - ruleData.setIcmpType(securityGroupRule.getStartPort()); - ruleData.setIcmpCode(securityGroupRule.getEndPort()); - } else { - ruleData.setStartPort(securityGroupRule.getStartPort()); - ruleData.setEndPort(securityGroupRule.getEndPort()); - } - - if (securityGroupRule.getAllowedSecurityGroup() != null) { - ruleData.setSecurityGroupName(securityGroupRule - .getAllowedSecurityGroup()); - ruleData.setAccountName(securityGroupRule - .getAllowedSecGroupAcct()); - } else { - ruleData.setCidr(securityGroupRule - .getAllowedSourceIpCidr()); - } - - if (securityGroupRule.getRuleType() == SecurityRuleType.IngressRule) { - ruleData.setObjectName("ingressrule"); - ingressRulesResponse.add(ruleData); - } else { - ruleData.setObjectName("egressrule"); - egressRulesResponse.add(ruleData); - } - } - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, networkGroup.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - netGrpResponse.setTags(tagResponses); - - netGrpResponse - .setSecurityGroupIngressRules(ingressRulesResponse); - netGrpResponse.setSecurityGroupEgressRules(egressRulesResponse); - } - netGrpResponse.setObjectName("securitygroup"); - netGrpResponses.add(netGrpResponse); - } - - response.setResponses(netGrpResponses); - return response; - } - - @Override - public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) { - SecurityGroupResponse response = new SecurityGroupResponse(); - - populateOwner(response, group); - - response.setDescription(group.getDescription()); - response.setId(group.getId()); - response.setName(group.getName()); - - response.setObjectName("securitygroup"); - return response; - - } - - @Override - public ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode) { - UploadVO uploadInfo = ApiDBUtils.findUploadById(uploadId); - ExtractResponse response = new ExtractResponse(); - response.setObjectName("template"); - response.setId(id); - response.setName(ApiDBUtils.findTemplateById(id).getName()); - if (zoneId != null) { - response.setZoneId(zoneId); - response.setZoneName(ApiDBUtils.findZoneById(zoneId).getName()); - } - response.setMode(mode); - response.setUploadId(uploadId); - response.setState(uploadInfo.getUploadState().toString()); - response.setAccountId(accountId); - response.setUrl(uploadInfo.getUploadUrl()); - return response; - - } - - @Override - public String toSerializedString(CreateCmdResponse response, String responseType) { - return ApiResponseSerializer.toSerializedString(response, responseType); - } - - @Override - public AsyncJobResponse createAsyncJobResponse(AsyncJob job) { - AsyncJobResponse jobResponse = new AsyncJobResponse(); - jobResponse.setAccountId(job.getAccountId()); - jobResponse.setUserId(job.getUserId()); - jobResponse.setCmd(job.getCmd()); - jobResponse.setCreated(job.getCreated()); - jobResponse.setJobId(job.getId()); - jobResponse.setJobStatus(job.getStatus()); - jobResponse.setJobProcStatus(job.getProcessStatus()); - - if (job.getInstanceType() != null && job.getInstanceId() != null) { - jobResponse.setJobInstanceType(job.getInstanceType().toString()); - jobResponse.setJobInstanceId(job.getInstanceId()); - } - jobResponse.setJobResultCode(job.getResultCode()); - - boolean savedValue = SerializationContext.current().getUuidTranslation(); - SerializationContext.current().setUuidTranslation(false); - - Object resultObject = ApiSerializerHelper.fromSerializedString(job.getResult()); - jobResponse.setJobResult((ResponseObject) resultObject); - SerializationContext.current().setUuidTranslation(savedValue); - - if (resultObject != null) { - Class clz = resultObject.getClass(); - if (clz.isPrimitive() || clz.getSuperclass() == Number.class || clz == String.class || clz == Date.class) { - jobResponse.setJobResultType("text"); - } else { - jobResponse.setJobResultType("object"); - } - } - - jobResponse.setObjectName("asyncjobs"); - return jobResponse; - } - - @Override - public List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly) { - VolumeVO volume = null; - if (snapshotId != null) { - Snapshot snapshot = ApiDBUtils.findSnapshotById(snapshotId); - volume = findVolumeById(snapshot.getVolumeId()); - } else { - volume = findVolumeById(volumeId); - } - return createTemplateResponses(templateId, volume.getDataCenterId(), readyOnly); - } - - @Override - public List createTemplateResponses(long templateId, Long vmId) { - UserVm vm = findUserVmById(vmId); - Long hostId = (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()); - Host host = findHostById(hostId); - return createTemplateResponses(templateId, host.getDataCenterId(), true); - } - - @Override - public EventResponse createEventResponse(Event event) { - EventResponse responseEvent = new EventResponse(); - responseEvent.setCreated(event.getCreateDate()); - responseEvent.setDescription(event.getDescription()); - responseEvent.setEventType(event.getType()); - responseEvent.setId(event.getId()); - responseEvent.setLevel(event.getLevel()); - responseEvent.setParentId(event.getStartId()); - responseEvent.setState(event.getState()); - - populateOwner(responseEvent, event); - - User user = ApiDBUtils.findUserById(event.getUserId()); - if (user != null) { - responseEvent.setUsername(user.getUsername()); - } - - responseEvent.setObjectName("event"); - return responseEvent; - } - - private List sumCapacities(List hostCapacities) { - Map totalCapacityMap = new HashMap(); - Map usedCapacityMap = new HashMap(); - - Set poolIdsToIgnore = new HashSet(); - Criteria c = new Criteria(); - // TODO: implement - List allStoragePools = ApiDBUtils.searchForStoragePools(c); - for (StoragePoolVO pool : allStoragePools) { - StoragePoolType poolType = pool.getPoolType(); - if (!(poolType.isShared())) {// All the non shared storages shouldn't show up in the capacity calculation - poolIdsToIgnore.add(pool.getId()); - } - } - - float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); - - // collect all the capacity types, sum allocated/used and sum total...get one capacity number for each - for (Capacity capacity : hostCapacities) { - - // check if zone exist - DataCenter zone = ApiDBUtils.findZoneById(capacity.getDataCenterId()); - if (zone == null) { - continue; - } - - short capacityType = capacity.getCapacityType(); - - // If local storage then ignore - if ((capacityType == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED || capacityType == Capacity.CAPACITY_TYPE_STORAGE) - && poolIdsToIgnore.contains(capacity.getHostOrPoolId())) { - continue; - } - - String key = capacity.getCapacityType() + "_" + capacity.getDataCenterId(); - String keyForPodTotal = key + "_-1"; - - boolean sumPodCapacity = false; - if (capacity.getPodId() != null) { - key += "_" + capacity.getPodId(); - sumPodCapacity = true; - } - - Long totalCapacity = totalCapacityMap.get(key); - Long usedCapacity = usedCapacityMap.get(key); - - // reset overprovisioning factor to 1 - float overprovisioningFactor = 1; - if (capacityType == Capacity.CAPACITY_TYPE_CPU) { - overprovisioningFactor = cpuOverprovisioningFactor; - } - - if (totalCapacity == null) { - totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)); - } else { - totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)) + totalCapacity; - } - - if (usedCapacity == null) { - usedCapacity = new Long(capacity.getUsedCapacity()); - } else { - usedCapacity = new Long(capacity.getUsedCapacity() + usedCapacity); - } - - if (capacityType == Capacity.CAPACITY_TYPE_CPU || capacityType == Capacity.CAPACITY_TYPE_MEMORY) { // Reserved - // Capacity - // accounts -// for - // stopped -// vms - // that -// have been - // stopped -// within - // an -// interval - usedCapacity += capacity.getReservedCapacity(); - } - - totalCapacityMap.put(key, totalCapacity); - usedCapacityMap.put(key, usedCapacity); - - if (sumPodCapacity) { - totalCapacity = totalCapacityMap.get(keyForPodTotal); - usedCapacity = usedCapacityMap.get(keyForPodTotal); - - overprovisioningFactor = 1; - if (capacityType == Capacity.CAPACITY_TYPE_CPU) { - overprovisioningFactor = cpuOverprovisioningFactor; - } - - if (totalCapacity == null) { - totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)); - } else { - totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)) + totalCapacity; - } - - if (usedCapacity == null) { - usedCapacity = new Long(capacity.getUsedCapacity()); - } else { - usedCapacity = new Long(capacity.getUsedCapacity() + usedCapacity); - } - - if (capacityType == Capacity.CAPACITY_TYPE_CPU || capacityType == Capacity.CAPACITY_TYPE_MEMORY) { // Reserved - // Capacity - // accounts - // for - // stopped - // vms -// that - // have -// been - // stopped - // within -// an - // interval - usedCapacity += capacity.getReservedCapacity(); - } - - totalCapacityMap.put(keyForPodTotal, totalCapacity); - usedCapacityMap.put(keyForPodTotal, usedCapacity); - } - } - - List summedCapacities = new ArrayList(); - for (String key : totalCapacityMap.keySet()) { - CapacityVO summedCapacity = new CapacityVO(); - - StringTokenizer st = new StringTokenizer(key, "_"); - summedCapacity.setCapacityType(Short.parseShort(st.nextToken())); - summedCapacity.setDataCenterId(Long.parseLong(st.nextToken())); - if (st.hasMoreTokens()) { - summedCapacity.setPodId(Long.parseLong(st.nextToken())); - } - - summedCapacity.setTotalCapacity(totalCapacityMap.get(key)); - summedCapacity.setUsedCapacity(usedCapacityMap.get(key)); - - summedCapacities.add(summedCapacity); - } - return summedCapacities; - } - - @Override - public List createCapacityResponse(List result, DecimalFormat format) { - List capacityResponses = new ArrayList(); - - for (Capacity summedCapacity : result) { - CapacityResponse capacityResponse = new CapacityResponse(); - capacityResponse.setCapacityTotal(summedCapacity.getTotalCapacity()); - capacityResponse.setCapacityType(summedCapacity.getCapacityType()); - capacityResponse.setCapacityUsed(summedCapacity.getUsedCapacity()); - if (summedCapacity.getPodId() != null) { - capacityResponse.setPodId(summedCapacity.getPodId()); - HostPodVO pod = ApiDBUtils.findPodById(summedCapacity.getPodId()); - if (pod != null) { - capacityResponse.setPodName(pod.getName()); - } - } - if (summedCapacity.getClusterId() != null) { - capacityResponse.setClusterId(summedCapacity.getClusterId()); - ClusterVO cluster = ApiDBUtils.findClusterById(summedCapacity.getClusterId()); - if (cluster != null) { - capacityResponse.setClusterName(cluster.getName()); - if (summedCapacity.getPodId() == null) { - long podId = cluster.getPodId(); - capacityResponse.setPodId(podId); - capacityResponse.setPodName(ApiDBUtils.findPodById(podId).getName()); - } - } - } - capacityResponse.setZoneId(summedCapacity.getDataCenterId()); - capacityResponse.setZoneName(ApiDBUtils.findZoneById(summedCapacity.getDataCenterId()).getName()); - if (summedCapacity.getUsedPercentage() != null){ - capacityResponse.setPercentUsed(format.format(summedCapacity.getUsedPercentage() * 100f)); - } else if (summedCapacity.getTotalCapacity() != 0) { - capacityResponse.setPercentUsed(format.format((float) summedCapacity.getUsedCapacity() / (float) summedCapacity.getTotalCapacity() * 100f)); - } else { - capacityResponse.setPercentUsed(format.format(0L)); - } - - capacityResponse.setObjectName("capacity"); - capacityResponses.add(capacityResponse); - } - - return capacityResponses; - } - - @Override - public TemplatePermissionsResponse createTemplatePermissionsResponse(List accountNames, Long id, boolean isAdmin) { - Long templateOwnerDomain = null; - VirtualMachineTemplate template = ApiDBUtils.findTemplateById(id); - Account templateOwner = ApiDBUtils.findAccountById(template.getAccountId()); - if (isAdmin) { - // FIXME: we have just template id and need to get template owner from that - if (templateOwner != null) { - templateOwnerDomain = templateOwner.getDomainId(); - } - } - - TemplatePermissionsResponse response = new TemplatePermissionsResponse(); - response.setId(template.getId()); - response.setPublicTemplate(template.isPublicTemplate()); - if (isAdmin && (templateOwnerDomain != null)) { - response.setDomainId(templateOwnerDomain); - } - - // Set accounts - List projectIds = new ArrayList(); - List regularAccounts = new ArrayList(); - for (String accountName : accountNames) { - Account account = ApiDBUtils.findAccountByNameDomain(accountName, templateOwner.getDomainId()); - if (account.getType() != Account.ACCOUNT_TYPE_PROJECT) { - regularAccounts.add(accountName); - } else { - // convert account to projectIds - Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); - - if (project.getUuid() != null && !project.getUuid().isEmpty()) - projectIds.add(project.getUuid()); - else - projectIds.add(String.valueOf(project.getId())); - } - } - - if (!projectIds.isEmpty()) { - response.setProjectIds(projectIds); - } - - if (!regularAccounts.isEmpty()) { - response.setAccountNames(regularAccounts); - } - - response.setObjectName("templatepermission"); - return response; - } - - @Override - public AsyncJobResponse queryJobResult(QueryAsyncJobResultCmd cmd) { - AsyncJob result = ApiDBUtils._asyncMgr.queryAsyncJobResult(cmd); - return createAsyncJobResponse(result); - } - - @Override - public SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List securityRules) { - SecurityGroupResponse response = new SecurityGroupResponse(); - Map securiytGroupAccounts = new HashMap(); - Map allowedSecurityGroups = new HashMap(); - Map allowedSecuriytGroupAccounts = new HashMap(); - - if ((securityRules != null) && !securityRules.isEmpty()) { - SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(securityRules.get(0).getSecurityGroupId()); - response.setId(securityGroup.getId()); - response.setName(securityGroup.getName()); - response.setDescription(securityGroup.getDescription()); - - Account account = securiytGroupAccounts.get(securityGroup.getAccountId()); - - if (account == null) { - account = ApiDBUtils.findAccountById(securityGroup.getAccountId()); - securiytGroupAccounts.put(securityGroup.getAccountId(), account); - } - - populateAccount(response, account.getId()); - populateDomain(response, account.getDomainId()); - - List egressResponses = new ArrayList(); - List ingressResponses = new ArrayList(); - for (SecurityRule securityRule : securityRules) { - SecurityGroupRuleResponse securityGroupData = new SecurityGroupRuleResponse(); - - securityGroupData.setRuleId(securityRule.getId()); - securityGroupData.setProtocol(securityRule.getProtocol()); - if ("icmp".equalsIgnoreCase(securityRule.getProtocol())) { - securityGroupData.setIcmpType(securityRule.getStartPort()); - securityGroupData.setIcmpCode(securityRule.getEndPort()); - } else { - securityGroupData.setStartPort(securityRule.getStartPort()); - securityGroupData.setEndPort(securityRule.getEndPort()); - } - - Long allowedSecurityGroupId = securityRule.getAllowedNetworkId(); - if (allowedSecurityGroupId != null) { - SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId); - if (allowedSecurityGroup == null) { - allowedSecurityGroup = ApiDBUtils.findSecurityGroupById(allowedSecurityGroupId); - allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup); - } - - securityGroupData.setSecurityGroupName(allowedSecurityGroup.getName()); - - Account allowedAccount = allowedSecuriytGroupAccounts.get(allowedSecurityGroup.getAccountId()); - if (allowedAccount == null) { - allowedAccount = ApiDBUtils.findAccountById(allowedSecurityGroup.getAccountId()); - allowedSecuriytGroupAccounts.put(allowedAccount.getId(), allowedAccount); - } - - securityGroupData.setAccountName(allowedAccount.getAccountName()); - } else { - securityGroupData.setCidr(securityRule.getAllowedSourceIpCidr()); - } - if (securityRule.getRuleType() == SecurityRuleType.IngressRule) { - securityGroupData.setObjectName("ingressrule"); - ingressResponses.add(securityGroupData); - } else { - securityGroupData.setObjectName("egressrule"); - egressResponses.add(securityGroupData); - } - - } - response.setSecurityGroupIngressRules(ingressResponses); - response.setSecurityGroupEgressRules(egressResponses); - response.setObjectName("securitygroup"); - - } - return response; - } - - @Override - public NetworkOfferingResponse createNetworkOfferingResponse(NetworkOffering offering) { - NetworkOfferingResponse response = new NetworkOfferingResponse(); - response.setId(offering.getId()); - response.setName(offering.getName()); - response.setDisplayText(offering.getDisplayText()); - response.setTags(offering.getTags()); - response.setTrafficType(offering.getTrafficType().toString()); - response.setIsDefault(offering.isDefault()); - response.setSpecifyVlan(offering.getSpecifyVlan()); - response.setConserveMode(offering.isConserveMode()); - response.setSpecifyIpRanges(offering.getSpecifyIpRanges()); - response.setAvailability(offering.getAvailability().toString()); - response.setNetworkRate(ApiDBUtils.getNetworkRate(offering.getId())); - if (offering.getServiceOfferingId() != null) { - response.setServiceOfferingId(offering.getServiceOfferingId()); - } else { - response.setServiceOfferingId(ApiDBUtils.findDefaultRouterServiceOffering()); - } - if (offering.getGuestType() != null) { - response.setGuestIpType(offering.getGuestType().toString()); - } - - response.setState(offering.getState().name()); - - Map> serviceProviderMap = ApiDBUtils.listNetworkOfferingServices(offering.getId()); - List serviceResponses = new ArrayList(); - for (Service service : serviceProviderMap.keySet()) { - ServiceResponse svcRsp = new ServiceResponse(); - // skip gateway service - if (service == Service.Gateway) { - continue; - } - svcRsp.setName(service.getName()); - List providers = new ArrayList(); - for (Provider provider : serviceProviderMap.get(service)) { - if (provider != null) { - ProviderResponse providerRsp = new ProviderResponse(); - providerRsp.setName(provider.getName()); - providers.add(providerRsp); - } - } - svcRsp.setProviders(providers); - - if (Service.Lb == service) { - List lbCapResponse = new ArrayList(); - - CapabilityResponse lbIsoaltion = new CapabilityResponse(); - lbIsoaltion.setName(Capability.SupportedLBIsolation.getName()); - lbIsoaltion.setValue(offering.getDedicatedLB() ? "dedicated" : "shared"); - lbCapResponse.add(lbIsoaltion); - - CapabilityResponse eLb = new CapabilityResponse(); - eLb.setName(Capability.ElasticLb.getName()); - eLb.setValue(offering.getElasticLb() ? "true" : "false"); - lbCapResponse.add(eLb); - - svcRsp.setCapabilities(lbCapResponse); - } else if (Service.SourceNat == service) { - List capabilities = new ArrayList(); - CapabilityResponse sharedSourceNat = new CapabilityResponse(); - sharedSourceNat.setName(Capability.SupportedSourceNatTypes.getName()); - sharedSourceNat.setValue(offering.getSharedSourceNat() ? "perzone" : "peraccount"); - capabilities.add(sharedSourceNat); - - CapabilityResponse redundantRouter = new CapabilityResponse(); - redundantRouter.setName(Capability.RedundantRouter.getName()); - redundantRouter.setValue(offering.getRedundantRouter() ? "true" : "false"); - capabilities.add(redundantRouter); - - svcRsp.setCapabilities(capabilities); - } else if (service == Service.StaticNat) { - List staticNatCapResponse = new ArrayList(); - - CapabilityResponse eIp = new CapabilityResponse(); - eIp.setName(Capability.ElasticIp.getName()); - eIp.setValue(offering.getElasticLb() ? "true" : "false"); - staticNatCapResponse.add(eIp); - - svcRsp.setCapabilities(staticNatCapResponse); - } - - serviceResponses.add(svcRsp); - } - response.setForVpc(ApiDBUtils.isOfferingForVpc(offering)); - - response.setServices(serviceResponses); - response.setObjectName("networkoffering"); - return response; - } - - @Override - public NetworkResponse createNetworkResponse(Network network) { - // need to get network profile in order to retrieve dns information from there - NetworkProfile profile = ApiDBUtils.getNetworkProfile(network.getId()); - NetworkResponse response = new NetworkResponse(); - response.setId(network.getId()); - response.setName(network.getName()); - response.setDisplaytext(network.getDisplayText()); - if (network.getBroadcastDomainType() != null) { - response.setBroadcastDomainType(network.getBroadcastDomainType().toString()); - } - - if (network.getTrafficType() != null) { - response.setTrafficType(network.getTrafficType().name()); - } - - if (network.getGuestType() != null) { - response.setType(network.getGuestType().toString()); - } - - response.setGateway(network.getGateway()); - - // FIXME - either set netmask or cidr - response.setCidr(network.getCidr()); - if (network.getCidr() != null) { - response.setNetmask(NetUtils.cidr2Netmask(network.getCidr())); - } - - if (network.getBroadcastUri() != null) { - String broadcastUri = network.getBroadcastUri().toString(); - response.setBroadcastUri(broadcastUri); - String vlan="N/A"; - if (broadcastUri.startsWith("vlan")) { - vlan = broadcastUri.substring("vlan://".length(), broadcastUri.length()); - } - response.setVlan(vlan); - } - - DataCenter zone = ApiDBUtils.findZoneById(network.getDataCenterId()); - response.setZoneId(network.getDataCenterId()); - response.setZoneName(zone.getName()); - response.setPhysicalNetworkId(network.getPhysicalNetworkId()); - - // populate network offering information - NetworkOffering networkOffering = ApiDBUtils.findNetworkOfferingById(network.getNetworkOfferingId()); - if (networkOffering != null) { - response.setNetworkOfferingId(networkOffering.getId()); - response.setNetworkOfferingName(networkOffering.getName()); - response.setNetworkOfferingDisplayText(networkOffering.getDisplayText()); - response.setIsSystem(networkOffering.isSystemOnly()); - response.setNetworkOfferingAvailability(networkOffering.getAvailability().toString()); - } - - if (network.getAclType() != null) { - response.setAclType(network.getAclType().toString()); - } - response.setState(network.getState().toString()); - response.setRestartRequired(network.isRestartRequired()); - response.setRelated(network.getRelated()); - response.setNetworkDomain(network.getNetworkDomain()); - - response.setDns1(profile.getDns1()); - response.setDns2(profile.getDns2()); - // populate capability - Map> serviceCapabilitiesMap = ApiDBUtils.getNetworkCapabilities(network.getId(), network.getDataCenterId()); - List serviceResponses = new ArrayList(); - if (serviceCapabilitiesMap != null) { - for (Service service : serviceCapabilitiesMap.keySet()) { - ServiceResponse serviceResponse = new ServiceResponse(); - // skip gateway service - if (service == Service.Gateway) { - continue; - } - serviceResponse.setName(service.getName()); - - // set list of capabilities for the service - List capabilityResponses = new ArrayList(); - Map serviceCapabilities = serviceCapabilitiesMap.get(service); - if (serviceCapabilities != null) { - for (Capability capability : serviceCapabilities.keySet()) { - CapabilityResponse capabilityResponse = new CapabilityResponse(); - String capabilityValue = serviceCapabilities.get(capability); - capabilityResponse.setName(capability.getName()); - capabilityResponse.setValue(capabilityValue); - capabilityResponse.setObjectName("capability"); - capabilityResponses.add(capabilityResponse); - } - serviceResponse.setCapabilities(capabilityResponses); - } - - serviceResponse.setObjectName("service"); - serviceResponses.add(serviceResponse); - } - } - response.setServices(serviceResponses); - - if (network.getAclType() == null || network.getAclType() == ACLType.Account) { - populateOwner(response, network); - } else { - // get domain from network_domain table - Pair domainNetworkDetails = ApiDBUtils.getDomainNetworkDetails(network.getId()); - response.setDomainId(domainNetworkDetails.first()); - response.setSubdomainAccess(domainNetworkDetails.second()); - } - - Long dedicatedDomainId = ApiDBUtils.getDedicatedNetworkDomain(network.getId()); - if (dedicatedDomainId != null) { - Domain domain = ApiDBUtils.findDomainById(dedicatedDomainId); - response.setDomainId(dedicatedDomainId); - response.setDomainName(domain.getName()); - } - - response.setSpecifyIpRanges(network.getSpecifyIpRanges()); - response.setCanUseForDeploy(ApiDBUtils.canUseForDeploy(network)); - response.setVpcId(network.getVpcId()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Network, network.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setObjectName("network"); - return response; - } - - @Override - public Long getSecurityGroupId(String groupName, long accountId) { - SecurityGroup sg = ApiDBUtils.getSecurityGroup(groupName, accountId); - if (sg == null) { - return null; - } else { - return sg.getId(); - } - } - - @Override - public ProjectResponse createProjectResponse(Project project) { - ProjectResponse response = new ProjectResponse(); - response.setId(project.getId()); - response.setName(project.getName()); - response.setDisplaytext(project.getDisplayText()); - response.setState(project.getState().toString()); - - Domain domain = ApiDBUtils.findDomainById(project.getDomainId()); - response.setDomainId(domain.getId()); - response.setDomain(domain.getName()); - - response.setOwner(ApiDBUtils.getProjectOwner(project.getId()).getAccountName()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Project, project.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setObjectName("project"); - return response; - } - - @Override - public FirewallResponse createFirewallResponse(FirewallRule fwRule) { - FirewallResponse response = new FirewallResponse(); - - response.setId(fwRule.getId()); - response.setProtocol(fwRule.getProtocol()); - if (fwRule.getSourcePortStart() != null) { - response.setStartPort(Integer.toString(fwRule.getSourcePortStart())); - } - - if (fwRule.getSourcePortEnd() != null) { - response.setEndPort(Integer.toString(fwRule.getSourcePortEnd())); - } - - List cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId()); - response.setCidrList(StringUtils.join(cidrs, ",")); - - IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId()); - response.setPublicIpAddressId(ip.getId()); - response.setPublicIpAddress(ip.getAddress().addr()); - - FirewallRule.State state = fwRule.getState(); - String stateToSet = state.toString(); - if (state.equals(FirewallRule.State.Revoke)) { - stateToSet = "Deleting"; - } - - response.setIcmpCode(fwRule.getIcmpCode()); - response.setIcmpType(fwRule.getIcmpType()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.FirewallRule, fwRule.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setState(stateToSet); - response.setObjectName("firewallrule"); - return response; - } - - @Override - public NetworkACLResponse createNetworkACLResponse(FirewallRule networkACL) { - NetworkACLResponse response = new NetworkACLResponse(); - - response.setId(networkACL.getId()); - response.setProtocol(networkACL.getProtocol()); - if (networkACL.getSourcePortStart() != null) { - response.setStartPort(Integer.toString(networkACL.getSourcePortStart())); - } - - if (networkACL.getSourcePortEnd() != null) { - response.setEndPort(Integer.toString(networkACL.getSourcePortEnd())); - } - - List cidrs = ApiDBUtils.findFirewallSourceCidrs(networkACL.getId()); - response.setCidrList(StringUtils.join(cidrs, ",")); - - response.setTrafficType(networkACL.getTrafficType().toString()); - - FirewallRule.State state = networkACL.getState(); - String stateToSet = state.toString(); - if (state.equals(FirewallRule.State.Revoke)) { - stateToSet = "Deleting"; - } - - response.setIcmpCode(networkACL.getIcmpCode()); - response.setIcmpType(networkACL.getIcmpType()); - - response.setState(stateToSet); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.NetworkACL, networkACL.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setObjectName("networkacl"); - return response; - } - - public UserVmData newUserVmData(UserVm userVm) { - UserVmData userVmData = new UserVmData(); - userVmData.setId(userVm.getId()); - userVmData.setName(userVm.getHostName()); - userVmData.setCreated(userVm.getCreated()); - userVmData.setGuestOsId(userVm.getGuestOSId()); - userVmData.setHaEnable(userVm.isHaEnabled()); - if (userVm.getState() != null) { - userVmData.setState(userVm.getState().toString()); - } - if (userVm.getDisplayName() != null) { - userVmData.setDisplayName(userVm.getDisplayName()); - } else { - userVmData.setDisplayName(userVm.getHostName()); - } - userVmData.setInstanceName(userVm.getInstanceName()); - - userVmData.setDomainId(userVm.getDomainId()); - - if (userVm.getHypervisorType() != null) { - userVmData.setHypervisor(userVm.getHypervisorType().toString()); - } - - if (userVm.getPassword() != null) { - userVmData.setPassword(userVm.getPassword()); - } - return userVmData; - } - - public UserVmResponse newUserVmResponse(UserVmData userVmData, boolean caller_is_admin) { - UserVmResponse userVmResponse = new UserVmResponse(); - - userVmResponse.setHypervisor(userVmData.getHypervisor()); - userVmResponse.setId(userVmData.getId()); - userVmResponse.setName(userVmData.getName()); - - userVmResponse.setDisplayName(userVmData.getDisplayName()); - - populateAccount(userVmResponse, userVmData.getAccountId()); - populateDomain(userVmResponse, userVmData.getDomainId()); - - userVmResponse.setCreated(userVmData.getCreated()); - userVmResponse.setState(userVmData.getState()); - userVmResponse.setHaEnable(userVmData.getHaEnable()); - userVmResponse.setGroupId(userVmData.getGroupId()); - userVmResponse.setGroup(userVmData.getGroup()); - userVmResponse.setZoneId(userVmData.getZoneId()); - userVmResponse.setZoneName(userVmData.getZoneName()); - if (caller_is_admin) { - userVmResponse.setInstanceName(userVmData.getInstanceName()); - userVmResponse.setHostId(userVmData.getHostId()); - userVmResponse.setHostName(userVmData.getHostName()); - } - userVmResponse.setTemplateId(userVmData.getTemplateId()); - userVmResponse.setTemplateName(userVmData.getTemplateName()); - userVmResponse.setTemplateDisplayText(userVmData.getTemplateDisplayText()); - userVmResponse.setPasswordEnabled(userVmData.getPasswordEnabled()); - userVmResponse.setIsoId(userVmData.getIsoId()); - userVmResponse.setIsoName(userVmData.getIsoName()); - userVmResponse.setIsoDisplayText(userVmData.getIsoDisplayText()); - userVmResponse.setServiceOfferingId(userVmData.getServiceOfferingId()); - userVmResponse.setServiceOfferingName(userVmData.getServiceOfferingName()); - userVmResponse.setCpuNumber(userVmData.getCpuNumber()); - userVmResponse.setCpuSpeed(userVmData.getCpuSpeed()); - userVmResponse.setMemory(userVmData.getMemory()); - userVmResponse.setCpuUsed(userVmData.getCpuUsed()); - userVmResponse.setNetworkKbsRead(userVmData.getNetworkKbsRead()); - userVmResponse.setNetworkKbsWrite(userVmData.getNetworkKbsWrite()); - userVmResponse.setGuestOsId(userVmData.getGuestOsId()); - userVmResponse.setRootDeviceId(userVmData.getRootDeviceId()); - userVmResponse.setRootDeviceType(userVmData.getRootDeviceType()); - userVmResponse.setPassword(userVmData.getPassword()); - userVmResponse.setJobId(userVmData.getJobId()); - userVmResponse.setJobStatus(userVmData.getJobStatus()); - userVmResponse.setForVirtualNetwork(userVmData.getForVirtualNetwork()); - - Set securityGroupResponse = new HashSet(); - for (SecurityGroupData sgd : userVmData.getSecurityGroupList()) { - if (sgd.getId() != null) { - SecurityGroupResponse sgr = new SecurityGroupResponse(); - sgr.setId(sgd.getId()); - sgr.setName(sgd.getName()); - sgr.setDescription(sgd.getDescription()); - - Account account = ApiDBUtils.findAccountByNameDomain(sgd.getAccountName(), sgd.getDomainId()); - if (account != null) { - populateAccount(sgr, account.getId()); - populateDomain(sgr, account.getDomainId()); - } - - sgr.setObjectName(sgd.getObjectName()); - securityGroupResponse.add(sgr); - } - } - userVmResponse.setSecurityGroupList(new ArrayList(securityGroupResponse)); - - Set nicResponses = new HashSet(); - for (NicData nd : userVmData.getNics()) { - NicResponse nr = new NicResponse(); - nr.setId(nd.getId()); - nr.setNetworkid(nd.getNetworkid()); - nr.setNetmask(nd.getNetmask()); - nr.setGateway(nd.getGateway()); - nr.setIpaddress(nd.getIpaddress()); - nr.setIsolationUri(nd.getIsolationUri()); - nr.setBroadcastUri(nd.getBroadcastUri()); - nr.setTrafficType(nd.getTrafficType()); - nr.setType(nd.getType()); - nr.setIsDefault(nd.getIsDefault()); - nr.setMacAddress(nd.getMacAddress()); - nr.setObjectName(nd.getObjectName()); - nicResponses.add(nr); - } - userVmResponse.setNics(new ArrayList(nicResponses)); - userVmResponse.setPublicIpId(userVmData.getPublicIpId()); - userVmResponse.setPublicIp(userVmData.getPublicIp()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, userVmData.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - userVmResponse.setTags(tagResponses); - - return userVmResponse; - } - - @Override - public HypervisorCapabilitiesResponse createHypervisorCapabilitiesResponse(HypervisorCapabilities hpvCapabilities) { - HypervisorCapabilitiesResponse hpvCapabilitiesResponse = new HypervisorCapabilitiesResponse(); - hpvCapabilitiesResponse.setId(hpvCapabilities.getId()); - hpvCapabilitiesResponse.setHypervisor(hpvCapabilities.getHypervisorType()); - hpvCapabilitiesResponse.setHypervisorVersion(hpvCapabilities.getHypervisorVersion()); - hpvCapabilitiesResponse.setIsSecurityGroupEnabled(hpvCapabilities.isSecurityGroupEnabled()); - hpvCapabilitiesResponse.setMaxGuestsLimit(hpvCapabilities.getMaxGuestsLimit()); - return hpvCapabilitiesResponse; - } - - private void populateOwner(ControlledEntityResponse response, ControlledEntity object) { - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(object.getAccountId()); - - if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { - // find the project - Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); - response.setProjectId(project.getId()); - response.setProjectName(project.getName()); - } else { - response.setAccountName(account.getAccountName()); - } - - Domain domain = ApiDBUtils.findDomainById(object.getDomainId()); - response.setDomainId(domain.getId()); - response.setDomainName(domain.getName()); - } - - private void populateAccount(ControlledEntityResponse response, long accountId) { - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(accountId); - if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { - // find the project - Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); - response.setProjectId(project.getId()); - response.setProjectName(project.getName()); - } else { - response.setAccountName(account.getAccountName()); - } - } - - private void populateDomain(ControlledEntityResponse response, long domainId) { - Domain domain = ApiDBUtils.findDomainById(domainId); - - response.setDomainId(domain.getId()); - response.setDomainName(domain.getName()); - } - - @Override - public ProjectAccountResponse createProjectAccountResponse(ProjectAccount projectAccount) { - Account account = ApiDBUtils.findAccountById(projectAccount.getAccountId()); - ProjectAccountResponse projectAccountResponse = new ProjectAccountResponse(); - - long projectId = projectAccount.getProjectId(); - projectAccountResponse.setProjectId(projectId); - projectAccountResponse.setProjectName(ApiDBUtils.findProjectById(projectId).getName()); - - projectAccountResponse.setId(account.getId()); - projectAccountResponse.setAccountName(account.getAccountName()); - projectAccountResponse.setAccountType(account.getType()); - projectAccountResponse.setRole(projectAccount.getAccountRole().toString()); - populateDomain(projectAccountResponse, account.getDomainId()); - - // add all the users for an account as part of the response obj - List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId()); - List userResponseList = new ArrayList(); - for (UserVO user : usersForAccount) { - UserResponse userResponse = createUserResponse(user); - userResponseList.add(userResponse); - } - - projectAccountResponse.setUsers(userResponseList); - projectAccountResponse.setObjectName("projectaccount"); - - return projectAccountResponse; - } - - @Override - public ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite) { - ProjectInvitationResponse response = new ProjectInvitationResponse(); - response.setId(invite.getId()); - response.setProjectId(invite.getProjectId()); - response.setProjectName(ApiDBUtils.findProjectById(invite.getProjectId()).getName()); - response.setInvitationState(invite.getState().toString()); - - if (invite.getForAccountId() != null) { - Account account = ApiDBUtils.findAccountById(invite.getForAccountId()); - response.setAccountName(account.getAccountName()); - - } else { - response.setEmail(invite.getEmail()); - } - - populateDomain(response, invite.getInDomainId()); - - response.setObjectName("projectinvitation"); - return response; - } - - @Override - public SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine vm) { - SystemVmInstanceResponse vmResponse = new SystemVmInstanceResponse(); - vmResponse.setId(vm.getId()); - vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); - vmResponse.setName(vm.getHostName()); - if (vm.getHostId() != null) { - vmResponse.setHostId(vm.getHostId()); - } - if (vm.getState() != null) { - vmResponse.setState(vm.getState().toString()); - } - if (vm.getType() == Type.DomainRouter) { - VirtualRouter router = (VirtualRouter) vm; - if (router.getRole() != null) { - vmResponse.setRole(router.getRole().toString()); - } - } - vmResponse.setObjectName("systemvminstance"); - return vmResponse; - } - - @Override - public PhysicalNetworkResponse createPhysicalNetworkResponse(PhysicalNetwork result) { - PhysicalNetworkResponse response = new PhysicalNetworkResponse(); - - response.setZoneId(result.getDataCenterId()); - response.setNetworkSpeed(result.getSpeed()); - response.setVlan(result.getVnet()); - response.setDomainId(result.getDomainId()); - response.setId(result.getUuid()); - if (result.getBroadcastDomainRange() != null) { - response.setBroadcastDomainRange(result.getBroadcastDomainRange().toString()); - } - response.setIsolationMethods(result.getIsolationMethods()); - response.setTags(result.getTags()); - if (result.getState() != null) { - response.setState(result.getState().toString()); - } - - response.setName(result.getName()); - - response.setObjectName("physicalnetwork"); - return response; - } - - @Override - public ServiceResponse createNetworkServiceResponse(Service service) { - ServiceResponse response = new ServiceResponse(); - response.setName(service.getName()); - - // set list of capabilities required for the service - List capabilityResponses = new ArrayList(); - Capability[] capabilities = service.getCapabilities(); - for (Capability cap : capabilities) { - CapabilityResponse capabilityResponse = new CapabilityResponse(); - capabilityResponse.setName(cap.getName()); - capabilityResponse.setObjectName("capability"); - if (cap.getName().equals(Capability.SupportedLBIsolation.getName()) || - cap.getName().equals(Capability.SupportedSourceNatTypes.getName()) || - cap.getName().equals(Capability.RedundantRouter.getName())) { - capabilityResponse.setCanChoose(true); - } else { - capabilityResponse.setCanChoose(false); - } - capabilityResponses.add(capabilityResponse); - } - response.setCapabilities(capabilityResponses); - - // set list of providers providing this service - List serviceProviders = ApiDBUtils.getProvidersForService(service); - List serviceProvidersResponses = new ArrayList(); - for (Network.Provider serviceProvider : serviceProviders) { - // return only Virtual Router/JuniperSRX as a provider for the firewall - if (service == Service.Firewall && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.JuniperSRX)) { - continue; - } - - ProviderResponse serviceProviderResponse = createServiceProviderResponse(serviceProvider); - serviceProvidersResponses.add(serviceProviderResponse); - } - response.setProviders(serviceProvidersResponses); - - response.setObjectName("networkservice"); - return response; - - } - - private ProviderResponse createServiceProviderResponse(Provider serviceProvider) { - ProviderResponse response = new ProviderResponse(); - response.setName(serviceProvider.getName()); - boolean canEnableIndividualServices = ApiDBUtils.canElementEnableIndividualServices(serviceProvider); - response.setCanEnableIndividualServices(canEnableIndividualServices); - return response; - } - - @Override - public ProviderResponse createNetworkServiceProviderResponse(PhysicalNetworkServiceProvider result) { - ProviderResponse response = new ProviderResponse(); - response.setId(result.getUuid()); - response.setName(result.getProviderName()); - response.setPhysicalNetworkId(result.getPhysicalNetworkId()); - response.setDestinationPhysicalNetworkId(result.getDestinationPhysicalNetworkId()); - response.setState(result.getState().toString()); - - // set enabled services - List services = new ArrayList(); - for (Service service : result.getEnabledServices()) { - services.add(service.getName()); - } - response.setServices(services); - - response.setObjectName("networkserviceprovider"); - return response; - } - - @Override - public TrafficTypeResponse createTrafficTypeResponse(PhysicalNetworkTrafficType result) { - TrafficTypeResponse response = new TrafficTypeResponse(); - response.setId(result.getUuid()); - response.setPhysicalNetworkId(result.getPhysicalNetworkId()); - response.setTrafficType(result.getTrafficType().toString()); - response.setXenLabel(result.getXenNetworkLabel()); - response.setKvmLabel(result.getKvmNetworkLabel()); - response.setVmwareLabel(result.getVmwareNetworkLabel()); - - response.setObjectName("traffictype"); - return response; - } - - @Override - public VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result) { - VirtualRouterProviderResponse response = new VirtualRouterProviderResponse(); - response.setId(result.getId()); - response.setNspId(result.getNspId()); - response.setEnabled(result.isEnabled()); - - response.setObjectName("virtualrouterelement"); - return response; - } - - @Override - public LBStickinessResponse createLBStickinessPolicyResponse( - StickinessPolicy stickinessPolicy, LoadBalancer lb) { - LBStickinessResponse spResponse = new LBStickinessResponse(); - - spResponse.setlbRuleId(lb.getId()); - Account accountTemp = ApiDBUtils.findAccountById(lb.getAccountId()); - if (accountTemp != null) { - spResponse.setAccountName(accountTemp.getAccountName()); - spResponse.setDomainId(accountTemp.getDomainId()); - spResponse.setDomainName(ApiDBUtils.findDomainById( - accountTemp.getDomainId()).getName()); - } - - List responses = new ArrayList(); - LBStickinessPolicyResponse ruleResponse = new LBStickinessPolicyResponse( - stickinessPolicy); - responses.add(ruleResponse); - - spResponse.setRules(responses); - - spResponse.setObjectName("stickinesspolicies"); - return spResponse; - } - - @Override - public LBStickinessResponse createLBStickinessPolicyResponse( - List stickinessPolicies, LoadBalancer lb) { - LBStickinessResponse spResponse = new LBStickinessResponse(); - - if (lb == null) - return spResponse; - spResponse.setlbRuleId(lb.getId()); - Account account = ApiDBUtils.findAccountById(lb.getAccountId()); - if (account != null) { - spResponse.setAccountName(account.getAccountName()); - spResponse.setDomainId(account.getDomainId()); - spResponse.setDomainName(ApiDBUtils.findDomainById( - account.getDomainId()).getName()); - } - - List responses = new ArrayList(); - for (StickinessPolicy stickinessPolicy : stickinessPolicies) { - LBStickinessPolicyResponse ruleResponse = new LBStickinessPolicyResponse(stickinessPolicy); - responses.add(ruleResponse); - } - spResponse.setRules(responses); - - spResponse.setObjectName("stickinesspolicies"); - return spResponse; - } - - @Override - public LDAPConfigResponse createLDAPConfigResponse(String hostname, - Integer port, Boolean useSSL, String queryFilter, - String searchBase, String bindDN) { - LDAPConfigResponse lr = new LDAPConfigResponse(); - lr.setHostname(hostname); - lr.setPort(port.toString()); - lr.setUseSSL(useSSL.toString()); - lr.setQueryFilter(queryFilter); - lr.setBindDN(bindDN); - lr.setSearchBase(searchBase); - lr.setObjectName("ldapconfig"); - return lr; - } - - @Override - public StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result) { - StorageNetworkIpRangeResponse response = new StorageNetworkIpRangeResponse(); - response.setUuid(result.getUuid()); - response.setVlan(result.getVlan()); - response.setEndIp(result.getEndIp()); - response.setStartIp(result.getStartIp()); - response.setPodUuid(result.getPodUuid()); - response.setZoneUuid(result.getZoneUuid()); - response.setNetworkUuid(result.getNetworkUuid()); - response.setNetmask(result.getNetmask()); - response.setGateway(result.getGateway()); - response.setObjectName("storagenetworkiprange"); - return response; - } - - @Override - public Long getIdentiyId(String tableName, String token) { - return ApiDispatcher.getIdentiyId(tableName, token); - } - - @Override - public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) { - ResourceTagResponse response = new ResourceTagResponse(); - response.setKey(resourceTag.getKey()); - response.setValue(resourceTag.getValue()); - - if (!keyValueOnly) { - response.setResourceType(resourceTag.getResourceType().toString()); - response.setId(ApiDBUtils.getUuid(String.valueOf(resourceTag.getResourceId()),resourceTag.getResourceType())); - Long accountId = resourceTag.getAccountId(); - Long domainId = resourceTag.getDomainId(); - if (accountId != null) { - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(resourceTag.getAccountId()); - - if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { - // find the project - Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); - response.setProjectId(project.getId()); - response.setProjectName(project.getName()); - } else { - response.setAccountName(account.getAccountName()); - } - } - - if (domainId != null) { - response.setDomainId(domainId); - response.setDomainName(ApiDBUtils.findDomainById(domainId).getName()); - } - - response.setCustomer(resourceTag.getCustomer()); - } - - response.setObjectName("tag"); - - return response; - } - - @Override - public VpcOfferingResponse createVpcOfferingResponse(VpcOffering offering) { - VpcOfferingResponse response = new VpcOfferingResponse(); - response.setId(offering.getId()); - response.setName(offering.getName()); - response.setDisplayText(offering.getDisplayText()); - response.setIsDefault(offering.isDefault()); - response.setState(offering.getState().name()); - - Map> serviceProviderMap = ApiDBUtils.listVpcOffServices(offering.getId()); - List serviceResponses = new ArrayList(); - for (Service service : serviceProviderMap.keySet()) { - ServiceResponse svcRsp = new ServiceResponse(); - // skip gateway service - if (service == Service.Gateway) { - continue; - } - svcRsp.setName(service.getName()); - List providers = new ArrayList(); - for (Provider provider : serviceProviderMap.get(service)) { - if (provider != null) { - ProviderResponse providerRsp = new ProviderResponse(); - providerRsp.setName(provider.getName()); - providers.add(providerRsp); - } - } - svcRsp.setProviders(providers); - - serviceResponses.add(svcRsp); - } - response.setServices(serviceResponses); - response.setObjectName("vpcoffering"); - return response; - } - - - @Override - public VpcResponse createVpcResponse(Vpc vpc) { - VpcResponse response = new VpcResponse(); - response.setId(vpc.getId()); - response.setName(vpc.getName()); - response.setDisplayText(vpc.getDisplayText()); - response.setState(vpc.getState().name()); - response.setVpcOfferingId(vpc.getVpcOfferingId()); - response.setCidr(vpc.getCidr()); - response.setRestartRequired(vpc.isRestartRequired()); - response.setNetworkDomain(vpc.getNetworkDomain()); - - Map> serviceProviderMap = ApiDBUtils.listVpcOffServices(vpc.getVpcOfferingId()); - List serviceResponses = new ArrayList(); - for (Service service : serviceProviderMap.keySet()) { - ServiceResponse svcRsp = new ServiceResponse(); - // skip gateway service - if (service == Service.Gateway) { - continue; - } - svcRsp.setName(service.getName()); - List providers = new ArrayList(); - for (Provider provider : serviceProviderMap.get(service)) { - if (provider != null) { - ProviderResponse providerRsp = new ProviderResponse(); - providerRsp.setName(provider.getName()); - providers.add(providerRsp); - } - } - svcRsp.setProviders(providers); - - serviceResponses.add(svcRsp); - } - - List networkResponses = new ArrayList(); - List networks = ApiDBUtils.listVpcNetworks(vpc.getId()); - for (Network network : networks) { - NetworkResponse ntwkRsp = createNetworkResponse(network); - networkResponses.add(ntwkRsp); - } - - DataCenter zone = ApiDBUtils.findZoneById(vpc.getZoneId()); - response.setZoneId(vpc.getZoneId()); - response.setZoneName(zone.getName()); - - response.setNetworks(networkResponses); - response.setServices(serviceResponses); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Vpc, vpc.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - - response.setObjectName("vpc"); - return response; - } - - @Override - public PrivateGatewayResponse createPrivateGatewayResponse(PrivateGateway result) { - PrivateGatewayResponse response = new PrivateGatewayResponse(); - response.setId(result.getId()); - response.setVlan(result.getVlanTag()); - response.setGateway(result.getGateway()); - response.setNetmask(result.getNetmask()); - response.setVpcId(result.getVpcId()); - response.setZoneId(result.getZoneId()); - DataCenter zone = ApiDBUtils.findZoneById(result.getZoneId()); - response.setZoneName(zone.getName()); - response.setAddress(result.getIp4Address()); - response.setPhysicalNetworkId(result.getPhysicalNetworkId()); - - populateAccount(response, result.getAccountId()); - populateDomain(response, result.getDomainId()); - response.setState(result.getState().toString()); - - response.setObjectName("privategateway"); - - return response; - } - - @Override - public StaticRouteResponse createStaticRouteResponse(StaticRoute result) { - StaticRouteResponse response = new StaticRouteResponse(); - response.setId(result.getId()); - response.setVpcId(result.getVpcId()); - response.setCidr(result.getCidr()); - - StaticRoute.State state = result.getState(); - String stateToSet = state.toString(); - if (state.equals(FirewallRule.State.Revoke)) { - stateToSet = "Deleting"; - } - response.setState(stateToSet); - populateAccount(response, result.getAccountId()); - populateDomain(response, result.getDomainId()); - - //set tag information - List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.StaticRoute, result.getId()); - List tagResponses = new ArrayList(); - for (ResourceTag tag : tags) { - ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); - tagResponses.add(tagResponse); - } - response.setTags(tagResponses); - response.setObjectName("staticroute"); - - return response; - } - - @Override - public Site2SiteVpnGatewayResponse createSite2SiteVpnGatewayResponse(Site2SiteVpnGateway result) { - Site2SiteVpnGatewayResponse response = new Site2SiteVpnGatewayResponse(); - response.setId(result.getId()); - response.setIp(ApiDBUtils.findIpAddressById(result.getAddrId()).getAddress().toString()); - response.setVpcId(result.getVpcId()); - response.setRemoved(result.getRemoved()); - response.setObjectName("vpngateway"); - - populateAccount(response, result.getAccountId()); - populateDomain(response, result.getDomainId()); - - return response; - } - - @Override - public Site2SiteCustomerGatewayResponse createSite2SiteCustomerGatewayResponse(Site2SiteCustomerGateway result) { - Site2SiteCustomerGatewayResponse response = new Site2SiteCustomerGatewayResponse(); - response.setId(result.getId()); - response.setGatewayIp(result.getGatewayIp()); - response.setGuestCidrList(result.getGuestCidrList()); - response.setIpsecPsk(result.getIpsecPsk()); - response.setRemoved(result.getRemoved()); - response.setObjectName("vpncustomergateway"); - - populateAccount(response, result.getAccountId()); - populateDomain(response, result.getDomainId()); - - return response; - } - - @Override - public Site2SiteVpnConnectionResponse createSite2SiteVpnConnectionResponse(Site2SiteVpnConnection result) { - Site2SiteVpnConnectionResponse response = new Site2SiteVpnConnectionResponse(); - response.setId(result.getId()); - - response.setVpnGatewayId(result.getVpnGatewayId()); - Long vpnGatewayId = result.getVpnGatewayId(); - if(vpnGatewayId != null) { - Site2SiteVpnGatewayVO vpnGateway = ApiDBUtils.findVpnGatewayById(vpnGatewayId); - - long ipId = vpnGateway.getAddrId(); - IPAddressVO ipObj = ApiDBUtils.findIpAddressById(ipId); - response.setIp(ipObj.getAddress().addr()); - } - - response.setCustomerGatewayId(result.getCustomerGatewayId()); - Long customerGatewayId = result.getCustomerGatewayId(); - if(customerGatewayId != null) { - Site2SiteCustomerGatewayVO customerGateway = ApiDBUtils.findCustomerGatewayById(customerGatewayId); - response.setGatewayIp(customerGateway.getGatewayIp()); - response.setGuestCidrList(customerGateway.getGuestCidrList()); - response.setIpsecPsk(customerGateway.getIpsecPsk()); - response.setIkePolicy(customerGateway.getIkePolicy()); - response.setEspPolicy(customerGateway.getEspPolicy()); - response.setLifetime(customerGateway.getLifetime()); - } - - populateAccount(response, result.getAccountId()); - populateDomain(response, result.getDomainId()); - - response.setState(result.getState().toString()); - response.setCreated(result.getCreated()); - response.setRemoved(result.getRemoved()); - response.setObjectName("vpnconnection"); - return response; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; + +import org.apache.log4j.Logger; + +import com.cloud.acl.ControlledEntity; +import com.cloud.acl.ControlledEntity.ACLType; +import com.cloud.api.ApiConstants.HostDetails; +import com.cloud.api.ApiConstants.VMDetails; +import com.cloud.api.commands.QueryAsyncJobResultCmd; +import com.cloud.api.response.AccountResponse; +import com.cloud.api.response.ApiResponseSerializer; +import com.cloud.api.response.AsyncJobResponse; +import com.cloud.api.response.AutoScalePolicyResponse; +import com.cloud.api.response.AutoScaleVmGroupResponse; +import com.cloud.api.response.AutoScaleVmProfileResponse; +import com.cloud.api.response.CapabilityResponse; +import com.cloud.api.response.CapacityResponse; +import com.cloud.api.response.ClusterResponse; +import com.cloud.api.response.ConditionResponse; +import com.cloud.api.response.ConfigurationResponse; +import com.cloud.api.response.ControlledEntityResponse; +import com.cloud.api.response.CounterResponse; +import com.cloud.api.response.CreateCmdResponse; +import com.cloud.api.response.DiskOfferingResponse; +import com.cloud.api.response.DomainResponse; +import com.cloud.api.response.DomainRouterResponse; +import com.cloud.api.response.EventResponse; +import com.cloud.api.response.ExtractResponse; +import com.cloud.api.response.FirewallResponse; +import com.cloud.api.response.FirewallRuleResponse; +import com.cloud.api.response.HostResponse; +import com.cloud.api.response.HypervisorCapabilitiesResponse; +import com.cloud.api.response.IPAddressResponse; +import com.cloud.api.response.InstanceGroupResponse; +import com.cloud.api.response.IpForwardingRuleResponse; +import com.cloud.api.response.LBStickinessPolicyResponse; +import com.cloud.api.response.LBStickinessResponse; +import com.cloud.api.response.LDAPConfigResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.LoadBalancerResponse; +import com.cloud.api.response.NetworkACLResponse; +import com.cloud.api.response.NetworkOfferingResponse; +import com.cloud.api.response.NetworkResponse; +import com.cloud.api.response.NicResponse; +import com.cloud.api.response.PhysicalNetworkResponse; +import com.cloud.api.response.PodResponse; +import com.cloud.api.response.PrivateGatewayResponse; +import com.cloud.api.response.ProjectAccountResponse; +import com.cloud.api.response.ProjectInvitationResponse; +import com.cloud.api.response.ProjectResponse; +import com.cloud.api.response.ProviderResponse; +import com.cloud.api.response.RemoteAccessVpnResponse; +import com.cloud.api.response.ResourceCountResponse; +import com.cloud.api.response.ResourceLimitResponse; +import com.cloud.api.response.ResourceTagResponse; +import com.cloud.api.response.SecurityGroupResponse; +import com.cloud.api.response.SecurityGroupResultObject; +import com.cloud.api.response.SecurityGroupRuleResponse; +import com.cloud.api.response.SecurityGroupRuleResultObject; +import com.cloud.api.response.ServiceOfferingResponse; +import com.cloud.api.response.ServiceResponse; +import com.cloud.api.response.Site2SiteCustomerGatewayResponse; +import com.cloud.api.response.Site2SiteVpnConnectionResponse; +import com.cloud.api.response.Site2SiteVpnGatewayResponse; +import com.cloud.api.response.SnapshotPolicyResponse; +import com.cloud.api.response.SnapshotResponse; +import com.cloud.api.response.StaticRouteResponse; +import com.cloud.api.response.StorageNetworkIpRangeResponse; +import com.cloud.api.response.StoragePoolResponse; +import com.cloud.api.response.SwiftResponse; +import com.cloud.api.response.SystemVmInstanceResponse; +import com.cloud.api.response.SystemVmResponse; +import com.cloud.api.response.TemplatePermissionsResponse; +import com.cloud.api.response.TemplateResponse; +import com.cloud.api.response.TrafficTypeResponse; +import com.cloud.api.response.UserResponse; +import com.cloud.api.response.UserVmResponse; +import com.cloud.api.response.VirtualRouterProviderResponse; +import com.cloud.api.response.VlanIpRangeResponse; +import com.cloud.api.response.VolumeResponse; +import com.cloud.api.response.VpcOfferingResponse; +import com.cloud.api.response.VpcResponse; +import com.cloud.api.response.VpnUsersResponse; +import com.cloud.api.response.ZoneResponse; +import com.cloud.async.AsyncJob; +import com.cloud.capacity.Capacity; +import com.cloud.capacity.CapacityVO; +import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; +import com.cloud.configuration.Configuration; +import com.cloud.configuration.Resource.ResourceOwnerType; +import com.cloud.configuration.Resource.ResourceType; +import com.cloud.configuration.ResourceCount; +import com.cloud.configuration.ResourceLimit; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Pod; +import com.cloud.dc.StorageNetworkIpRange; +import com.cloud.dc.Vlan; +import com.cloud.dc.Vlan.VlanType; +import com.cloud.dc.VlanVO; +import com.cloud.domain.Domain; +import com.cloud.event.Event; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.host.Host; +import com.cloud.host.HostStats; +import com.cloud.host.HostVO; +import com.cloud.hypervisor.HypervisorCapabilities; +import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; +import com.cloud.network.Network; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.NetworkProfile; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.PhysicalNetworkTrafficType; +import com.cloud.network.RemoteAccessVpn; +import com.cloud.network.Site2SiteCustomerGateway; +import com.cloud.network.Site2SiteCustomerGatewayVO; +import com.cloud.network.Site2SiteVpnConnection; +import com.cloud.network.Site2SiteVpnGateway; +import com.cloud.network.Site2SiteVpnGatewayVO; +import com.cloud.network.VirtualRouterProvider; +import com.cloud.network.VpnUser; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.as.Condition; +import com.cloud.network.as.ConditionVO; +import com.cloud.network.as.Counter; +import com.cloud.network.router.VirtualRouter; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.StaticNatRule; +import com.cloud.network.rules.StickinessPolicy; +import com.cloud.network.security.SecurityGroup; +import com.cloud.network.security.SecurityGroupRules; +import com.cloud.network.security.SecurityGroupVO; +import com.cloud.network.security.SecurityRule; +import com.cloud.network.security.SecurityRule.SecurityRuleType; +import com.cloud.network.vpc.PrivateGateway; +import com.cloud.network.vpc.StaticRoute; +import com.cloud.network.vpc.Vpc; +import com.cloud.network.vpc.VpcOffering; +import com.cloud.offering.DiskOffering; +import com.cloud.offering.NetworkOffering; +import com.cloud.offering.ServiceOffering; +import com.cloud.org.Cluster; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectAccount; +import com.cloud.projects.ProjectInvitation; +import com.cloud.server.Criteria; +import com.cloud.server.ResourceTag; +import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.GuestOS; +import com.cloud.storage.GuestOSCategoryVO; +import com.cloud.storage.Snapshot; +import com.cloud.storage.Storage; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.storage.Storage.TemplateType; +import com.cloud.storage.StoragePool; +import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.StorageStats; +import com.cloud.storage.Swift; +import com.cloud.storage.UploadVO; +import com.cloud.storage.VMTemplateHostVO; +import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; +import com.cloud.storage.VMTemplateSwiftVO; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.snapshot.SnapshotPolicy; +import com.cloud.template.VirtualMachineTemplate; +import com.cloud.test.PodZoneConfig; +import com.cloud.user.Account; +import com.cloud.user.User; +import com.cloud.user.UserAccount; +import com.cloud.user.UserContext; +import com.cloud.user.UserStatisticsVO; +import com.cloud.user.UserVO; +import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; +import com.cloud.utils.StringUtils; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.ConsoleProxyVO; +import com.cloud.vm.InstanceGroup; +import com.cloud.vm.InstanceGroupVO; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachine.Type; +import com.cloud.vm.VmStats; +import com.cloud.vm.dao.UserVmData; +import com.cloud.vm.dao.UserVmData.NicData; +import com.cloud.vm.dao.UserVmData.SecurityGroupData; + +public class ApiResponseHelper implements ResponseGenerator { + + public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class); + private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##"); + + @Override + public UserResponse createUserResponse(User user) { + UserResponse userResponse = new UserResponse(); + Account account = ApiDBUtils.findAccountById(user.getAccountId()); + userResponse.setAccountName(account.getAccountName()); + userResponse.setAccountType(account.getType()); + userResponse.setCreated(user.getCreated()); + userResponse.setDomainId(account.getDomainId()); + userResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); + userResponse.setEmail(user.getEmail()); + userResponse.setFirstname(user.getFirstname()); + userResponse.setId(user.getId()); + userResponse.setLastname(user.getLastname()); + userResponse.setState(user.getState().toString()); + userResponse.setTimezone(user.getTimezone()); + userResponse.setUsername(user.getUsername()); + userResponse.setApiKey(user.getApiKey()); + userResponse.setSecretKey(user.getSecretKey()); + userResponse.setObjectName("user"); + + return userResponse; + } + + // this method is used for response generation via createAccount (which creates an account + user) + @Override + public AccountResponse createUserAccountResponse(UserAccount user) { + return createAccountResponse(ApiDBUtils.findAccountById(user.getAccountId())); + } + + @Override + public AccountResponse createAccountResponse(Account account) { + boolean accountIsAdmin = (account.getType() == Account.ACCOUNT_TYPE_ADMIN); + AccountResponse accountResponse = new AccountResponse(); + accountResponse.setId(account.getId()); + accountResponse.setName(account.getAccountName()); + accountResponse.setAccountType(account.getType()); + accountResponse.setDomainId(account.getDomainId()); + accountResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName()); + accountResponse.setState(account.getState().toString()); + accountResponse.setNetworkDomain(account.getNetworkDomain()); + accountResponse.setDefaultZone(account.getDefaultZoneId()); + + // get network stat + List stats = ApiDBUtils.listUserStatsBy(account.getId()); + if (stats == null) { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for user stats"); + } + + Long bytesSent = 0L; + Long bytesReceived = 0L; + for (UserStatisticsVO stat : stats) { + Long rx = stat.getNetBytesReceived() + stat.getCurrentBytesReceived(); + Long tx = stat.getNetBytesSent() + stat.getCurrentBytesSent(); + bytesReceived = bytesReceived + Long.valueOf(rx); + bytesSent = bytesSent + Long.valueOf(tx); + } + accountResponse.setBytesReceived(bytesReceived); + accountResponse.setBytesSent(bytesSent); + + // Get resource limits and counts + + Long vmLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.user_vm, account.getId()); + String vmLimitDisplay = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit); + Long vmTotal = ApiDBUtils.getResourceCount(ResourceType.user_vm, account.getId()); + String vmAvail = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit - vmTotal); + accountResponse.setVmLimit(vmLimitDisplay); + accountResponse.setVmTotal(vmTotal); + accountResponse.setVmAvailable(vmAvail); + + Long ipLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.public_ip, account.getId()); + String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit); + Long ipTotal = ApiDBUtils.getResourceCount(ResourceType.public_ip, account.getId()); + + Long ips = ipLimit - ipTotal; + // check how many free ips are left, and if it's less than max allowed number of ips from account - use this + // value + Long ipsLeft = ApiDBUtils.countFreePublicIps(); + boolean unlimited = true; + if (ips.longValue() > ipsLeft.longValue()) { + ips = ipsLeft; + unlimited = false; + } + + String ipAvail = ((accountIsAdmin || ipLimit == -1) && unlimited) ? "Unlimited" : String.valueOf(ips); + + accountResponse.setIpLimit(ipLimitDisplay); + accountResponse.setIpTotal(ipTotal); + accountResponse.setIpAvailable(ipAvail); + + Long volumeLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.volume, account.getId()); + String volumeLimitDisplay = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit); + Long volumeTotal = ApiDBUtils.getResourceCount(ResourceType.volume, account.getId()); + String volumeAvail = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit - volumeTotal); + accountResponse.setVolumeLimit(volumeLimitDisplay); + accountResponse.setVolumeTotal(volumeTotal); + accountResponse.setVolumeAvailable(volumeAvail); + + Long snapshotLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.snapshot, account.getId()); + String snapshotLimitDisplay = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit); + Long snapshotTotal = ApiDBUtils.getResourceCount(ResourceType.snapshot, account.getId()); + String snapshotAvail = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit - snapshotTotal); + accountResponse.setSnapshotLimit(snapshotLimitDisplay); + accountResponse.setSnapshotTotal(snapshotTotal); + accountResponse.setSnapshotAvailable(snapshotAvail); + + Long templateLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.template, account.getId()); + String templateLimitDisplay = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit); + Long templateTotal = ApiDBUtils.getResourceCount(ResourceType.template, account.getId()); + String templateAvail = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit - templateTotal); + accountResponse.setTemplateLimit(templateLimitDisplay); + accountResponse.setTemplateTotal(templateTotal); + accountResponse.setTemplateAvailable(templateAvail); + + // Get stopped and running VMs + int vmStopped = 0; + int vmRunning = 0; + + List permittedAccounts = new ArrayList(); + permittedAccounts.add(account.getId()); + + List virtualMachines = ApiDBUtils.searchForUserVMs(new Criteria(), permittedAccounts); + + // get Running/Stopped VMs + for (Iterator iter = virtualMachines.iterator(); iter.hasNext();) { + // count how many stopped/running vms we have + UserVm vm = iter.next(); + + if (vm.getState() == State.Stopped) { + vmStopped++; + } else if (vm.getState() == State.Running) { + vmRunning++; + } + } + + accountResponse.setVmStopped(vmStopped); + accountResponse.setVmRunning(vmRunning); + accountResponse.setObjectName("account"); + + //get resource limits for projects + Long projectLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.project, account.getId()); + String projectLimitDisplay = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit); + Long projectTotal = ApiDBUtils.getResourceCount(ResourceType.project, account.getId()); + String projectAvail = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit - projectTotal); + accountResponse.setProjectLimit(projectLimitDisplay); + accountResponse.setProjectTotal(projectTotal); + accountResponse.setProjectAvailable(projectAvail); + + //get resource limits for networks + Long networkLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.network, account.getId()); + String networkLimitDisplay = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit); + Long networkTotal = ApiDBUtils.getResourceCount(ResourceType.network, account.getId()); + String networkAvail = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit - networkTotal); + accountResponse.setNetworkLimit(networkLimitDisplay); + accountResponse.setNetworkTotal(networkTotal); + accountResponse.setNetworkAvailable(networkAvail); + + // adding all the users for an account as part of the response obj + List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId()); + List userResponseList = new ArrayList(); + for (UserVO user : usersForAccount) { + UserResponse userResponse = createUserResponse(user); + userResponseList.add(userResponse); + } + + accountResponse.setUsers(userResponseList); + accountResponse.setDetails(ApiDBUtils.getAccountDetails(account.getId())); + return accountResponse; + } + + @Override + public UserResponse createUserResponse(UserAccount user) { + UserResponse userResponse = new UserResponse(); + userResponse.setAccountName(user.getAccountName()); + userResponse.setAccountType(user.getType()); + userResponse.setCreated(user.getCreated()); + userResponse.setDomainId(user.getDomainId()); + userResponse.setDomainName(ApiDBUtils.findDomainById(user.getDomainId()).getName()); + userResponse.setEmail(user.getEmail()); + userResponse.setFirstname(user.getFirstname()); + userResponse.setId(user.getId()); + userResponse.setLastname(user.getLastname()); + userResponse.setState(user.getState()); + userResponse.setTimezone(user.getTimezone()); + userResponse.setUsername(user.getUsername()); + userResponse.setApiKey(user.getApiKey()); + userResponse.setSecretKey(user.getSecretKey()); + userResponse.setAccountId((user.getAccountId())); + userResponse.setObjectName("user"); + + return userResponse; + } + + @Override + public DomainResponse createDomainResponse(Domain domain) { + DomainResponse domainResponse = new DomainResponse(); + domainResponse.setDomainName(domain.getName()); + domainResponse.setId(domain.getId()); + domainResponse.setLevel(domain.getLevel()); + domainResponse.setNetworkDomain(domain.getNetworkDomain()); + domainResponse.setParentDomainId(domain.getParent()); + StringBuilder domainPath = new StringBuilder("ROOT"); + (domainPath.append(domain.getPath())).deleteCharAt(domainPath.length() - 1); + domainResponse.setPath(domainPath.toString()); + if (domain.getParent() != null) { + domainResponse.setParentDomainName(ApiDBUtils.findDomainById(domain.getParent()).getName()); + } + if (domain.getChildCount() > 0) { + domainResponse.setHasChild(true); + } + domainResponse.setObjectName("domain"); + return domainResponse; + } + + @Override + public DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering) { + DiskOfferingResponse diskOfferingResponse = new DiskOfferingResponse(); + diskOfferingResponse.setId(offering.getId()); + diskOfferingResponse.setName(offering.getName()); + diskOfferingResponse.setDisplayText(offering.getDisplayText()); + diskOfferingResponse.setCreated(offering.getCreated()); + diskOfferingResponse.setDiskSize(offering.getDiskSize() / (1024 * 1024 * 1024)); + if (offering.getDomainId() != null) { + diskOfferingResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName()); + diskOfferingResponse.setDomainId(offering.getDomainId()); + } + diskOfferingResponse.setTags(offering.getTags()); + diskOfferingResponse.setCustomized(offering.isCustomized()); + diskOfferingResponse.setObjectName("diskoffering"); + return diskOfferingResponse; + } + + @Override + public ResourceLimitResponse createResourceLimitResponse(ResourceLimit limit) { + ResourceLimitResponse resourceLimitResponse = new ResourceLimitResponse(); + if (limit.getResourceOwnerType() == ResourceOwnerType.Domain) { + populateDomain(resourceLimitResponse, limit.getOwnerId()); + } else if (limit.getResourceOwnerType() == ResourceOwnerType.Account) { + Account accountTemp = ApiDBUtils.findAccountById(limit.getOwnerId()); + populateAccount(resourceLimitResponse, limit.getOwnerId()); + populateDomain(resourceLimitResponse, accountTemp.getDomainId()); + } + resourceLimitResponse.setResourceType(Integer.valueOf(limit.getType().getOrdinal()).toString()); + resourceLimitResponse.setMax(limit.getMax()); + resourceLimitResponse.setObjectName("resourcelimit"); + + return resourceLimitResponse; + } + + @Override + public ResourceCountResponse createResourceCountResponse(ResourceCount resourceCount) { + ResourceCountResponse resourceCountResponse = new ResourceCountResponse(); + + if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Account) { + Account accountTemp = ApiDBUtils.findAccountById(resourceCount.getOwnerId()); + if (accountTemp != null) { + populateAccount(resourceCountResponse, accountTemp.getId()); + populateDomain(resourceCountResponse, accountTemp.getDomainId()); + } + } else if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Domain) { + populateDomain(resourceCountResponse, resourceCount.getOwnerId()); + } + + resourceCountResponse.setResourceType(Integer.valueOf(resourceCount.getType().getOrdinal()).toString()); + resourceCountResponse.setResourceCount(resourceCount.getCount()); + resourceCountResponse.setObjectName("resourcecount"); + return resourceCountResponse; + } + + @Override + public ServiceOfferingResponse createServiceOfferingResponse(ServiceOffering offering) { + ServiceOfferingResponse offeringResponse = new ServiceOfferingResponse(); + offeringResponse.setId(offering.getId()); + offeringResponse.setName(offering.getName()); + offeringResponse.setIsSystemOffering(offering.getSystemUse()); + offeringResponse.setDefaultUse(offering.getDefaultUse()); + offeringResponse.setSystemVmType(offering.getSystemVmType()); + offeringResponse.setDisplayText(offering.getDisplayText()); + offeringResponse.setCpuNumber(offering.getCpu()); + offeringResponse.setCpuSpeed(offering.getSpeed()); + offeringResponse.setMemory(offering.getRamSize()); + offeringResponse.setCreated(offering.getCreated()); + offeringResponse.setStorageType(offering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString()); + offeringResponse.setOfferHa(offering.getOfferHA()); + offeringResponse.setLimitCpuUse(offering.getLimitCpuUse()); + offeringResponse.setTags(offering.getTags()); + if (offering.getDomainId() != null) { + offeringResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName()); + offeringResponse.setDomainId(offering.getDomainId()); + } + offeringResponse.setNetworkRate(offering.getRateMbps()); + offeringResponse.setHostTag(offering.getHostTag()); + offeringResponse.setObjectName("serviceoffering"); + + return offeringResponse; + } + + @Override + public ConfigurationResponse createConfigurationResponse(Configuration cfg) { + ConfigurationResponse cfgResponse = new ConfigurationResponse(); + cfgResponse.setCategory(cfg.getCategory()); + cfgResponse.setDescription(cfg.getDescription()); + cfgResponse.setName(cfg.getName()); + cfgResponse.setValue(cfg.getValue()); + cfgResponse.setObjectName("configuration"); + + return cfgResponse; + } + + @Override + public SnapshotResponse createSnapshotResponse(Snapshot snapshot) { + SnapshotResponse snapshotResponse = new SnapshotResponse(); + snapshotResponse.setId(snapshot.getId()); + + populateOwner(snapshotResponse, snapshot); + + VolumeVO volume = findVolumeById(snapshot.getVolumeId()); + String snapshotTypeStr = snapshot.getType().name(); + snapshotResponse.setSnapshotType(snapshotTypeStr); + snapshotResponse.setVolumeId(snapshot.getVolumeId()); + if (volume != null) { + snapshotResponse.setVolumeName(volume.getName()); + snapshotResponse.setVolumeType(volume.getVolumeType().name()); + } + snapshotResponse.setCreated(snapshot.getCreated()); + snapshotResponse.setName(snapshot.getName()); + snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId())); + snapshotResponse.setState(snapshot.getStatus()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Snapshot, snapshot.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + snapshotResponse.setTags(tagResponses); + + snapshotResponse.setObjectName("snapshot"); + return snapshotResponse; + } + + @Override + public SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy) { + SnapshotPolicyResponse policyResponse = new SnapshotPolicyResponse(); + policyResponse.setId(policy.getId()); + policyResponse.setVolumeId(policy.getVolumeId()); + policyResponse.setSchedule(policy.getSchedule()); + policyResponse.setIntervalType(policy.getInterval()); + policyResponse.setMaxSnaps(policy.getMaxSnaps()); + policyResponse.setTimezone(policy.getTimezone()); + policyResponse.setObjectName("snapshotpolicy"); + + return policyResponse; + } + + @Override + public HostResponse createHostResponse(Host host) { + return createHostResponse(host, EnumSet.of(HostDetails.all)); + } + + @Override + public HostResponse createHostResponse(Host host, EnumSet details) { + HostResponse hostResponse = new HostResponse(); + hostResponse.setId(host.getId()); + hostResponse.setCapabilities(host.getCapabilities()); + hostResponse.setClusterId(host.getClusterId()); + hostResponse.setCpuNumber(host.getCpus()); + hostResponse.setZoneId(host.getDataCenterId()); + hostResponse.setDisconnectedOn(host.getDisconnectedOn()); + hostResponse.setHypervisor(host.getHypervisorType()); + hostResponse.setHostType(host.getType()); + hostResponse.setLastPinged(new Date(host.getLastPinged())); + hostResponse.setManagementServerId(host.getManagementServerId()); + hostResponse.setName(host.getName()); + hostResponse.setPodId(host.getPodId()); + hostResponse.setRemoved(host.getRemoved()); + hostResponse.setCpuSpeed(host.getSpeed()); + hostResponse.setState(host.getStatus()); + hostResponse.setIpAddress(host.getPrivateIpAddress()); + hostResponse.setVersion(host.getVersion()); + hostResponse.setCreated(host.getCreated()); + + if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity) + || details.contains(HostDetails.stats) || details.contains(HostDetails.events)) { + + GuestOSCategoryVO guestOSCategory = ApiDBUtils.getHostGuestOSCategory(host.getId()); + if (guestOSCategory != null) { + hostResponse.setOsCategoryId(guestOSCategory.getId()); + hostResponse.setOsCategoryName(guestOSCategory.getName()); + } + hostResponse.setZoneName(ApiDBUtils.findZoneById(host.getDataCenterId()).getName()); + + if (host.getPodId() != null) { + HostPodVO pod = ApiDBUtils.findPodById(host.getPodId()); + if (pod != null) { + hostResponse.setPodName(pod.getName()); + } + } + + if (host.getClusterId() != null) { + ClusterVO cluster = ApiDBUtils.findClusterById(host.getClusterId()); + hostResponse.setClusterName(cluster.getName()); + hostResponse.setClusterType(cluster.getClusterType().toString()); + } + } + + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + if (host.getType() == Host.Type.Routing) { + if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)) { + // set allocated capacities + Long mem = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_MEMORY); + Long cpu = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_CPU); + + hostResponse.setMemoryAllocated(mem); + hostResponse.setMemoryTotal(host.getTotalMemory()); + String hostTags = ApiDBUtils.getHostTags(host.getId()); + hostResponse.setHostTags(hostTags); + + String haTag = ApiDBUtils.getHaTag(); + if (haTag != null && !haTag.isEmpty() && hostTags != null && !hostTags.isEmpty()) { + if (haTag.equalsIgnoreCase(hostTags)) { + hostResponse.setHaHost(true); + } else { + hostResponse.setHaHost(false); + } + } else { + hostResponse.setHaHost(false); + } + + hostResponse.setHypervisorVersion(host.getHypervisorVersion()); + + String cpuAlloc = decimalFormat.format(((float) cpu / (float) (host.getCpus() * host.getSpeed())) * 100f) + "%"; + hostResponse.setCpuAllocated(cpuAlloc); + String cpuWithOverprovisioning = new Float(host.getCpus() * host.getSpeed() * ApiDBUtils.getCpuOverprovisioningFactor()).toString(); + hostResponse.setCpuWithOverprovisioning(cpuWithOverprovisioning); + } + + if (details.contains(HostDetails.all) || details.contains(HostDetails.stats)) { + // set CPU/RAM/Network stats + String cpuUsed = null; + HostStats hostStats = ApiDBUtils.getHostStatistics(host.getId()); + if (hostStats != null) { + float cpuUtil = (float) hostStats.getCpuUtilization(); + cpuUsed = decimalFormat.format(cpuUtil) + "%"; + hostResponse.setCpuUsed(cpuUsed); + hostResponse.setMemoryUsed((new Double(hostStats.getUsedMemory())).longValue()); + hostResponse.setNetworkKbsRead((new Double(hostStats.getNetworkReadKBs())).longValue()); + hostResponse.setNetworkKbsWrite((new Double(hostStats.getNetworkWriteKBs())).longValue()); + + } + } + + } else if (host.getType() == Host.Type.SecondaryStorage) { + StorageStats secStorageStats = ApiDBUtils.getSecondaryStorageStatistics(host.getId()); + if (secStorageStats != null) { + hostResponse.setDiskSizeTotal(secStorageStats.getCapacityBytes()); + hostResponse.setDiskSizeAllocated(secStorageStats.getByteUsed()); + } + } + + hostResponse.setLocalStorageActive(ApiDBUtils.isLocalStorageActiveOnHost(host)); + + if (details.contains(HostDetails.all) || details.contains(HostDetails.events)) { + Set possibleEvents = host.getStatus().getPossibleEvents(); + if ((possibleEvents != null) && !possibleEvents.isEmpty()) { + String events = ""; + Iterator iter = possibleEvents.iterator(); + while (iter.hasNext()) { + com.cloud.host.Status.Event event = iter.next(); + events += event.toString(); + if (iter.hasNext()) { + events += "; "; + } + } + hostResponse.setEvents(events); + } + } + + hostResponse.setResourceState(host.getResourceState().toString()); + hostResponse.setObjectName("host"); + + return hostResponse; + } + + @Override + public SwiftResponse createSwiftResponse(Swift swift) { + SwiftResponse swiftResponse = new SwiftResponse(); + swiftResponse.setId(swift.getId()); + swiftResponse.setUrl(swift.getUrl()); + swiftResponse.setAccount(swift.getAccount()); + swiftResponse.setUsername(swift.getUserName()); + swiftResponse.setObjectName("swift"); + return swiftResponse; + } + + @Override + public VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan) { + Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId()); + + VlanIpRangeResponse vlanResponse = new VlanIpRangeResponse(); + vlanResponse.setId(vlan.getId()); + vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork)); + vlanResponse.setVlan(vlan.getVlanTag()); + vlanResponse.setZoneId(vlan.getDataCenterId()); + + if (podId != null) { + HostPodVO pod = ApiDBUtils.findPodById(podId); + vlanResponse.setPodId(podId); + if (pod != null) { + vlanResponse.setPodName(pod.getName()); + } + } + + vlanResponse.setGateway(vlan.getVlanGateway()); + vlanResponse.setNetmask(vlan.getVlanNetmask()); + + // get start ip and end ip of corresponding vlan + String ipRange = vlan.getIpRange(); + String[] range = ipRange.split("-"); + vlanResponse.setStartIp(range[0]); + vlanResponse.setEndIp(range[1]); + + vlanResponse.setNetworkId(vlan.getNetworkId()); + Account owner = ApiDBUtils.getVlanAccount(vlan.getId()); + if (owner != null) { + populateAccount(vlanResponse, owner.getId()); + populateDomain(vlanResponse, owner.getDomainId()); + } + + vlanResponse.setPhysicalNetworkId(vlan.getPhysicalNetworkId()); + + vlanResponse.setObjectName("vlan"); + return vlanResponse; + } + + @Override + public IPAddressResponse createIPAddressResponse(IpAddress ipAddr) { + VlanVO vlan = ApiDBUtils.findVlanById(ipAddr.getVlanId()); + boolean forVirtualNetworks = vlan.getVlanType().equals(VlanType.VirtualNetwork); + long zoneId = ipAddr.getDataCenterId(); + + IPAddressResponse ipResponse = new IPAddressResponse(); + ipResponse.setId(ipAddr.getId()); + ipResponse.setIpAddress(ipAddr.getAddress().toString()); + if (ipAddr.getAllocatedTime() != null) { + ipResponse.setAllocated(ipAddr.getAllocatedTime()); + } + ipResponse.setZoneId(zoneId); + ipResponse.setZoneName(ApiDBUtils.findZoneById(ipAddr.getDataCenterId()).getName()); + ipResponse.setSourceNat(ipAddr.isSourceNat()); + ipResponse.setIsSystem(ipAddr.getSystem()); + + // get account information + if (ipAddr.getAllocatedToAccountId() != null) { + populateOwner(ipResponse, ipAddr); + } + + ipResponse.setForVirtualNetwork(forVirtualNetworks); + ipResponse.setStaticNat(ipAddr.isOneToOneNat()); + + if (ipAddr.getAssociatedWithVmId() != null) { + UserVm vm = ApiDBUtils.findUserVmById(ipAddr.getAssociatedWithVmId()); + ipResponse.setVirtualMachineId(vm.getId()); + ipResponse.setVirtualMachineName(vm.getHostName()); + if (vm.getDisplayName() != null) { + ipResponse.setVirtualMachineDisplayName(vm.getDisplayName()); + } else { + ipResponse.setVirtualMachineDisplayName(vm.getHostName()); + } + } + + ipResponse.setAssociatedNetworkId(ipAddr.getAssociatedWithNetworkId()); + ipResponse.setVpcId(ipAddr.getVpcId()); + + // Network id the ip is associated with (if associated networkId is null, try to get this information from vlan) + Long vlanNetworkId = ApiDBUtils.getVlanNetworkId(ipAddr.getVlanId()); + + // Network id the ip belongs to + Long networkId; + if (vlanNetworkId != null) { + networkId = vlanNetworkId; + } else { + networkId = ApiDBUtils.getPublicNetworkIdByZone(zoneId); + } + + ipResponse.setNetworkId(networkId); + ipResponse.setState(ipAddr.getState().toString()); + ipResponse.setPhysicalNetworkId(ipAddr.getPhysicalNetworkId()); + + // show this info to admin only + Account account = UserContext.current().getCaller(); + if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) { + ipResponse.setVlanId(ipAddr.getVlanId()); + ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddr.getVlanId()).getVlanTag()); + } + + if (ipAddr.getSystem()) { + if (ipAddr.isOneToOneNat()) { + ipResponse.setPurpose(IpAddress.Purpose.StaticNat.toString()); + } else { + ipResponse.setPurpose(IpAddress.Purpose.Lb.toString()); + } + } + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.PublicIpAddress, ipAddr.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + ipResponse.setTags(tagResponses); + + ipResponse.setObjectName("ipaddress"); + return ipResponse; + } + + @Override + public LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer) { + LoadBalancerResponse lbResponse = new LoadBalancerResponse(); + lbResponse.setId(loadBalancer.getId()); + lbResponse.setName(loadBalancer.getName()); + lbResponse.setDescription(loadBalancer.getDescription()); + List cidrs = ApiDBUtils.findFirewallSourceCidrs(loadBalancer.getId()); + lbResponse.setCidrList(StringUtils.join(cidrs, ",")); + + IPAddressVO publicIp = ApiDBUtils.findIpAddressById(loadBalancer.getSourceIpAddressId()); + lbResponse.setPublicIpId(publicIp.getId()); + lbResponse.setPublicIp(publicIp.getAddress().addr()); + lbResponse.setPublicPort(Integer.toString(loadBalancer.getSourcePortStart())); + lbResponse.setPrivatePort(Integer.toString(loadBalancer.getDefaultPortStart())); + lbResponse.setAlgorithm(loadBalancer.getAlgorithm()); + FirewallRule.State state = loadBalancer.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + lbResponse.setState(stateToSet); + populateOwner(lbResponse, loadBalancer); + lbResponse.setZoneId(publicIp.getDataCenterId()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, loadBalancer.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + lbResponse.setTags(tagResponses); + + lbResponse.setObjectName("loadbalancer"); + return lbResponse; + } + + @Override + public PodResponse createPodResponse(Pod pod, Boolean showCapacities) { + String[] ipRange = new String[2]; + if (pod.getDescription() != null && pod.getDescription().length() > 0) { + ipRange = pod.getDescription().split("-"); + } else { + ipRange[0] = pod.getDescription(); + } + + PodResponse podResponse = new PodResponse(); + podResponse.setId(pod.getId()); + podResponse.setName(pod.getName()); + podResponse.setZoneId(pod.getDataCenterId()); + podResponse.setZoneName(PodZoneConfig.getZoneName(pod.getDataCenterId())); + podResponse.setNetmask(NetUtils.getCidrNetmask(pod.getCidrSize())); + podResponse.setStartIp(ipRange[0]); + podResponse.setEndIp(((ipRange.length > 1) && (ipRange[1] != null)) ? ipRange[1] : ""); + podResponse.setGateway(pod.getGateway()); + podResponse.setAllocationState(pod.getAllocationState().toString()); + if (showCapacities != null && showCapacities) { + List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, pod.getId(), null); + Set capacityResponses = new HashSet(); + float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); + + for (SummedCapacity capacity : capacities) { + CapacityResponse capacityResponse = new CapacityResponse(); + capacityResponse.setCapacityType(capacity.getCapacityType()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); + if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { + capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor))); + } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { + List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, pod.getId(), null); + capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); + } else { + capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); + } + if (capacityResponse.getCapacityTotal() != 0) { + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + } else { + capacityResponse.setPercentUsed(s_percentFormat.format(0L)); + } + capacityResponses.add(capacityResponse); + } + // Do it for stats as well. + capacityResponses.addAll(getStatsCapacityresponse(null, null, pod.getId(), pod.getDataCenterId())); + podResponse.setCapacitites(new ArrayList(capacityResponses)); + } + podResponse.setObjectName("pod"); + return podResponse; + } + + @Override + public ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities) { + Account account = UserContext.current().getCaller(); + ZoneResponse zoneResponse = new ZoneResponse(); + zoneResponse.setId(dataCenter.getId()); + zoneResponse.setName(dataCenter.getName()); + zoneResponse.setSecurityGroupsEnabled(ApiDBUtils.isSecurityGroupEnabledInZone(dataCenter.getId())); + + if ((dataCenter.getDescription() != null) && !dataCenter.getDescription().equalsIgnoreCase("null")) { + zoneResponse.setDescription(dataCenter.getDescription()); + } + + if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) { + zoneResponse.setDns1(dataCenter.getDns1()); + zoneResponse.setDns2(dataCenter.getDns2()); + zoneResponse.setInternalDns1(dataCenter.getInternalDns1()); + zoneResponse.setInternalDns2(dataCenter.getInternalDns2()); + // FIXME zoneResponse.setVlan(dataCenter.get.getVnet()); + zoneResponse.setGuestCidrAddress(dataCenter.getGuestNetworkCidr()); + } + + if (showCapacities != null && showCapacities) { + List capacities = ApiDBUtils.getCapacityByClusterPodZone(dataCenter.getId(), null, null); + Set capacityResponses = new HashSet(); + float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); + + for (SummedCapacity capacity : capacities) { + CapacityResponse capacityResponse = new CapacityResponse(); + capacityResponse.setCapacityType(capacity.getCapacityType()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); + if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { + capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor))); + } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { + List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(dataCenter.getId(), null, null); + capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); + } else { + capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); + } + if (capacityResponse.getCapacityTotal() != 0) { + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + } else { + capacityResponse.setPercentUsed(s_percentFormat.format(0L)); + } + capacityResponses.add(capacityResponse); + } + // Do it for stats as well. + capacityResponses.addAll(getStatsCapacityresponse(null, null, null, dataCenter.getId())); + + zoneResponse.setCapacitites(new ArrayList(capacityResponses)); + } + + // set network domain info + zoneResponse.setDomain(dataCenter.getDomain()); + + // set domain info + Long domainId = dataCenter.getDomainId(); + if (domainId != null) { + Domain domain = ApiDBUtils.findDomainById(domainId); + zoneResponse.setDomainId(domain.getId()); + zoneResponse.setDomainName(domain.getName()); + } + + zoneResponse.setType(dataCenter.getNetworkType().toString()); + zoneResponse.setAllocationState(dataCenter.getAllocationState().toString()); + zoneResponse.setZoneToken(dataCenter.getZoneToken()); + zoneResponse.setDhcpProvider(dataCenter.getDhcpProvider()); + zoneResponse.setObjectName("zone"); + return zoneResponse; + } + + private List getStatsCapacityresponse(Long poolId, Long clusterId, Long podId, Long zoneId) { + List capacities = new ArrayList(); + capacities.add(ApiDBUtils.getStoragePoolUsedStats(poolId, clusterId, podId, zoneId)); + if (clusterId == null && podId == null) { + capacities.add(ApiDBUtils.getSecondaryStorageUsedStats(poolId, zoneId)); + } + + List capacityResponses = new ArrayList(); + for (CapacityVO capacity : capacities) { + CapacityResponse capacityResponse = new CapacityResponse(); + capacityResponse.setCapacityType(capacity.getCapacityType()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); + capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); + if (capacityResponse.getCapacityTotal() != 0) { + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + } else { + capacityResponse.setPercentUsed(s_percentFormat.format(0L)); + } + capacityResponses.add(capacityResponse); + } + + return capacityResponses; + } + + @Override + public VolumeResponse createVolumeResponse(Volume volume) { + VolumeResponse volResponse = new VolumeResponse(); + volResponse.setId(volume.getId()); + + if (volume.getName() != null) { + volResponse.setName(volume.getName()); + } else { + volResponse.setName(""); + } + + volResponse.setZoneId(volume.getDataCenterId()); + volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName()); + + volResponse.setVolumeType(volume.getVolumeType().toString()); + volResponse.setDeviceId(volume.getDeviceId()); + + Long instanceId = volume.getInstanceId(); + if (instanceId != null && volume.getState() != Volume.State.Destroy) { + VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId); + if (vm != null) { + volResponse.setVirtualMachineId(vm.getId()); + volResponse.setVirtualMachineName(vm.getHostName()); + UserVm userVm = ApiDBUtils.findUserVmById(vm.getId()); + if (userVm != null) { + if (userVm.getDisplayName() != null) { + volResponse.setVirtualMachineDisplayName(userVm.getDisplayName()); + } else { + volResponse.setVirtualMachineDisplayName(userVm.getHostName()); + } + volResponse.setVirtualMachineState(vm.getState().toString()); + } else { + s_logger.error("User Vm with Id: " + instanceId + " does not exist for volume " + volume.getId()); + } + } else { + s_logger.error("Vm with Id: " + instanceId + " does not exist for volume " + volume.getId()); + } + } + + // Show the virtual size of the volume + volResponse.setSize(volume.getSize()); + + volResponse.setCreated(volume.getCreated()); + volResponse.setState(volume.getState().toString()); + if(volume.getState() == Volume.State.UploadOp){ + com.cloud.storage.VolumeHostVO volumeHostRef = ApiDBUtils.findVolumeHostRef(volume.getId(), volume.getDataCenterId()); + volResponse.setSize(volumeHostRef.getSize()); + volResponse.setCreated(volumeHostRef.getCreated()); + Account caller = UserContext.current().getCaller(); + if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) + volResponse.setHypervisor(ApiDBUtils.getHypervisorTypeFromFormat(volumeHostRef.getFormat()).toString()); + if (volumeHostRef.getDownloadState() != Status.DOWNLOADED) { + String volumeStatus = "Processing"; + if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (volumeHostRef.getDownloadPercent() == 100) { + volumeStatus = "Checking Volume"; + } else { + volumeStatus = volumeHostRef.getDownloadPercent() + "% Uploaded"; + } + volResponse.setState("Uploading"); + } else { + volumeStatus = volumeHostRef.getErrorString(); + if(volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.NOT_DOWNLOADED){ + volResponse.setState("UploadNotStarted"); + }else { + volResponse.setState("UploadError"); + } + } + volResponse.setStatus(volumeStatus); + } else if (volumeHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + volResponse.setStatus("Upload Complete"); + volResponse.setState("Uploaded"); + } else { + volResponse.setStatus("Successfully Installed"); + } + } + + populateOwner(volResponse, volume); + + String storageType; + try { + if (volume.getPoolId() == null) { + if (volume.getState() == Volume.State.Allocated || volume.getState() == Volume.State.UploadOp) { + /* set it as shared, so the UI can attach it to VM */ + storageType = "shared"; + } else { + storageType = "unknown"; + } + } else { + storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? ServiceOffering.StorageType.shared.toString() : ServiceOffering.StorageType.local.toString(); + } + } catch (InvalidParameterValueException e) { + s_logger.error(e.getMessage(), e); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID"); + } + + volResponse.setStorageType(storageType); + if (volume.getVolumeType().equals(Volume.Type.ROOT)) { + volResponse.setServiceOfferingId(volume.getDiskOfferingId()); + } else { + volResponse.setDiskOfferingId(volume.getDiskOfferingId()); + } + + DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId()); + if (volume.getVolumeType().equals(Volume.Type.ROOT)) { + volResponse.setServiceOfferingName(diskOffering.getName()); + volResponse.setServiceOfferingDisplayText(diskOffering.getDisplayText()); + } else { + volResponse.setDiskOfferingName(diskOffering.getName()); + volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText()); + } + + Long poolId = volume.getPoolId(); + String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName(); + volResponse.setStoragePoolName(poolName); + // volResponse.setSourceId(volume.getSourceId()); + // if (volume.getSourceType() != null) { + // volResponse.setSourceType(volume.getSourceType().toString()); + // } + + // return hypervisor for ROOT and Resource domain only + Account caller = UserContext.current().getCaller(); + if ((caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) && volume.getState() != Volume.State.UploadOp) { + volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString()); + } + + volResponse.setAttached(volume.getAttached()); + volResponse.setDestroyed(volume.getState() == Volume.State.Destroy); + boolean isExtractable = true; + if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont have any template dependence. + VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId()); + if (template != null) { // For ISO based volumes template = null and we allow extraction of all ISO based + // volumes + isExtractable = template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM; + } + } + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Volume, volume.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + volResponse.setTags(tagResponses); + + volResponse.setExtractable(isExtractable); + volResponse.setObjectName("volume"); + return volResponse; + } + + @Override + public InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group) { + InstanceGroupResponse groupResponse = new InstanceGroupResponse(); + groupResponse.setId(group.getId()); + groupResponse.setName(group.getName()); + groupResponse.setCreated(group.getCreated()); + + populateOwner(groupResponse, group); + + groupResponse.setObjectName("instancegroup"); + return groupResponse; + } + + @Override + public StoragePoolResponse createStoragePoolResponse(StoragePool pool) { + StoragePoolResponse poolResponse = new StoragePoolResponse(); + poolResponse.setId(pool.getId()); + poolResponse.setName(pool.getName()); + poolResponse.setState(pool.getStatus()); + poolResponse.setPath(pool.getPath()); + poolResponse.setIpAddress(pool.getHostAddress()); + poolResponse.setZoneId(pool.getDataCenterId()); + poolResponse.setZoneName(ApiDBUtils.findZoneById(pool.getDataCenterId()).getName()); + if (pool.getPoolType() != null) { + poolResponse.setType(pool.getPoolType().toString()); + } + if (pool.getPodId() != null) { + poolResponse.setPodId(pool.getPodId()); + HostPodVO pod = ApiDBUtils.findPodById(pool.getPodId()); + if (pod != null) { + poolResponse.setPodName(pod.getName()); + } + } + if (pool.getCreated() != null) { + poolResponse.setCreated(pool.getCreated()); + } + + StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId()); + long allocatedSize = ApiDBUtils.getStorageCapacitybyPool(pool.getId(), Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED); + poolResponse.setDiskSizeTotal(pool.getCapacityBytes()); + poolResponse.setDiskSizeAllocated(allocatedSize); + + if (stats != null) { + Long used = stats.getByteUsed(); + poolResponse.setDiskSizeUsed(used); + } + + if (pool.getClusterId() != null) { + ClusterVO cluster = ApiDBUtils.findClusterById(pool.getClusterId()); + poolResponse.setClusterId(cluster.getId()); + poolResponse.setClusterName(cluster.getName()); + } + poolResponse.setTags(ApiDBUtils.getStoragePoolTags(pool.getId())); + poolResponse.setObjectName("storagepool"); + return poolResponse; + } + + @Override + public ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities) { + ClusterResponse clusterResponse = new ClusterResponse(); + clusterResponse.setId(cluster.getId()); + clusterResponse.setName(cluster.getName()); + clusterResponse.setPodId(cluster.getPodId()); + clusterResponse.setZoneId(cluster.getDataCenterId()); + clusterResponse.setHypervisorType(cluster.getHypervisorType().toString()); + clusterResponse.setClusterType(cluster.getClusterType().toString()); + clusterResponse.setAllocationState(cluster.getAllocationState().toString()); + clusterResponse.setManagedState(cluster.getManagedState().toString()); + HostPodVO pod = ApiDBUtils.findPodById(cluster.getPodId()); + if (pod != null) { + clusterResponse.setPodName(pod.getName()); + } + DataCenterVO zone = ApiDBUtils.findZoneById(cluster.getDataCenterId()); + clusterResponse.setZoneName(zone.getName()); + if (showCapacities != null && showCapacities) { + List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, null, cluster.getId()); + Set capacityResponses = new HashSet(); + float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); + + for (SummedCapacity capacity : capacities) { + CapacityResponse capacityResponse = new CapacityResponse(); + capacityResponse.setCapacityType(capacity.getCapacityType()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); + + if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { + capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor))); + } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { + List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, null, cluster.getId()); + capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); + capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity()); + } else { + capacityResponse.setCapacityTotal(capacity.getTotalCapacity()); + } + if (capacityResponse.getCapacityTotal() != 0) { + capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f)); + } else { + capacityResponse.setPercentUsed(s_percentFormat.format(0L)); + } + capacityResponses.add(capacityResponse); + } + // Do it for stats as well. + capacityResponses.addAll(getStatsCapacityresponse(null, cluster.getId(), pod.getId(), pod.getDataCenterId())); + clusterResponse.setCapacitites(new ArrayList(capacityResponses)); + } + clusterResponse.setObjectName("cluster"); + return clusterResponse; + } + + @Override + public FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule) { + FirewallRuleResponse response = new FirewallRuleResponse(); + response.setId(fwRule.getId()); + response.setPrivateStartPort(Integer.toString(fwRule.getDestinationPortStart())); + response.setPrivateEndPort(Integer.toString(fwRule.getDestinationPortEnd())); + response.setProtocol(fwRule.getProtocol()); + response.setPublicStartPort(Integer.toString(fwRule.getSourcePortStart())); + response.setPublicEndPort(Integer.toString(fwRule.getSourcePortEnd())); + List cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId()); + response.setCidrList(StringUtils.join(cidrs, ",")); + + IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId()); + response.setPublicIpAddressId(ip.getId()); + response.setPublicIpAddress(ip.getAddress().addr()); + + if (ip != null && fwRule.getDestinationIpAddress() != null) { + UserVm vm = ApiDBUtils.findUserVmById(fwRule.getVirtualMachineId()); + if (vm != null) { + response.setVirtualMachineId(vm.getId()); + response.setVirtualMachineName(vm.getHostName()); + + if (vm.getDisplayName() != null) { + response.setVirtualMachineDisplayName(vm.getDisplayName()); + } else { + response.setVirtualMachineDisplayName(vm.getHostName()); + } + } + } + FirewallRule.State state = fwRule.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.PortForwardingRule, fwRule.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setState(stateToSet); + response.setObjectName("portforwardingrule"); + return response; + } + + @Override + public IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule) { + IpForwardingRuleResponse response = new IpForwardingRuleResponse(); + response.setId(fwRule.getId()); + response.setProtocol(fwRule.getProtocol()); + + IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId()); + response.setPublicIpAddressId(ip.getId()); + response.setPublicIpAddress(ip.getAddress().addr()); + + if (ip != null && fwRule.getDestIpAddress() != null) { + UserVm vm = ApiDBUtils.findUserVmById(ip.getAssociatedWithVmId()); + if (vm != null) {// vm might be destroyed + response.setVirtualMachineId(vm.getId()); + response.setVirtualMachineName(vm.getHostName()); + if (vm.getDisplayName() != null) { + response.setVirtualMachineDisplayName(vm.getDisplayName()); + } else { + response.setVirtualMachineDisplayName(vm.getHostName()); + } + } + } + FirewallRule.State state = fwRule.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + + response.setStartPort(fwRule.getSourcePortStart()); + response.setEndPort(fwRule.getSourcePortEnd()); + response.setProtocol(fwRule.getProtocol()); + response.setState(stateToSet); + response.setObjectName("ipforwardingrule"); + return response; + } + + @Override + public List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms) { + Account caller = UserContext.current().getCaller(); + Map dataCenters = new HashMap(); + Map hosts = new HashMap(); + Map templates = new HashMap(); + Map serviceOfferings = new HashMap(); + Map networks = new HashMap(); + + List vmResponses = new ArrayList(); + + for (UserVm userVm : userVms) { + UserVmResponse userVmResponse = new UserVmResponse(); + Account acct = ApiDBUtils.findAccountById(Long.valueOf(userVm.getAccountId())); + if (acct != null) { + userVmResponse.setAccountName(acct.getAccountName()); + userVmResponse.setDomainId(acct.getDomainId()); + userVmResponse.setDomainName(ApiDBUtils.findDomainById(acct.getDomainId()).getName()); + } + + userVmResponse.setId(userVm.getId()); + userVmResponse.setName(userVm.getHostName()); + userVmResponse.setCreated(userVm.getCreated()); + + userVmResponse.setHaEnable(userVm.isHaEnabled()); + + if (userVm.getDisplayName() != null) { + userVmResponse.setDisplayName(userVm.getDisplayName()); + } else { + userVmResponse.setDisplayName(userVm.getHostName()); + } + + if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { + userVmResponse.setInstanceName(userVm.getInstanceName()); + } + + if (userVm.getPassword() != null) { + userVmResponse.setPassword(userVm.getPassword()); + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.group)) { + InstanceGroupVO group = ApiDBUtils.findInstanceGroupForVM(userVm.getId()); + if (group != null) { + userVmResponse.setGroup(group.getName()); + userVmResponse.setGroupId(group.getId()); + } + + } + + // Data Center Info + DataCenter zone = dataCenters.get(userVm.getDataCenterIdToDeployIn()); + if (zone == null) { + zone = ApiDBUtils.findZoneById(userVm.getDataCenterIdToDeployIn()); + dataCenters.put(zone.getId(), zone); + } + + userVmResponse.setZoneId(zone.getId()); + userVmResponse.setZoneName(zone.getName()); + + // if user is an admin, display host id + if (((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN)) && (userVm.getHostId() != null)) { + Host host = hosts.get(userVm.getHostId()); + + if (host == null) { + host = ApiDBUtils.findHostById(userVm.getHostId()); + hosts.put(host.getId(), host); + } + + userVmResponse.setHostId(host.getId()); + userVmResponse.setHostName(host.getName()); + } + + if (userVm.getState() != null) { + if (userVm.getHostId() != null) { + Host host = hosts.get(userVm.getHostId()); + + if (host == null) { + host = ApiDBUtils.findHostById(userVm.getHostId()); + hosts.put(host.getId(), host); + } + if (host.getStatus() != com.cloud.host.Status.Up) { + userVmResponse.setState(VirtualMachine.State.Unknown.toString()); + } else { + userVmResponse.setState(userVm.getState().toString()); + } + } else { + userVmResponse.setState(userVm.getState().toString()); + } + } + + if (userVm.getHypervisorType() != null) { + userVmResponse.setHypervisor(userVm.getHypervisorType().toString()); + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.tmpl)) { + // Template Info + VMTemplateVO template = templates.get(userVm.getTemplateId()); + if (template == null) { + template = ApiDBUtils.findTemplateById(userVm.getTemplateId()); + if (template != null) { + templates.put(template.getId(), template); + } + } + + if (template != null) { + userVmResponse.setTemplateId(userVm.getTemplateId()); + userVmResponse.setTemplateName(template.getName()); + userVmResponse.setTemplateDisplayText(template.getDisplayText()); + userVmResponse.setPasswordEnabled(template.getEnablePassword()); + } else { + userVmResponse.setTemplateId(-1L); + userVmResponse.setTemplateName("ISO Boot"); + userVmResponse.setTemplateDisplayText("ISO Boot"); + userVmResponse.setPasswordEnabled(false); + } + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.iso)) { + // ISO Info + VMTemplateVO iso = templates.get(userVm.getIsoId()); + if (iso == null) { + iso = ApiDBUtils.findTemplateById(userVm.getIsoId()); + if (iso != null) { + templates.put(iso.getId(), iso); + } + } + + if (iso != null) { + userVmResponse.setIsoId(iso.getId()); + userVmResponse.setIsoName(iso.getName()); + } + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.servoff)) { + // Service Offering Info + ServiceOffering offering = serviceOfferings.get(userVm.getServiceOfferingId()); + + if (offering == null) { + offering = ApiDBUtils.findServiceOfferingById(userVm.getServiceOfferingId()); + serviceOfferings.put(offering.getId(), offering); + } + + userVmResponse.setServiceOfferingId(offering.getId()); + userVmResponse.setServiceOfferingName(offering.getName()); + userVmResponse.setCpuNumber(offering.getCpu()); + userVmResponse.setCpuSpeed(offering.getSpeed()); + userVmResponse.setMemory(offering.getRamSize()); + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.volume)) { + VolumeVO rootVolume = ApiDBUtils.findRootVolume(userVm.getId()); + if (rootVolume != null) { + userVmResponse.setRootDeviceId(rootVolume.getDeviceId()); + String rootDeviceType = "Not created"; + if (rootVolume.getPoolId() != null) { + StoragePoolVO storagePool = ApiDBUtils.findStoragePoolById(rootVolume.getPoolId()); + rootDeviceType = storagePool.getPoolType().toString(); + } + userVmResponse.setRootDeviceType(rootDeviceType); + } + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.stats)) { + // stats calculation + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + String cpuUsed = null; + VmStats vmStats = ApiDBUtils.getVmStatistics(userVm.getId()); + if (vmStats != null) { + float cpuUtil = (float) vmStats.getCPUUtilization(); + cpuUsed = decimalFormat.format(cpuUtil) + "%"; + userVmResponse.setCpuUsed(cpuUsed); + + Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs()); + userVmResponse.setNetworkKbsRead(networkKbRead.longValue()); + + Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs()); + userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue()); + } + } + + userVmResponse.setGuestOsId(userVm.getGuestOSId()); + + if (details.contains(VMDetails.all) || details.contains(VMDetails.secgrp)) { + // security groups - list only when zone is security group enabled + if (zone.isSecurityGroupEnabled()) { + List securityGroups = ApiDBUtils.getSecurityGroupsForVm(userVm.getId()); + List securityGroupResponse = new ArrayList(); + for (SecurityGroupVO grp : securityGroups) { + SecurityGroupResponse resp = new SecurityGroupResponse(); + resp.setId(grp.getId()); + resp.setName(grp.getName()); + resp.setDescription(grp.getDescription()); + resp.setObjectName("securitygroup"); + securityGroupResponse.add(resp); + } + userVmResponse.setSecurityGroupList(securityGroupResponse); + } + } + + if (details.contains(VMDetails.all) || details.contains(VMDetails.nics)) { + List nicProfiles = ApiDBUtils.getNics(userVm); + List nicResponses = new ArrayList(); + for (NicProfile singleNicProfile : nicProfiles) { + NicResponse nicResponse = new NicResponse(); + nicResponse.setId(singleNicProfile.getId()); + nicResponse.setIpaddress(singleNicProfile.getIp4Address()); + nicResponse.setGateway(singleNicProfile.getGateway()); + nicResponse.setNetmask(singleNicProfile.getNetmask()); + nicResponse.setNetworkid(singleNicProfile.getNetworkId()); + if (acct.getType() == Account.ACCOUNT_TYPE_ADMIN) { + if (singleNicProfile.getBroadCastUri() != null) { + nicResponse.setBroadcastUri(singleNicProfile.getBroadCastUri().toString()); + } + if (singleNicProfile.getIsolationUri() != null) { + nicResponse.setIsolationUri(singleNicProfile.getIsolationUri().toString()); + } + } + + // Long networkId = singleNicProfile.getNetworkId(); + Network network = networks.get(singleNicProfile.getNetworkId()); + if (network == null) { + network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId()); + networks.put(singleNicProfile.getNetworkId(), network); + } + + nicResponse.setTrafficType(network.getTrafficType().toString()); + nicResponse.setType(network.getGuestType().toString()); + nicResponse.setIsDefault(singleNicProfile.isDefaultNic()); + nicResponse.setObjectName("nic"); + nicResponses.add(nicResponse); + } + userVmResponse.setNics(nicResponses); + } + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, userVm.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + userVmResponse.setTags(tagResponses); + + IpAddress ip = ApiDBUtils.findIpByAssociatedVmId(userVm.getId()); + if (ip != null) { + userVmResponse.setPublicIpId(ip.getId()); + userVmResponse.setPublicIp(ip.getAddress().addr()); + } + + userVmResponse.setObjectName(objectName); + vmResponses.add(userVmResponse); + } + + return vmResponses; + } + + @Override + public List createUserVmResponse(String objectName, UserVm... userVms) { + Account caller = UserContext.current().getCaller(); + boolean caller_is_admin = ((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN)); + + Hashtable vmDataList = new Hashtable(); + // Initialise the vmdatalist with the input data + for (UserVm userVm : userVms) { + UserVmData userVmData = newUserVmData(userVm); + vmDataList.put(userVm.getId(), userVmData); + } + + vmDataList = ApiDBUtils.listVmDetails(vmDataList); + + // initialize vmresponse from vmdatalist + List vmResponses = new ArrayList(); + DecimalFormat decimalFormat = new DecimalFormat("#.##"); + for (UserVmData uvd : vmDataList.values()) { + UserVmResponse userVmResponse = newUserVmResponse(uvd, caller_is_admin); + + // stats calculation + String cpuUsed = null; + // VmStats vmStats = ApiDBUtils.getVmStatistics(userVmResponse.getId()); + VmStats vmStats = ApiDBUtils.getVmStatistics(uvd.getId()); + if (vmStats != null) { + float cpuUtil = (float) vmStats.getCPUUtilization(); + cpuUsed = decimalFormat.format(cpuUtil) + "%"; + userVmResponse.setCpuUsed(cpuUsed); + + Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs()); + userVmResponse.setNetworkKbsRead(networkKbRead.longValue()); + + Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs()); + userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue()); + } + userVmResponse.setObjectName(objectName); + + vmResponses.add(userVmResponse); + } + return vmResponses; + } + + @Override + public DomainRouterResponse createDomainRouterResponse(VirtualRouter router) { + Account caller = UserContext.current().getCaller(); + Map serviceOfferings = new HashMap(); + + DomainRouterResponse routerResponse = new DomainRouterResponse(); + routerResponse.setId(router.getId()); + routerResponse.setZoneId(router.getDataCenterIdToDeployIn()); + routerResponse.setName(router.getHostName()); + routerResponse.setTemplateId(router.getTemplateId()); + routerResponse.setCreated(router.getCreated()); + routerResponse.setState(router.getState()); + routerResponse.setIsRedundantRouter(router.getIsRedundantRouter()); + routerResponse.setRedundantState(router.getRedundantState().toString()); + + if (caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_ADMIN) { + if (router.getHostId() != null) { + routerResponse.setHostId(router.getHostId()); + routerResponse.setHostName(ApiDBUtils.findHostById(router.getHostId()).getName()); + } + routerResponse.setPodId(router.getPodIdToDeployIn()); + List nicProfiles = ApiDBUtils.getNics(router); + for (NicProfile singleNicProfile : nicProfiles) { + Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId()); + if (network != null) { + if (network.getTrafficType() == TrafficType.Public) { + routerResponse.setPublicIp(singleNicProfile.getIp4Address()); + routerResponse.setPublicMacAddress(singleNicProfile.getMacAddress()); + routerResponse.setPublicNetmask(singleNicProfile.getNetmask()); + routerResponse.setGateway(singleNicProfile.getGateway()); + routerResponse.setPublicNetworkId(singleNicProfile.getNetworkId()); + } else if (network.getTrafficType() == TrafficType.Control) { + routerResponse.setLinkLocalIp(singleNicProfile.getIp4Address()); + routerResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress()); + routerResponse.setLinkLocalNetmask(singleNicProfile.getNetmask()); + routerResponse.setLinkLocalNetworkId(singleNicProfile.getNetworkId()); + } else if (network.getTrafficType() == TrafficType.Guest) { + routerResponse.setGuestIpAddress(singleNicProfile.getIp4Address()); + routerResponse.setGuestMacAddress(singleNicProfile.getMacAddress()); + routerResponse.setGuestNetmask(singleNicProfile.getNetmask()); + routerResponse.setGuestNetworkId(singleNicProfile.getNetworkId()); + routerResponse.setNetworkDomain(network.getNetworkDomain()); + } + } + } + } + + // Service Offering Info + ServiceOffering offering = serviceOfferings.get(router.getServiceOfferingId()); + + if (offering == null) { + offering = ApiDBUtils.findServiceOfferingById(router.getServiceOfferingId()); + serviceOfferings.put(offering.getId(), offering); + } + routerResponse.setServiceOfferingId(offering.getId()); + routerResponse.setServiceOfferingName(offering.getName()); + + populateOwner(routerResponse, router); + + DataCenter zone = ApiDBUtils.findZoneById(router.getDataCenterIdToDeployIn()); + if (zone != null) { + routerResponse.setZoneName(zone.getName()); + routerResponse.setDns1(zone.getDns1()); + routerResponse.setDns2(zone.getDns2()); + } + + routerResponse.setVpcId(router.getVpcId()); + + routerResponse.setObjectName("domainrouter"); + return routerResponse; + } + + @Override + public SystemVmResponse createSystemVmResponse(VirtualMachine vm) { + SystemVmResponse vmResponse = new SystemVmResponse(); + if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) { + // SystemVm vm = (SystemVm) systemVM; + vmResponse.setId(vm.getId()); + vmResponse.setObjectId(vm.getId()); + vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); + vmResponse.setZoneId(vm.getDataCenterIdToDeployIn()); + + vmResponse.setName(vm.getHostName()); + vmResponse.setPodId(vm.getPodIdToDeployIn()); + vmResponse.setTemplateId(vm.getTemplateId()); + vmResponse.setCreated(vm.getCreated()); + + if (vm.getHostId() != null) { + vmResponse.setHostId(vm.getHostId()); + vmResponse.setHostName(ApiDBUtils.findHostById(vm.getHostId()).getName()); + } + + if (vm.getState() != null) { + vmResponse.setState(vm.getState().toString()); + } + + // for console proxies, add the active sessions + if (vm.getType() == Type.ConsoleProxy) { + ConsoleProxyVO proxy = ApiDBUtils.findConsoleProxy(vm.getId()); + // proxy can be already destroyed + if (proxy != null) { + vmResponse.setActiveViewerSessions(proxy.getActiveSession()); + } + } + + DataCenter zone = ApiDBUtils.findZoneById(vm.getDataCenterIdToDeployIn()); + if (zone != null) { + vmResponse.setZoneName(zone.getName()); + vmResponse.setDns1(zone.getDns1()); + vmResponse.setDns2(zone.getDns2()); + } + + List nicProfiles = ApiDBUtils.getNics(vm); + for (NicProfile singleNicProfile : nicProfiles) { + Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId()); + if (network != null) { + if (network.getTrafficType() == TrafficType.Management) { + vmResponse.setPrivateIp(singleNicProfile.getIp4Address()); + vmResponse.setPrivateMacAddress(singleNicProfile.getMacAddress()); + vmResponse.setPrivateNetmask(singleNicProfile.getNetmask()); + } else if (network.getTrafficType() == TrafficType.Control) { + vmResponse.setLinkLocalIp(singleNicProfile.getIp4Address()); + vmResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress()); + vmResponse.setLinkLocalNetmask(singleNicProfile.getNetmask()); + } else if (network.getTrafficType() == TrafficType.Public || network.getTrafficType() == TrafficType.Guest) { + /*In basic zone, public ip has TrafficType.Guest*/ + vmResponse.setPublicIp(singleNicProfile.getIp4Address()); + vmResponse.setPublicMacAddress(singleNicProfile.getMacAddress()); + vmResponse.setPublicNetmask(singleNicProfile.getNetmask()); + vmResponse.setGateway(singleNicProfile.getGateway()); + } + } + } + } + vmResponse.setObjectName("systemvm"); + return vmResponse; + } + + @Override + public Host findHostById(Long hostId) { + return ApiDBUtils.findHostById(hostId); + } + + @Override + public User findUserById(Long userId) { + return ApiDBUtils.findUserById(userId); + } + + @Override + public UserVm findUserVmById(Long vmId) { + return ApiDBUtils.findUserVmById(vmId); + + } + + @Override + public VolumeVO findVolumeById(Long volumeId) { + return ApiDBUtils.findVolumeById(volumeId); + } + + @Override + public Account findAccountByNameDomain(String accountName, Long domainId) { + return ApiDBUtils.findAccountByNameDomain(accountName, domainId); + } + + @Override + public VirtualMachineTemplate findTemplateById(Long templateId) { + return ApiDBUtils.findTemplateById(templateId); + } + + @Override + public VpnUsersResponse createVpnUserResponse(VpnUser vpnUser) { + VpnUsersResponse vpnResponse = new VpnUsersResponse(); + vpnResponse.setId(vpnUser.getId()); + vpnResponse.setUserName(vpnUser.getUsername()); + + populateOwner(vpnResponse, vpnUser); + + vpnResponse.setObjectName("vpnuser"); + return vpnResponse; + } + + @Override + public RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn) { + RemoteAccessVpnResponse vpnResponse = new RemoteAccessVpnResponse(); + vpnResponse.setPublicIpId(vpn.getServerAddressId()); + vpnResponse.setPublicIp(ApiDBUtils.findIpAddressById(vpn.getServerAddressId()).getAddress().addr()); + vpnResponse.setIpRange(vpn.getIpRange()); + vpnResponse.setPresharedKey(vpn.getIpsecPresharedKey()); + vpnResponse.setDomainId(vpn.getDomainId()); + + populateOwner(vpnResponse, vpn); + + vpnResponse.setState(vpn.getState().toString()); + vpnResponse.setObjectName("remoteaccessvpn"); + + return vpnResponse; + } + + @Override + public TemplateResponse createIsoResponse(VirtualMachineTemplate result) { + TemplateResponse response = new TemplateResponse(); + response.setId(result.getId()); + response.setName(result.getName()); + response.setDisplayText(result.getDisplayText()); + response.setPublic(result.isPublicTemplate()); + response.setCreated(result.getCreated()); + response.setFormat(result.getFormat()); + response.setOsTypeId(result.getGuestOSId()); + response.setOsTypeName(ApiDBUtils.findGuestOSById(result.getGuestOSId()).getDisplayName()); + response.setDetails(result.getDetails()); + Account caller = UserContext.current().getCaller(); + + if (result.getFormat() == ImageFormat.ISO) { // Templates are always bootable + response.setBootable(result.isBootable()); + } else { + response.setHypervisor(result.getHypervisorType().toString());// hypervisors are associated with templates + } + + // add account ID and name + Account owner = ApiDBUtils.findAccountById(result.getAccountId()); + populateAccount(response, owner.getId()); + populateDomain(response, owner.getDomainId()); + + //set tag information + List tags = null; + if (result.getFormat() == ImageFormat.ISO) { + tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, result.getId()); + } else { + tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Template, result.getId()); + } + + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setObjectName("iso"); + return response; + } + + @Override + public List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly) { + if (zoneId == null || zoneId == -1) { + List responses = new ArrayList(); + List dcs = new ArrayList(); + responses = createSwiftTemplateResponses(templateId); + if (!responses.isEmpty()) { + return responses; + } + dcs.addAll(ApiDBUtils.listZones()); + for (DataCenterVO dc : dcs) { + responses.addAll(createTemplateResponses(templateId, dc.getId(), readyOnly)); + } + return responses; + } else { + return createTemplateResponses(templateId, zoneId.longValue(), readyOnly); + } + } + + private List createSwiftTemplateResponses(long templateId) { + VirtualMachineTemplate template = findTemplateById(templateId); + List responses = new ArrayList(); + VMTemplateSwiftVO templateSwiftRef = ApiDBUtils.findTemplateSwiftRef(templateId); + if (templateSwiftRef == null) { + return responses; + } + + TemplateResponse templateResponse = new TemplateResponse(); + templateResponse.setId(template.getId()); + templateResponse.setName(template.getName()); + templateResponse.setDisplayText(template.getDisplayText()); + templateResponse.setPublic(template.isPublicTemplate()); + templateResponse.setCreated(templateSwiftRef.getCreated()); + + templateResponse.setReady(true); + templateResponse.setFeatured(template.isFeatured()); + templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); + templateResponse.setPasswordEnabled(template.getEnablePassword()); + templateResponse.setCrossZones(template.isCrossZones()); + templateResponse.setFormat(template.getFormat()); + templateResponse.setDetails(template.getDetails()); + if (template.getTemplateType() != null) { + templateResponse.setTemplateType(template.getTemplateType().toString()); + } + + templateResponse.setHypervisor(template.getHypervisorType().toString()); + + GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); + if (os != null) { + templateResponse.setOsTypeId(os.getId()); + templateResponse.setOsTypeName(os.getDisplayName()); + } else { + templateResponse.setOsTypeId(-1L); + templateResponse.setOsTypeName(""); + } + + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId()); + populateAccount(templateResponse, account.getId()); + populateDomain(templateResponse, account.getDomainId()); + + Account caller = UserContext.current().getCaller(); + boolean isAdmin = false; + if (BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + + // If the user is an Admin, add the template download status + if (isAdmin || caller.getId() == template.getAccountId()) { + // add download status + templateResponse.setStatus("Successfully Installed"); + } + + Long templateSize = templateSwiftRef.getSize(); + if (templateSize > 0) { + templateResponse.setSize(templateSize); + } + + templateResponse.setChecksum(template.getChecksum()); + templateResponse.setSourceTemplateId(template.getSourceTemplateId()); + + templateResponse.setChecksum(template.getChecksum()); + + templateResponse.setTemplateTag(template.getTemplateTag()); + + templateResponse.setObjectName("template"); + responses.add(templateResponse); + return responses; + } + + @Override + public List createTemplateResponses(long templateId, long zoneId, boolean readyOnly) { + VirtualMachineTemplate template = findTemplateById(templateId); + List responses = new ArrayList(); + VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(templateId, zoneId, readyOnly); + if (templateHostRef == null) { + return responses; + } + + HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId()); + if (host.getType() == Host.Type.LocalSecondaryStorage && host.getStatus() != com.cloud.host.Status.Up) { + return responses; + } + + TemplateResponse templateResponse = new TemplateResponse(); + templateResponse.setId(template.getId()); + templateResponse.setName(template.getName()); + templateResponse.setDisplayText(template.getDisplayText()); + templateResponse.setPublic(template.isPublicTemplate()); + templateResponse.setCreated(templateHostRef.getCreated()); + + templateResponse.setReady(templateHostRef.getDownloadState() == Status.DOWNLOADED); + templateResponse.setFeatured(template.isFeatured()); + templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); + templateResponse.setPasswordEnabled(template.getEnablePassword()); + templateResponse.setCrossZones(template.isCrossZones()); + templateResponse.setFormat(template.getFormat()); + if (template.getTemplateType() != null) { + templateResponse.setTemplateType(template.getTemplateType().toString()); + } + + templateResponse.setHypervisor(template.getHypervisorType().toString()); + templateResponse.setDetails(template.getDetails()); + + GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId()); + if (os != null) { + templateResponse.setOsTypeId(os.getId()); + templateResponse.setOsTypeName(os.getDisplayName()); + } else { + templateResponse.setOsTypeId(-1L); + templateResponse.setOsTypeName(""); + } + + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId()); + populateAccount(templateResponse, account.getId()); + populateDomain(templateResponse, account.getDomainId()); + + DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId); + + // Add the zone ID + templateResponse.setZoneId(zoneId); + templateResponse.setZoneName(datacenter.getName()); + + boolean isAdmin = false; + Account caller = UserContext.current().getCaller(); + if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + + // If the user is an Admin, add the template download status + if (isAdmin || caller.getId() == template.getAccountId()) { + // add download status + if (templateHostRef.getDownloadState() != Status.DOWNLOADED) { + String templateStatus = "Processing"; + if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (templateHostRef.getDownloadPercent() == 100) { + templateStatus = "Installing Template"; + } else { + templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded"; + } + } else { + templateStatus = templateHostRef.getErrorString(); + } + templateResponse.setStatus(templateStatus); + } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + templateResponse.setStatus("Download Complete"); + } else { + templateResponse.setStatus("Successfully Installed"); + } + } + + Long templateSize = templateHostRef.getSize(); + if (templateSize > 0) { + templateResponse.setSize(templateSize); + } + + templateResponse.setChecksum(template.getChecksum()); + templateResponse.setSourceTemplateId(template.getSourceTemplateId()); + + templateResponse.setChecksum(template.getChecksum()); + + templateResponse.setTemplateTag(template.getTemplateTag()); + + //set tag information + List tags = null; + if (template.getFormat() == ImageFormat.ISO) { + tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, template.getId()); + } else { + tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Template, template.getId()); + } + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + templateResponse.setTags(tagResponses); + + templateResponse.setObjectName("template"); + responses.add(templateResponse); + return responses; + } + + @Override + public List createIsoResponses(long isoId, Long zoneId, boolean readyOnly) { + + List isoResponses = new ArrayList(); + VirtualMachineTemplate iso = findTemplateById(isoId); + if (iso.getTemplateType() == TemplateType.PERHOST) { + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getId()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setReady(true); + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setCreated(iso.getCreated()); + isoResponse.setChecksum(iso.getChecksum()); + isoResponse.setPasswordEnabled(false); + isoResponse.setDetails(iso.getDetails()); + + // add account ID and name + Account owner = ApiDBUtils.findAccountById(iso.getAccountId()); + populateAccount(isoResponse, owner.getId()); + populateDomain(isoResponse, owner.getDomainId()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + isoResponse.setTags(tagResponses); + + isoResponse.setObjectName("iso"); + isoResponses.add(isoResponse); + return isoResponses; + } else { + if (zoneId == null || zoneId == -1) { + isoResponses = createSwiftIsoResponses(iso); + if (!isoResponses.isEmpty()) { + return isoResponses; + } + List dcs = new ArrayList(); + dcs.addAll(ApiDBUtils.listZones()); + for (DataCenterVO dc : dcs) { + isoResponses.addAll(createIsoResponses(iso, dc.getId(), readyOnly)); + } + return isoResponses; + } else { + return createIsoResponses(iso, zoneId, readyOnly); + } + } + } + + private List createSwiftIsoResponses(VirtualMachineTemplate iso) { + long isoId = iso.getId(); + List isoResponses = new ArrayList(); + VMTemplateSwiftVO isoSwift = ApiDBUtils.findTemplateSwiftRef(isoId); + if (isoSwift == null) { + return isoResponses; + } + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getId()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setCreated(isoSwift.getCreated()); + isoResponse.setReady(true); + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setChecksum(iso.getChecksum()); + isoResponse.setDetails(iso.getDetails()); + + // TODO: implement + GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); + if (os != null) { + isoResponse.setOsTypeId(os.getId()); + isoResponse.setOsTypeName(os.getDisplayName()); + } else { + isoResponse.setOsTypeId(-1L); + isoResponse.setOsTypeName(""); + } + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); + populateAccount(isoResponse, account.getId()); + populateDomain(isoResponse, account.getDomainId()); + boolean isAdmin = false; + if ((account == null) || BaseCmd.isAdmin(account.getType())) { + isAdmin = true; + } + + // If the user is an admin, add the template download status + if (isAdmin || account.getId() == iso.getAccountId()) { + // add download status + isoResponse.setStatus("Successfully Installed"); + } + Long isoSize = isoSwift.getSize(); + if (isoSize > 0) { + isoResponse.setSize(isoSize); + } + isoResponse.setObjectName("iso"); + isoResponses.add(isoResponse); + return isoResponses; + } + + @Override + public List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly) { + long isoId = iso.getId(); + List isoResponses = new ArrayList(); + VMTemplateHostVO isoHost = ApiDBUtils.findTemplateHostRef(isoId, zoneId, readyOnly); + if (isoHost == null) { + return isoResponses; + } + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getId()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setCreated(isoHost.getCreated()); + isoResponse.setReady(isoHost.getDownloadState() == Status.DOWNLOADED); + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setChecksum(iso.getChecksum()); + isoResponse.setDetails(iso.getDetails()); + + // TODO: implement + GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId()); + if (os != null) { + isoResponse.setOsTypeId(os.getId()); + isoResponse.setOsTypeName(os.getDisplayName()); + } else { + isoResponse.setOsTypeId(-1L); + isoResponse.setOsTypeName(""); + } + + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); + populateAccount(isoResponse, account.getId()); + populateDomain(isoResponse, account.getDomainId()); + + Account caller = UserContext.current().getCaller(); + boolean isAdmin = false; + if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + // Add the zone ID + DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId); + isoResponse.setZoneId(zoneId); + isoResponse.setZoneName(datacenter.getName()); + + // If the user is an admin, add the template download status + if (isAdmin || caller.getId() == iso.getAccountId()) { + // add download status + if (isoHost.getDownloadState() != Status.DOWNLOADED) { + String isoStatus = "Processing"; + if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + isoStatus = "Download Complete"; + } else if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (isoHost.getDownloadPercent() == 100) { + isoStatus = "Installing ISO"; + } else { + isoStatus = isoHost.getDownloadPercent() + "% Downloaded"; + } + } else { + isoStatus = isoHost.getErrorString(); + } + isoResponse.setStatus(isoStatus); + } else { + isoResponse.setStatus("Successfully Installed"); + } + } + + Long isoSize = isoHost.getSize(); + if (isoSize > 0) { + isoResponse.setSize(isoSize); + } + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.ISO, iso.getId()); + + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + isoResponse.setTags(tagResponses); + + isoResponse.setObjectName("iso"); + isoResponses.add(isoResponse); + return isoResponses; + } + + @Override + public ListResponse createSecurityGroupResponses( + List networkGroups) { + List groupResultObjs = SecurityGroupResultObject + .transposeNetworkGroups(networkGroups); + + ListResponse response = new ListResponse(); + List netGrpResponses = new ArrayList(); + for (SecurityGroupResultObject networkGroup : groupResultObjs) { + SecurityGroupResponse netGrpResponse = new SecurityGroupResponse(); + netGrpResponse.setId(networkGroup.getId()); + netGrpResponse.setName(networkGroup.getName()); + netGrpResponse.setDescription(networkGroup.getDescription()); + + populateOwner(netGrpResponse, networkGroup); + + List securityGroupRules = networkGroup + .getSecurityGroupRules(); + if ((securityGroupRules != null) && !securityGroupRules.isEmpty()) { + List ingressRulesResponse = new ArrayList(); + List egressRulesResponse = new ArrayList(); + for (SecurityGroupRuleResultObject securityGroupRule : securityGroupRules) { + SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse(); + ruleData.setRuleId(securityGroupRule.getId()); + ruleData.setProtocol(securityGroupRule.getProtocol()); + + if ("icmp".equalsIgnoreCase(securityGroupRule.getProtocol())) { + ruleData.setIcmpType(securityGroupRule.getStartPort()); + ruleData.setIcmpCode(securityGroupRule.getEndPort()); + } else { + ruleData.setStartPort(securityGroupRule.getStartPort()); + ruleData.setEndPort(securityGroupRule.getEndPort()); + } + + if (securityGroupRule.getAllowedSecurityGroup() != null) { + ruleData.setSecurityGroupName(securityGroupRule + .getAllowedSecurityGroup()); + ruleData.setAccountName(securityGroupRule + .getAllowedSecGroupAcct()); + } else { + ruleData.setCidr(securityGroupRule + .getAllowedSourceIpCidr()); + } + + if (securityGroupRule.getRuleType() == SecurityRuleType.IngressRule) { + ruleData.setObjectName("ingressrule"); + ingressRulesResponse.add(ruleData); + } else { + ruleData.setObjectName("egressrule"); + egressRulesResponse.add(ruleData); + } + } + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, networkGroup.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + netGrpResponse.setTags(tagResponses); + + netGrpResponse + .setSecurityGroupIngressRules(ingressRulesResponse); + netGrpResponse.setSecurityGroupEgressRules(egressRulesResponse); + } + netGrpResponse.setObjectName("securitygroup"); + netGrpResponses.add(netGrpResponse); + } + + response.setResponses(netGrpResponses); + return response; + } + + @Override + public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) { + SecurityGroupResponse response = new SecurityGroupResponse(); + + populateOwner(response, group); + + response.setDescription(group.getDescription()); + response.setId(group.getId()); + response.setName(group.getName()); + + response.setObjectName("securitygroup"); + return response; + + } + + @Override + public ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode) { + UploadVO uploadInfo = ApiDBUtils.findUploadById(uploadId); + ExtractResponse response = new ExtractResponse(); + response.setObjectName("template"); + response.setId(id); + response.setName(ApiDBUtils.findTemplateById(id).getName()); + if (zoneId != null) { + response.setZoneId(zoneId); + response.setZoneName(ApiDBUtils.findZoneById(zoneId).getName()); + } + response.setMode(mode); + response.setUploadId(uploadId); + response.setState(uploadInfo.getUploadState().toString()); + response.setAccountId(accountId); + response.setUrl(uploadInfo.getUploadUrl()); + return response; + + } + + @Override + public String toSerializedString(CreateCmdResponse response, String responseType) { + return ApiResponseSerializer.toSerializedString(response, responseType); + } + + @Override + public AsyncJobResponse createAsyncJobResponse(AsyncJob job) { + AsyncJobResponse jobResponse = new AsyncJobResponse(); + jobResponse.setAccountId(job.getAccountId()); + jobResponse.setUserId(job.getUserId()); + jobResponse.setCmd(job.getCmd()); + jobResponse.setCreated(job.getCreated()); + jobResponse.setJobId(job.getId()); + jobResponse.setJobStatus(job.getStatus()); + jobResponse.setJobProcStatus(job.getProcessStatus()); + + if (job.getInstanceType() != null && job.getInstanceId() != null) { + jobResponse.setJobInstanceType(job.getInstanceType().toString()); + jobResponse.setJobInstanceId(job.getInstanceId()); + } + jobResponse.setJobResultCode(job.getResultCode()); + + boolean savedValue = SerializationContext.current().getUuidTranslation(); + SerializationContext.current().setUuidTranslation(false); + + Object resultObject = ApiSerializerHelper.fromSerializedString(job.getResult()); + jobResponse.setJobResult((ResponseObject) resultObject); + SerializationContext.current().setUuidTranslation(savedValue); + + if (resultObject != null) { + Class clz = resultObject.getClass(); + if (clz.isPrimitive() || clz.getSuperclass() == Number.class || clz == String.class || clz == Date.class) { + jobResponse.setJobResultType("text"); + } else { + jobResponse.setJobResultType("object"); + } + } + + jobResponse.setObjectName("asyncjobs"); + return jobResponse; + } + + @Override + public List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly) { + VolumeVO volume = null; + if (snapshotId != null) { + Snapshot snapshot = ApiDBUtils.findSnapshotById(snapshotId); + volume = findVolumeById(snapshot.getVolumeId()); + } else { + volume = findVolumeById(volumeId); + } + return createTemplateResponses(templateId, volume.getDataCenterId(), readyOnly); + } + + @Override + public List createTemplateResponses(long templateId, Long vmId) { + UserVm vm = findUserVmById(vmId); + Long hostId = (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()); + Host host = findHostById(hostId); + return createTemplateResponses(templateId, host.getDataCenterId(), true); + } + + @Override + public EventResponse createEventResponse(Event event) { + EventResponse responseEvent = new EventResponse(); + responseEvent.setCreated(event.getCreateDate()); + responseEvent.setDescription(event.getDescription()); + responseEvent.setEventType(event.getType()); + responseEvent.setId(event.getId()); + responseEvent.setLevel(event.getLevel()); + responseEvent.setParentId(event.getStartId()); + responseEvent.setState(event.getState()); + + populateOwner(responseEvent, event); + + User user = ApiDBUtils.findUserById(event.getUserId()); + if (user != null) { + responseEvent.setUsername(user.getUsername()); + } + + responseEvent.setObjectName("event"); + return responseEvent; + } + + private List sumCapacities(List hostCapacities) { + Map totalCapacityMap = new HashMap(); + Map usedCapacityMap = new HashMap(); + + Set poolIdsToIgnore = new HashSet(); + Criteria c = new Criteria(); + // TODO: implement + List allStoragePools = ApiDBUtils.searchForStoragePools(c); + for (StoragePoolVO pool : allStoragePools) { + StoragePoolType poolType = pool.getPoolType(); + if (!(poolType.isShared())) {// All the non shared storages shouldn't show up in the capacity calculation + poolIdsToIgnore.add(pool.getId()); + } + } + + float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor(); + + // collect all the capacity types, sum allocated/used and sum total...get one capacity number for each + for (Capacity capacity : hostCapacities) { + + // check if zone exist + DataCenter zone = ApiDBUtils.findZoneById(capacity.getDataCenterId()); + if (zone == null) { + continue; + } + + short capacityType = capacity.getCapacityType(); + + // If local storage then ignore + if ((capacityType == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED || capacityType == Capacity.CAPACITY_TYPE_STORAGE) + && poolIdsToIgnore.contains(capacity.getHostOrPoolId())) { + continue; + } + + String key = capacity.getCapacityType() + "_" + capacity.getDataCenterId(); + String keyForPodTotal = key + "_-1"; + + boolean sumPodCapacity = false; + if (capacity.getPodId() != null) { + key += "_" + capacity.getPodId(); + sumPodCapacity = true; + } + + Long totalCapacity = totalCapacityMap.get(key); + Long usedCapacity = usedCapacityMap.get(key); + + // reset overprovisioning factor to 1 + float overprovisioningFactor = 1; + if (capacityType == Capacity.CAPACITY_TYPE_CPU) { + overprovisioningFactor = cpuOverprovisioningFactor; + } + + if (totalCapacity == null) { + totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)); + } else { + totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)) + totalCapacity; + } + + if (usedCapacity == null) { + usedCapacity = new Long(capacity.getUsedCapacity()); + } else { + usedCapacity = new Long(capacity.getUsedCapacity() + usedCapacity); + } + + if (capacityType == Capacity.CAPACITY_TYPE_CPU || capacityType == Capacity.CAPACITY_TYPE_MEMORY) { // Reserved + // Capacity + // accounts +// for + // stopped +// vms + // that +// have been + // stopped +// within + // an +// interval + usedCapacity += capacity.getReservedCapacity(); + } + + totalCapacityMap.put(key, totalCapacity); + usedCapacityMap.put(key, usedCapacity); + + if (sumPodCapacity) { + totalCapacity = totalCapacityMap.get(keyForPodTotal); + usedCapacity = usedCapacityMap.get(keyForPodTotal); + + overprovisioningFactor = 1; + if (capacityType == Capacity.CAPACITY_TYPE_CPU) { + overprovisioningFactor = cpuOverprovisioningFactor; + } + + if (totalCapacity == null) { + totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)); + } else { + totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)) + totalCapacity; + } + + if (usedCapacity == null) { + usedCapacity = new Long(capacity.getUsedCapacity()); + } else { + usedCapacity = new Long(capacity.getUsedCapacity() + usedCapacity); + } + + if (capacityType == Capacity.CAPACITY_TYPE_CPU || capacityType == Capacity.CAPACITY_TYPE_MEMORY) { // Reserved + // Capacity + // accounts + // for + // stopped + // vms +// that + // have +// been + // stopped + // within +// an + // interval + usedCapacity += capacity.getReservedCapacity(); + } + + totalCapacityMap.put(keyForPodTotal, totalCapacity); + usedCapacityMap.put(keyForPodTotal, usedCapacity); + } + } + + List summedCapacities = new ArrayList(); + for (String key : totalCapacityMap.keySet()) { + CapacityVO summedCapacity = new CapacityVO(); + + StringTokenizer st = new StringTokenizer(key, "_"); + summedCapacity.setCapacityType(Short.parseShort(st.nextToken())); + summedCapacity.setDataCenterId(Long.parseLong(st.nextToken())); + if (st.hasMoreTokens()) { + summedCapacity.setPodId(Long.parseLong(st.nextToken())); + } + + summedCapacity.setTotalCapacity(totalCapacityMap.get(key)); + summedCapacity.setUsedCapacity(usedCapacityMap.get(key)); + + summedCapacities.add(summedCapacity); + } + return summedCapacities; + } + + @Override + public List createCapacityResponse(List result, DecimalFormat format) { + List capacityResponses = new ArrayList(); + + for (Capacity summedCapacity : result) { + CapacityResponse capacityResponse = new CapacityResponse(); + capacityResponse.setCapacityTotal(summedCapacity.getTotalCapacity()); + capacityResponse.setCapacityType(summedCapacity.getCapacityType()); + capacityResponse.setCapacityUsed(summedCapacity.getUsedCapacity()); + if (summedCapacity.getPodId() != null) { + capacityResponse.setPodId(summedCapacity.getPodId()); + HostPodVO pod = ApiDBUtils.findPodById(summedCapacity.getPodId()); + if (pod != null) { + capacityResponse.setPodName(pod.getName()); + } + } + if (summedCapacity.getClusterId() != null) { + capacityResponse.setClusterId(summedCapacity.getClusterId()); + ClusterVO cluster = ApiDBUtils.findClusterById(summedCapacity.getClusterId()); + if (cluster != null) { + capacityResponse.setClusterName(cluster.getName()); + if (summedCapacity.getPodId() == null) { + long podId = cluster.getPodId(); + capacityResponse.setPodId(podId); + capacityResponse.setPodName(ApiDBUtils.findPodById(podId).getName()); + } + } + } + capacityResponse.setZoneId(summedCapacity.getDataCenterId()); + capacityResponse.setZoneName(ApiDBUtils.findZoneById(summedCapacity.getDataCenterId()).getName()); + if (summedCapacity.getUsedPercentage() != null){ + capacityResponse.setPercentUsed(format.format(summedCapacity.getUsedPercentage() * 100f)); + } else if (summedCapacity.getTotalCapacity() != 0) { + capacityResponse.setPercentUsed(format.format((float) summedCapacity.getUsedCapacity() / (float) summedCapacity.getTotalCapacity() * 100f)); + } else { + capacityResponse.setPercentUsed(format.format(0L)); + } + + capacityResponse.setObjectName("capacity"); + capacityResponses.add(capacityResponse); + } + + return capacityResponses; + } + + @Override + public TemplatePermissionsResponse createTemplatePermissionsResponse(List accountNames, Long id, boolean isAdmin) { + Long templateOwnerDomain = null; + VirtualMachineTemplate template = ApiDBUtils.findTemplateById(id); + Account templateOwner = ApiDBUtils.findAccountById(template.getAccountId()); + if (isAdmin) { + // FIXME: we have just template id and need to get template owner from that + if (templateOwner != null) { + templateOwnerDomain = templateOwner.getDomainId(); + } + } + + TemplatePermissionsResponse response = new TemplatePermissionsResponse(); + response.setId(template.getId()); + response.setPublicTemplate(template.isPublicTemplate()); + if (isAdmin && (templateOwnerDomain != null)) { + response.setDomainId(templateOwnerDomain); + } + + // Set accounts + List projectIds = new ArrayList(); + List regularAccounts = new ArrayList(); + for (String accountName : accountNames) { + Account account = ApiDBUtils.findAccountByNameDomain(accountName, templateOwner.getDomainId()); + if (account.getType() != Account.ACCOUNT_TYPE_PROJECT) { + regularAccounts.add(accountName); + } else { + // convert account to projectIds + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); + + if (project.getUuid() != null && !project.getUuid().isEmpty()) + projectIds.add(project.getUuid()); + else + projectIds.add(String.valueOf(project.getId())); + } + } + + if (!projectIds.isEmpty()) { + response.setProjectIds(projectIds); + } + + if (!regularAccounts.isEmpty()) { + response.setAccountNames(regularAccounts); + } + + response.setObjectName("templatepermission"); + return response; + } + + @Override + public AsyncJobResponse queryJobResult(QueryAsyncJobResultCmd cmd) { + AsyncJob result = ApiDBUtils._asyncMgr.queryAsyncJobResult(cmd); + return createAsyncJobResponse(result); + } + + @Override + public SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List securityRules) { + SecurityGroupResponse response = new SecurityGroupResponse(); + Map securiytGroupAccounts = new HashMap(); + Map allowedSecurityGroups = new HashMap(); + Map allowedSecuriytGroupAccounts = new HashMap(); + + if ((securityRules != null) && !securityRules.isEmpty()) { + SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(securityRules.get(0).getSecurityGroupId()); + response.setId(securityGroup.getId()); + response.setName(securityGroup.getName()); + response.setDescription(securityGroup.getDescription()); + + Account account = securiytGroupAccounts.get(securityGroup.getAccountId()); + + if (account == null) { + account = ApiDBUtils.findAccountById(securityGroup.getAccountId()); + securiytGroupAccounts.put(securityGroup.getAccountId(), account); + } + + populateAccount(response, account.getId()); + populateDomain(response, account.getDomainId()); + + List egressResponses = new ArrayList(); + List ingressResponses = new ArrayList(); + for (SecurityRule securityRule : securityRules) { + SecurityGroupRuleResponse securityGroupData = new SecurityGroupRuleResponse(); + + securityGroupData.setRuleId(securityRule.getId()); + securityGroupData.setProtocol(securityRule.getProtocol()); + if ("icmp".equalsIgnoreCase(securityRule.getProtocol())) { + securityGroupData.setIcmpType(securityRule.getStartPort()); + securityGroupData.setIcmpCode(securityRule.getEndPort()); + } else { + securityGroupData.setStartPort(securityRule.getStartPort()); + securityGroupData.setEndPort(securityRule.getEndPort()); + } + + Long allowedSecurityGroupId = securityRule.getAllowedNetworkId(); + if (allowedSecurityGroupId != null) { + SecurityGroup allowedSecurityGroup = allowedSecurityGroups.get(allowedSecurityGroupId); + if (allowedSecurityGroup == null) { + allowedSecurityGroup = ApiDBUtils.findSecurityGroupById(allowedSecurityGroupId); + allowedSecurityGroups.put(allowedSecurityGroupId, allowedSecurityGroup); + } + + securityGroupData.setSecurityGroupName(allowedSecurityGroup.getName()); + + Account allowedAccount = allowedSecuriytGroupAccounts.get(allowedSecurityGroup.getAccountId()); + if (allowedAccount == null) { + allowedAccount = ApiDBUtils.findAccountById(allowedSecurityGroup.getAccountId()); + allowedSecuriytGroupAccounts.put(allowedAccount.getId(), allowedAccount); + } + + securityGroupData.setAccountName(allowedAccount.getAccountName()); + } else { + securityGroupData.setCidr(securityRule.getAllowedSourceIpCidr()); + } + if (securityRule.getRuleType() == SecurityRuleType.IngressRule) { + securityGroupData.setObjectName("ingressrule"); + ingressResponses.add(securityGroupData); + } else { + securityGroupData.setObjectName("egressrule"); + egressResponses.add(securityGroupData); + } + + } + response.setSecurityGroupIngressRules(ingressResponses); + response.setSecurityGroupEgressRules(egressResponses); + response.setObjectName("securitygroup"); + + } + return response; + } + + @Override + public NetworkOfferingResponse createNetworkOfferingResponse(NetworkOffering offering) { + NetworkOfferingResponse response = new NetworkOfferingResponse(); + response.setId(offering.getId()); + response.setName(offering.getName()); + response.setDisplayText(offering.getDisplayText()); + response.setTags(offering.getTags()); + response.setTrafficType(offering.getTrafficType().toString()); + response.setIsDefault(offering.isDefault()); + response.setSpecifyVlan(offering.getSpecifyVlan()); + response.setConserveMode(offering.isConserveMode()); + response.setSpecifyIpRanges(offering.getSpecifyIpRanges()); + response.setAvailability(offering.getAvailability().toString()); + response.setNetworkRate(ApiDBUtils.getNetworkRate(offering.getId())); + if (offering.getServiceOfferingId() != null) { + response.setServiceOfferingId(offering.getServiceOfferingId()); + } else { + response.setServiceOfferingId(ApiDBUtils.findDefaultRouterServiceOffering()); + } + if (offering.getGuestType() != null) { + response.setGuestIpType(offering.getGuestType().toString()); + } + + response.setState(offering.getState().name()); + + Map> serviceProviderMap = ApiDBUtils.listNetworkOfferingServices(offering.getId()); + List serviceResponses = new ArrayList(); + for (Service service : serviceProviderMap.keySet()) { + ServiceResponse svcRsp = new ServiceResponse(); + // skip gateway service + if (service == Service.Gateway) { + continue; + } + svcRsp.setName(service.getName()); + List providers = new ArrayList(); + for (Provider provider : serviceProviderMap.get(service)) { + if (provider != null) { + ProviderResponse providerRsp = new ProviderResponse(); + providerRsp.setName(provider.getName()); + providers.add(providerRsp); + } + } + svcRsp.setProviders(providers); + + if (Service.Lb == service) { + List lbCapResponse = new ArrayList(); + + CapabilityResponse lbIsoaltion = new CapabilityResponse(); + lbIsoaltion.setName(Capability.SupportedLBIsolation.getName()); + lbIsoaltion.setValue(offering.getDedicatedLB() ? "dedicated" : "shared"); + lbCapResponse.add(lbIsoaltion); + + CapabilityResponse eLb = new CapabilityResponse(); + eLb.setName(Capability.ElasticLb.getName()); + eLb.setValue(offering.getElasticLb() ? "true" : "false"); + lbCapResponse.add(eLb); + + svcRsp.setCapabilities(lbCapResponse); + } else if (Service.SourceNat == service) { + List capabilities = new ArrayList(); + CapabilityResponse sharedSourceNat = new CapabilityResponse(); + sharedSourceNat.setName(Capability.SupportedSourceNatTypes.getName()); + sharedSourceNat.setValue(offering.getSharedSourceNat() ? "perzone" : "peraccount"); + capabilities.add(sharedSourceNat); + + CapabilityResponse redundantRouter = new CapabilityResponse(); + redundantRouter.setName(Capability.RedundantRouter.getName()); + redundantRouter.setValue(offering.getRedundantRouter() ? "true" : "false"); + capabilities.add(redundantRouter); + + svcRsp.setCapabilities(capabilities); + } else if (service == Service.StaticNat) { + List staticNatCapResponse = new ArrayList(); + + CapabilityResponse eIp = new CapabilityResponse(); + eIp.setName(Capability.ElasticIp.getName()); + eIp.setValue(offering.getElasticLb() ? "true" : "false"); + staticNatCapResponse.add(eIp); + + svcRsp.setCapabilities(staticNatCapResponse); + } + + serviceResponses.add(svcRsp); + } + response.setForVpc(ApiDBUtils.isOfferingForVpc(offering)); + + response.setServices(serviceResponses); + response.setObjectName("networkoffering"); + return response; + } + + @Override + public NetworkResponse createNetworkResponse(Network network) { + // need to get network profile in order to retrieve dns information from there + NetworkProfile profile = ApiDBUtils.getNetworkProfile(network.getId()); + NetworkResponse response = new NetworkResponse(); + response.setId(network.getId()); + response.setName(network.getName()); + response.setDisplaytext(network.getDisplayText()); + if (network.getBroadcastDomainType() != null) { + response.setBroadcastDomainType(network.getBroadcastDomainType().toString()); + } + + if (network.getTrafficType() != null) { + response.setTrafficType(network.getTrafficType().name()); + } + + if (network.getGuestType() != null) { + response.setType(network.getGuestType().toString()); + } + + response.setGateway(network.getGateway()); + + // FIXME - either set netmask or cidr + response.setCidr(network.getCidr()); + if (network.getCidr() != null) { + response.setNetmask(NetUtils.cidr2Netmask(network.getCidr())); + } + + if (network.getBroadcastUri() != null) { + String broadcastUri = network.getBroadcastUri().toString(); + response.setBroadcastUri(broadcastUri); + String vlan="N/A"; + if (broadcastUri.startsWith("vlan")) { + vlan = broadcastUri.substring("vlan://".length(), broadcastUri.length()); + } + response.setVlan(vlan); + } + + DataCenter zone = ApiDBUtils.findZoneById(network.getDataCenterId()); + response.setZoneId(network.getDataCenterId()); + response.setZoneName(zone.getName()); + response.setPhysicalNetworkId(network.getPhysicalNetworkId()); + + // populate network offering information + NetworkOffering networkOffering = ApiDBUtils.findNetworkOfferingById(network.getNetworkOfferingId()); + if (networkOffering != null) { + response.setNetworkOfferingId(networkOffering.getId()); + response.setNetworkOfferingName(networkOffering.getName()); + response.setNetworkOfferingDisplayText(networkOffering.getDisplayText()); + response.setIsSystem(networkOffering.isSystemOnly()); + response.setNetworkOfferingAvailability(networkOffering.getAvailability().toString()); + } + + if (network.getAclType() != null) { + response.setAclType(network.getAclType().toString()); + } + response.setState(network.getState().toString()); + response.setRestartRequired(network.isRestartRequired()); + response.setRelated(network.getRelated()); + response.setNetworkDomain(network.getNetworkDomain()); + + response.setDns1(profile.getDns1()); + response.setDns2(profile.getDns2()); + // populate capability + Map> serviceCapabilitiesMap = ApiDBUtils.getNetworkCapabilities(network.getId(), network.getDataCenterId()); + List serviceResponses = new ArrayList(); + if (serviceCapabilitiesMap != null) { + for (Service service : serviceCapabilitiesMap.keySet()) { + ServiceResponse serviceResponse = new ServiceResponse(); + // skip gateway service + if (service == Service.Gateway) { + continue; + } + serviceResponse.setName(service.getName()); + + // set list of capabilities for the service + List capabilityResponses = new ArrayList(); + Map serviceCapabilities = serviceCapabilitiesMap.get(service); + if (serviceCapabilities != null) { + for (Capability capability : serviceCapabilities.keySet()) { + CapabilityResponse capabilityResponse = new CapabilityResponse(); + String capabilityValue = serviceCapabilities.get(capability); + capabilityResponse.setName(capability.getName()); + capabilityResponse.setValue(capabilityValue); + capabilityResponse.setObjectName("capability"); + capabilityResponses.add(capabilityResponse); + } + serviceResponse.setCapabilities(capabilityResponses); + } + + serviceResponse.setObjectName("service"); + serviceResponses.add(serviceResponse); + } + } + response.setServices(serviceResponses); + + if (network.getAclType() == null || network.getAclType() == ACLType.Account) { + populateOwner(response, network); + } else { + // get domain from network_domain table + Pair domainNetworkDetails = ApiDBUtils.getDomainNetworkDetails(network.getId()); + response.setDomainId(domainNetworkDetails.first()); + response.setSubdomainAccess(domainNetworkDetails.second()); + } + + Long dedicatedDomainId = ApiDBUtils.getDedicatedNetworkDomain(network.getId()); + if (dedicatedDomainId != null) { + Domain domain = ApiDBUtils.findDomainById(dedicatedDomainId); + response.setDomainId(dedicatedDomainId); + response.setDomainName(domain.getName()); + } + + response.setSpecifyIpRanges(network.getSpecifyIpRanges()); + response.setCanUseForDeploy(ApiDBUtils.canUseForDeploy(network)); + response.setVpcId(network.getVpcId()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Network, network.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setObjectName("network"); + return response; + } + + @Override + public Long getSecurityGroupId(String groupName, long accountId) { + SecurityGroup sg = ApiDBUtils.getSecurityGroup(groupName, accountId); + if (sg == null) { + return null; + } else { + return sg.getId(); + } + } + + @Override + public ProjectResponse createProjectResponse(Project project) { + ProjectResponse response = new ProjectResponse(); + response.setId(project.getId()); + response.setName(project.getName()); + response.setDisplaytext(project.getDisplayText()); + response.setState(project.getState().toString()); + + Domain domain = ApiDBUtils.findDomainById(project.getDomainId()); + response.setDomainId(domain.getId()); + response.setDomain(domain.getName()); + + response.setOwner(ApiDBUtils.getProjectOwner(project.getId()).getAccountName()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Project, project.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setObjectName("project"); + return response; + } + + @Override + public FirewallResponse createFirewallResponse(FirewallRule fwRule) { + FirewallResponse response = new FirewallResponse(); + + response.setId(fwRule.getId()); + response.setProtocol(fwRule.getProtocol()); + if (fwRule.getSourcePortStart() != null) { + response.setStartPort(Integer.toString(fwRule.getSourcePortStart())); + } + + if (fwRule.getSourcePortEnd() != null) { + response.setEndPort(Integer.toString(fwRule.getSourcePortEnd())); + } + + List cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId()); + response.setCidrList(StringUtils.join(cidrs, ",")); + + IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId()); + response.setPublicIpAddressId(ip.getId()); + response.setPublicIpAddress(ip.getAddress().addr()); + + FirewallRule.State state = fwRule.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + + response.setIcmpCode(fwRule.getIcmpCode()); + response.setIcmpType(fwRule.getIcmpType()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.FirewallRule, fwRule.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setState(stateToSet); + response.setObjectName("firewallrule"); + return response; + } + + @Override + public NetworkACLResponse createNetworkACLResponse(FirewallRule networkACL) { + NetworkACLResponse response = new NetworkACLResponse(); + + response.setId(networkACL.getId()); + response.setProtocol(networkACL.getProtocol()); + if (networkACL.getSourcePortStart() != null) { + response.setStartPort(Integer.toString(networkACL.getSourcePortStart())); + } + + if (networkACL.getSourcePortEnd() != null) { + response.setEndPort(Integer.toString(networkACL.getSourcePortEnd())); + } + + List cidrs = ApiDBUtils.findFirewallSourceCidrs(networkACL.getId()); + response.setCidrList(StringUtils.join(cidrs, ",")); + + response.setTrafficType(networkACL.getTrafficType().toString()); + + FirewallRule.State state = networkACL.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + + response.setIcmpCode(networkACL.getIcmpCode()); + response.setIcmpType(networkACL.getIcmpType()); + + response.setState(stateToSet); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.NetworkACL, networkACL.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setObjectName("networkacl"); + return response; + } + + public UserVmData newUserVmData(UserVm userVm) { + UserVmData userVmData = new UserVmData(); + userVmData.setId(userVm.getId()); + userVmData.setName(userVm.getHostName()); + userVmData.setCreated(userVm.getCreated()); + userVmData.setGuestOsId(userVm.getGuestOSId()); + userVmData.setHaEnable(userVm.isHaEnabled()); + if (userVm.getState() != null) { + userVmData.setState(userVm.getState().toString()); + } + if (userVm.getDisplayName() != null) { + userVmData.setDisplayName(userVm.getDisplayName()); + } else { + userVmData.setDisplayName(userVm.getHostName()); + } + userVmData.setInstanceName(userVm.getInstanceName()); + + userVmData.setDomainId(userVm.getDomainId()); + + if (userVm.getHypervisorType() != null) { + userVmData.setHypervisor(userVm.getHypervisorType().toString()); + } + + if (userVm.getPassword() != null) { + userVmData.setPassword(userVm.getPassword()); + } + return userVmData; + } + + public UserVmResponse newUserVmResponse(UserVmData userVmData, boolean caller_is_admin) { + UserVmResponse userVmResponse = new UserVmResponse(); + + userVmResponse.setHypervisor(userVmData.getHypervisor()); + userVmResponse.setId(userVmData.getId()); + userVmResponse.setName(userVmData.getName()); + + userVmResponse.setDisplayName(userVmData.getDisplayName()); + + populateAccount(userVmResponse, userVmData.getAccountId()); + populateDomain(userVmResponse, userVmData.getDomainId()); + + userVmResponse.setCreated(userVmData.getCreated()); + userVmResponse.setState(userVmData.getState()); + userVmResponse.setHaEnable(userVmData.getHaEnable()); + userVmResponse.setGroupId(userVmData.getGroupId()); + userVmResponse.setGroup(userVmData.getGroup()); + userVmResponse.setZoneId(userVmData.getZoneId()); + userVmResponse.setZoneName(userVmData.getZoneName()); + if (caller_is_admin) { + userVmResponse.setInstanceName(userVmData.getInstanceName()); + userVmResponse.setHostId(userVmData.getHostId()); + userVmResponse.setHostName(userVmData.getHostName()); + } + userVmResponse.setTemplateId(userVmData.getTemplateId()); + userVmResponse.setTemplateName(userVmData.getTemplateName()); + userVmResponse.setTemplateDisplayText(userVmData.getTemplateDisplayText()); + userVmResponse.setPasswordEnabled(userVmData.getPasswordEnabled()); + userVmResponse.setIsoId(userVmData.getIsoId()); + userVmResponse.setIsoName(userVmData.getIsoName()); + userVmResponse.setIsoDisplayText(userVmData.getIsoDisplayText()); + userVmResponse.setServiceOfferingId(userVmData.getServiceOfferingId()); + userVmResponse.setServiceOfferingName(userVmData.getServiceOfferingName()); + userVmResponse.setCpuNumber(userVmData.getCpuNumber()); + userVmResponse.setCpuSpeed(userVmData.getCpuSpeed()); + userVmResponse.setMemory(userVmData.getMemory()); + userVmResponse.setCpuUsed(userVmData.getCpuUsed()); + userVmResponse.setNetworkKbsRead(userVmData.getNetworkKbsRead()); + userVmResponse.setNetworkKbsWrite(userVmData.getNetworkKbsWrite()); + userVmResponse.setGuestOsId(userVmData.getGuestOsId()); + userVmResponse.setRootDeviceId(userVmData.getRootDeviceId()); + userVmResponse.setRootDeviceType(userVmData.getRootDeviceType()); + userVmResponse.setPassword(userVmData.getPassword()); + userVmResponse.setJobId(userVmData.getJobId()); + userVmResponse.setJobStatus(userVmData.getJobStatus()); + userVmResponse.setForVirtualNetwork(userVmData.getForVirtualNetwork()); + + Set securityGroupResponse = new HashSet(); + for (SecurityGroupData sgd : userVmData.getSecurityGroupList()) { + if (sgd.getId() != null) { + SecurityGroupResponse sgr = new SecurityGroupResponse(); + sgr.setId(sgd.getId()); + sgr.setName(sgd.getName()); + sgr.setDescription(sgd.getDescription()); + + Account account = ApiDBUtils.findAccountByNameDomain(sgd.getAccountName(), sgd.getDomainId()); + if (account != null) { + populateAccount(sgr, account.getId()); + populateDomain(sgr, account.getDomainId()); + } + + sgr.setObjectName(sgd.getObjectName()); + securityGroupResponse.add(sgr); + } + } + userVmResponse.setSecurityGroupList(new ArrayList(securityGroupResponse)); + + Set nicResponses = new HashSet(); + for (NicData nd : userVmData.getNics()) { + NicResponse nr = new NicResponse(); + nr.setId(nd.getId()); + nr.setNetworkid(nd.getNetworkid()); + nr.setNetmask(nd.getNetmask()); + nr.setGateway(nd.getGateway()); + nr.setIpaddress(nd.getIpaddress()); + nr.setIsolationUri(nd.getIsolationUri()); + nr.setBroadcastUri(nd.getBroadcastUri()); + nr.setTrafficType(nd.getTrafficType()); + nr.setType(nd.getType()); + nr.setIsDefault(nd.getIsDefault()); + nr.setMacAddress(nd.getMacAddress()); + nr.setObjectName(nd.getObjectName()); + nicResponses.add(nr); + } + userVmResponse.setNics(new ArrayList(nicResponses)); + userVmResponse.setPublicIpId(userVmData.getPublicIpId()); + userVmResponse.setPublicIp(userVmData.getPublicIp()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.UserVm, userVmData.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + userVmResponse.setTags(tagResponses); + + return userVmResponse; + } + + @Override + public HypervisorCapabilitiesResponse createHypervisorCapabilitiesResponse(HypervisorCapabilities hpvCapabilities) { + HypervisorCapabilitiesResponse hpvCapabilitiesResponse = new HypervisorCapabilitiesResponse(); + hpvCapabilitiesResponse.setId(hpvCapabilities.getId()); + hpvCapabilitiesResponse.setHypervisor(hpvCapabilities.getHypervisorType()); + hpvCapabilitiesResponse.setHypervisorVersion(hpvCapabilities.getHypervisorVersion()); + hpvCapabilitiesResponse.setIsSecurityGroupEnabled(hpvCapabilities.isSecurityGroupEnabled()); + hpvCapabilitiesResponse.setMaxGuestsLimit(hpvCapabilities.getMaxGuestsLimit()); + return hpvCapabilitiesResponse; + } + + private void populateOwner(ControlledEntityResponse response, ControlledEntity object) { + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(object.getAccountId()); + + if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { + // find the project + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); + response.setProjectId(project.getId()); + response.setProjectName(project.getName()); + } else { + response.setAccountName(account.getAccountName()); + } + + Domain domain = ApiDBUtils.findDomainById(object.getDomainId()); + response.setDomainId(domain.getId()); + response.setDomainName(domain.getName()); + } + + private void populateAccount(ControlledEntityResponse response, long accountId) { + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(accountId); + if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { + // find the project + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); + response.setProjectId(project.getId()); + response.setProjectName(project.getName()); + } else { + response.setAccountName(account.getAccountName()); + } + } + + private void populateDomain(ControlledEntityResponse response, long domainId) { + Domain domain = ApiDBUtils.findDomainById(domainId); + + response.setDomainId(domain.getId()); + response.setDomainName(domain.getName()); + } + + @Override + public ProjectAccountResponse createProjectAccountResponse(ProjectAccount projectAccount) { + Account account = ApiDBUtils.findAccountById(projectAccount.getAccountId()); + ProjectAccountResponse projectAccountResponse = new ProjectAccountResponse(); + + long projectId = projectAccount.getProjectId(); + projectAccountResponse.setProjectId(projectId); + projectAccountResponse.setProjectName(ApiDBUtils.findProjectById(projectId).getName()); + + projectAccountResponse.setId(account.getId()); + projectAccountResponse.setAccountName(account.getAccountName()); + projectAccountResponse.setAccountType(account.getType()); + projectAccountResponse.setRole(projectAccount.getAccountRole().toString()); + populateDomain(projectAccountResponse, account.getDomainId()); + + // add all the users for an account as part of the response obj + List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId()); + List userResponseList = new ArrayList(); + for (UserVO user : usersForAccount) { + UserResponse userResponse = createUserResponse(user); + userResponseList.add(userResponse); + } + + projectAccountResponse.setUsers(userResponseList); + projectAccountResponse.setObjectName("projectaccount"); + + return projectAccountResponse; + } + + @Override + public ProjectInvitationResponse createProjectInvitationResponse(ProjectInvitation invite) { + ProjectInvitationResponse response = new ProjectInvitationResponse(); + response.setId(invite.getId()); + response.setProjectId(invite.getProjectId()); + response.setProjectName(ApiDBUtils.findProjectById(invite.getProjectId()).getName()); + response.setInvitationState(invite.getState().toString()); + + if (invite.getForAccountId() != null) { + Account account = ApiDBUtils.findAccountById(invite.getForAccountId()); + response.setAccountName(account.getAccountName()); + + } else { + response.setEmail(invite.getEmail()); + } + + populateDomain(response, invite.getInDomainId()); + + response.setObjectName("projectinvitation"); + return response; + } + + @Override + public SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine vm) { + SystemVmInstanceResponse vmResponse = new SystemVmInstanceResponse(); + vmResponse.setId(vm.getId()); + vmResponse.setSystemVmType(vm.getType().toString().toLowerCase()); + vmResponse.setName(vm.getHostName()); + if (vm.getHostId() != null) { + vmResponse.setHostId(vm.getHostId()); + } + if (vm.getState() != null) { + vmResponse.setState(vm.getState().toString()); + } + if (vm.getType() == Type.DomainRouter) { + VirtualRouter router = (VirtualRouter) vm; + if (router.getRole() != null) { + vmResponse.setRole(router.getRole().toString()); + } + } + vmResponse.setObjectName("systemvminstance"); + return vmResponse; + } + + @Override + public PhysicalNetworkResponse createPhysicalNetworkResponse(PhysicalNetwork result) { + PhysicalNetworkResponse response = new PhysicalNetworkResponse(); + + response.setZoneId(result.getDataCenterId()); + response.setNetworkSpeed(result.getSpeed()); + response.setVlan(result.getVnet()); + response.setDomainId(result.getDomainId()); + response.setId(result.getUuid()); + if (result.getBroadcastDomainRange() != null) { + response.setBroadcastDomainRange(result.getBroadcastDomainRange().toString()); + } + response.setIsolationMethods(result.getIsolationMethods()); + response.setTags(result.getTags()); + if (result.getState() != null) { + response.setState(result.getState().toString()); + } + + response.setName(result.getName()); + + response.setObjectName("physicalnetwork"); + return response; + } + + @Override + public ServiceResponse createNetworkServiceResponse(Service service) { + ServiceResponse response = new ServiceResponse(); + response.setName(service.getName()); + + // set list of capabilities required for the service + List capabilityResponses = new ArrayList(); + Capability[] capabilities = service.getCapabilities(); + for (Capability cap : capabilities) { + CapabilityResponse capabilityResponse = new CapabilityResponse(); + capabilityResponse.setName(cap.getName()); + capabilityResponse.setObjectName("capability"); + if (cap.getName().equals(Capability.SupportedLBIsolation.getName()) || + cap.getName().equals(Capability.SupportedSourceNatTypes.getName()) || + cap.getName().equals(Capability.RedundantRouter.getName())) { + capabilityResponse.setCanChoose(true); + } else { + capabilityResponse.setCanChoose(false); + } + capabilityResponses.add(capabilityResponse); + } + response.setCapabilities(capabilityResponses); + + // set list of providers providing this service + List serviceProviders = ApiDBUtils.getProvidersForService(service); + List serviceProvidersResponses = new ArrayList(); + for (Network.Provider serviceProvider : serviceProviders) { + // return only Virtual Router/JuniperSRX as a provider for the firewall + if (service == Service.Firewall && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.JuniperSRX)) { + continue; + } + + ProviderResponse serviceProviderResponse = createServiceProviderResponse(serviceProvider); + serviceProvidersResponses.add(serviceProviderResponse); + } + response.setProviders(serviceProvidersResponses); + + response.setObjectName("networkservice"); + return response; + + } + + private ProviderResponse createServiceProviderResponse(Provider serviceProvider) { + ProviderResponse response = new ProviderResponse(); + response.setName(serviceProvider.getName()); + boolean canEnableIndividualServices = ApiDBUtils.canElementEnableIndividualServices(serviceProvider); + response.setCanEnableIndividualServices(canEnableIndividualServices); + return response; + } + + @Override + public ProviderResponse createNetworkServiceProviderResponse(PhysicalNetworkServiceProvider result) { + ProviderResponse response = new ProviderResponse(); + response.setId(result.getUuid()); + response.setName(result.getProviderName()); + response.setPhysicalNetworkId(result.getPhysicalNetworkId()); + response.setDestinationPhysicalNetworkId(result.getDestinationPhysicalNetworkId()); + response.setState(result.getState().toString()); + + // set enabled services + List services = new ArrayList(); + for (Service service : result.getEnabledServices()) { + services.add(service.getName()); + } + response.setServices(services); + + response.setObjectName("networkserviceprovider"); + return response; + } + + @Override + public TrafficTypeResponse createTrafficTypeResponse(PhysicalNetworkTrafficType result) { + TrafficTypeResponse response = new TrafficTypeResponse(); + response.setId(result.getUuid()); + response.setPhysicalNetworkId(result.getPhysicalNetworkId()); + response.setTrafficType(result.getTrafficType().toString()); + response.setXenLabel(result.getXenNetworkLabel()); + response.setKvmLabel(result.getKvmNetworkLabel()); + response.setVmwareLabel(result.getVmwareNetworkLabel()); + + response.setObjectName("traffictype"); + return response; + } + + @Override + public VirtualRouterProviderResponse createVirtualRouterProviderResponse(VirtualRouterProvider result) { + VirtualRouterProviderResponse response = new VirtualRouterProviderResponse(); + response.setId(result.getId()); + response.setNspId(result.getNspId()); + response.setEnabled(result.isEnabled()); + + response.setObjectName("virtualrouterelement"); + return response; + } + + @Override + public LBStickinessResponse createLBStickinessPolicyResponse( + StickinessPolicy stickinessPolicy, LoadBalancer lb) { + LBStickinessResponse spResponse = new LBStickinessResponse(); + + spResponse.setlbRuleId(lb.getId()); + Account accountTemp = ApiDBUtils.findAccountById(lb.getAccountId()); + if (accountTemp != null) { + spResponse.setAccountName(accountTemp.getAccountName()); + spResponse.setDomainId(accountTemp.getDomainId()); + spResponse.setDomainName(ApiDBUtils.findDomainById( + accountTemp.getDomainId()).getName()); + } + + List responses = new ArrayList(); + LBStickinessPolicyResponse ruleResponse = new LBStickinessPolicyResponse( + stickinessPolicy); + responses.add(ruleResponse); + + spResponse.setRules(responses); + + spResponse.setObjectName("stickinesspolicies"); + return spResponse; + } + + @Override + public LBStickinessResponse createLBStickinessPolicyResponse( + List stickinessPolicies, LoadBalancer lb) { + LBStickinessResponse spResponse = new LBStickinessResponse(); + + if (lb == null) { + return spResponse; + } + spResponse.setlbRuleId(lb.getId()); + Account account = ApiDBUtils.findAccountById(lb.getAccountId()); + if (account != null) { + spResponse.setAccountName(account.getAccountName()); + spResponse.setDomainId(account.getDomainId()); + spResponse.setDomainName(ApiDBUtils.findDomainById( + account.getDomainId()).getName()); + } + + List responses = new ArrayList(); + for (StickinessPolicy stickinessPolicy : stickinessPolicies) { + LBStickinessPolicyResponse ruleResponse = new LBStickinessPolicyResponse(stickinessPolicy); + responses.add(ruleResponse); + } + spResponse.setRules(responses); + + spResponse.setObjectName("stickinesspolicies"); + return spResponse; + } + + @Override + public LDAPConfigResponse createLDAPConfigResponse(String hostname, + Integer port, Boolean useSSL, String queryFilter, + String searchBase, String bindDN) { + LDAPConfigResponse lr = new LDAPConfigResponse(); + lr.setHostname(hostname); + lr.setPort(port.toString()); + lr.setUseSSL(useSSL.toString()); + lr.setQueryFilter(queryFilter); + lr.setBindDN(bindDN); + lr.setSearchBase(searchBase); + lr.setObjectName("ldapconfig"); + return lr; + } + + @Override + public StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result) { + StorageNetworkIpRangeResponse response = new StorageNetworkIpRangeResponse(); + response.setUuid(result.getUuid()); + response.setVlan(result.getVlan()); + response.setEndIp(result.getEndIp()); + response.setStartIp(result.getStartIp()); + response.setPodUuid(result.getPodUuid()); + response.setZoneUuid(result.getZoneUuid()); + response.setNetworkUuid(result.getNetworkUuid()); + response.setNetmask(result.getNetmask()); + response.setGateway(result.getGateway()); + response.setObjectName("storagenetworkiprange"); + return response; + } + + @Override + public Long getIdentiyId(String tableName, String token) { + return ApiDispatcher.getIdentiyId(tableName, token); + } + + @Override + public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) { + ResourceTagResponse response = new ResourceTagResponse(); + response.setKey(resourceTag.getKey()); + response.setValue(resourceTag.getValue()); + + if (!keyValueOnly) { + response.setResourceType(resourceTag.getResourceType().toString()); + response.setId(ApiDBUtils.getUuid(String.valueOf(resourceTag.getResourceId()),resourceTag.getResourceType())); + Long accountId = resourceTag.getAccountId(); + Long domainId = resourceTag.getDomainId(); + if (accountId != null) { + Account account = ApiDBUtils.findAccountByIdIncludingRemoved(resourceTag.getAccountId()); + + if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { + // find the project + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); + response.setProjectId(project.getId()); + response.setProjectName(project.getName()); + } else { + response.setAccountName(account.getAccountName()); + } + } + + if (domainId != null) { + response.setDomainId(domainId); + response.setDomainName(ApiDBUtils.findDomainById(domainId).getName()); + } + + response.setCustomer(resourceTag.getCustomer()); + } + + response.setObjectName("tag"); + + return response; + } + + @Override + public VpcOfferingResponse createVpcOfferingResponse(VpcOffering offering) { + VpcOfferingResponse response = new VpcOfferingResponse(); + response.setId(offering.getId()); + response.setName(offering.getName()); + response.setDisplayText(offering.getDisplayText()); + response.setIsDefault(offering.isDefault()); + response.setState(offering.getState().name()); + + Map> serviceProviderMap = ApiDBUtils.listVpcOffServices(offering.getId()); + List serviceResponses = new ArrayList(); + for (Service service : serviceProviderMap.keySet()) { + ServiceResponse svcRsp = new ServiceResponse(); + // skip gateway service + if (service == Service.Gateway) { + continue; + } + svcRsp.setName(service.getName()); + List providers = new ArrayList(); + for (Provider provider : serviceProviderMap.get(service)) { + if (provider != null) { + ProviderResponse providerRsp = new ProviderResponse(); + providerRsp.setName(provider.getName()); + providers.add(providerRsp); + } + } + svcRsp.setProviders(providers); + + serviceResponses.add(svcRsp); + } + response.setServices(serviceResponses); + response.setObjectName("vpcoffering"); + return response; + } + + @Override + public VpcResponse createVpcResponse(Vpc vpc) { + VpcResponse response = new VpcResponse(); + response.setId(vpc.getId()); + response.setName(vpc.getName()); + response.setDisplayText(vpc.getDisplayText()); + response.setState(vpc.getState().name()); + response.setVpcOfferingId(vpc.getVpcOfferingId()); + response.setCidr(vpc.getCidr()); + response.setRestartRequired(vpc.isRestartRequired()); + response.setNetworkDomain(vpc.getNetworkDomain()); + + Map> serviceProviderMap = ApiDBUtils.listVpcOffServices(vpc.getVpcOfferingId()); + List serviceResponses = new ArrayList(); + for (Service service : serviceProviderMap.keySet()) { + ServiceResponse svcRsp = new ServiceResponse(); + // skip gateway service + if (service == Service.Gateway) { + continue; + } + svcRsp.setName(service.getName()); + List providers = new ArrayList(); + for (Provider provider : serviceProviderMap.get(service)) { + if (provider != null) { + ProviderResponse providerRsp = new ProviderResponse(); + providerRsp.setName(provider.getName()); + providers.add(providerRsp); + } + } + svcRsp.setProviders(providers); + + serviceResponses.add(svcRsp); + } + + List networkResponses = new ArrayList(); + List networks = ApiDBUtils.listVpcNetworks(vpc.getId()); + for (Network network : networks) { + NetworkResponse ntwkRsp = createNetworkResponse(network); + networkResponses.add(ntwkRsp); + } + + DataCenter zone = ApiDBUtils.findZoneById(vpc.getZoneId()); + response.setZoneId(vpc.getZoneId()); + response.setZoneName(zone.getName()); + + response.setNetworks(networkResponses); + response.setServices(serviceResponses); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Vpc, vpc.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + + response.setObjectName("vpc"); + return response; + } + + @Override + public PrivateGatewayResponse createPrivateGatewayResponse(PrivateGateway result) { + PrivateGatewayResponse response = new PrivateGatewayResponse(); + response.setId(result.getId()); + response.setVlan(result.getVlanTag()); + response.setGateway(result.getGateway()); + response.setNetmask(result.getNetmask()); + response.setVpcId(result.getVpcId()); + response.setZoneId(result.getZoneId()); + DataCenter zone = ApiDBUtils.findZoneById(result.getZoneId()); + response.setZoneName(zone.getName()); + response.setAddress(result.getIp4Address()); + response.setPhysicalNetworkId(result.getPhysicalNetworkId()); + + populateAccount(response, result.getAccountId()); + populateDomain(response, result.getDomainId()); + response.setState(result.getState().toString()); + + response.setObjectName("privategateway"); + return response; + } + + @Override + public AutoScaleVmProfileResponse createAutoScaleVmProfileResponse(AutoScaleVmProfile profile) { + AutoScaleVmProfileResponse response = new AutoScaleVmProfileResponse(); + response.setId(profile.getId()); + response.setZoneId(profile.getZoneId()); + response.setServiceOfferingId(profile.getServiceOfferingId()); + response.setTemplateId(profile.getTemplateId()); + response.setOtherDeployParams(profile.getOtherDeployParams()); + response.setSnmpCommunity(profile.getSnmpCommunity()); + response.setSnmpPort(profile.getSnmpPort()); + response.setDestroyVmGraceperiod(profile.getDestroyVmGraceperiod()); + response.setAutoscaleUserId(profile.getAutoScaleUserId()); + // Populates the account information in the response + populateOwner(response, profile); + return response; + } + + @Override + public AutoScalePolicyResponse createAutoScalePolicyResponse(AutoScalePolicy policy) { + AutoScalePolicyResponse response = new AutoScalePolicyResponse(); + response.setId(policy.getId()); + response.setDuration(policy.getDuration()); + response.setQuietTime(policy.getQuietTime()); + response.setAction(policy.getAction()); + List vos = ApiDBUtils.getAutoScalePolicyConditions(policy.getId()); + ArrayList conditions = new ArrayList(vos.size()); + for (ConditionVO vo : vos) { + conditions.add(createConditionResponse(vo)); + } + response.setConditions(conditions); + + // Populates the account information in the response + populateOwner(response, policy); + + return response; + } + + @Override + public AutoScaleVmGroupResponse createAutoScaleVmGroupResponse(AutoScaleVmGroup vmGroup) { + AutoScaleVmGroupResponse response = new AutoScaleVmGroupResponse(); + response.setId(vmGroup.getId()); + response.setMinMembers(vmGroup.getMinMembers()); + response.setMaxMembers(vmGroup.getMaxMembers()); + response.setInterval(vmGroup.getInterval()); + response.setProfileId(vmGroup.getProfileId()); + response.setLoadBalancerId(vmGroup.getProfileId()); + + List scaleUpPoliciesResponse = new ArrayList(); + List scaleDownPoliciesResponse = new ArrayList(); + response.setScaleUpPolicies(scaleUpPoliciesResponse); + response.setScaleDownPolicies(scaleDownPoliciesResponse); + + // Fetch policies for vmgroup + List scaleUpPolicies = new ArrayList(); + List scaleDownPolicies = new ArrayList(); + ApiDBUtils.getAutoScaleVmGroupPolicies(vmGroup.getId(), scaleUpPolicies, scaleDownPolicies); + // populate policies + for (AutoScalePolicy autoScalePolicy : scaleUpPolicies) { + scaleUpPoliciesResponse.add(createAutoScalePolicyResponse(autoScalePolicy)); + } + for (AutoScalePolicy autoScalePolicy : scaleDownPolicies) { + scaleDownPoliciesResponse.add(createAutoScalePolicyResponse(autoScalePolicy)); + } + return response; + } + + @Override + public StaticRouteResponse createStaticRouteResponse(StaticRoute result) { + StaticRouteResponse response = new StaticRouteResponse(); + response.setId(result.getId()); + response.setVpcId(result.getVpcId()); + response.setCidr(result.getCidr()); + + StaticRoute.State state = result.getState(); + String stateToSet = state.toString(); + if (state.equals(FirewallRule.State.Revoke)) { + stateToSet = "Deleting"; + } + response.setState(stateToSet); + populateAccount(response, result.getAccountId()); + populateDomain(response, result.getDomainId()); + + //set tag information + List tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.StaticRoute, result.getId()); + List tagResponses = new ArrayList(); + for (ResourceTag tag : tags) { + ResourceTagResponse tagResponse = createResourceTagResponse(tag, true); + tagResponses.add(tagResponse); + } + response.setTags(tagResponses); + response.setObjectName("staticroute"); + return response; + } + + @Override + public Site2SiteVpnGatewayResponse createSite2SiteVpnGatewayResponse(Site2SiteVpnGateway result) { + Site2SiteVpnGatewayResponse response = new Site2SiteVpnGatewayResponse(); + response.setId(result.getId()); + response.setIp(ApiDBUtils.findIpAddressById(result.getAddrId()).getAddress().toString()); + response.setVpcId(result.getVpcId()); + response.setRemoved(result.getRemoved()); + response.setObjectName("vpngateway"); + + populateAccount(response, result.getAccountId()); + populateDomain(response, result.getDomainId()); + + return response; + } + + @Override + public Site2SiteCustomerGatewayResponse createSite2SiteCustomerGatewayResponse(Site2SiteCustomerGateway result) { + Site2SiteCustomerGatewayResponse response = new Site2SiteCustomerGatewayResponse(); + response.setId(result.getId()); + response.setGatewayIp(result.getGatewayIp()); + response.setGuestCidrList(result.getGuestCidrList()); + response.setIpsecPsk(result.getIpsecPsk()); + response.setRemoved(result.getRemoved()); + response.setObjectName("vpncustomergateway"); + + populateAccount(response, result.getAccountId()); + populateDomain(response, result.getDomainId()); + + return response; + } + + @Override + public Site2SiteVpnConnectionResponse createSite2SiteVpnConnectionResponse(Site2SiteVpnConnection result) { + Site2SiteVpnConnectionResponse response = new Site2SiteVpnConnectionResponse(); + response.setId(result.getId()); + + response.setVpnGatewayId(result.getVpnGatewayId()); + Long vpnGatewayId = result.getVpnGatewayId(); + if(vpnGatewayId != null) { + Site2SiteVpnGatewayVO vpnGateway = ApiDBUtils.findVpnGatewayById(vpnGatewayId); + + long ipId = vpnGateway.getAddrId(); + IPAddressVO ipObj = ApiDBUtils.findIpAddressById(ipId); + response.setIp(ipObj.getAddress().addr()); + } + + response.setCustomerGatewayId(result.getCustomerGatewayId()); + Long customerGatewayId = result.getCustomerGatewayId(); + if(customerGatewayId != null) { + Site2SiteCustomerGatewayVO customerGateway = ApiDBUtils.findCustomerGatewayById(customerGatewayId); + response.setGatewayIp(customerGateway.getGatewayIp()); + response.setGuestCidrList(customerGateway.getGuestCidrList()); + response.setIpsecPsk(customerGateway.getIpsecPsk()); + response.setIkePolicy(customerGateway.getIkePolicy()); + response.setEspPolicy(customerGateway.getEspPolicy()); + response.setLifetime(customerGateway.getLifetime()); + } + + populateAccount(response, result.getAccountId()); + populateDomain(response, result.getDomainId()); + + response.setState(result.getState().toString()); + response.setCreated(result.getCreated()); + response.setRemoved(result.getRemoved()); + response.setObjectName("vpnconnection"); + return response; + } + + /* + * + * @Override + * public CounterResponse createCounterResponse(Counter counter) { + * CounterResponse response = new CounterResponse(); + * response.setId(counter.getId()); + * response.setSource(counter.getSource().toString()); + * response.setName(counter.getName()); + * response.setValue(counter.getValue()); + * response.setZoneId(counter.getZoneId()); + * response.setObjectName("counter"); + * + * response.setVpnGatewayId(result.getVpnGatewayId()); + * Long vpnGatewayId = result.getVpnGatewayId(); + * if(vpnGatewayId != null) { + * Site2SiteVpnGatewayVO vpnGateway = ApiDBUtils.findVpnGatewayById(vpnGatewayId); + * + * long ipId = vpnGateway.getAddrId(); + * IPAddressVO ipObj = ApiDBUtils.findIpAddressById(ipId); + * response.setIp(ipObj.getAddress().addr()); + * } + * + * response.setCustomerGatewayId(result.getCustomerGatewayId()); + * Long customerGatewayId = result.getCustomerGatewayId(); + * if(customerGatewayId != null) { + * Site2SiteCustomerGatewayVO customerGateway = ApiDBUtils.findCustomerGatewayById(customerGatewayId); + * response.setGatewayIp(customerGateway.getGatewayIp()); + * response.setGuestCidrList(customerGateway.getGuestCidrList()); + * response.setIpsecPsk(customerGateway.getIpsecPsk()); + * response.setIkePolicy(customerGateway.getIkePolicy()); + * response.setEspPolicy(customerGateway.getEspPolicy()); + * response.setLifetime(customerGateway.getLifetime()); + * } + * + * response.setCreated(result.getCreated()); + * response.setRemoved(result.getRemoved()); + * response.setObjectName("vpnconnection"); + * return response; + * } + */ + + // @Override + // public ConditionResponse createConditionResponse(Condition condition) { + // ConditionResponse response = new ConditionResponse(); + // response.setId(condition.getId()); + // CounterResponse counter; + // counter = createCounterResponse(ApiDBUtils.getCounter(condition.getCounterid())); + // response.setCounter(counter); + // response.setRelationalOperator(condition.getRelationalOperator().toString()); + // response.setThreshold(condition.getThreshold()); + // Account account = ApiDBUtils.findAccountById(condition.getAccountId()); + // response.setZoneId(condition.getZoneId()); + // response.setObjectName("condition"); + // + // populateOwner(response, condition); + // return response; + // } + + @Override + public CounterResponse createCounterResponse(Counter counter) { + CounterResponse response = new CounterResponse(); + response.setId(counter.getId()); + response.setSource(counter.getSource().toString()); + response.setName(counter.getName()); + response.setValue(counter.getValue()); + response.setObjectName("counter"); + return response; + } + + @Override + public ConditionResponse createConditionResponse(Condition condition) { + ConditionResponse response = new ConditionResponse(); + response.setId(condition.getId()); + CounterResponse counter; + counter = createCounterResponse(ApiDBUtils.getCounter(condition.getCounterid())); + response.setCounter(counter); + response.setRelationalOperator(condition.getRelationalOperator().toString()); + response.setThreshold(condition.getThreshold()); + response.setObjectName("condition"); + populateOwner(response, condition); + return response; + } +} diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java index a840fac90ab..5586aace2ef 100755 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@ -1,1101 +1,1137 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.api; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.InterruptedIOException; -import java.io.UnsupportedEncodingException; -import java.net.InetAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.security.SecureRandom; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.TimeZone; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.apache.http.ConnectionClosedException; -import org.apache.http.HttpException; -import org.apache.http.HttpRequest; -import org.apache.http.HttpResponse; -import org.apache.http.HttpServerConnection; -import org.apache.http.HttpStatus; -import org.apache.http.entity.BasicHttpEntity; -import org.apache.http.impl.DefaultHttpResponseFactory; -import org.apache.http.impl.DefaultHttpServerConnection; -import org.apache.http.impl.NoConnectionReuseStrategy; -import org.apache.http.impl.SocketHttpServerConnection; -import org.apache.http.params.BasicHttpParams; -import org.apache.http.params.CoreConnectionPNames; -import org.apache.http.params.CoreProtocolPNames; -import org.apache.http.params.HttpParams; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.BasicHttpProcessor; -import org.apache.http.protocol.HttpContext; -import org.apache.http.protocol.HttpRequestHandler; -import org.apache.http.protocol.HttpRequestHandlerRegistry; -import org.apache.http.protocol.HttpService; -import org.apache.http.protocol.ResponseConnControl; -import org.apache.http.protocol.ResponseContent; -import org.apache.http.protocol.ResponseDate; -import org.apache.http.protocol.ResponseServer; -import org.apache.log4j.Logger; - -import com.cloud.api.response.ApiResponseSerializer; -import com.cloud.api.response.ExceptionResponse; -import com.cloud.api.response.ListResponse; -import com.cloud.async.AsyncJob; -import com.cloud.async.AsyncJobManager; -import com.cloud.async.AsyncJobVO; -import com.cloud.cluster.StackMaid; -import com.cloud.configuration.Config; -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.EventUtils; -import com.cloud.exception.CloudAuthenticationException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.server.ManagementServer; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.DomainManager; -import com.cloud.user.User; -import com.cloud.user.UserAccount; -import com.cloud.user.UserContext; -import com.cloud.user.UserVO; -import com.cloud.utils.IdentityProxy; -import com.cloud.utils.Pair; -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.component.PluggableService; -import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.encoding.Base64; -import com.cloud.uuididentity.dao.IdentityDao; -import com.cloud.utils.exception.CSExceptionErrorCode; - - -public class ApiServer implements HttpRequestHandler { - private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName()); - private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName()); - - public static final short ADMIN_COMMAND = 1; - public static final short DOMAIN_ADMIN_COMMAND = 4; - public static final short RESOURCE_DOMAIN_ADMIN_COMMAND = 2; - public static final short USER_COMMAND = 8; - public static boolean encodeApiResponse = false; - public static String jsonContentType = "text/javascript"; - private Properties _apiCommands = null; - private ApiDispatcher _dispatcher; - private AccountManager _accountMgr = null; - private DomainManager _domainMgr = null; - private AsyncJobManager _asyncMgr = null; - private Account _systemAccount = null; - private User _systemUser = null; - - private static int _workerCount = 0; - - private static ApiServer s_instance = null; - private static List s_userCommands = null; - private static List s_resellerCommands = null; // AKA domain-admin - private static List s_adminCommands = null; - private static List s_resourceDomainAdminCommands = null; - private static List s_allCommands = null; - private static List s_pluggableServiceCommands = null; - private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); - - private static ExecutorService _executor = new ThreadPoolExecutor(10, 150, 60, TimeUnit.SECONDS, new LinkedBlockingQueue(), new NamedThreadFactory("ApiServer")); - - static { - s_userCommands = new ArrayList(); - s_resellerCommands = new ArrayList(); - s_adminCommands = new ArrayList(); - s_resourceDomainAdminCommands = new ArrayList(); - s_allCommands = new ArrayList(); - s_pluggableServiceCommands = new ArrayList(); - } - - private ApiServer() { - } - - public static void initApiServer(String[] apiConfig) { - if (s_instance == null) { - s_instance = new ApiServer(); - s_instance.init(apiConfig); - } - } - - public static ApiServer getInstance() { - // initApiServer(); - return s_instance; - } - - public Properties get_apiCommands() { - return _apiCommands; - } - - public static boolean isPluggableServiceCommand(String cmdClassName) { - if (s_pluggableServiceCommands != null) { - if (s_pluggableServiceCommands.contains(cmdClassName)) { - return true; - } - } - return false; - } - - private String[] getPluggableServicesApiConfigs() { - List pluggableServicesApiConfigs = new ArrayList(); - - ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); - List services = locator.getAllPluggableServices(); - for (PluggableService service : services) { - pluggableServicesApiConfigs.add(service.getPropertiesFile()); - } - return pluggableServicesApiConfigs.toArray(new String[0]); - } - - private void processConfigFiles(String[] apiConfig, boolean pluggableServicesConfig) { - try { - if (_apiCommands == null) { - _apiCommands = new Properties(); - } - Properties preProcessedCommands = new Properties(); - if (apiConfig != null) { - for (String configFile : apiConfig) { - File commandsFile = PropertiesUtil.findConfigFile(configFile); - if (commandsFile != null) { - try { - preProcessedCommands.load(new FileInputStream(commandsFile)); - } catch (FileNotFoundException fnfex) { - // in case of a file within a jar in classpath, try to open stream using url - InputStream stream = PropertiesUtil.openStreamFromURL(configFile); - if (stream != null) { - preProcessedCommands.load(stream); - } else { - s_logger.error("Unable to find properites file", fnfex); - } - } - } - } - for (Object key : preProcessedCommands.keySet()) { - String preProcessedCommand = preProcessedCommands.getProperty((String) key); - String[] commandParts = preProcessedCommand.split(";"); - _apiCommands.put(key, commandParts[0]); - - if (pluggableServicesConfig) { - s_pluggableServiceCommands.add(commandParts[0]); - } - - if (commandParts.length > 1) { - try { - short cmdPermissions = Short.parseShort(commandParts[1]); - if ((cmdPermissions & ADMIN_COMMAND) != 0) { - s_adminCommands.add((String) key); - } - if ((cmdPermissions & RESOURCE_DOMAIN_ADMIN_COMMAND) != 0) { - s_resourceDomainAdminCommands.add((String) key); - } - if ((cmdPermissions & DOMAIN_ADMIN_COMMAND) != 0) { - s_resellerCommands.add((String) key); - } - if ((cmdPermissions & USER_COMMAND) != 0) { - s_userCommands.add((String) key); - } - } catch (NumberFormatException nfe) { - s_logger.info("Malformed command.properties permissions value, key = " + key + ", value = " + preProcessedCommand); - } - } - } - - s_allCommands.addAll(s_adminCommands); - s_allCommands.addAll(s_resourceDomainAdminCommands); - s_allCommands.addAll(s_userCommands); - s_allCommands.addAll(s_resellerCommands); - } - } catch (FileNotFoundException fnfex) { - s_logger.error("Unable to find properites file", fnfex); - } catch (IOException ioex) { - s_logger.error("Exception loading properties file", ioex); - } - } - - public void init(String[] apiConfig) { - BaseCmd.setComponents(new ApiResponseHelper()); - BaseListCmd.configure(); - processConfigFiles(apiConfig, false); - - // get commands for all pluggable services - String[] pluggableServicesApiConfigs = getPluggableServicesApiConfigs(); - processConfigFiles(pluggableServicesApiConfigs, true); - - ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); - _accountMgr = locator.getManager(AccountManager.class); - _asyncMgr = locator.getManager(AsyncJobManager.class); - _systemAccount = _accountMgr.getSystemAccount(); - _systemUser = _accountMgr.getSystemUser(); - _dispatcher = ApiDispatcher.getInstance(); - _domainMgr = locator.getManager(DomainManager.class); - - Integer apiPort = null; // api port, null by default - ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); - SearchCriteria sc = configDao.createSearchCriteria(); - sc.addAnd("name", SearchCriteria.Op.EQ, "integration.api.port"); - List values = configDao.search(sc, null); - if ((values != null) && (values.size() > 0)) { - ConfigurationVO apiPortConfig = values.get(0); - if (apiPortConfig.getValue() != null) { - apiPort = Integer.parseInt(apiPortConfig.getValue()); - } - } - - encodeApiResponse = Boolean.valueOf(configDao.getValue(Config.EncodeApiResponse.key())); - - String jsonType = configDao.getValue(Config.JavaScriptDefaultContentType.key()); - if (jsonType != null) { - jsonContentType = jsonType; - } - - if (apiPort != null) { - ListenerThread listenerThread = new ListenerThread(this, apiPort); - listenerThread.start(); - } - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException { - // get some information for the access log... - StringBuffer sb = new StringBuffer(); - HttpServerConnection connObj = (HttpServerConnection) context.getAttribute("http.connection"); - if (connObj instanceof SocketHttpServerConnection) { - InetAddress remoteAddr = ((SocketHttpServerConnection) connObj).getRemoteAddress(); - sb.append(remoteAddr.toString() + " -- "); - } - sb.append(request.getRequestLine()); - - try { - String uri = request.getRequestLine().getUri(); - int requestParamsStartIndex = uri.indexOf('?'); - if (requestParamsStartIndex >= 0) { - uri = uri.substring(requestParamsStartIndex + 1); - } - - String[] paramArray = uri.split("&"); - if (paramArray.length < 1) { - s_logger.info("no parameters received for request: " + uri + ", aborting..."); - return; - } - - Map parameterMap = new HashMap(); - - String responseType = BaseCmd.RESPONSE_TYPE_XML; - for (String paramEntry : paramArray) { - String[] paramValue = paramEntry.split("="); - if (paramValue.length != 2) { - s_logger.info("malformed parameter: " + paramEntry + ", skipping"); - continue; - } - if ("response".equalsIgnoreCase(paramValue[0])) { - responseType = paramValue[1]; - } else { - // according to the servlet spec, the parameter map should be in the form (name=String, - // value=String[]), so - // parameter values will be stored in an array - parameterMap.put(/* name */paramValue[0], /* value */new String[] { paramValue[1] }); - } - } - try { - // always trust commands from API port, user context will always be UID_SYSTEM/ACCOUNT_ID_SYSTEM - UserContext.registerContext(_systemUser.getId(), _systemAccount, null, true); - sb.insert(0, "(userId=" + User.UID_SYSTEM + " accountId=" + Account.ACCOUNT_ID_SYSTEM + " sessionId=" + null + ") "); - String responseText = handleRequest(parameterMap, true, responseType, sb); - sb.append(" 200 " + ((responseText == null) ? 0 : responseText.length())); - - writeResponse(response, responseText, HttpStatus.SC_OK, responseType, null); - } catch (ServerApiException se) { - String responseText = getSerializedApiError(se.getErrorCode(), se.getDescription(), parameterMap, responseType, se); - writeResponse(response, responseText, se.getErrorCode(), responseType, se.getDescription()); - sb.append(" " + se.getErrorCode() + " " + se.getDescription()); - } catch (RuntimeException e) { - // log runtime exception like NullPointerException to help identify the source easier - s_logger.error("Unhandled exception, ", e); - throw e; - } - } finally { - s_accessLogger.info(sb.toString()); - UserContext.unregisterContext(); - } - } - - @SuppressWarnings("rawtypes") - public String handleRequest(Map params, boolean decode, String responseType, StringBuffer auditTrailSb) throws ServerApiException { - String response = null; - String[] command = null; - try { - command = (String[]) params.get("command"); - if (command == null) { - s_logger.error("invalid request, no command sent"); - if (s_logger.isTraceEnabled()) { - s_logger.trace("dumping request parameters"); - for (Object key : params.keySet()) { - String keyStr = (String) key; - String[] value = (String[]) params.get(key); - s_logger.trace(" key: " + keyStr + ", value: " + ((value == null) ? "'null'" : value[0])); - } - } - throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "Invalid request, no command sent"); - } else { - Map paramMap = new HashMap(); - Set keys = params.keySet(); - Iterator keysIter = keys.iterator(); - while (keysIter.hasNext()) { - String key = (String) keysIter.next(); - if ("command".equalsIgnoreCase(key)) { - continue; - } - String[] value = (String[]) params.get(key); - - String decodedValue = null; - if (decode) { - try { - decodedValue = URLDecoder.decode(value[0], "UTF-8"); - } catch (UnsupportedEncodingException usex) { - s_logger.warn(key + " could not be decoded, value = " + value[0]); - throw new ServerApiException(BaseCmd.PARAM_ERROR, key + " could not be decoded, received value " + value[0]); - } catch (IllegalArgumentException iae) { - s_logger.warn(key + " could not be decoded, value = " + value[0]); - throw new ServerApiException(BaseCmd.PARAM_ERROR, key + " could not be decoded, received value " + value[0] + " which contains illegal characters eg.%"); - } - } else { - decodedValue = value[0]; - } - paramMap.put(key, decodedValue); - } - String cmdClassName = _apiCommands.getProperty(command[0]); - if (cmdClassName != null) { - Class cmdClass = Class.forName(cmdClassName); - BaseCmd cmdObj = (BaseCmd) cmdClass.newInstance(); - cmdObj.setFullUrlParams(paramMap); - cmdObj.setResponseType(responseType); - // This is where the command is either serialized, or directly dispatched - response = queueCommand(cmdObj, paramMap); - buildAuditTrail(auditTrailSb, command[0], response); - } else { - if (!command[0].equalsIgnoreCase("login") && !command[0].equalsIgnoreCase("logout")) { - String errorString = "Unknown API command: " + ((command == null) ? "null" : command[0]); - s_logger.warn(errorString); - auditTrailSb.append(" " + errorString); - throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, errorString); - } - } - } - } catch (Exception ex) { - if (ex instanceof InvalidParameterValueException) { - InvalidParameterValueException ref = (InvalidParameterValueException)ex; - ServerApiException e = new ServerApiException(BaseCmd.PARAM_ERROR, ex.getMessage()); - // copy over the IdentityProxy information as well and throw the serverapiexception. - ArrayList idList = ref.getIdProxyList(); - if (idList != null) { - // Iterate through entire arraylist and copy over each proxy id. - for (int i = 0 ; i < idList.size(); i++) { - IdentityProxy obj = idList.get(i); - e.addProxyObject(obj.getTableName(), obj.getValue(), obj.getidFieldName()); - } - } - // Also copy over the cserror code and the function/layer in which it was thrown. - e.setCSErrorCode(ref.getCSErrorCode()); - throw e; - } else if (ex instanceof PermissionDeniedException) { - PermissionDeniedException ref = (PermissionDeniedException)ex; - ServerApiException e = new ServerApiException(BaseCmd.ACCOUNT_ERROR, ex.getMessage()); - // copy over the IdentityProxy information as well and throw the serverapiexception. - ArrayList idList = ref.getIdProxyList(); - if (idList != null) { - // Iterate through entire arraylist and copy over each proxy id. - for (int i = 0 ; i < idList.size(); i++) { - IdentityProxy obj = idList.get(i); - e.addProxyObject(obj.getTableName(), obj.getValue(), obj.getidFieldName()); - } - } - e.setCSErrorCode(ref.getCSErrorCode()); - throw e; - } else if (ex instanceof ServerApiException) { - throw (ServerApiException) ex; - } else { - s_logger.error("unhandled exception executing api command: " + ((command == null) ? "null" : command[0]), ex); - ServerApiException e = new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal server error, unable to execute request."); - e.setCSErrorCode(CSExceptionErrorCode.getCSErrCode("ServerApiException")); - throw e; - } - } - return response; - } - - private String queueCommand(BaseCmd cmdObj, Map params) { - UserContext ctx = UserContext.current(); - Long callerUserId = ctx.getCallerUserId(); - Account caller = ctx.getCaller(); - if (cmdObj instanceof BaseAsyncCmd) { - Long objectId = null; - String objectEntityTable = null; - if (cmdObj instanceof BaseAsyncCreateCmd) { - BaseAsyncCreateCmd createCmd = (BaseAsyncCreateCmd) cmdObj; - _dispatcher.dispatchCreateCmd(createCmd, params); - objectId = createCmd.getEntityId(); - objectEntityTable = createCmd.getEntityTable(); - params.put("id", objectId.toString()); - } else { - ApiDispatcher.setupParameters(cmdObj, params); - ApiDispatcher.plugService(cmdObj); - } - - BaseAsyncCmd asyncCmd = (BaseAsyncCmd) cmdObj; - - if (callerUserId != null) { - params.put("ctxUserId", callerUserId.toString()); - } - if (caller != null) { - params.put("ctxAccountId", String.valueOf(caller.getId())); - } - - long startEventId = ctx.getStartEventId(); - asyncCmd.setStartEventId(startEventId); - - // save the scheduled event - Long eventId = EventUtils.saveScheduledEvent((callerUserId == null) ? User.UID_SYSTEM : callerUserId, - asyncCmd.getEntityOwnerId(), asyncCmd.getEventType(), asyncCmd.getEventDescription(), - startEventId); - if (startEventId == 0) { - // There was no create event before, set current event id as start eventId - startEventId = eventId; - } - - params.put("ctxStartEventId", String.valueOf(startEventId)); - - ctx.setAccountId(asyncCmd.getEntityOwnerId()); - - AsyncJobVO job = new AsyncJobVO(); - job.setInstanceId((objectId == null) ? asyncCmd.getInstanceId() : objectId); - job.setInstanceType(asyncCmd.getInstanceType()); - job.setUserId(callerUserId); - job.setAccountId(caller.getId()); - - job.setCmd(cmdObj.getClass().getName()); - job.setCmdInfo(ApiGsonHelper.getBuilder().create().toJson(params)); - - long jobId = _asyncMgr.submitAsyncJob(job); - - if (jobId == 0L) { - String errorMsg = "Unable to schedule async job for command " + job.getCmd(); - s_logger.warn(errorMsg); - throw new ServerApiException(BaseCmd.INTERNAL_ERROR, errorMsg); - } - - if (objectId != null) { - SerializationContext.current().setUuidTranslation(true); - return ((BaseAsyncCreateCmd) asyncCmd).getResponse(jobId, objectId, objectEntityTable); - } - - SerializationContext.current().setUuidTranslation(true); - return ApiResponseSerializer.toSerializedString(asyncCmd.getResponse(jobId), asyncCmd.getResponseType()); - } else { - _dispatcher.dispatch(cmdObj, params); - - // if the command is of the listXXXCommand, we will need to also return the - // the job id and status if possible - if (cmdObj instanceof BaseListCmd) { - buildAsyncListResponse((BaseListCmd) cmdObj, caller); - } - - SerializationContext.current().setUuidTranslation(true); - return ApiResponseSerializer.toSerializedString((ResponseObject) cmdObj.getResponseObject(), cmdObj.getResponseType()); - } - } - - private void buildAsyncListResponse(BaseListCmd command, Account account) { - List responses = ((ListResponse) command.getResponseObject()).getResponses(); - if (responses != null && responses.size() > 0) { - List jobs = null; - - // list all jobs for ROOT admin - if (account.getType() == Account.ACCOUNT_TYPE_ADMIN) { - jobs = _asyncMgr.findInstancePendingAsyncJobs(command.getInstanceType(), null); - } else { - jobs = _asyncMgr.findInstancePendingAsyncJobs(command.getInstanceType(), account.getId()); - } - - if (jobs.size() == 0) { - return; - } - - // Using maps might possibly be more efficient if the set is large enough but for now, we'll just do a - // comparison of two lists. Either way, there shouldn't be too many async jobs active for the account. - for (AsyncJob job : jobs) { - if (job.getInstanceId() == null) { - continue; - } - for (ResponseObject response : responses) { - if (response.getObjectId() != null && job.getInstanceId().longValue() == response.getObjectId().longValue()) { - response.setJobId(job.getId()); - response.setJobStatus(job.getStatus()); - } - } - } - } - } - - private void buildAuditTrail(StringBuffer auditTrailSb, String command, String result) { - if (result == null) { - return; - } - auditTrailSb.append(" " + HttpServletResponse.SC_OK + " "); - auditTrailSb.append(result); - /* - * if (command.equals("queryAsyncJobResult")){ //For this command we need to also log job status and job - * resultcode for - * (Pair pair : resultValues){ String key = pair.first(); if (key.equals("jobstatus")){ - * auditTrailSb.append(" "); auditTrailSb.append(key); auditTrailSb.append("="); - * auditTrailSb.append(pair.second()); - * }else if (key.equals("jobresultcode")){ auditTrailSb.append(" "); auditTrailSb.append(key); - * auditTrailSb.append("="); - * auditTrailSb.append(pair.second()); } } }else { for (Pair pair : resultValues){ if - * (pair.first().equals("jobid")){ // Its an async job so report the jobid auditTrailSb.append(" "); - * auditTrailSb.append(pair.first()); auditTrailSb.append("="); auditTrailSb.append(pair.second()); } } } - */ - } - - private static boolean isCommandAvailable(String commandName) { - boolean isCommandAvailable = false; - isCommandAvailable = s_allCommands.contains(commandName); - return isCommandAvailable; - } - - public boolean verifyRequest(Map requestParameters, Long userId) throws ServerApiException { - try { - String apiKey = null; - String secretKey = null; - String signature = null; - String unsignedRequest = null; - - String[] command = (String[]) requestParameters.get("command"); - if (command == null) { - s_logger.info("missing command, ignoring request..."); - return false; - } - - String commandName = command[0]; - - // if userId not null, that mean that user is logged in - if (userId != null) { - Long accountId = ApiDBUtils.findUserById(userId).getAccountId(); - Account userAccount = _accountMgr.getAccount(accountId); - short accountType = userAccount.getType(); - - if (!isCommandAvailable(accountType, commandName)) { - s_logger.warn("The given command:" + commandName + " does not exist"); - throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "The given command does not exist"); - } - return true; - } else { - // check against every available command to see if the command exists or not - if (!isCommandAvailable(commandName) && !commandName.equals("login") && !commandName.equals("logout")) { - s_logger.warn("The given command:" + commandName + " does not exist"); - throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "The given command does not exist"); - } - } - - // - build a request string with sorted params, make sure it's all lowercase - // - sign the request, verify the signature is the same - List parameterNames = new ArrayList(); - - for (Object paramNameObj : requestParameters.keySet()) { - parameterNames.add((String) paramNameObj); // put the name in a list that we'll sort later - } - - Collections.sort(parameterNames); - - String signatureVersion = null; - String expires = null; - - for (String paramName : parameterNames) { - // parameters come as name/value pairs in the form String/String[] - String paramValue = ((String[]) requestParameters.get(paramName))[0]; - - if ("signature".equalsIgnoreCase(paramName)) { - signature = paramValue; - } else { - if ("apikey".equalsIgnoreCase(paramName)) { - apiKey = paramValue; - } - else if ("signatureversion".equalsIgnoreCase(paramName)) { - signatureVersion = paramValue; - } else if ("expires".equalsIgnoreCase(paramName)) { - expires = paramValue; - } - - if (unsignedRequest == null) { - unsignedRequest = paramName + "=" + URLEncoder.encode(paramValue, "UTF-8").replaceAll("\\+", "%20"); - } else { - unsignedRequest = unsignedRequest + "&" + paramName + "=" + URLEncoder.encode(paramValue, "UTF-8").replaceAll("\\+", "%20"); - } - } - } - - // if api/secret key are passed to the parameters - if ((signature == null) || (apiKey == null)) { - if (s_logger.isDebugEnabled()) { - s_logger.info("expired session, missing signature, or missing apiKey -- ignoring request...sig: " + signature + ", apiKey: " + apiKey); - } - return false; // no signature, bad request - } - - Date expiresTS = null; - if ("3".equals(signatureVersion)) { - // New signature authentication. Check for expire parameter and its validity - if (expires == null) { - s_logger.info("missing Expires parameter -- ignoring request...sig: " + signature + ", apiKey: " + apiKey); - return false; - } - synchronized (_dateFormat) { - try { - expiresTS = _dateFormat.parse(expires); - } catch (ParseException pe) { - s_logger.info("Incorrect date format for Expires parameter", pe); - return false; - } - } - Date now = new Date(System.currentTimeMillis()); - if (expiresTS.before(now)) { - s_logger.info("Request expired -- ignoring ...sig: " + signature + ", apiKey: " + apiKey); - return false; - } - } - - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - txn.close(); - User user = null; - // verify there is a user with this api key - Pair userAcctPair = _accountMgr.findUserByApiKey(apiKey); - if (userAcctPair == null) { - s_logger.info("apiKey does not map to a valid user -- ignoring request, apiKey: " + apiKey); - return false; - } - - user = userAcctPair.first(); - Account account = userAcctPair.second(); - - if (user.getState() != Account.State.enabled || !account.getState().equals(Account.State.enabled)) { - s_logger.info("disabled or locked user accessing the api, userid = " + user.getId() + "; name = " + user.getUsername() + "; state: " + user.getState() + "; accountState: " - + account.getState()); - return false; - } - - UserContext.updateContext(user.getId(), account, null); - - if (!isCommandAvailable(account.getType(), commandName)) { - s_logger.warn("The given command:" + commandName + " does not exist"); - throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "The given command:" + commandName + " does not exist"); - } - - // verify secret key exists - secretKey = user.getSecretKey(); - if (secretKey == null) { - s_logger.info("User does not have a secret key associated with the account -- ignoring request, username: " + user.getUsername()); - return false; - } - - unsignedRequest = unsignedRequest.toLowerCase(); - - Mac mac = Mac.getInstance("HmacSHA1"); - SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA1"); - mac.init(keySpec); - mac.update(unsignedRequest.getBytes()); - byte[] encryptedBytes = mac.doFinal(); - String computedSignature = Base64.encodeBytes(encryptedBytes); - boolean equalSig = signature.equals(computedSignature); - if (!equalSig) { - s_logger.info("User signature: " + signature + " is not equaled to computed signature: " + computedSignature); - } - return equalSig; - } catch (Exception ex) { - if (ex instanceof ServerApiException && ((ServerApiException) ex).getErrorCode() == BaseCmd.UNSUPPORTED_ACTION_ERROR) { - throw (ServerApiException) ex; - } - s_logger.error("unable to verifty request signature", ex); - } - return false; - } - - public Long fetchDomainId(String domainUUID){ - ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); - IdentityDao identityDao = locator.getDao(IdentityDao.class); - try{ - Long domainId = identityDao.getIdentityId("domain", domainUUID); - return domainId; - }catch(InvalidParameterValueException ex){ - return null; - } - } - - public void loginUser(HttpSession session, String username, String password, Long domainId, String domainPath, String loginIpAddress ,Map requestParameters) throws CloudAuthenticationException { - // We will always use domainId first. If that does not exist, we will use domain name. If THAT doesn't exist - // we will default to ROOT - if (domainId == null) { - if (domainPath == null || domainPath.trim().length() == 0) { - domainId = DomainVO.ROOT_DOMAIN; - } else { - Domain domainObj = _domainMgr.findDomainByPath(domainPath); - if (domainObj != null) { - domainId = domainObj.getId(); - } else { // if an unknown path is passed in, fail the login call - throw new CloudAuthenticationException("Unable to find the domain from the path " + domainPath); - } - } - } - - UserAccount userAcct = _accountMgr.authenticateUser(username, password, domainId, loginIpAddress, requestParameters); - if (userAcct != null) { - String timezone = userAcct.getTimezone(); - float offsetInHrs = 0f; - if (timezone != null) { - TimeZone t = TimeZone.getTimeZone(timezone); - s_logger.info("Current user logged in under " + timezone + " timezone"); - - java.util.Date date = new java.util.Date(); - long longDate = date.getTime(); - float offsetInMs = (t.getOffset(longDate)); - offsetInHrs = offsetInMs / (1000 * 60 * 60); - s_logger.info("Timezone offset from UTC is: " + offsetInHrs); - } - - Account account = _accountMgr.getAccount(userAcct.getAccountId()); - - // set the userId and account object for everyone - session.setAttribute("userid", userAcct.getId()); - UserVO user = (UserVO) _accountMgr.getActiveUser(userAcct.getId()); - if(user.getUuid() != null){ - session.setAttribute("user_UUID", user.getUuid()); - } - - session.setAttribute("username", userAcct.getUsername()); - session.setAttribute("firstname", userAcct.getFirstname()); - session.setAttribute("lastname", userAcct.getLastname()); - session.setAttribute("accountobj", account); - session.setAttribute("account", account.getAccountName()); - - session.setAttribute("domainid", account.getDomainId()); - DomainVO domain = (DomainVO) _domainMgr.getDomain(account.getDomainId()); - if(domain.getUuid() != null){ - session.setAttribute("domain_UUID", domain.getUuid()); - } - - session.setAttribute("type", Short.valueOf(account.getType()).toString()); - session.setAttribute("registrationtoken", userAcct.getRegistrationToken()); - session.setAttribute("registered", new Boolean(userAcct.isRegistered()).toString()); - - if (timezone != null) { - session.setAttribute("timezone", timezone); - session.setAttribute("timezoneoffset", Float.valueOf(offsetInHrs).toString()); - } - - // (bug 5483) generate a session key that the user must submit on every request to prevent CSRF, add that - // to the login response so that session-based authenticators know to send the key back - SecureRandom sesssionKeyRandom = new SecureRandom(); - byte sessionKeyBytes[] = new byte[20]; - sesssionKeyRandom.nextBytes(sessionKeyBytes); - String sessionKey = Base64.encodeBytes(sessionKeyBytes); - session.setAttribute("sessionkey", sessionKey); - - return; - } - throw new CloudAuthenticationException("Failed to authenticate user " + username + " in domain " + domainId + "; please provide valid credentials"); - } - - public void logoutUser(long userId) { - _accountMgr.logoutUser(Long.valueOf(userId)); - return; - } - - public boolean verifyUser(Long userId) { - User user = _accountMgr.getUserIncludingRemoved(userId); - Account account = null; - if (user != null) { - account = _accountMgr.getAccount(user.getAccountId()); - } - - if ((user == null) || (user.getRemoved() != null) || !user.getState().equals(Account.State.enabled) || (account == null) || !account.getState().equals(Account.State.enabled)) { - s_logger.warn("Deleted/Disabled/Locked user with id=" + userId + " attempting to access public API"); - return false; - } - return true; - } - - public static boolean isCommandAvailable(short accountType, String commandName) { - boolean isCommandAvailable = false; - switch (accountType) { - case Account.ACCOUNT_TYPE_ADMIN: - isCommandAvailable = s_adminCommands.contains(commandName); - break; - case Account.ACCOUNT_TYPE_DOMAIN_ADMIN: - isCommandAvailable = s_resellerCommands.contains(commandName); - break; - case Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN: - isCommandAvailable = s_resourceDomainAdminCommands.contains(commandName); - break; - case Account.ACCOUNT_TYPE_NORMAL: - isCommandAvailable = s_userCommands.contains(commandName); - break; - } - return isCommandAvailable; - } - - // FIXME: rather than isError, we might was to pass in the status code to give more flexibility - private void writeResponse(HttpResponse resp, final String responseText, final int statusCode, String responseType, String reasonPhrase) { - try { - resp.setStatusCode(statusCode); - resp.setReasonPhrase(reasonPhrase); - - BasicHttpEntity body = new BasicHttpEntity(); - if (BaseCmd.RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - // JSON response - body.setContentType(jsonContentType); - if (responseText == null) { - body.setContent(new ByteArrayInputStream("{ \"error\" : { \"description\" : \"Internal Server Error\" } }".getBytes("UTF-8"))); - } - } else { - body.setContentType("text/xml"); - if (responseText == null) { - body.setContent(new ByteArrayInputStream("Internal Server Error".getBytes("UTF-8"))); - } - } - - if (responseText != null) { - body.setContent(new ByteArrayInputStream(responseText.getBytes("UTF-8"))); - } - resp.setEntity(body); - } catch (Exception ex) { - s_logger.error("error!", ex); - } - } - - // FIXME: the following two threads are copied from - // http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java - // we have to cite a license if we are using this code directly, so we need to add the appropriate citation or - // modify the - // code to be very specific to our needs - static class ListenerThread extends Thread { - private HttpService _httpService = null; - private ServerSocket _serverSocket = null; - private HttpParams _params = null; - - public ListenerThread(ApiServer requestHandler, int port) { - try { - _serverSocket = new ServerSocket(port); - } catch (IOException ioex) { - s_logger.error("error initializing api server", ioex); - return; - } - - _params = new BasicHttpParams(); - _params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 30000).setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024) - .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false).setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true) - .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1"); - - // Set up the HTTP protocol processor - BasicHttpProcessor httpproc = new BasicHttpProcessor(); - httpproc.addInterceptor(new ResponseDate()); - httpproc.addInterceptor(new ResponseServer()); - httpproc.addInterceptor(new ResponseContent()); - httpproc.addInterceptor(new ResponseConnControl()); - - // Set up request handlers - HttpRequestHandlerRegistry reqistry = new HttpRequestHandlerRegistry(); - reqistry.register("*", requestHandler); - - // Set up the HTTP service - _httpService = new HttpService(httpproc, new NoConnectionReuseStrategy(), new DefaultHttpResponseFactory()); - _httpService.setParams(_params); - _httpService.setHandlerResolver(reqistry); - } - - @Override - public void run() { - s_logger.info("ApiServer listening on port " + _serverSocket.getLocalPort()); - while (!Thread.interrupted()) { - try { - // Set up HTTP connection - Socket socket = _serverSocket.accept(); - DefaultHttpServerConnection conn = new DefaultHttpServerConnection(); - conn.bind(socket, _params); - - // Execute a new worker task to handle the request - _executor.execute(new WorkerTask(_httpService, conn, _workerCount++)); - } catch (InterruptedIOException ex) { - break; - } catch (IOException e) { - s_logger.error("I/O error initializing connection thread", e); - break; - } - } - } - } - - static class WorkerTask implements Runnable { - private final HttpService _httpService; - private final HttpServerConnection _conn; - - public WorkerTask(final HttpService httpService, final HttpServerConnection conn, final int count) { - _httpService = httpService; - _conn = conn; - } - - @Override - public void run() { - HttpContext context = new BasicHttpContext(null); - try { - while (!Thread.interrupted() && _conn.isOpen()) { - try { - _httpService.handleRequest(_conn, context); - _conn.close(); - } finally { - StackMaid.current().exitCleanup(); - } - } - } catch (ConnectionClosedException ex) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("ApiServer: Client closed connection"); - } - } catch (IOException ex) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("ApiServer: IOException - " + ex); - } - } catch (HttpException ex) { - s_logger.warn("ApiServer: Unrecoverable HTTP protocol violation" + ex); - } finally { - try { - _conn.shutdown(); - } catch (IOException ignore) { - } - } - } - } - - public String getSerializedApiError(int errorCode, String errorText, Map apiCommandParams, String responseType, Exception ex) { - String responseName = null; - String cmdClassName = null; - - String responseText = null; - - try { - if (errorCode == BaseCmd.UNSUPPORTED_ACTION_ERROR || apiCommandParams == null || apiCommandParams.isEmpty()) { - responseName = "errorresponse"; - } else { - Object cmdObj = apiCommandParams.get("command"); - // cmd name can be null when "command" parameter is missing in the request - if (cmdObj != null) { - String cmdName = ((String[]) cmdObj)[0]; - cmdClassName = _apiCommands.getProperty(cmdName); - if (cmdClassName != null) { - Class claz = Class.forName(cmdClassName); - responseName = ((BaseCmd) claz.newInstance()).getCommandName(); - } else { - responseName = "errorresponse"; - } - } - } - ExceptionResponse apiResponse = new ExceptionResponse(); - apiResponse.setErrorCode(errorCode); - apiResponse.setErrorText(errorText); - apiResponse.setResponseName(responseName); - // Also copy over the IdentityProxy object List into this new apiResponse, from - // the exception caught. When invoked from handle(), the exception here can - // be either ServerApiException, PermissionDeniedException or InvalidParameterValue - // Exception. When invoked from ApiServlet's processRequest(), this can be - // a standard exception like NumberFormatException. We'll leave the standard ones alone. - if (ex != null) { - if (ex instanceof ServerApiException || ex instanceof PermissionDeniedException - || ex instanceof InvalidParameterValueException) { - // Cast the exception appropriately and retrieve the IdentityProxy - if (ex instanceof ServerApiException) { - ServerApiException ref = (ServerApiException) ex; - ArrayList idList = ref.getIdProxyList(); - if (idList != null) { - for (int i=0; i < idList.size(); i++) { - IdentityProxy id = idList.get(i); - apiResponse.addProxyObject(id.getTableName(), id.getValue(), id.getidFieldName()); - } - } - // Also copy over the cserror code and the function/layer in which it was thrown. - apiResponse.setCSErrorCode(ref.getCSErrorCode()); - } else if (ex instanceof PermissionDeniedException) { - PermissionDeniedException ref = (PermissionDeniedException) ex; - ArrayList idList = ref.getIdProxyList(); - if (idList != null) { - for (int i=0; i < idList.size(); i++) { - IdentityProxy id = idList.get(i); - apiResponse.addProxyObject(id.getTableName(), id.getValue(), id.getidFieldName()); - } - } - // Also copy over the cserror code and the function/layer in which it was thrown. - apiResponse.setCSErrorCode(ref.getCSErrorCode()); - } else if (ex instanceof InvalidParameterValueException) { - InvalidParameterValueException ref = (InvalidParameterValueException) ex; - ArrayList idList = ref.getIdProxyList(); - if (idList != null) { - for (int i=0; i < idList.size(); i++) { - IdentityProxy id = idList.get(i); - apiResponse.addProxyObject(id.getTableName(), id.getValue(), id.getidFieldName()); - } - } - // Also copy over the cserror code and the function/layer in which it was thrown. - apiResponse.setCSErrorCode(ref.getCSErrorCode()); - } - } - } - SerializationContext.current().setUuidTranslation(true); - responseText = ApiResponseSerializer.toSerializedString(apiResponse, responseType); - - } catch (Exception e) { - s_logger.error("Exception responding to http request", e); - } - return responseText; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.api; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InterruptedIOException; +import java.io.UnsupportedEncodingException; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.net.UnknownHostException; +import java.security.SecureRandom; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.TimeZone; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.http.ConnectionClosedException; +import org.apache.http.HttpException; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.HttpServerConnection; +import org.apache.http.HttpStatus; +import org.apache.http.entity.BasicHttpEntity; +import org.apache.http.impl.DefaultHttpResponseFactory; +import org.apache.http.impl.DefaultHttpServerConnection; +import org.apache.http.impl.NoConnectionReuseStrategy; +import org.apache.http.impl.SocketHttpServerConnection; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.CoreConnectionPNames; +import org.apache.http.params.CoreProtocolPNames; +import org.apache.http.params.HttpParams; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.BasicHttpProcessor; +import org.apache.http.protocol.HttpContext; +import org.apache.http.protocol.HttpRequestHandler; +import org.apache.http.protocol.HttpRequestHandlerRegistry; +import org.apache.http.protocol.HttpService; +import org.apache.http.protocol.ResponseConnControl; +import org.apache.http.protocol.ResponseContent; +import org.apache.http.protocol.ResponseDate; +import org.apache.http.protocol.ResponseServer; +import org.apache.log4j.Logger; + +import com.cloud.api.response.ApiResponseSerializer; +import com.cloud.api.response.ExceptionResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.async.AsyncJob; +import com.cloud.async.AsyncJobManager; +import com.cloud.async.AsyncJobVO; +import com.cloud.cluster.StackMaid; +import com.cloud.configuration.Config; +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.EventUtils; +import com.cloud.exception.CloudAuthenticationException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.server.ManagementServer; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.DomainManager; +import com.cloud.user.User; +import com.cloud.user.UserAccount; +import com.cloud.user.UserContext; +import com.cloud.user.UserVO; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Pair; +import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.PluggableService; +import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.encoding.Base64; +import com.cloud.utils.exception.CSExceptionErrorCode; +import com.cloud.uuididentity.dao.IdentityDao; + +public class ApiServer implements HttpRequestHandler { + private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName()); + private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName()); + + public static final short ADMIN_COMMAND = 1; + public static final short DOMAIN_ADMIN_COMMAND = 4; + public static final short RESOURCE_DOMAIN_ADMIN_COMMAND = 2; + public static final short USER_COMMAND = 8; + public static boolean encodeApiResponse = false; + public static String jsonContentType = "text/javascript"; + private Properties _apiCommands = null; + private ApiDispatcher _dispatcher; + private AccountManager _accountMgr = null; + private DomainManager _domainMgr = null; + private AsyncJobManager _asyncMgr = null; + private Account _systemAccount = null; + private User _systemUser = null; + private String serverIpAddress = null; + private String serverPort = null; + + private static int _workerCount = 0; + + private static ApiServer s_instance = null; + private static List s_userCommands = null; + private static List s_resellerCommands = null; // AKA domain-admin + private static List s_adminCommands = null; + private static List s_resourceDomainAdminCommands = null; + private static List s_allCommands = null; + private static List s_pluggableServiceCommands = null; + private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + + private static ExecutorService _executor = new ThreadPoolExecutor(10, 150, 60, TimeUnit.SECONDS, new LinkedBlockingQueue(), new NamedThreadFactory("ApiServer")); + + static { + s_userCommands = new ArrayList(); + s_resellerCommands = new ArrayList(); + s_adminCommands = new ArrayList(); + s_resourceDomainAdminCommands = new ArrayList(); + s_allCommands = new ArrayList(); + s_pluggableServiceCommands = new ArrayList(); + } + + private ApiServer() { + } + + public static void initApiServer(String[] apiConfig) { + if (s_instance == null) { + s_instance = new ApiServer(); + s_instance.init(apiConfig); + } + } + + public static ApiServer getInstance() { + // initApiServer(); + return s_instance; + } + + public Properties get_apiCommands() { + return _apiCommands; + } + + public String getServerIpAddress() { + return serverIpAddress; + } + + public String getServerPort() { + return serverPort; + } + + public static boolean isPluggableServiceCommand(String cmdClassName) { + if (s_pluggableServiceCommands != null) { + if (s_pluggableServiceCommands.contains(cmdClassName)) { + return true; + } + } + return false; + } + + private String[] getPluggableServicesApiConfigs() { + List pluggableServicesApiConfigs = new ArrayList(); + + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + List services = locator.getAllPluggableServices(); + for (PluggableService service : services) { + pluggableServicesApiConfigs.add(service.getPropertiesFile()); + } + return pluggableServicesApiConfigs.toArray(new String[0]); + } + + private void processConfigFiles(String[] apiConfig, boolean pluggableServicesConfig) { + try { + if (_apiCommands == null) { + _apiCommands = new Properties(); + } + Properties preProcessedCommands = new Properties(); + if (apiConfig != null) { + for (String configFile : apiConfig) { + File commandsFile = PropertiesUtil.findConfigFile(configFile); + if (commandsFile != null) { + try { + preProcessedCommands.load(new FileInputStream(commandsFile)); + } catch (FileNotFoundException fnfex) { + // in case of a file within a jar in classpath, try to open stream using url + InputStream stream = PropertiesUtil.openStreamFromURL(configFile); + if (stream != null) { + preProcessedCommands.load(stream); + } else { + s_logger.error("Unable to find properites file", fnfex); + } + } + } + } + for (Object key : preProcessedCommands.keySet()) { + String preProcessedCommand = preProcessedCommands.getProperty((String) key); + String[] commandParts = preProcessedCommand.split(";"); + _apiCommands.put(key, commandParts[0]); + + if (pluggableServicesConfig) { + s_pluggableServiceCommands.add(commandParts[0]); + } + + if (commandParts.length > 1) { + try { + short cmdPermissions = Short.parseShort(commandParts[1]); + if ((cmdPermissions & ADMIN_COMMAND) != 0) { + s_adminCommands.add((String) key); + } + if ((cmdPermissions & RESOURCE_DOMAIN_ADMIN_COMMAND) != 0) { + s_resourceDomainAdminCommands.add((String) key); + } + if ((cmdPermissions & DOMAIN_ADMIN_COMMAND) != 0) { + s_resellerCommands.add((String) key); + } + if ((cmdPermissions & USER_COMMAND) != 0) { + s_userCommands.add((String) key); + } + } catch (NumberFormatException nfe) { + s_logger.info("Malformed command.properties permissions value, key = " + key + ", value = " + preProcessedCommand); + } + } + } + + s_allCommands.addAll(s_adminCommands); + s_allCommands.addAll(s_resourceDomainAdminCommands); + s_allCommands.addAll(s_userCommands); + s_allCommands.addAll(s_resellerCommands); + } + } catch (FileNotFoundException fnfex) { + s_logger.error("Unable to find properites file", fnfex); + } catch (IOException ioex) { + s_logger.error("Exception loading properties file", ioex); + } + } + + public void init(String[] apiConfig) { + BaseCmd.setComponents(new ApiResponseHelper()); + BaseListCmd.configure(); + processConfigFiles(apiConfig, false); + + // get commands for all pluggable services + String[] pluggableServicesApiConfigs = getPluggableServicesApiConfigs(); + processConfigFiles(pluggableServicesApiConfigs, true); + + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + _accountMgr = locator.getManager(AccountManager.class); + _asyncMgr = locator.getManager(AsyncJobManager.class); + _systemAccount = _accountMgr.getSystemAccount(); + _systemUser = _accountMgr.getSystemUser(); + _dispatcher = ApiDispatcher.getInstance(); + _domainMgr = locator.getManager(DomainManager.class); + + Integer apiPort = null; // api port, null by default + ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); + SearchCriteria sc = configDao.createSearchCriteria(); + sc.addAnd("name", SearchCriteria.Op.EQ, "integration.api.port"); + List values = configDao.search(sc, null); + if ((values != null) && (values.size() > 0)) { + ConfigurationVO apiPortConfig = values.get(0); + if (apiPortConfig.getValue() != null) { + apiPort = Integer.parseInt(apiPortConfig.getValue()); + } + } + + encodeApiResponse = Boolean.valueOf(configDao.getValue(Config.EncodeApiResponse.key())); + + String jsonType = configDao.getValue(Config.JavaScriptDefaultContentType.key()); + if (jsonType != null) { + jsonContentType = jsonType; + } + + if (apiPort != null) { + ListenerThread listenerThread = new ListenerThread(this, apiPort); + + serverIpAddress = listenerThread.getServerIpAddress(); + serverPort = listenerThread.getServerPort(); + listenerThread.start(); + } + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void handle(HttpRequest request, HttpResponse response, HttpContext context) throws HttpException, IOException { + // get some information for the access log... + StringBuffer sb = new StringBuffer(); + HttpServerConnection connObj = (HttpServerConnection) context.getAttribute("http.connection"); + if (connObj instanceof SocketHttpServerConnection) { + InetAddress remoteAddr = ((SocketHttpServerConnection) connObj).getRemoteAddress(); + sb.append(remoteAddr.toString() + " -- "); + } + sb.append(request.getRequestLine()); + + try { + String uri = request.getRequestLine().getUri(); + int requestParamsStartIndex = uri.indexOf('?'); + if (requestParamsStartIndex >= 0) { + uri = uri.substring(requestParamsStartIndex + 1); + } + + String[] paramArray = uri.split("&"); + if (paramArray.length < 1) { + s_logger.info("no parameters received for request: " + uri + ", aborting..."); + return; + } + + Map parameterMap = new HashMap(); + + String responseType = BaseCmd.RESPONSE_TYPE_XML; + for (String paramEntry : paramArray) { + String[] paramValue = paramEntry.split("="); + if (paramValue.length != 2) { + s_logger.info("malformed parameter: " + paramEntry + ", skipping"); + continue; + } + if ("response".equalsIgnoreCase(paramValue[0])) { + responseType = paramValue[1]; + } else { + // according to the servlet spec, the parameter map should be in the form (name=String, + // value=String[]), so + // parameter values will be stored in an array + parameterMap.put(/* name */paramValue[0], /* value */new String[] { paramValue[1] }); + } + } + try { + // always trust commands from API port, user context will always be UID_SYSTEM/ACCOUNT_ID_SYSTEM + UserContext.registerContext(_systemUser.getId(), _systemAccount, null, true); + sb.insert(0, "(userId=" + User.UID_SYSTEM + " accountId=" + Account.ACCOUNT_ID_SYSTEM + " sessionId=" + null + ") "); + String responseText = handleRequest(parameterMap, true, responseType, sb); + sb.append(" 200 " + ((responseText == null) ? 0 : responseText.length())); + + writeResponse(response, responseText, HttpStatus.SC_OK, responseType, null); + } catch (ServerApiException se) { + String responseText = getSerializedApiError(se.getErrorCode(), se.getDescription(), parameterMap, responseType, se); + writeResponse(response, responseText, se.getErrorCode(), responseType, se.getDescription()); + sb.append(" " + se.getErrorCode() + " " + se.getDescription()); + } catch (RuntimeException e) { + // log runtime exception like NullPointerException to help identify the source easier + s_logger.error("Unhandled exception, ", e); + throw e; + } + } finally { + s_accessLogger.info(sb.toString()); + UserContext.unregisterContext(); + } + } + + @SuppressWarnings("rawtypes") + public String handleRequest(Map params, boolean decode, String responseType, StringBuffer auditTrailSb) throws ServerApiException { + String response = null; + String[] command = null; + try { + command = (String[]) params.get("command"); + if (command == null) { + s_logger.error("invalid request, no command sent"); + if (s_logger.isTraceEnabled()) { + s_logger.trace("dumping request parameters"); + for (Object key : params.keySet()) { + String keyStr = (String) key; + String[] value = (String[]) params.get(key); + s_logger.trace(" key: " + keyStr + ", value: " + ((value == null) ? "'null'" : value[0])); + } + } + throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "Invalid request, no command sent"); + } else { + Map paramMap = new HashMap(); + Set keys = params.keySet(); + Iterator keysIter = keys.iterator(); + while (keysIter.hasNext()) { + String key = (String) keysIter.next(); + if ("command".equalsIgnoreCase(key)) { + continue; + } + String[] value = (String[]) params.get(key); + + String decodedValue = null; + if (decode) { + try { + decodedValue = URLDecoder.decode(value[0], "UTF-8"); + } catch (UnsupportedEncodingException usex) { + s_logger.warn(key + " could not be decoded, value = " + value[0]); + throw new ServerApiException(BaseCmd.PARAM_ERROR, key + " could not be decoded, received value " + value[0]); + } catch (IllegalArgumentException iae) { + s_logger.warn(key + " could not be decoded, value = " + value[0]); + throw new ServerApiException(BaseCmd.PARAM_ERROR, key + " could not be decoded, received value " + value[0] + " which contains illegal characters eg.%"); + } + } else { + decodedValue = value[0]; + } + paramMap.put(key, decodedValue); + } + String cmdClassName = _apiCommands.getProperty(command[0]); + if (cmdClassName != null) { + Class cmdClass = Class.forName(cmdClassName); + BaseCmd cmdObj = (BaseCmd) cmdClass.newInstance(); + cmdObj.setFullUrlParams(paramMap); + cmdObj.setResponseType(responseType); + // This is where the command is either serialized, or directly dispatched + response = queueCommand(cmdObj, paramMap); + buildAuditTrail(auditTrailSb, command[0], response); + } else { + if (!command[0].equalsIgnoreCase("login") && !command[0].equalsIgnoreCase("logout")) { + String errorString = "Unknown API command: " + ((command == null) ? "null" : command[0]); + s_logger.warn(errorString); + auditTrailSb.append(" " + errorString); + throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, errorString); + } + } + } + } catch (Exception ex) { + if (ex instanceof InvalidParameterValueException) { + InvalidParameterValueException ref = (InvalidParameterValueException)ex; + ServerApiException e = new ServerApiException(BaseCmd.PARAM_ERROR, ex.getMessage()); + // copy over the IdentityProxy information as well and throw the serverapiexception. + ArrayList idList = ref.getIdProxyList(); + if (idList != null) { + // Iterate through entire arraylist and copy over each proxy id. + for (int i = 0 ; i < idList.size(); i++) { + IdentityProxy obj = idList.get(i); + e.addProxyObject(obj.getTableName(), obj.getValue(), obj.getidFieldName()); + } + } + // Also copy over the cserror code and the function/layer in which it was thrown. + e.setCSErrorCode(ref.getCSErrorCode()); + throw e; + } else if (ex instanceof PermissionDeniedException) { + PermissionDeniedException ref = (PermissionDeniedException)ex; + ServerApiException e = new ServerApiException(BaseCmd.ACCOUNT_ERROR, ex.getMessage()); + // copy over the IdentityProxy information as well and throw the serverapiexception. + ArrayList idList = ref.getIdProxyList(); + if (idList != null) { + // Iterate through entire arraylist and copy over each proxy id. + for (int i = 0 ; i < idList.size(); i++) { + IdentityProxy obj = idList.get(i); + e.addProxyObject(obj.getTableName(), obj.getValue(), obj.getidFieldName()); + } + } + e.setCSErrorCode(ref.getCSErrorCode()); + throw e; + } else if (ex instanceof ServerApiException) { + throw (ServerApiException) ex; + } else { + s_logger.error("unhandled exception executing api command: " + ((command == null) ? "null" : command[0]), ex); + ServerApiException e = new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal server error, unable to execute request."); + e.setCSErrorCode(CSExceptionErrorCode.getCSErrCode("ServerApiException")); + throw e; + } + } + return response; + } + + private String queueCommand(BaseCmd cmdObj, Map params) { + UserContext ctx = UserContext.current(); + Long callerUserId = ctx.getCallerUserId(); + Account caller = ctx.getCaller(); + if (cmdObj instanceof BaseAsyncCmd) { + Long objectId = null; + String objectEntityTable = null; + if (cmdObj instanceof BaseAsyncCreateCmd) { + BaseAsyncCreateCmd createCmd = (BaseAsyncCreateCmd) cmdObj; + _dispatcher.dispatchCreateCmd(createCmd, params); + objectId = createCmd.getEntityId(); + objectEntityTable = createCmd.getEntityTable(); + params.put("id", objectId.toString()); + } else { + ApiDispatcher.setupParameters(cmdObj, params); + ApiDispatcher.plugService(cmdObj); + } + + BaseAsyncCmd asyncCmd = (BaseAsyncCmd) cmdObj; + + if (callerUserId != null) { + params.put("ctxUserId", callerUserId.toString()); + } + if (caller != null) { + params.put("ctxAccountId", String.valueOf(caller.getId())); + } + + long startEventId = ctx.getStartEventId(); + asyncCmd.setStartEventId(startEventId); + + // save the scheduled event + Long eventId = EventUtils.saveScheduledEvent((callerUserId == null) ? User.UID_SYSTEM : callerUserId, + asyncCmd.getEntityOwnerId(), asyncCmd.getEventType(), asyncCmd.getEventDescription(), + startEventId); + if (startEventId == 0) { + // There was no create event before, set current event id as start eventId + startEventId = eventId; + } + + params.put("ctxStartEventId", String.valueOf(startEventId)); + + ctx.setAccountId(asyncCmd.getEntityOwnerId()); + + AsyncJobVO job = new AsyncJobVO(); + job.setInstanceId((objectId == null) ? asyncCmd.getInstanceId() : objectId); + job.setInstanceType(asyncCmd.getInstanceType()); + job.setUserId(callerUserId); + job.setAccountId(caller.getId()); + + job.setCmd(cmdObj.getClass().getName()); + job.setCmdInfo(ApiGsonHelper.getBuilder().create().toJson(params)); + + long jobId = _asyncMgr.submitAsyncJob(job); + + if (jobId == 0L) { + String errorMsg = "Unable to schedule async job for command " + job.getCmd(); + s_logger.warn(errorMsg); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, errorMsg); + } + + if (objectId != null) { + SerializationContext.current().setUuidTranslation(true); + return ((BaseAsyncCreateCmd) asyncCmd).getResponse(jobId, objectId, objectEntityTable); + } + + SerializationContext.current().setUuidTranslation(true); + return ApiResponseSerializer.toSerializedString(asyncCmd.getResponse(jobId), asyncCmd.getResponseType()); + } else { + _dispatcher.dispatch(cmdObj, params); + + // if the command is of the listXXXCommand, we will need to also return the + // the job id and status if possible + if (cmdObj instanceof BaseListCmd) { + buildAsyncListResponse((BaseListCmd) cmdObj, caller); + } + + SerializationContext.current().setUuidTranslation(true); + return ApiResponseSerializer.toSerializedString((ResponseObject) cmdObj.getResponseObject(), cmdObj.getResponseType()); + } + } + + private void buildAsyncListResponse(BaseListCmd command, Account account) { + List responses = ((ListResponse) command.getResponseObject()).getResponses(); + if (responses != null && responses.size() > 0) { + List jobs = null; + + // list all jobs for ROOT admin + if (account.getType() == Account.ACCOUNT_TYPE_ADMIN) { + jobs = _asyncMgr.findInstancePendingAsyncJobs(command.getInstanceType(), null); + } else { + jobs = _asyncMgr.findInstancePendingAsyncJobs(command.getInstanceType(), account.getId()); + } + + if (jobs.size() == 0) { + return; + } + + // Using maps might possibly be more efficient if the set is large enough but for now, we'll just do a + // comparison of two lists. Either way, there shouldn't be too many async jobs active for the account. + for (AsyncJob job : jobs) { + if (job.getInstanceId() == null) { + continue; + } + for (ResponseObject response : responses) { + if (response.getObjectId() != null && job.getInstanceId().longValue() == response.getObjectId().longValue()) { + response.setJobId(job.getId()); + response.setJobStatus(job.getStatus()); + } + } + } + } + } + + private void buildAuditTrail(StringBuffer auditTrailSb, String command, String result) { + if (result == null) { + return; + } + auditTrailSb.append(" " + HttpServletResponse.SC_OK + " "); + auditTrailSb.append(result); + /* + * if (command.equals("queryAsyncJobResult")){ //For this command we need to also log job status and job + * resultcode for + * (Pair pair : resultValues){ String key = pair.first(); if (key.equals("jobstatus")){ + * auditTrailSb.append(" "); auditTrailSb.append(key); auditTrailSb.append("="); + * auditTrailSb.append(pair.second()); + * }else if (key.equals("jobresultcode")){ auditTrailSb.append(" "); auditTrailSb.append(key); + * auditTrailSb.append("="); + * auditTrailSb.append(pair.second()); } } }else { for (Pair pair : resultValues){ if + * (pair.first().equals("jobid")){ // Its an async job so report the jobid auditTrailSb.append(" "); + * auditTrailSb.append(pair.first()); auditTrailSb.append("="); auditTrailSb.append(pair.second()); } } } + */ + } + + private static boolean isCommandAvailable(String commandName) { + boolean isCommandAvailable = false; + isCommandAvailable = s_allCommands.contains(commandName); + return isCommandAvailable; + } + + public boolean verifyRequest(Map requestParameters, Long userId) throws ServerApiException { + try { + String apiKey = null; + String secretKey = null; + String signature = null; + String unsignedRequest = null; + + String[] command = (String[]) requestParameters.get("command"); + if (command == null) { + s_logger.info("missing command, ignoring request..."); + return false; + } + + String commandName = command[0]; + + // if userId not null, that mean that user is logged in + if (userId != null) { + Long accountId = ApiDBUtils.findUserById(userId).getAccountId(); + Account userAccount = _accountMgr.getAccount(accountId); + short accountType = userAccount.getType(); + + if (!isCommandAvailable(accountType, commandName)) { + s_logger.warn("The given command:" + commandName + " does not exist"); + throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "The given command does not exist"); + } + return true; + } else { + // check against every available command to see if the command exists or not + if (!isCommandAvailable(commandName) && !commandName.equals("login") && !commandName.equals("logout")) { + s_logger.warn("The given command:" + commandName + " does not exist"); + throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "The given command does not exist"); + } + } + + // - build a request string with sorted params, make sure it's all lowercase + // - sign the request, verify the signature is the same + List parameterNames = new ArrayList(); + + for (Object paramNameObj : requestParameters.keySet()) { + parameterNames.add((String) paramNameObj); // put the name in a list that we'll sort later + } + + Collections.sort(parameterNames); + + String signatureVersion = null; + String expires = null; + + for (String paramName : parameterNames) { + // parameters come as name/value pairs in the form String/String[] + String paramValue = ((String[]) requestParameters.get(paramName))[0]; + + if ("signature".equalsIgnoreCase(paramName)) { + signature = paramValue; + } else { + if ("apikey".equalsIgnoreCase(paramName)) { + apiKey = paramValue; + } + else if ("signatureversion".equalsIgnoreCase(paramName)) { + signatureVersion = paramValue; + } else if ("expires".equalsIgnoreCase(paramName)) { + expires = paramValue; + } + + if (unsignedRequest == null) { + unsignedRequest = paramName + "=" + URLEncoder.encode(paramValue, "UTF-8").replaceAll("\\+", "%20"); + } else { + unsignedRequest = unsignedRequest + "&" + paramName + "=" + URLEncoder.encode(paramValue, "UTF-8").replaceAll("\\+", "%20"); + } + } + } + + // if api/secret key are passed to the parameters + if ((signature == null) || (apiKey == null)) { + if (s_logger.isDebugEnabled()) { + s_logger.info("expired session, missing signature, or missing apiKey -- ignoring request...sig: " + signature + ", apiKey: " + apiKey); + } + return false; // no signature, bad request + } + + Date expiresTS = null; + if ("3".equals(signatureVersion)) { + // New signature authentication. Check for expire parameter and its validity + if (expires == null) { + s_logger.info("missing Expires parameter -- ignoring request...sig: " + signature + ", apiKey: " + apiKey); + return false; + } + synchronized (_dateFormat) { + try { + expiresTS = _dateFormat.parse(expires); + } catch (ParseException pe) { + s_logger.info("Incorrect date format for Expires parameter", pe); + return false; + } + } + Date now = new Date(System.currentTimeMillis()); + if (expiresTS.before(now)) { + s_logger.info("Request expired -- ignoring ...sig: " + signature + ", apiKey: " + apiKey); + return false; + } + } + + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + txn.close(); + User user = null; + // verify there is a user with this api key + Pair userAcctPair = _accountMgr.findUserByApiKey(apiKey); + if (userAcctPair == null) { + s_logger.info("apiKey does not map to a valid user -- ignoring request, apiKey: " + apiKey); + return false; + } + + user = userAcctPair.first(); + Account account = userAcctPair.second(); + + if (user.getState() != Account.State.enabled || !account.getState().equals(Account.State.enabled)) { + s_logger.info("disabled or locked user accessing the api, userid = " + user.getId() + "; name = " + user.getUsername() + "; state: " + user.getState() + "; accountState: " + + account.getState()); + return false; + } + + UserContext.updateContext(user.getId(), account, null); + + if (!isCommandAvailable(account.getType(), commandName)) { + s_logger.warn("The given command:" + commandName + " does not exist"); + throw new ServerApiException(BaseCmd.UNSUPPORTED_ACTION_ERROR, "The given command:" + commandName + " does not exist"); + } + + // verify secret key exists + secretKey = user.getSecretKey(); + if (secretKey == null) { + s_logger.info("User does not have a secret key associated with the account -- ignoring request, username: " + user.getUsername()); + return false; + } + + unsignedRequest = unsignedRequest.toLowerCase(); + + Mac mac = Mac.getInstance("HmacSHA1"); + SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA1"); + mac.init(keySpec); + mac.update(unsignedRequest.getBytes()); + byte[] encryptedBytes = mac.doFinal(); + String computedSignature = Base64.encodeBytes(encryptedBytes); + boolean equalSig = signature.equals(computedSignature); + if (!equalSig) { + s_logger.info("User signature: " + signature + " is not equaled to computed signature: " + computedSignature); + } + return equalSig; + } catch (Exception ex) { + if (ex instanceof ServerApiException && ((ServerApiException) ex).getErrorCode() == BaseCmd.UNSUPPORTED_ACTION_ERROR) { + throw (ServerApiException) ex; + } + s_logger.error("unable to verifty request signature", ex); + } + return false; + } + + public Long fetchDomainId(String domainUUID){ + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); + IdentityDao identityDao = locator.getDao(IdentityDao.class); + try{ + Long domainId = identityDao.getIdentityId("domain", domainUUID); + return domainId; + }catch(InvalidParameterValueException ex){ + return null; + } + } + + public void loginUser(HttpSession session, String username, String password, Long domainId, String domainPath, String loginIpAddress ,Map requestParameters) throws CloudAuthenticationException { + // We will always use domainId first. If that does not exist, we will use domain name. If THAT doesn't exist + // we will default to ROOT + if (domainId == null) { + if (domainPath == null || domainPath.trim().length() == 0) { + domainId = DomainVO.ROOT_DOMAIN; + } else { + Domain domainObj = _domainMgr.findDomainByPath(domainPath); + if (domainObj != null) { + domainId = domainObj.getId(); + } else { // if an unknown path is passed in, fail the login call + throw new CloudAuthenticationException("Unable to find the domain from the path " + domainPath); + } + } + } + + UserAccount userAcct = _accountMgr.authenticateUser(username, password, domainId, loginIpAddress, requestParameters); + if (userAcct != null) { + String timezone = userAcct.getTimezone(); + float offsetInHrs = 0f; + if (timezone != null) { + TimeZone t = TimeZone.getTimeZone(timezone); + s_logger.info("Current user logged in under " + timezone + " timezone"); + + java.util.Date date = new java.util.Date(); + long longDate = date.getTime(); + float offsetInMs = (t.getOffset(longDate)); + offsetInHrs = offsetInMs / (1000 * 60 * 60); + s_logger.info("Timezone offset from UTC is: " + offsetInHrs); + } + + Account account = _accountMgr.getAccount(userAcct.getAccountId()); + + // set the userId and account object for everyone + session.setAttribute("userid", userAcct.getId()); + UserVO user = (UserVO) _accountMgr.getActiveUser(userAcct.getId()); + if(user.getUuid() != null){ + session.setAttribute("user_UUID", user.getUuid()); + } + + session.setAttribute("username", userAcct.getUsername()); + session.setAttribute("firstname", userAcct.getFirstname()); + session.setAttribute("lastname", userAcct.getLastname()); + session.setAttribute("accountobj", account); + session.setAttribute("account", account.getAccountName()); + + session.setAttribute("domainid", account.getDomainId()); + DomainVO domain = (DomainVO) _domainMgr.getDomain(account.getDomainId()); + if(domain.getUuid() != null){ + session.setAttribute("domain_UUID", domain.getUuid()); + } + + session.setAttribute("type", Short.valueOf(account.getType()).toString()); + session.setAttribute("registrationtoken", userAcct.getRegistrationToken()); + session.setAttribute("registered", new Boolean(userAcct.isRegistered()).toString()); + + if (timezone != null) { + session.setAttribute("timezone", timezone); + session.setAttribute("timezoneoffset", Float.valueOf(offsetInHrs).toString()); + } + + // (bug 5483) generate a session key that the user must submit on every request to prevent CSRF, add that + // to the login response so that session-based authenticators know to send the key back + SecureRandom sesssionKeyRandom = new SecureRandom(); + byte sessionKeyBytes[] = new byte[20]; + sesssionKeyRandom.nextBytes(sessionKeyBytes); + String sessionKey = Base64.encodeBytes(sessionKeyBytes); + session.setAttribute("sessionkey", sessionKey); + + return; + } + throw new CloudAuthenticationException("Failed to authenticate user " + username + " in domain " + domainId + "; please provide valid credentials"); + } + + public void logoutUser(long userId) { + _accountMgr.logoutUser(Long.valueOf(userId)); + return; + } + + public boolean verifyUser(Long userId) { + User user = _accountMgr.getUserIncludingRemoved(userId); + Account account = null; + if (user != null) { + account = _accountMgr.getAccount(user.getAccountId()); + } + + if ((user == null) || (user.getRemoved() != null) || !user.getState().equals(Account.State.enabled) || (account == null) || !account.getState().equals(Account.State.enabled)) { + s_logger.warn("Deleted/Disabled/Locked user with id=" + userId + " attempting to access public API"); + return false; + } + return true; + } + + public static boolean isCommandAvailable(short accountType, String commandName) { + boolean isCommandAvailable = false; + switch (accountType) { + case Account.ACCOUNT_TYPE_ADMIN: + isCommandAvailable = s_adminCommands.contains(commandName); + break; + case Account.ACCOUNT_TYPE_DOMAIN_ADMIN: + isCommandAvailable = s_resellerCommands.contains(commandName); + break; + case Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN: + isCommandAvailable = s_resourceDomainAdminCommands.contains(commandName); + break; + case Account.ACCOUNT_TYPE_NORMAL: + isCommandAvailable = s_userCommands.contains(commandName); + break; + } + return isCommandAvailable; + } + + // FIXME: rather than isError, we might was to pass in the status code to give more flexibility + private void writeResponse(HttpResponse resp, final String responseText, final int statusCode, String responseType, String reasonPhrase) { + try { + resp.setStatusCode(statusCode); + resp.setReasonPhrase(reasonPhrase); + + BasicHttpEntity body = new BasicHttpEntity(); + if (BaseCmd.RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { + // JSON response + body.setContentType(jsonContentType); + if (responseText == null) { + body.setContent(new ByteArrayInputStream("{ \"error\" : { \"description\" : \"Internal Server Error\" } }".getBytes("UTF-8"))); + } + } else { + body.setContentType("text/xml"); + if (responseText == null) { + body.setContent(new ByteArrayInputStream("Internal Server Error".getBytes("UTF-8"))); + } + } + + if (responseText != null) { + body.setContent(new ByteArrayInputStream(responseText.getBytes("UTF-8"))); + } + resp.setEntity(body); + } catch (Exception ex) { + s_logger.error("error!", ex); + } + } + + // FIXME: the following two threads are copied from + // http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/httpcore/src/examples/org/apache/http/examples/ElementalHttpServer.java + // we have to cite a license if we are using this code directly, so we need to add the appropriate citation or + // modify the + // code to be very specific to our needs + static class ListenerThread extends Thread { + private HttpService _httpService = null; + private ServerSocket _serverSocket = null; + private HttpParams _params = null; + + public ListenerThread(ApiServer requestHandler, int port) { + try { + _serverSocket = new ServerSocket(port); + } catch (IOException ioex) { + s_logger.error("error initializing api server", ioex); + return; + } + + _params = new BasicHttpParams(); + _params.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 30000).setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024) + .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false).setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true) + .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1"); + + // Set up the HTTP protocol processor + BasicHttpProcessor httpproc = new BasicHttpProcessor(); + httpproc.addInterceptor(new ResponseDate()); + httpproc.addInterceptor(new ResponseServer()); + httpproc.addInterceptor(new ResponseContent()); + httpproc.addInterceptor(new ResponseConnControl()); + + // Set up request handlers + HttpRequestHandlerRegistry reqistry = new HttpRequestHandlerRegistry(); + reqistry.register("*", requestHandler); + + // Set up the HTTP service + _httpService = new HttpService(httpproc, new NoConnectionReuseStrategy(), new DefaultHttpResponseFactory()); + _httpService.setParams(_params); + _httpService.setHandlerResolver(reqistry); + } + + public String getServerIpAddress() { + String hostName; + InetAddress addrs[] = null; + try { + hostName = InetAddress.getLocalHost().getHostName(); + addrs = InetAddress.getAllByName(hostName); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + String myIp = "UNKNOWN"; + for (InetAddress addr : addrs) { + if (!addr.isLoopbackAddress() && addr.isSiteLocalAddress()) { + myIp = addr.getHostAddress(); + break; + } + } + return myIp; + } + + public String getServerPort() { + return _serverSocket.getLocalPort() + ""; + } + + @Override + public void run() { + s_logger.info("ApiServer listening on port " + _serverSocket.getLocalPort()); + while (!Thread.interrupted()) { + try { + // Set up HTTP connection + Socket socket = _serverSocket.accept(); + DefaultHttpServerConnection conn = new DefaultHttpServerConnection(); + conn.bind(socket, _params); + + // Execute a new worker task to handle the request + _executor.execute(new WorkerTask(_httpService, conn, _workerCount++)); + } catch (InterruptedIOException ex) { + break; + } catch (IOException e) { + s_logger.error("I/O error initializing connection thread", e); + break; + } + } + } + } + + static class WorkerTask implements Runnable { + private final HttpService _httpService; + private final HttpServerConnection _conn; + + public WorkerTask(final HttpService httpService, final HttpServerConnection conn, final int count) { + _httpService = httpService; + _conn = conn; + } + + @Override + public void run() { + HttpContext context = new BasicHttpContext(null); + try { + while (!Thread.interrupted() && _conn.isOpen()) { + try { + _httpService.handleRequest(_conn, context); + _conn.close(); + } finally { + StackMaid.current().exitCleanup(); + } + } + } catch (ConnectionClosedException ex) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("ApiServer: Client closed connection"); + } + } catch (IOException ex) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("ApiServer: IOException - " + ex); + } + } catch (HttpException ex) { + s_logger.warn("ApiServer: Unrecoverable HTTP protocol violation" + ex); + } finally { + try { + _conn.shutdown(); + } catch (IOException ignore) { + } + } + } + } + + public String getSerializedApiError(int errorCode, String errorText, Map apiCommandParams, String responseType, Exception ex) { + String responseName = null; + String cmdClassName = null; + + String responseText = null; + + try { + if (errorCode == BaseCmd.UNSUPPORTED_ACTION_ERROR || apiCommandParams == null || apiCommandParams.isEmpty()) { + responseName = "errorresponse"; + } else { + Object cmdObj = apiCommandParams.get("command"); + // cmd name can be null when "command" parameter is missing in the request + if (cmdObj != null) { + String cmdName = ((String[]) cmdObj)[0]; + cmdClassName = _apiCommands.getProperty(cmdName); + if (cmdClassName != null) { + Class claz = Class.forName(cmdClassName); + responseName = ((BaseCmd) claz.newInstance()).getCommandName(); + } else { + responseName = "errorresponse"; + } + } + } + ExceptionResponse apiResponse = new ExceptionResponse(); + apiResponse.setErrorCode(errorCode); + apiResponse.setErrorText(errorText); + apiResponse.setResponseName(responseName); + // Also copy over the IdentityProxy object List into this new apiResponse, from + // the exception caught. When invoked from handle(), the exception here can + // be either ServerApiException, PermissionDeniedException or InvalidParameterValue + // Exception. When invoked from ApiServlet's processRequest(), this can be + // a standard exception like NumberFormatException. We'll leave the standard ones alone. + if (ex != null) { + if (ex instanceof ServerApiException || ex instanceof PermissionDeniedException + || ex instanceof InvalidParameterValueException) { + // Cast the exception appropriately and retrieve the IdentityProxy + if (ex instanceof ServerApiException) { + ServerApiException ref = (ServerApiException) ex; + ArrayList idList = ref.getIdProxyList(); + if (idList != null) { + for (int i=0; i < idList.size(); i++) { + IdentityProxy id = idList.get(i); + apiResponse.addProxyObject(id.getTableName(), id.getValue(), id.getidFieldName()); + } + } + // Also copy over the cserror code and the function/layer in which it was thrown. + apiResponse.setCSErrorCode(ref.getCSErrorCode()); + } else if (ex instanceof PermissionDeniedException) { + PermissionDeniedException ref = (PermissionDeniedException) ex; + ArrayList idList = ref.getIdProxyList(); + if (idList != null) { + for (int i=0; i < idList.size(); i++) { + IdentityProxy id = idList.get(i); + apiResponse.addProxyObject(id.getTableName(), id.getValue(), id.getidFieldName()); + } + } + // Also copy over the cserror code and the function/layer in which it was thrown. + apiResponse.setCSErrorCode(ref.getCSErrorCode()); + } else if (ex instanceof InvalidParameterValueException) { + InvalidParameterValueException ref = (InvalidParameterValueException) ex; + ArrayList idList = ref.getIdProxyList(); + if (idList != null) { + for (int i=0; i < idList.size(); i++) { + IdentityProxy id = idList.get(i); + apiResponse.addProxyObject(id.getTableName(), id.getValue(), id.getidFieldName()); + } + } + // Also copy over the cserror code and the function/layer in which it was thrown. + apiResponse.setCSErrorCode(ref.getCSErrorCode()); + } + } + } + SerializationContext.current().setUuidTranslation(true); + responseText = ApiResponseSerializer.toSerializedString(apiResponse, responseType); + + } catch (Exception e) { + s_logger.error("Exception responding to http request", e); + } + return responseText; + } +} diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index f367175dfd8..19dfe89ed4c 100755 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -1,460 +1,475 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.configuration; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.cloud.agent.manager.ClusteredAgentManagerImpl; -import com.cloud.alert.AlertManagerImpl; -import com.cloud.alert.dao.AlertDaoImpl; -import com.cloud.async.AsyncJobExecutorContextImpl; -import com.cloud.async.AsyncJobManagerImpl; -import com.cloud.async.SyncQueueManagerImpl; -import com.cloud.async.dao.AsyncJobDaoImpl; -import com.cloud.async.dao.SyncQueueDaoImpl; -import com.cloud.async.dao.SyncQueueItemDaoImpl; -import com.cloud.capacity.CapacityManagerImpl; -import com.cloud.capacity.dao.CapacityDaoImpl; -import com.cloud.certificate.dao.CertificateDaoImpl; -import com.cloud.cluster.CheckPointManagerImpl; -import com.cloud.cluster.ClusterFenceManagerImpl; -import com.cloud.cluster.ClusterManagerImpl; -import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl; -import com.cloud.cluster.dao.ManagementServerHostDaoImpl; -import com.cloud.cluster.dao.ManagementServerHostPeerDaoImpl; -import com.cloud.cluster.dao.StackMaidDaoImpl; -import com.cloud.configuration.dao.ConfigurationDaoImpl; -import com.cloud.configuration.dao.ResourceCountDaoImpl; -import com.cloud.configuration.dao.ResourceLimitDaoImpl; -import com.cloud.consoleproxy.ConsoleProxyManagerImpl; -import com.cloud.dao.EntityManager; -import com.cloud.dao.EntityManagerImpl; -import com.cloud.dc.ClusterDetailsDaoImpl; -import com.cloud.dc.dao.AccountVlanMapDaoImpl; -import com.cloud.dc.dao.ClusterDaoImpl; -import com.cloud.dc.dao.ClusterVSMMapDaoImpl; -import com.cloud.dc.dao.DataCenterDaoImpl; -import com.cloud.dc.dao.DataCenterIpAddressDaoImpl; -import com.cloud.dc.dao.DcDetailsDaoImpl; -import com.cloud.dc.dao.HostPodDaoImpl; -import com.cloud.dc.dao.PodVlanMapDaoImpl; -import com.cloud.dc.dao.StorageNetworkIpAddressDaoImpl; -import com.cloud.dc.dao.StorageNetworkIpRangeDaoImpl; -import com.cloud.dc.dao.VlanDaoImpl; -import com.cloud.domain.dao.DomainDaoImpl; -import com.cloud.event.dao.EventDaoImpl; -import com.cloud.event.dao.UsageEventDaoImpl; -import com.cloud.ha.HighAvailabilityManagerImpl; -import com.cloud.ha.dao.HighAvailabilityDaoImpl; -import com.cloud.host.dao.HostDaoImpl; -import com.cloud.host.dao.HostDetailsDaoImpl; -import com.cloud.host.dao.HostTagsDaoImpl; -import com.cloud.hypervisor.HypervisorGuruManagerImpl; -import com.cloud.hypervisor.dao.HypervisorCapabilitiesDaoImpl; -import com.cloud.keystore.KeystoreDaoImpl; -import com.cloud.keystore.KeystoreManagerImpl; -import com.cloud.maint.UpgradeManagerImpl; -import com.cloud.maint.dao.AgentUpgradeDaoImpl; -import com.cloud.network.ExternalLoadBalancerUsageManagerImpl; -import com.cloud.network.NetworkManagerImpl; -import com.cloud.network.StorageNetworkManagerImpl; -import com.cloud.network.dao.CiscoNexusVSMDeviceDaoImpl; -import com.cloud.network.dao.ExternalFirewallDeviceDaoImpl; -import com.cloud.network.dao.ExternalLoadBalancerDeviceDaoImpl; -import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; -import com.cloud.network.dao.FirewallRulesDaoImpl; -import com.cloud.network.dao.IPAddressDaoImpl; -import com.cloud.network.dao.InlineLoadBalancerNicMapDaoImpl; -import com.cloud.network.dao.LBStickinessPolicyDaoImpl; -import com.cloud.network.dao.LoadBalancerDaoImpl; -import com.cloud.network.dao.LoadBalancerVMMapDaoImpl; -import com.cloud.network.dao.NetworkDaoImpl; -import com.cloud.network.dao.NetworkDomainDaoImpl; -import com.cloud.network.dao.NetworkExternalFirewallDaoImpl; -import com.cloud.network.dao.NetworkExternalLoadBalancerDaoImpl; -import com.cloud.network.dao.NetworkRuleConfigDaoImpl; -import com.cloud.network.dao.NetworkServiceMapDaoImpl; -import com.cloud.network.dao.PhysicalNetworkDaoImpl; -import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl; -import com.cloud.network.dao.PhysicalNetworkTrafficTypeDaoImpl; -import com.cloud.network.dao.PortProfileDaoImpl; -import com.cloud.network.dao.RemoteAccessVpnDaoImpl; -import com.cloud.network.dao.Site2SiteCustomerGatewayDaoImpl; -import com.cloud.network.dao.Site2SiteVpnConnectionDaoImpl; -import com.cloud.network.dao.Site2SiteVpnGatewayDaoImpl; -import com.cloud.network.dao.VirtualRouterProviderDaoImpl; -import com.cloud.network.dao.VpnUserDaoImpl; -import com.cloud.network.element.CiscoNexusVSMElement; -import com.cloud.network.element.CiscoNexusVSMElementService; -import com.cloud.network.element.F5ExternalLoadBalancerElement; -import com.cloud.network.element.F5ExternalLoadBalancerElementService; -import com.cloud.network.element.JuniperSRXExternalFirewallElement; -import com.cloud.network.element.JuniperSRXFirewallElementService; -import com.cloud.network.element.NetscalerElement; -import com.cloud.network.element.NetscalerLoadBalancerElementService; -import com.cloud.network.element.VirtualRouterElement; -import com.cloud.network.element.VirtualRouterElementService; -import com.cloud.network.firewall.FirewallManagerImpl; -import com.cloud.network.lb.ElasticLoadBalancerManagerImpl; -import com.cloud.network.lb.LoadBalancingRulesManagerImpl; -import com.cloud.network.lb.dao.ElasticLbVmMapDaoImpl; -import com.cloud.network.ovs.OvsTunnelManagerImpl; -import com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl; -import com.cloud.network.ovs.dao.OvsTunnelNetworkDaoImpl; -import com.cloud.network.router.VirtualNetworkApplianceManagerImpl; -import com.cloud.network.router.VpcVirtualNetworkApplianceManagerImpl; -import com.cloud.network.rules.RulesManagerImpl; -import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl; -import com.cloud.network.security.SecurityGroupManagerImpl2; -import com.cloud.network.security.dao.SecurityGroupDaoImpl; -import com.cloud.network.security.dao.SecurityGroupRuleDaoImpl; -import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl; -import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl; -import com.cloud.network.security.dao.SecurityGroupWorkDaoImpl; -import com.cloud.network.security.dao.VmRulesetLogDaoImpl; -import com.cloud.network.vpc.NetworkACLManagerImpl; -import com.cloud.network.vpc.VpcManagerImpl; -import com.cloud.network.vpc.Dao.PrivateIpDaoImpl; -import com.cloud.network.vpc.Dao.StaticRouteDaoImpl; -import com.cloud.network.vpc.Dao.VpcDaoImpl; -import com.cloud.network.vpc.Dao.VpcGatewayDaoImpl; -import com.cloud.network.vpc.Dao.VpcOfferingDaoImpl; -import com.cloud.network.vpc.Dao.VpcOfferingServiceMapDaoImpl; -import com.cloud.network.vpn.RemoteAccessVpnManagerImpl; -import com.cloud.network.vpn.Site2SiteVpnManagerImpl; -import com.cloud.offerings.dao.NetworkOfferingDaoImpl; -import com.cloud.offerings.dao.NetworkOfferingServiceMapDaoImpl; -import com.cloud.projects.ProjectManagerImpl; -import com.cloud.projects.dao.ProjectAccountDaoImpl; -import com.cloud.projects.dao.ProjectDaoImpl; -import com.cloud.projects.dao.ProjectInvitationDaoImpl; -import com.cloud.resource.ResourceManagerImpl; -import com.cloud.resourcelimit.ResourceLimitManagerImpl; -import com.cloud.service.dao.ServiceOfferingDaoImpl; -import com.cloud.storage.OCFS2ManagerImpl; -import com.cloud.storage.StorageManagerImpl; -import com.cloud.storage.dao.DiskOfferingDaoImpl; -import com.cloud.storage.dao.GuestOSCategoryDaoImpl; -import com.cloud.storage.dao.GuestOSDaoImpl; -import com.cloud.storage.dao.LaunchPermissionDaoImpl; -import com.cloud.storage.dao.SnapshotDaoImpl; -import com.cloud.storage.dao.SnapshotPolicyDaoImpl; -import com.cloud.storage.dao.SnapshotScheduleDaoImpl; -import com.cloud.storage.dao.StoragePoolDaoImpl; -import com.cloud.storage.dao.StoragePoolHostDaoImpl; -import com.cloud.storage.dao.StoragePoolWorkDaoImpl; -import com.cloud.storage.dao.SwiftDaoImpl; -import com.cloud.storage.dao.UploadDaoImpl; -import com.cloud.storage.dao.VMTemplateDaoImpl; -import com.cloud.storage.dao.VMTemplateDetailsDaoImpl; -import com.cloud.storage.dao.VMTemplateHostDaoImpl; -import com.cloud.storage.dao.VMTemplatePoolDaoImpl; -import com.cloud.storage.dao.VMTemplateSwiftDaoImpl; -import com.cloud.storage.dao.VMTemplateZoneDaoImpl; -import com.cloud.storage.dao.VolumeDaoImpl; -import com.cloud.storage.dao.VolumeHostDaoImpl; -import com.cloud.storage.download.DownloadMonitorImpl; -import com.cloud.storage.secondary.SecondaryStorageManagerImpl; -import com.cloud.storage.snapshot.SnapshotManagerImpl; -import com.cloud.storage.snapshot.SnapshotSchedulerImpl; -import com.cloud.storage.swift.SwiftManagerImpl; -import com.cloud.storage.upload.UploadMonitorImpl; -import com.cloud.tags.TaggedResourceManagerImpl; -import com.cloud.tags.dao.ResourceTagsDaoImpl; -import com.cloud.template.HyervisorTemplateAdapter; -import com.cloud.template.TemplateAdapter; -import com.cloud.template.TemplateAdapter.TemplateAdapterType; -import com.cloud.template.TemplateManagerImpl; -import com.cloud.user.AccountDetailsDaoImpl; -import com.cloud.user.AccountManagerImpl; -import com.cloud.user.DomainManagerImpl; -import com.cloud.user.dao.AccountDaoImpl; -import com.cloud.user.dao.SSHKeyPairDaoImpl; -import com.cloud.user.dao.UserAccountDaoImpl; -import com.cloud.user.dao.UserDaoImpl; -import com.cloud.user.dao.UserStatisticsDaoImpl; -import com.cloud.user.dao.UserStatsLogDaoImpl; -import com.cloud.utils.component.Adapter; -import com.cloud.utils.component.ComponentLibrary; -import com.cloud.utils.component.ComponentLibraryBase; -import com.cloud.utils.component.ComponentLocator.ComponentInfo; -import com.cloud.utils.component.Manager; -import com.cloud.utils.component.PluggableService; -import com.cloud.utils.db.GenericDao; -import com.cloud.uuididentity.IdentityServiceImpl; -import com.cloud.uuididentity.dao.IdentityDaoImpl; -import com.cloud.vm.ClusteredVirtualMachineManagerImpl; -import com.cloud.vm.ItWorkDaoImpl; -import com.cloud.vm.UserVmManagerImpl; -import com.cloud.vm.dao.ConsoleProxyDaoImpl; -import com.cloud.vm.dao.DomainRouterDaoImpl; -import com.cloud.vm.dao.InstanceGroupDaoImpl; -import com.cloud.vm.dao.InstanceGroupVMMapDaoImpl; -import com.cloud.vm.dao.NicDaoImpl; -import com.cloud.vm.dao.SecondaryStorageVmDaoImpl; -import com.cloud.vm.dao.UserVmDaoImpl; -import com.cloud.vm.dao.UserVmDetailsDaoImpl; -import com.cloud.vm.dao.VMInstanceDaoImpl; - - -public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { - protected void populateDaos() { - addDao("StackMaidDao", StackMaidDaoImpl.class); - addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class); - addDao("VMTemplateDetailsDao", VMTemplateDetailsDaoImpl.class); - addDao("DomainRouterDao", DomainRouterDaoImpl.class); - addDao("HostDao", HostDaoImpl.class); - addDao("VMInstanceDao", VMInstanceDaoImpl.class); - addDao("UserVmDao", UserVmDaoImpl.class); - ComponentInfo> info = addDao("ServiceOfferingDao", ServiceOfferingDaoImpl.class); - info.addParameter("cache.size", "50"); - info.addParameter("cache.time.to.live", "600"); - info = addDao("DiskOfferingDao", DiskOfferingDaoImpl.class); - info.addParameter("cache.size", "50"); - info.addParameter("cache.time.to.live", "600"); - info = addDao("DataCenterDao", DataCenterDaoImpl.class); - info.addParameter("cache.size", "50"); - info.addParameter("cache.time.to.live", "600"); - info = addDao("HostPodDao", HostPodDaoImpl.class); - info.addParameter("cache.size", "50"); - info.addParameter("cache.time.to.live", "600"); - addDao("IPAddressDao", IPAddressDaoImpl.class); - info = addDao("VlanDao", VlanDaoImpl.class); - info.addParameter("cache.size", "30"); - info.addParameter("cache.time.to.live", "3600"); - addDao("PodVlanMapDao", PodVlanMapDaoImpl.class); - addDao("AccountVlanMapDao", AccountVlanMapDaoImpl.class); - addDao("VolumeDao", VolumeDaoImpl.class); - addDao("EventDao", EventDaoImpl.class); - info = addDao("UserDao", UserDaoImpl.class); - info.addParameter("cache.size", "5000"); - info.addParameter("cache.time.to.live", "300"); - addDao("UserStatisticsDao", UserStatisticsDaoImpl.class); - addDao("UserStatsLogDao", UserStatsLogDaoImpl.class); - addDao("FirewallRulesDao", FirewallRulesDaoImpl.class); - addDao("LoadBalancerDao", LoadBalancerDaoImpl.class); - addDao("NetworkRuleConfigDao", NetworkRuleConfigDaoImpl.class); - addDao("LoadBalancerVMMapDao", LoadBalancerVMMapDaoImpl.class); - addDao("LBStickinessPolicyDao", LBStickinessPolicyDaoImpl.class); - addDao("DataCenterIpAddressDao", DataCenterIpAddressDaoImpl.class); - addDao("SecurityGroupDao", SecurityGroupDaoImpl.class); - addDao("SecurityGroupRuleDao", SecurityGroupRuleDaoImpl.class); - addDao("SecurityGroupVMMapDao", SecurityGroupVMMapDaoImpl.class); - addDao("SecurityGroupRulesDao", SecurityGroupRulesDaoImpl.class); - addDao("SecurityGroupWorkDao", SecurityGroupWorkDaoImpl.class); - addDao("VmRulesetLogDao", VmRulesetLogDaoImpl.class); - addDao("AlertDao", AlertDaoImpl.class); - addDao("CapacityDao", CapacityDaoImpl.class); - addDao("DomainDao", DomainDaoImpl.class); - addDao("AccountDao", AccountDaoImpl.class); - addDao("ResourceLimitDao", ResourceLimitDaoImpl.class); - addDao("ResourceCountDao", ResourceCountDaoImpl.class); - addDao("UserAccountDao", UserAccountDaoImpl.class); - addDao("VMTemplateHostDao", VMTemplateHostDaoImpl.class); - addDao("VolumeHostDao", VolumeHostDaoImpl.class); - addDao("VMTemplateSwiftDao", VMTemplateSwiftDaoImpl.class); - addDao("UploadDao", UploadDaoImpl.class); - addDao("VMTemplatePoolDao", VMTemplatePoolDaoImpl.class); - addDao("LaunchPermissionDao", LaunchPermissionDaoImpl.class); - addDao("ConfigurationDao", ConfigurationDaoImpl.class); - info = addDao("VMTemplateDao", VMTemplateDaoImpl.class); - info.addParameter("cache.size", "100"); - info.addParameter("cache.time.to.live", "600"); - info.addParameter("routing.uniquename", "routing"); - addDao("HighAvailabilityDao", HighAvailabilityDaoImpl.class); - addDao("ConsoleProxyDao", ConsoleProxyDaoImpl.class); - addDao("SecondaryStorageVmDao", SecondaryStorageVmDaoImpl.class); - addDao("ManagementServerHostDao", ManagementServerHostDaoImpl.class); - addDao("ManagementServerHostPeerDao", ManagementServerHostPeerDaoImpl.class); - addDao("AgentUpgradeDao", AgentUpgradeDaoImpl.class); - addDao("SnapshotDao", SnapshotDaoImpl.class); - addDao("AsyncJobDao", AsyncJobDaoImpl.class); - addDao("SyncQueueDao", SyncQueueDaoImpl.class); - addDao("SyncQueueItemDao", SyncQueueItemDaoImpl.class); - addDao("GuestOSDao", GuestOSDaoImpl.class); - addDao("GuestOSCategoryDao", GuestOSCategoryDaoImpl.class); - addDao("StoragePoolDao", StoragePoolDaoImpl.class); - addDao("StoragePoolHostDao", StoragePoolHostDaoImpl.class); - addDao("DetailsDao", HostDetailsDaoImpl.class); - addDao("SnapshotPolicyDao", SnapshotPolicyDaoImpl.class); - addDao("SnapshotScheduleDao", SnapshotScheduleDaoImpl.class); - addDao("ClusterDao", ClusterDaoImpl.class); - addDao("CertificateDao", CertificateDaoImpl.class); - addDao("NetworkConfigurationDao", NetworkDaoImpl.class); - addDao("NetworkOfferingDao", NetworkOfferingDaoImpl.class); - addDao("NicDao", NicDaoImpl.class); - addDao("InstanceGroupDao", InstanceGroupDaoImpl.class); - addDao("InstanceGroupVMMapDao", InstanceGroupVMMapDaoImpl.class); - addDao("RemoteAccessVpnDao", RemoteAccessVpnDaoImpl.class); - addDao("VpnUserDao", VpnUserDaoImpl.class); - addDao("ItWorkDao", ItWorkDaoImpl.class); - addDao("FirewallRulesDao", FirewallRulesDaoImpl.class); - addDao("PortForwardingRulesDao", PortForwardingRulesDaoImpl.class); - addDao("FirewallRulesCidrsDao", FirewallRulesCidrsDaoImpl.class); - addDao("SSHKeyPairDao", SSHKeyPairDaoImpl.class); - addDao("UsageEventDao", UsageEventDaoImpl.class); - addDao("ClusterDetailsDao", ClusterDetailsDaoImpl.class); - addDao("UserVmDetailsDao", UserVmDetailsDaoImpl.class); - addDao("OvsTunnelInterfaceDao", OvsTunnelInterfaceDaoImpl.class); - addDao("OvsTunnelAccountDao", OvsTunnelNetworkDaoImpl.class); - addDao("StoragePoolWorkDao", StoragePoolWorkDaoImpl.class); - addDao("HostTagsDao", HostTagsDaoImpl.class); - addDao("NetworkDomainDao", NetworkDomainDaoImpl.class); - addDao("KeystoreDao", KeystoreDaoImpl.class); - addDao("DcDetailsDao", DcDetailsDaoImpl.class); - addDao("SwiftDao", SwiftDaoImpl.class); - addDao("AgentTransferMapDao", HostTransferMapDaoImpl.class); - addDao("ProjectDao", ProjectDaoImpl.class); - addDao("InlineLoadBalancerNicMapDao", InlineLoadBalancerNicMapDaoImpl.class); - addDao("ElasticLbVmMap", ElasticLbVmMapDaoImpl.class); - addDao("ProjectsAccountDao", ProjectAccountDaoImpl.class); - addDao("ProjectInvitationDao", ProjectInvitationDaoImpl.class); - addDao("IdentityDao", IdentityDaoImpl.class); - addDao("AccountDetailsDao", AccountDetailsDaoImpl.class); - addDao("NetworkOfferingServiceMapDao", NetworkOfferingServiceMapDaoImpl.class); - info = addDao("HypervisorCapabilitiesDao",HypervisorCapabilitiesDaoImpl.class); - info.addParameter("cache.size", "100"); - info.addParameter("cache.time.to.live", "600"); - addDao("PhysicalNetworkDao", PhysicalNetworkDaoImpl.class); - addDao("PhysicalNetworkServiceProviderDao", PhysicalNetworkServiceProviderDaoImpl.class); - addDao("VirtualRouterProviderDao", VirtualRouterProviderDaoImpl.class); - addDao("ExternalLoadBalancerDeviceDao", ExternalLoadBalancerDeviceDaoImpl.class); - addDao("ExternalFirewallDeviceDao", ExternalFirewallDeviceDaoImpl.class); - addDao("NetworkExternalLoadBalancerDao", NetworkExternalLoadBalancerDaoImpl.class); - addDao("NetworkExternalFirewallDao", NetworkExternalFirewallDaoImpl.class); - addDao("CiscoNexusVSMDeviceDao", CiscoNexusVSMDeviceDaoImpl.class); - addDao("ClusterVSMMapDao", ClusterVSMMapDaoImpl.class); - addDao("PortProfileDao", PortProfileDaoImpl.class); - addDao("PhysicalNetworkTrafficTypeDao", PhysicalNetworkTrafficTypeDaoImpl.class); - addDao("NetworkServiceMapDao", NetworkServiceMapDaoImpl.class); - addDao("StorageNetworkIpAddressDao", StorageNetworkIpAddressDaoImpl.class); - addDao("StorageNetworkIpRangeDao", StorageNetworkIpRangeDaoImpl.class); - addDao("TagsDao", ResourceTagsDaoImpl.class); - addDao("VpcDao", VpcDaoImpl.class); - addDao("VpcOfferingDao", VpcOfferingDaoImpl.class); - addDao("VpcOfferingServiceMapDao", VpcOfferingServiceMapDaoImpl.class); - addDao("PrivateIpDao", PrivateIpDaoImpl.class); - addDao("VpcGatewayDao", VpcGatewayDaoImpl.class); - addDao("StaticRouteDao", StaticRouteDaoImpl.class); - addDao("Site2SiteVpnGatewayDao", Site2SiteVpnGatewayDaoImpl.class); - addDao("Site2SiteCustomerGatewayDao", Site2SiteCustomerGatewayDaoImpl.class); - addDao("Site2SiteVpnConnnectionDao", Site2SiteVpnConnectionDaoImpl.class); - } - - @Override - public synchronized Map>> getDaos() { - if (_daos.size() == 0) { - populateDaos(); - } - return _daos; - } - - protected void populateManagers() { - addManager("StackMaidManager", CheckPointManagerImpl.class); - addManager("Cluster Manager", ClusterManagerImpl.class); - addManager("ClusterFenceManager", ClusterFenceManagerImpl.class); - addManager("ClusteredAgentManager", ClusteredAgentManagerImpl.class); - addManager("SyncQueueManager", SyncQueueManagerImpl.class); - addManager("AsyncJobManager", AsyncJobManagerImpl.class); - addManager("AsyncJobExecutorContext", AsyncJobExecutorContextImpl.class); - addManager("configuration manager", ConfigurationManagerImpl.class); - addManager("account manager", AccountManagerImpl.class); - addManager("domain manager", DomainManagerImpl.class); - addManager("resource limit manager", ResourceLimitManagerImpl.class); - addManager("network manager", NetworkManagerImpl.class); - addManager("download manager", DownloadMonitorImpl.class); - addManager("upload manager", UploadMonitorImpl.class); - addManager("keystore manager", KeystoreManagerImpl.class); - addManager("secondary storage vm manager", SecondaryStorageManagerImpl.class); - addManager("vm manager", UserVmManagerImpl.class); - addManager("upgrade manager", UpgradeManagerImpl.class); - addManager("StorageManager", StorageManagerImpl.class); - addManager("Alert Manager", AlertManagerImpl.class); - addManager("Template Manager", TemplateManagerImpl.class); - addManager("Snapshot Manager", SnapshotManagerImpl.class); - addManager("SnapshotScheduler", SnapshotSchedulerImpl.class); - addManager("SecurityGroupManager", SecurityGroupManagerImpl2.class); - addManager("DomainRouterManager", VirtualNetworkApplianceManagerImpl.class); - addManager("EntityManager", EntityManagerImpl.class); - addManager("LoadBalancingRulesManager", LoadBalancingRulesManagerImpl.class); - addManager("RulesManager", RulesManagerImpl.class); - addManager("RemoteAccessVpnManager", RemoteAccessVpnManagerImpl.class); - addManager("OvsTunnelManager", OvsTunnelManagerImpl.class); - addManager("Capacity Manager", CapacityManagerImpl.class); - addManager("VirtualMachineManager", ClusteredVirtualMachineManagerImpl.class); - addManager("HypervisorGuruManager", HypervisorGuruManagerImpl.class); - addManager("ResourceManager", ResourceManagerImpl.class); - addManager("IdentityManager", IdentityServiceImpl.class); - addManager("OCFS2Manager", OCFS2ManagerImpl.class); - addManager("FirewallManager", FirewallManagerImpl.class); - ComponentInfo info = addManager("ConsoleProxyManager", ConsoleProxyManagerImpl.class); - info.addParameter("consoleproxy.sslEnabled", "true"); - addManager("ProjectManager", ProjectManagerImpl.class); - addManager("ElasticLoadBalancerManager", ElasticLoadBalancerManagerImpl.class); - addManager("SwiftManager", SwiftManagerImpl.class); - addManager("StorageNetworkManager", StorageNetworkManagerImpl.class); - addManager("ExternalLoadBalancerUsageManager", ExternalLoadBalancerUsageManagerImpl.class); - addManager("HA Manager", HighAvailabilityManagerImpl.class); - addManager("TaggedResourcesManager", TaggedResourceManagerImpl.class); - addManager("VPC Manager", VpcManagerImpl.class); - addManager("VpcVirtualRouterManager", VpcVirtualNetworkApplianceManagerImpl.class); - addManager("NetworkACLManager", NetworkACLManagerImpl.class); - addManager("Site2SiteVpnManager", Site2SiteVpnManagerImpl.class); - } - - @Override - public synchronized Map> getManagers() { - if (_managers.size() == 0) { - populateManagers(); - } - return _managers; - } - - protected void populateAdapters() { - addAdapter(TemplateAdapter.class, TemplateAdapterType.Hypervisor.getName(), HyervisorTemplateAdapter.class); - } - - @Override - public synchronized Map>> getAdapters() { - if (_adapters.size() == 0) { - populateAdapters(); - } - return _adapters; - } - - @Override - public synchronized Map, Class> getFactories() { - HashMap, Class> factories = new HashMap, Class>(); - factories.put(EntityManager.class, EntityManagerImpl.class); - return factories; - } - - protected void populateServices() { - addService("VirtualRouterElementService", VirtualRouterElementService.class, VirtualRouterElement.class); - addService("NetscalerExternalLoadBalancerElementService", NetscalerLoadBalancerElementService.class, NetscalerElement.class); - addService("F5LoadBalancerElementService", F5ExternalLoadBalancerElementService.class, F5ExternalLoadBalancerElement.class); - addService("JuniperSRXFirewallElementService", JuniperSRXFirewallElementService.class, JuniperSRXExternalFirewallElement.class); - addService("CiscoNexusVSMElementService", CiscoNexusVSMElementService.class, CiscoNexusVSMElement.class); - } - - @Override - public synchronized Map> getPluggableServices() { - if (_pluggableServices.size() == 0) { - populateServices(); - } - return _pluggableServices; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.configuration; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.cloud.agent.manager.ClusteredAgentManagerImpl; +import com.cloud.alert.AlertManagerImpl; +import com.cloud.alert.dao.AlertDaoImpl; +import com.cloud.async.AsyncJobExecutorContextImpl; +import com.cloud.async.AsyncJobManagerImpl; +import com.cloud.async.SyncQueueManagerImpl; +import com.cloud.async.dao.AsyncJobDaoImpl; +import com.cloud.async.dao.SyncQueueDaoImpl; +import com.cloud.async.dao.SyncQueueItemDaoImpl; +import com.cloud.capacity.CapacityManagerImpl; +import com.cloud.capacity.dao.CapacityDaoImpl; +import com.cloud.certificate.dao.CertificateDaoImpl; +import com.cloud.cluster.CheckPointManagerImpl; +import com.cloud.cluster.ClusterFenceManagerImpl; +import com.cloud.cluster.ClusterManagerImpl; +import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl; +import com.cloud.cluster.dao.ManagementServerHostDaoImpl; +import com.cloud.cluster.dao.ManagementServerHostPeerDaoImpl; +import com.cloud.cluster.dao.StackMaidDaoImpl; +import com.cloud.configuration.dao.ConfigurationDaoImpl; +import com.cloud.configuration.dao.ResourceCountDaoImpl; +import com.cloud.configuration.dao.ResourceLimitDaoImpl; +import com.cloud.consoleproxy.ConsoleProxyManagerImpl; +import com.cloud.dao.EntityManager; +import com.cloud.dao.EntityManagerImpl; +import com.cloud.dc.ClusterDetailsDaoImpl; +import com.cloud.dc.dao.AccountVlanMapDaoImpl; +import com.cloud.dc.dao.ClusterDaoImpl; +import com.cloud.dc.dao.ClusterVSMMapDaoImpl; +import com.cloud.dc.dao.DataCenterDaoImpl; +import com.cloud.dc.dao.DataCenterIpAddressDaoImpl; +import com.cloud.dc.dao.DcDetailsDaoImpl; +import com.cloud.dc.dao.HostPodDaoImpl; +import com.cloud.dc.dao.PodVlanMapDaoImpl; +import com.cloud.dc.dao.StorageNetworkIpAddressDaoImpl; +import com.cloud.dc.dao.StorageNetworkIpRangeDaoImpl; +import com.cloud.dc.dao.VlanDaoImpl; +import com.cloud.domain.dao.DomainDaoImpl; +import com.cloud.event.dao.EventDaoImpl; +import com.cloud.event.dao.UsageEventDaoImpl; +import com.cloud.ha.HighAvailabilityManagerImpl; +import com.cloud.ha.dao.HighAvailabilityDaoImpl; +import com.cloud.host.dao.HostDaoImpl; +import com.cloud.host.dao.HostDetailsDaoImpl; +import com.cloud.host.dao.HostTagsDaoImpl; +import com.cloud.hypervisor.HypervisorGuruManagerImpl; +import com.cloud.hypervisor.dao.HypervisorCapabilitiesDaoImpl; +import com.cloud.keystore.KeystoreDaoImpl; +import com.cloud.keystore.KeystoreManagerImpl; +import com.cloud.maint.UpgradeManagerImpl; +import com.cloud.maint.dao.AgentUpgradeDaoImpl; +import com.cloud.network.ExternalLoadBalancerUsageManagerImpl; +import com.cloud.network.NetworkManagerImpl; +import com.cloud.network.StorageNetworkManagerImpl; +import com.cloud.network.as.AutoScaleManagerImpl; +import com.cloud.network.as.dao.AutoScalePolicyConditionMapDaoImpl; +import com.cloud.network.as.dao.AutoScalePolicyDaoImpl; +import com.cloud.network.as.dao.AutoScaleVmGroupDaoImpl; +import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDaoImpl; +import com.cloud.network.as.dao.ConditionDaoImpl; +import com.cloud.network.as.dao.CounterDaoImpl; +import com.cloud.network.dao.CiscoNexusVSMDeviceDaoImpl; +import com.cloud.network.dao.ExternalFirewallDeviceDaoImpl; +import com.cloud.network.dao.ExternalLoadBalancerDeviceDaoImpl; +import com.cloud.network.dao.FirewallRulesCidrsDaoImpl; +import com.cloud.network.dao.FirewallRulesDaoImpl; +import com.cloud.network.dao.IPAddressDaoImpl; +import com.cloud.network.dao.InlineLoadBalancerNicMapDaoImpl; +import com.cloud.network.dao.LBStickinessPolicyDaoImpl; +import com.cloud.network.as.dao.AutoScaleVmProfileDaoImpl; +import com.cloud.network.dao.LoadBalancerDaoImpl; +import com.cloud.network.dao.LoadBalancerVMMapDaoImpl; +import com.cloud.network.dao.NetworkDaoImpl; +import com.cloud.network.dao.NetworkDomainDaoImpl; +import com.cloud.network.dao.NetworkExternalFirewallDaoImpl; +import com.cloud.network.dao.NetworkExternalLoadBalancerDaoImpl; +import com.cloud.network.dao.NetworkRuleConfigDaoImpl; +import com.cloud.network.dao.NetworkServiceMapDaoImpl; +import com.cloud.network.dao.PhysicalNetworkDaoImpl; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDaoImpl; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeDaoImpl; +import com.cloud.network.dao.PortProfileDaoImpl; +import com.cloud.network.dao.RemoteAccessVpnDaoImpl; +import com.cloud.network.dao.Site2SiteCustomerGatewayDaoImpl; +import com.cloud.network.dao.Site2SiteVpnConnectionDaoImpl; +import com.cloud.network.dao.Site2SiteVpnGatewayDaoImpl; +import com.cloud.network.dao.VirtualRouterProviderDaoImpl; +import com.cloud.network.dao.VpnUserDaoImpl; +import com.cloud.network.element.CiscoNexusVSMElement; +import com.cloud.network.element.CiscoNexusVSMElementService; +import com.cloud.network.element.F5ExternalLoadBalancerElement; +import com.cloud.network.element.F5ExternalLoadBalancerElementService; +import com.cloud.network.element.JuniperSRXExternalFirewallElement; +import com.cloud.network.element.JuniperSRXFirewallElementService; +import com.cloud.network.element.NetscalerElement; +import com.cloud.network.element.NetscalerLoadBalancerElementService; +import com.cloud.network.element.VirtualRouterElement; +import com.cloud.network.element.VirtualRouterElementService; +import com.cloud.network.firewall.FirewallManagerImpl; +import com.cloud.network.lb.ElasticLoadBalancerManagerImpl; +import com.cloud.network.lb.LoadBalancingRulesManagerImpl; +import com.cloud.network.lb.dao.ElasticLbVmMapDaoImpl; +import com.cloud.network.ovs.OvsTunnelManagerImpl; +import com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl; +import com.cloud.network.ovs.dao.OvsTunnelNetworkDaoImpl; +import com.cloud.network.router.VirtualNetworkApplianceManagerImpl; +import com.cloud.network.router.VpcVirtualNetworkApplianceManagerImpl; +import com.cloud.network.rules.RulesManagerImpl; +import com.cloud.network.rules.dao.PortForwardingRulesDaoImpl; +import com.cloud.network.security.SecurityGroupManagerImpl2; +import com.cloud.network.security.dao.SecurityGroupDaoImpl; +import com.cloud.network.security.dao.SecurityGroupRuleDaoImpl; +import com.cloud.network.security.dao.SecurityGroupRulesDaoImpl; +import com.cloud.network.security.dao.SecurityGroupVMMapDaoImpl; +import com.cloud.network.security.dao.SecurityGroupWorkDaoImpl; +import com.cloud.network.security.dao.VmRulesetLogDaoImpl; +import com.cloud.network.vpc.NetworkACLManagerImpl; +import com.cloud.network.vpc.VpcManagerImpl; +import com.cloud.network.vpc.Dao.PrivateIpDaoImpl; +import com.cloud.network.vpc.Dao.StaticRouteDaoImpl; +import com.cloud.network.vpc.Dao.VpcDaoImpl; +import com.cloud.network.vpc.Dao.VpcGatewayDaoImpl; +import com.cloud.network.vpc.Dao.VpcOfferingDaoImpl; +import com.cloud.network.vpc.Dao.VpcOfferingServiceMapDaoImpl; +import com.cloud.network.vpn.RemoteAccessVpnManagerImpl; +import com.cloud.network.vpn.Site2SiteVpnManagerImpl; +import com.cloud.offerings.dao.NetworkOfferingDaoImpl; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDaoImpl; +import com.cloud.projects.ProjectManagerImpl; +import com.cloud.projects.dao.ProjectAccountDaoImpl; +import com.cloud.projects.dao.ProjectDaoImpl; +import com.cloud.projects.dao.ProjectInvitationDaoImpl; +import com.cloud.resource.ResourceManagerImpl; +import com.cloud.resourcelimit.ResourceLimitManagerImpl; +import com.cloud.service.dao.ServiceOfferingDaoImpl; +import com.cloud.storage.OCFS2ManagerImpl; +import com.cloud.storage.StorageManagerImpl; +import com.cloud.storage.dao.DiskOfferingDaoImpl; +import com.cloud.storage.dao.GuestOSCategoryDaoImpl; +import com.cloud.storage.dao.GuestOSDaoImpl; +import com.cloud.storage.dao.LaunchPermissionDaoImpl; +import com.cloud.storage.dao.SnapshotDaoImpl; +import com.cloud.storage.dao.SnapshotPolicyDaoImpl; +import com.cloud.storage.dao.SnapshotScheduleDaoImpl; +import com.cloud.storage.dao.StoragePoolDaoImpl; +import com.cloud.storage.dao.StoragePoolHostDaoImpl; +import com.cloud.storage.dao.StoragePoolWorkDaoImpl; +import com.cloud.storage.dao.SwiftDaoImpl; +import com.cloud.storage.dao.UploadDaoImpl; +import com.cloud.storage.dao.VMTemplateDaoImpl; +import com.cloud.storage.dao.VMTemplateDetailsDaoImpl; +import com.cloud.storage.dao.VMTemplateHostDaoImpl; +import com.cloud.storage.dao.VMTemplatePoolDaoImpl; +import com.cloud.storage.dao.VMTemplateSwiftDaoImpl; +import com.cloud.storage.dao.VMTemplateZoneDaoImpl; +import com.cloud.storage.dao.VolumeDaoImpl; +import com.cloud.storage.dao.VolumeHostDaoImpl; +import com.cloud.storage.download.DownloadMonitorImpl; +import com.cloud.storage.secondary.SecondaryStorageManagerImpl; +import com.cloud.storage.snapshot.SnapshotManagerImpl; +import com.cloud.storage.snapshot.SnapshotSchedulerImpl; +import com.cloud.storage.swift.SwiftManagerImpl; +import com.cloud.storage.upload.UploadMonitorImpl; +import com.cloud.tags.TaggedResourceManagerImpl; +import com.cloud.tags.dao.ResourceTagsDaoImpl; +import com.cloud.template.HyervisorTemplateAdapter; +import com.cloud.template.TemplateAdapter; +import com.cloud.template.TemplateAdapter.TemplateAdapterType; +import com.cloud.template.TemplateManagerImpl; +import com.cloud.user.AccountDetailsDaoImpl; +import com.cloud.user.AccountManagerImpl; +import com.cloud.user.DomainManagerImpl; +import com.cloud.user.dao.AccountDaoImpl; +import com.cloud.user.dao.SSHKeyPairDaoImpl; +import com.cloud.user.dao.UserAccountDaoImpl; +import com.cloud.user.dao.UserDaoImpl; +import com.cloud.user.dao.UserStatisticsDaoImpl; +import com.cloud.user.dao.UserStatsLogDaoImpl; +import com.cloud.utils.component.Adapter; +import com.cloud.utils.component.ComponentLibrary; +import com.cloud.utils.component.ComponentLibraryBase; +import com.cloud.utils.component.ComponentLocator.ComponentInfo; +import com.cloud.utils.component.Manager; +import com.cloud.utils.component.PluggableService; +import com.cloud.utils.db.GenericDao; +import com.cloud.uuididentity.IdentityServiceImpl; +import com.cloud.uuididentity.dao.IdentityDaoImpl; +import com.cloud.vm.ClusteredVirtualMachineManagerImpl; +import com.cloud.vm.ItWorkDaoImpl; +import com.cloud.vm.UserVmManagerImpl; +import com.cloud.vm.dao.ConsoleProxyDaoImpl; +import com.cloud.vm.dao.DomainRouterDaoImpl; +import com.cloud.vm.dao.InstanceGroupDaoImpl; +import com.cloud.vm.dao.InstanceGroupVMMapDaoImpl; +import com.cloud.vm.dao.NicDaoImpl; +import com.cloud.vm.dao.SecondaryStorageVmDaoImpl; +import com.cloud.vm.dao.UserVmDaoImpl; +import com.cloud.vm.dao.UserVmDetailsDaoImpl; +import com.cloud.vm.dao.VMInstanceDaoImpl; + +public class DefaultComponentLibrary extends ComponentLibraryBase implements ComponentLibrary { + protected void populateDaos() { + addDao("StackMaidDao", StackMaidDaoImpl.class); + addDao("VMTemplateZoneDao", VMTemplateZoneDaoImpl.class); + addDao("VMTemplateDetailsDao", VMTemplateDetailsDaoImpl.class); + addDao("DomainRouterDao", DomainRouterDaoImpl.class); + addDao("HostDao", HostDaoImpl.class); + addDao("VMInstanceDao", VMInstanceDaoImpl.class); + addDao("UserVmDao", UserVmDaoImpl.class); + ComponentInfo> info = addDao("ServiceOfferingDao", ServiceOfferingDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + info = addDao("DiskOfferingDao", DiskOfferingDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + info = addDao("DataCenterDao", DataCenterDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + info = addDao("HostPodDao", HostPodDaoImpl.class); + info.addParameter("cache.size", "50"); + info.addParameter("cache.time.to.live", "600"); + addDao("IPAddressDao", IPAddressDaoImpl.class); + info = addDao("VlanDao", VlanDaoImpl.class); + info.addParameter("cache.size", "30"); + info.addParameter("cache.time.to.live", "3600"); + addDao("PodVlanMapDao", PodVlanMapDaoImpl.class); + addDao("AccountVlanMapDao", AccountVlanMapDaoImpl.class); + addDao("VolumeDao", VolumeDaoImpl.class); + addDao("EventDao", EventDaoImpl.class); + info = addDao("UserDao", UserDaoImpl.class); + info.addParameter("cache.size", "5000"); + info.addParameter("cache.time.to.live", "300"); + addDao("UserStatisticsDao", UserStatisticsDaoImpl.class); + addDao("UserStatsLogDao", UserStatsLogDaoImpl.class); + addDao("FirewallRulesDao", FirewallRulesDaoImpl.class); + addDao("LoadBalancerDao", LoadBalancerDaoImpl.class); + addDao("NetworkRuleConfigDao", NetworkRuleConfigDaoImpl.class); + addDao("LoadBalancerVMMapDao", LoadBalancerVMMapDaoImpl.class); + addDao("LBStickinessPolicyDao", LBStickinessPolicyDaoImpl.class); + addDao("AutoScalePolicyDao", AutoScalePolicyDaoImpl.class); + addDao("AutoScalePolicyConditionMapDao", AutoScalePolicyConditionMapDaoImpl.class); + addDao("AutoScaleVmProfileDao", AutoScaleVmProfileDaoImpl.class); + addDao("AutoScaleVmGroupDao", AutoScaleVmGroupDaoImpl.class); + addDao("AutoScaleVmGroupPolicyMapDao", AutoScaleVmGroupPolicyMapDaoImpl.class); + addDao("DataCenterIpAddressDao", DataCenterIpAddressDaoImpl.class); + addDao("SecurityGroupDao", SecurityGroupDaoImpl.class); + addDao("SecurityGroupRuleDao", SecurityGroupRuleDaoImpl.class); + addDao("SecurityGroupVMMapDao", SecurityGroupVMMapDaoImpl.class); + addDao("SecurityGroupRulesDao", SecurityGroupRulesDaoImpl.class); + addDao("SecurityGroupWorkDao", SecurityGroupWorkDaoImpl.class); + addDao("VmRulesetLogDao", VmRulesetLogDaoImpl.class); + addDao("AlertDao", AlertDaoImpl.class); + addDao("CapacityDao", CapacityDaoImpl.class); + addDao("DomainDao", DomainDaoImpl.class); + addDao("AccountDao", AccountDaoImpl.class); + addDao("ResourceLimitDao", ResourceLimitDaoImpl.class); + addDao("ResourceCountDao", ResourceCountDaoImpl.class); + addDao("UserAccountDao", UserAccountDaoImpl.class); + addDao("VMTemplateHostDao", VMTemplateHostDaoImpl.class); + addDao("VolumeHostDao", VolumeHostDaoImpl.class); + addDao("VMTemplateSwiftDao", VMTemplateSwiftDaoImpl.class); + addDao("UploadDao", UploadDaoImpl.class); + addDao("VMTemplatePoolDao", VMTemplatePoolDaoImpl.class); + addDao("LaunchPermissionDao", LaunchPermissionDaoImpl.class); + addDao("ConfigurationDao", ConfigurationDaoImpl.class); + info = addDao("VMTemplateDao", VMTemplateDaoImpl.class); + info.addParameter("cache.size", "100"); + info.addParameter("cache.time.to.live", "600"); + info.addParameter("routing.uniquename", "routing"); + addDao("HighAvailabilityDao", HighAvailabilityDaoImpl.class); + addDao("ConsoleProxyDao", ConsoleProxyDaoImpl.class); + addDao("SecondaryStorageVmDao", SecondaryStorageVmDaoImpl.class); + addDao("ManagementServerHostDao", ManagementServerHostDaoImpl.class); + addDao("ManagementServerHostPeerDao", ManagementServerHostPeerDaoImpl.class); + addDao("AgentUpgradeDao", AgentUpgradeDaoImpl.class); + addDao("SnapshotDao", SnapshotDaoImpl.class); + addDao("AsyncJobDao", AsyncJobDaoImpl.class); + addDao("SyncQueueDao", SyncQueueDaoImpl.class); + addDao("SyncQueueItemDao", SyncQueueItemDaoImpl.class); + addDao("GuestOSDao", GuestOSDaoImpl.class); + addDao("GuestOSCategoryDao", GuestOSCategoryDaoImpl.class); + addDao("StoragePoolDao", StoragePoolDaoImpl.class); + addDao("StoragePoolHostDao", StoragePoolHostDaoImpl.class); + addDao("DetailsDao", HostDetailsDaoImpl.class); + addDao("SnapshotPolicyDao", SnapshotPolicyDaoImpl.class); + addDao("SnapshotScheduleDao", SnapshotScheduleDaoImpl.class); + addDao("ClusterDao", ClusterDaoImpl.class); + addDao("CertificateDao", CertificateDaoImpl.class); + addDao("NetworkConfigurationDao", NetworkDaoImpl.class); + addDao("NetworkOfferingDao", NetworkOfferingDaoImpl.class); + addDao("NicDao", NicDaoImpl.class); + addDao("InstanceGroupDao", InstanceGroupDaoImpl.class); + addDao("InstanceGroupVMMapDao", InstanceGroupVMMapDaoImpl.class); + addDao("RemoteAccessVpnDao", RemoteAccessVpnDaoImpl.class); + addDao("VpnUserDao", VpnUserDaoImpl.class); + addDao("ItWorkDao", ItWorkDaoImpl.class); + addDao("FirewallRulesDao", FirewallRulesDaoImpl.class); + addDao("PortForwardingRulesDao", PortForwardingRulesDaoImpl.class); + addDao("FirewallRulesCidrsDao", FirewallRulesCidrsDaoImpl.class); + addDao("SSHKeyPairDao", SSHKeyPairDaoImpl.class); + addDao("UsageEventDao", UsageEventDaoImpl.class); + addDao("ClusterDetailsDao", ClusterDetailsDaoImpl.class); + addDao("UserVmDetailsDao", UserVmDetailsDaoImpl.class); + addDao("OvsTunnelInterfaceDao", OvsTunnelInterfaceDaoImpl.class); + addDao("OvsTunnelAccountDao", OvsTunnelNetworkDaoImpl.class); + addDao("StoragePoolWorkDao", StoragePoolWorkDaoImpl.class); + addDao("HostTagsDao", HostTagsDaoImpl.class); + addDao("NetworkDomainDao", NetworkDomainDaoImpl.class); + addDao("KeystoreDao", KeystoreDaoImpl.class); + addDao("DcDetailsDao", DcDetailsDaoImpl.class); + addDao("SwiftDao", SwiftDaoImpl.class); + addDao("AgentTransferMapDao", HostTransferMapDaoImpl.class); + addDao("ProjectDao", ProjectDaoImpl.class); + addDao("InlineLoadBalancerNicMapDao", InlineLoadBalancerNicMapDaoImpl.class); + addDao("ElasticLbVmMap", ElasticLbVmMapDaoImpl.class); + addDao("ProjectsAccountDao", ProjectAccountDaoImpl.class); + addDao("ProjectInvitationDao", ProjectInvitationDaoImpl.class); + addDao("IdentityDao", IdentityDaoImpl.class); + addDao("AccountDetailsDao", AccountDetailsDaoImpl.class); + addDao("NetworkOfferingServiceMapDao", NetworkOfferingServiceMapDaoImpl.class); + info = addDao("HypervisorCapabilitiesDao",HypervisorCapabilitiesDaoImpl.class); + info.addParameter("cache.size", "100"); + info.addParameter("cache.time.to.live", "600"); + addDao("PhysicalNetworkDao", PhysicalNetworkDaoImpl.class); + addDao("PhysicalNetworkServiceProviderDao", PhysicalNetworkServiceProviderDaoImpl.class); + addDao("VirtualRouterProviderDao", VirtualRouterProviderDaoImpl.class); + addDao("ExternalLoadBalancerDeviceDao", ExternalLoadBalancerDeviceDaoImpl.class); + addDao("ExternalFirewallDeviceDao", ExternalFirewallDeviceDaoImpl.class); + addDao("NetworkExternalLoadBalancerDao", NetworkExternalLoadBalancerDaoImpl.class); + addDao("NetworkExternalFirewallDao", NetworkExternalFirewallDaoImpl.class); + addDao("CiscoNexusVSMDeviceDao", CiscoNexusVSMDeviceDaoImpl.class); + addDao("ClusterVSMMapDao", ClusterVSMMapDaoImpl.class); + addDao("PortProfileDao", PortProfileDaoImpl.class); + addDao("PhysicalNetworkTrafficTypeDao", PhysicalNetworkTrafficTypeDaoImpl.class); + addDao("NetworkServiceMapDao", NetworkServiceMapDaoImpl.class); + addDao("StorageNetworkIpAddressDao", StorageNetworkIpAddressDaoImpl.class); + addDao("StorageNetworkIpRangeDao", StorageNetworkIpRangeDaoImpl.class); + addDao("TagsDao", ResourceTagsDaoImpl.class); + addDao("VpcDao", VpcDaoImpl.class); + addDao("VpcOfferingDao", VpcOfferingDaoImpl.class); + addDao("VpcOfferingServiceMapDao", VpcOfferingServiceMapDaoImpl.class); + addDao("PrivateIpDao", PrivateIpDaoImpl.class); + addDao("VpcGatewayDao", VpcGatewayDaoImpl.class); + addDao("StaticRouteDao", StaticRouteDaoImpl.class); + addDao("Site2SiteVpnGatewayDao", Site2SiteVpnGatewayDaoImpl.class); + addDao("Site2SiteCustomerGatewayDao", Site2SiteCustomerGatewayDaoImpl.class); + addDao("Site2SiteVpnConnnectionDao", Site2SiteVpnConnectionDaoImpl.class); + addDao("CounterDao", CounterDaoImpl.class); + addDao("ConditionDao", ConditionDaoImpl.class); + } + + @Override + public synchronized Map>> getDaos() { + if (_daos.size() == 0) { + populateDaos(); + } + return _daos; + } + + protected void populateManagers() { + addManager("StackMaidManager", CheckPointManagerImpl.class); + addManager("Cluster Manager", ClusterManagerImpl.class); + addManager("ClusterFenceManager", ClusterFenceManagerImpl.class); + addManager("ClusteredAgentManager", ClusteredAgentManagerImpl.class); + addManager("SyncQueueManager", SyncQueueManagerImpl.class); + addManager("AsyncJobManager", AsyncJobManagerImpl.class); + addManager("AsyncJobExecutorContext", AsyncJobExecutorContextImpl.class); + addManager("configuration manager", ConfigurationManagerImpl.class); + addManager("account manager", AccountManagerImpl.class); + addManager("domain manager", DomainManagerImpl.class); + addManager("resource limit manager", ResourceLimitManagerImpl.class); + addManager("network manager", NetworkManagerImpl.class); + addManager("download manager", DownloadMonitorImpl.class); + addManager("upload manager", UploadMonitorImpl.class); + addManager("keystore manager", KeystoreManagerImpl.class); + addManager("secondary storage vm manager", SecondaryStorageManagerImpl.class); + addManager("vm manager", UserVmManagerImpl.class); + addManager("upgrade manager", UpgradeManagerImpl.class); + addManager("StorageManager", StorageManagerImpl.class); + addManager("Alert Manager", AlertManagerImpl.class); + addManager("Template Manager", TemplateManagerImpl.class); + addManager("Snapshot Manager", SnapshotManagerImpl.class); + addManager("SnapshotScheduler", SnapshotSchedulerImpl.class); + addManager("SecurityGroupManager", SecurityGroupManagerImpl2.class); + addManager("DomainRouterManager", VirtualNetworkApplianceManagerImpl.class); + addManager("EntityManager", EntityManagerImpl.class); + addManager("LoadBalancingRulesManager", LoadBalancingRulesManagerImpl.class); + addManager("AutoScaleManager", AutoScaleManagerImpl.class); + addManager("RulesManager", RulesManagerImpl.class); + addManager("RemoteAccessVpnManager", RemoteAccessVpnManagerImpl.class); + addManager("OvsTunnelManager", OvsTunnelManagerImpl.class); + addManager("Capacity Manager", CapacityManagerImpl.class); + addManager("VirtualMachineManager", ClusteredVirtualMachineManagerImpl.class); + addManager("HypervisorGuruManager", HypervisorGuruManagerImpl.class); + addManager("ResourceManager", ResourceManagerImpl.class); + addManager("IdentityManager", IdentityServiceImpl.class); + addManager("OCFS2Manager", OCFS2ManagerImpl.class); + addManager("FirewallManager", FirewallManagerImpl.class); + ComponentInfo info = addManager("ConsoleProxyManager", ConsoleProxyManagerImpl.class); + info.addParameter("consoleproxy.sslEnabled", "true"); + addManager("ProjectManager", ProjectManagerImpl.class); + addManager("ElasticLoadBalancerManager", ElasticLoadBalancerManagerImpl.class); + addManager("SwiftManager", SwiftManagerImpl.class); + addManager("StorageNetworkManager", StorageNetworkManagerImpl.class); + addManager("ExternalLoadBalancerUsageManager", ExternalLoadBalancerUsageManagerImpl.class); + addManager("HA Manager", HighAvailabilityManagerImpl.class); + addManager("TaggedResourcesManager", TaggedResourceManagerImpl.class); + addManager("VPC Manager", VpcManagerImpl.class); + addManager("VpcVirtualRouterManager", VpcVirtualNetworkApplianceManagerImpl.class); + addManager("NetworkACLManager", NetworkACLManagerImpl.class); + addManager("Site2SiteVpnManager", Site2SiteVpnManagerImpl.class); + } + + @Override + public synchronized Map> getManagers() { + if (_managers.size() == 0) { + populateManagers(); + } + return _managers; + } + + protected void populateAdapters() { + addAdapter(TemplateAdapter.class, TemplateAdapterType.Hypervisor.getName(), HyervisorTemplateAdapter.class); + } + + @Override + public synchronized Map>> getAdapters() { + if (_adapters.size() == 0) { + populateAdapters(); + } + return _adapters; + } + + @Override + public synchronized Map, Class> getFactories() { + HashMap, Class> factories = new HashMap, Class>(); + factories.put(EntityManager.class, EntityManagerImpl.class); + return factories; + } + + protected void populateServices() { + addService("VirtualRouterElementService", VirtualRouterElementService.class, VirtualRouterElement.class); + addService("NetscalerExternalLoadBalancerElementService", NetscalerLoadBalancerElementService.class, NetscalerElement.class); + addService("F5LoadBalancerElementService", F5ExternalLoadBalancerElementService.class, F5ExternalLoadBalancerElement.class); + addService("JuniperSRXFirewallElementService", JuniperSRXFirewallElementService.class, JuniperSRXExternalFirewallElement.class); + addService("CiscoNexusVSMElementService", CiscoNexusVSMElementService.class, CiscoNexusVSMElement.class); + } + + @Override + public synchronized Map> getPluggableServices() { + if (_pluggableServices.size() == 0) { + populateServices(); + } + return _pluggableServices; + } +} diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java index 409970d8d92..133bfb5c01a 100644 --- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java +++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java @@ -1,1026 +1,1030 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.api.StartupExternalLoadBalancerCommand; -import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; -import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; -import com.cloud.agent.api.routing.IpAssocCommand; -import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.NetworkElementCommand; -import com.cloud.agent.api.routing.SetStaticNatRulesCommand; -import com.cloud.agent.api.to.IpAddressTO; -import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.StaticNatRuleTO; -import com.cloud.api.ApiConstants; -import com.cloud.configuration.Config; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenterIpAddressVO; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.Pod; -import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.VlanVO; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.dc.dao.VlanDao; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.host.DetailVO; -import com.cloud.host.Host; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.host.dao.HostDetailsDao; -import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState; -import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; -import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; -import com.cloud.network.Network.Service; -import com.cloud.network.Networks.TrafficType; -import com.cloud.network.addr.PublicIp; -import com.cloud.network.dao.ExternalFirewallDeviceDao; -import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; -import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.InlineLoadBalancerNicMapDao; -import com.cloud.network.dao.LoadBalancerDao; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkExternalFirewallDao; -import com.cloud.network.dao.NetworkExternalLoadBalancerDao; -import com.cloud.network.dao.NetworkServiceMapDao; -import com.cloud.network.dao.PhysicalNetworkDao; -import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; -import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; -import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.resource.CreateLoadBalancerApplianceAnswer; -import com.cloud.network.resource.DestroyLoadBalancerApplianceAnswer; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.FirewallRuleVO; -import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.StaticNatRuleImpl; -import com.cloud.network.rules.dao.PortForwardingRulesDao; -import com.cloud.offerings.NetworkOfferingVO; -import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.ResourceManager; -import com.cloud.resource.ResourceState; -import com.cloud.resource.ResourceStateAdapter; -import com.cloud.resource.ServerResource; -import com.cloud.resource.UnableDeleteHostException; -import com.cloud.server.api.response.ExternalLoadBalancerResponse; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.dao.AccountDao; -import com.cloud.user.dao.UserStatisticsDao; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.component.AdapterBase; -import com.cloud.utils.component.Inject; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.GlobalLock; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.NetUtils; -import com.cloud.utils.net.UrlUtil; -import com.cloud.vm.Nic.ReservationStrategy; -import com.cloud.vm.Nic.State; -import com.cloud.vm.NicVO; -import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.NicDao; -public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase implements ExternalLoadBalancerDeviceManager, ResourceStateAdapter { - - @Inject - NetworkExternalLoadBalancerDao _networkExternalLBDao; - @Inject - ExternalLoadBalancerDeviceDao _externalLoadBalancerDeviceDao; - @Inject - HostDao _hostDao; - @Inject - DataCenterDao _dcDao; - @Inject - NetworkManager _networkMgr; - @Inject - InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao; - @Inject - NicDao _nicDao; - @Inject - AgentManager _agentMgr; - @Inject - ResourceManager _resourceMgr; - @Inject - IPAddressDao _ipAddressDao; - @Inject - VlanDao _vlanDao; - @Inject - NetworkOfferingDao _networkOfferingDao; - @Inject - AccountDao _accountDao; - @Inject - PhysicalNetworkDao _physicalNetworkDao; - @Inject - PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao; - @Inject - AccountManager _accountMgr; - @Inject - UserStatisticsDao _userStatsDao; - @Inject - NetworkDao _networkDao; - @Inject - DomainRouterDao _routerDao; - @Inject - LoadBalancerDao _loadBalancerDao; - @Inject - PortForwardingRulesDao _portForwardingRulesDao; - @Inject - ConfigurationDao _configDao; - @Inject - HostDetailsDao _hostDetailDao; - @Inject - NetworkExternalLoadBalancerDao _networkLBDao; - @Inject - NetworkServiceMapDao _ntwkSrvcProviderDao; - @Inject - NetworkExternalFirewallDao _networkExternalFirewallDao; - @Inject - ExternalFirewallDeviceDao _externalFirewallDeviceDao; - @Inject - protected HostPodDao _podDao = null; - - private long _defaultLbCapacity; - private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalLoadBalancerDeviceManagerImpl.class); - - @Override - @DB - public ExternalLoadBalancerDeviceVO addExternalLoadBalancer(long physicalNetworkId, String url, String username, String password, String deviceName, ServerResource resource) { - - PhysicalNetworkVO pNetwork = null; - NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName); - long zoneId; - - if ((ntwkDevice == null) || (url == null) || (username == null) || (resource == null) || (password == null)) { - throw new InvalidParameterValueException("Atleast one of the required parameters (url, username, password," + - " server resource, zone id/physical network id) is not specified or a valid parameter."); - } - - pNetwork = _physicalNetworkDao.findById(physicalNetworkId); - if (pNetwork == null) { - throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId); - } - zoneId = pNetwork.getDataCenterId(); - - PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder()); - if (ntwkSvcProvider == null) { - throw new CloudRuntimeException("Network Service Provider: " + ntwkDevice.getNetworkServiceProvder() + - " is not enabled in the physical network: " + physicalNetworkId + "to add this device"); - } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) { - throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + - " is in shutdown state in the physical network: " + physicalNetworkId + "to add this device"); - } - - URI uri; - try { - uri = new URI(url); - } catch (Exception e) { - s_logger.debug(e); - throw new InvalidParameterValueException(e.getMessage()); - } - - String ipAddress = uri.getHost(); - Map hostDetails = new HashMap(); - String hostName = getExternalLoadBalancerResourceGuid(pNetwork.getId(), deviceName, ipAddress); - hostDetails.put("name", hostName); - hostDetails.put("guid", UUID.randomUUID().toString()); - hostDetails.put("zoneId", String.valueOf(pNetwork.getDataCenterId())); - hostDetails.put("ip", ipAddress); - hostDetails.put("physicalNetworkId", String.valueOf(pNetwork.getId())); - hostDetails.put("username", username); - hostDetails.put("password", password); - hostDetails.put("deviceName", deviceName); - - // leave parameter validation to be part server resource configure - Map configParams = new HashMap(); - UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams); - hostDetails.putAll(configParams); - - Transaction txn = Transaction.currentTxn(); - try { - resource.configure(hostName, hostDetails); - - Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails); - if (host != null) { - - boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false; - boolean inline = (configParams.get(ApiConstants.INLINE) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.INLINE)) : false; - long capacity = NumbersUtil.parseLong((String) configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_CAPACITY), 0); - if (capacity == 0) { - capacity = _defaultLbCapacity; - } - - txn.start(); - ExternalLoadBalancerDeviceVO lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(), - deviceName, capacity, dedicatedUse, inline); - _externalLoadBalancerDeviceDao.persist(lbDeviceVO); - - DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId())); - _hostDetailDao.persist(hostDetail); - - txn.commit(); - return lbDeviceVO; - } else { - throw new CloudRuntimeException("Failed to add load balancer device due to internal error."); - } - } catch (ConfigurationException e) { - txn.rollback(); - throw new CloudRuntimeException(e.getMessage()); - } - } - - @Override - public boolean deleteExternalLoadBalancer(long hostId) { - HostVO externalLoadBalancer = _hostDao.findById(hostId); - if (externalLoadBalancer == null) { - throw new InvalidParameterValueException("Could not find an external load balancer with ID: " + hostId); - } - - DetailVO lbHostDetails = _hostDetailDao.findDetail(hostId, ApiConstants.LOAD_BALANCER_DEVICE_ID); - long lbDeviceId = Long.parseLong(lbHostDetails.getValue()); - - ExternalLoadBalancerDeviceVO lbDeviceVo = _externalLoadBalancerDeviceDao.findById(lbDeviceId); - if (lbDeviceVo.getAllocationState() == LBDeviceAllocationState.Provider) { - // check if cloudstack has provisioned any load balancer appliance on the device before deleting - List lbDevices = _externalLoadBalancerDeviceDao.listAll(); - if (lbDevices != null) { - for (ExternalLoadBalancerDeviceVO lbDevice : lbDevices) { - if (lbDevice.getParentHostId() == hostId) { - throw new CloudRuntimeException("This load balancer device can not be deleted as there are one or more load balancers applainces provisioned by cloudstack on the device."); - } - } - } - } else { - // check if any networks are using this load balancer device - List networks = _networkLBDao.listByLoadBalancerDeviceId(lbDeviceId); - if ((networks != null) && !networks.isEmpty()) { - throw new CloudRuntimeException("Delete can not be done as there are networks using this load balancer device "); - } - } - - try { - // put the host in maintenance state in order for it to be deleted - externalLoadBalancer.setResourceState(ResourceState.Maintenance); - _hostDao.update(hostId, externalLoadBalancer); - _resourceMgr.deleteHost(hostId, false, false); - - // delete the external load balancer entry - _externalLoadBalancerDeviceDao.remove(lbDeviceId); - - return true; - } catch (Exception e) { - s_logger.debug(e); - return false; - } - } - - @Override - public List listExternalLoadBalancers(long physicalNetworkId, String deviceName) { - List lbHosts = new ArrayList(); - NetworkDevice lbNetworkDevice = NetworkDevice.getNetworkDevice(deviceName); - PhysicalNetworkVO pNetwork = null; - - pNetwork = _physicalNetworkDao.findById(physicalNetworkId); - - if ((pNetwork == null) || (lbNetworkDevice == null)) { - throw new InvalidParameterValueException("Atleast one of the required parameter physical networkId, device name is invalid."); - } - - PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), - lbNetworkDevice.getNetworkServiceProvder()); - // if provider not configured in to physical network, then there can be no instances - if (ntwkSvcProvider == null) { - return null; - } - - List lbDevices = _externalLoadBalancerDeviceDao.listByPhysicalNetworkAndProvider(physicalNetworkId, - ntwkSvcProvider.getProviderName()); - for (ExternalLoadBalancerDeviceVO provderInstance : lbDevices) { - lbHosts.add(_hostDao.findById(provderInstance.getHostId())); - } - return lbHosts; - } - - public ExternalLoadBalancerResponse createExternalLoadBalancerResponse(Host externalLoadBalancer) { - Map lbDetails = _hostDetailDao.findDetails(externalLoadBalancer.getId()); - ExternalLoadBalancerResponse response = new ExternalLoadBalancerResponse(); - response.setId(externalLoadBalancer.getId()); - response.setIpAddress(externalLoadBalancer.getPrivateIpAddress()); - response.setUsername(lbDetails.get("username")); - response.setPublicInterface(lbDetails.get("publicInterface")); - response.setPrivateInterface(lbDetails.get("privateInterface")); - response.setNumRetries(lbDetails.get("numRetries")); - return response; - } - - public String getExternalLoadBalancerResourceGuid(long physicalNetworkId, String deviceName, String ip) { - return physicalNetworkId + "-" + deviceName + "-" + ip; - } - - @Override - public ExternalLoadBalancerDeviceVO getExternalLoadBalancerForNetwork(Network network) { - NetworkExternalLoadBalancerVO lbDeviceForNetwork = _networkExternalLBDao.findByNetworkId(network.getId()); - if (lbDeviceForNetwork != null) { - long lbDeviceId = lbDeviceForNetwork.getExternalLBDeviceId(); - ExternalLoadBalancerDeviceVO lbDeviceVo = _externalLoadBalancerDeviceDao.findById(lbDeviceId); - assert (lbDeviceVo != null); - return lbDeviceVo; - } - return null; - } - - public void setExternalLoadBalancerForNetwork(Network network, long externalLBDeviceID) { - NetworkExternalLoadBalancerVO lbDeviceForNetwork = new NetworkExternalLoadBalancerVO(network.getId(), externalLBDeviceID); - _networkExternalLBDao.persist(lbDeviceForNetwork); - } - - @DB - protected ExternalLoadBalancerDeviceVO allocateLoadBalancerForNetwork(Network guestConfig) throws InsufficientCapacityException { - boolean retry = true; - boolean tryLbProvisioning = false; - ExternalLoadBalancerDeviceVO lbDevice = null; - long physicalNetworkId = guestConfig.getPhysicalNetworkId(); - NetworkOfferingVO offering = _networkOfferingDao.findById(guestConfig.getNetworkOfferingId()); - String provider = _ntwkSrvcProviderDao.getProviderForServiceInNetwork(guestConfig.getId(), Service.Lb); - - while (retry) { - GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock"); - Transaction txn = Transaction.currentTxn(); - try { - if (deviceMapLock.lock(120)) { - try { - boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated -// load balancer? - long lbDeviceId; - - txn.start(); - try { - // FIXME: should the device allocation be done during network implement phase or do a - // lazy allocation when first rule for the network is configured?? - - // find a load balancer device for this network as per the network offering - lbDevice = findSuitableLoadBalancerForNetwork(guestConfig, dedicatedLB); - lbDeviceId = lbDevice.getId(); - - // persist the load balancer device id that will be used for this network. Once a network - // is implemented on a LB device then later on all rules will be programmed on to same -// device - NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), lbDeviceId); - _networkExternalLBDao.persist(networkLB); - - // mark device to be either dedicated or shared use - lbDevice.setAllocationState(dedicatedLB ? LBDeviceAllocationState.Dedicated : LBDeviceAllocationState.Shared); - _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice); - - txn.commit(); - - // allocated load balancer for the network, so skip retry - tryLbProvisioning = false; - retry = false; - } catch (InsufficientCapacityException exception) { - // if already attempted to provision load balancer then throw out of capacity exception, - if (tryLbProvisioning) { - retry = false; - // TODO: throwing warning instead of error for now as its possible another provider can -// service this network - s_logger.warn("There are no load balancer device with the capacity for implementing this network"); - throw exception; - } else { - tryLbProvisioning = true; // if possible provision a LB appliance in to the physical -// network - } - } - } finally { - deviceMapLock.unlock(); - if (lbDevice == null) { - txn.rollback(); - } - } - } - } finally { - deviceMapLock.releaseRef(); - } - - // there are no LB devices or there is no free capacity on the devices in the physical network so provision -// a new LB appliance - if (tryLbProvisioning) { - // check if LB appliance can be dynamically provisioned - List providerLbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Provider); - if ((providerLbDevices != null) && (!providerLbDevices.isEmpty())) { - for (ExternalLoadBalancerDeviceVO lbProviderDevice : providerLbDevices) { - if (lbProviderDevice.getState() == LBDeviceState.Enabled) { - // acquire a private IP from the data center which will be used as management IP of -// provisioned LB appliance, - DataCenterIpAddressVO dcPrivateIp = _dcDao.allocatePrivateIpAddress(guestConfig.getDataCenterId(), lbProviderDevice.getUuid()); - if (dcPrivateIp == null) { - throw new InsufficientNetworkCapacityException("failed to acquire a priavate IP in the zone " + guestConfig.getDataCenterId() + - " needed for management IP of the load balancer appliance", DataCenter.class, guestConfig.getDataCenterId()); - } - Pod pod = _podDao.findById(dcPrivateIp.getPodId()); - String lbIP = dcPrivateIp.getIpAddress(); - String netmask = NetUtils.getCidrNetmask(pod.getCidrSize()); - String gateway = pod.getGateway(); - - // send CreateLoadBalancerApplianceCommand to the host capable of provisioning - CreateLoadBalancerApplianceCommand lbProvisionCmd = new CreateLoadBalancerApplianceCommand(lbIP, netmask, gateway); - CreateLoadBalancerApplianceAnswer createLbAnswer = null; - try { - createLbAnswer = (CreateLoadBalancerApplianceAnswer) _agentMgr.easySend(lbProviderDevice.getHostId(), lbProvisionCmd); - if (createLbAnswer == null || !createLbAnswer.getResult()) { - s_logger.error("Could not provision load balancer instance on the load balancer device " + lbProviderDevice.getId()); - continue; - } - } catch (Exception agentException) { - s_logger.error("Could not provision load balancer instance on the load balancer device " + lbProviderDevice.getId() + " due to " + agentException.getMessage()); - continue; - } - - String username = createLbAnswer.getUsername(); - String password = createLbAnswer.getPassword(); - String publicIf = createLbAnswer.getPublicInterface(); - String privateIf = createLbAnswer.getPrivateInterface(); - - // we have provisioned load balancer so add the appliance as cloudstack provisioned external -// load balancer - String dedicatedLb = offering.getDedicatedLB() ? "true" : "false"; - String capacity = Long.toString(lbProviderDevice.getCapacity()); - - // acquire a public IP to associate with lb appliance (used as subnet IP to make the -// appliance part of private network) - PublicIp publicIp = _networkMgr.assignPublicIpAddress(guestConfig.getDataCenterId(), null, _accountMgr.getSystemAccount(), VlanType.VirtualNetwork, null, null, false); - String publicIPNetmask = publicIp.getVlanNetmask(); - String publicIPgateway = publicIp.getVlanGateway(); - String publicIPVlanTag = publicIp.getVlanTag(); - String publicIP = publicIp.getAddress().toString(); - - String url = "https://" + lbIP + "?publicinterface=" + publicIf + "&privateinterface=" + privateIf + "&lbdevicededicated=" + dedicatedLb + - "&cloudmanaged=true" + "&publicip=" + publicIP + "&publicipnetmask=" + publicIPNetmask + "&lbdevicecapacity=" + capacity + - "&publicipvlan=" + publicIPVlanTag + "&publicipgateway=" + publicIPgateway; - ExternalLoadBalancerDeviceVO lbAppliance = null; - try { - lbAppliance = addExternalLoadBalancer(physicalNetworkId, url, username, password, createLbAnswer.getDeviceName(), createLbAnswer.getServerResource()); - } catch (Exception e) { - s_logger.error("Failed to add load balancer appliance in to cloudstack due to " + e.getMessage() + ". So provisioned load balancer appliance will be destroyed."); - } - - if (lbAppliance != null) { - // mark the load balancer as cloudstack managed and set parent host id on which lb -// appliance is provisioned - ExternalLoadBalancerDeviceVO managedLb = _externalLoadBalancerDeviceDao.findById(lbAppliance.getId()); - managedLb.setIsManagedDevice(true); - managedLb.setParentHostId(lbProviderDevice.getHostId()); - _externalLoadBalancerDeviceDao.update(lbAppliance.getId(), managedLb); - } else { - // failed to add the provisioned load balancer into cloudstack so destroy the appliance - DestroyLoadBalancerApplianceCommand lbDeleteCmd = new DestroyLoadBalancerApplianceCommand(lbIP); - DestroyLoadBalancerApplianceAnswer answer = null; - try { - answer = (DestroyLoadBalancerApplianceAnswer) _agentMgr.easySend(lbProviderDevice.getHostId(), lbDeleteCmd); - if (answer == null || !answer.getResult()) { - s_logger.warn("Failed to destroy load balancer appliance created"); - } else { - // release the public & private IP back to dc pool, as the load balancer -// appliance is now destroyed - _dcDao.releasePrivateIpAddress(lbIP, guestConfig.getDataCenterId(), null); - _networkMgr.disassociatePublicIpAddress(publicIp.getId(), _accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount()); - } - } catch (Exception e) { - s_logger.warn("Failed to destroy load balancer appliance created for the network" + guestConfig.getId() + " due to " + e.getMessage()); - } - } - } - } - } - } - } - - return lbDevice; - } - - @Override - public ExternalLoadBalancerDeviceVO findSuitableLoadBalancerForNetwork(Network network, boolean dedicatedLb) throws InsufficientCapacityException { - long physicalNetworkId = network.getPhysicalNetworkId(); - List lbDevices = null; - String provider = _ntwkSrvcProviderDao.getProviderForServiceInNetwork(network.getId(), Service.Lb); - assert (provider != null); - - if (dedicatedLb) { - lbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Free); - if (lbDevices != null && !lbDevices.isEmpty()) { - // return first device that is free, fully configured and meant for dedicated use - for (ExternalLoadBalancerDeviceVO lbdevice : lbDevices) { - if (lbdevice.getState() == LBDeviceState.Enabled && lbdevice.getIsDedicatedDevice()) { - return lbdevice; - } - } - } - } else { - // get the LB devices that are already allocated for shared use - lbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Shared); - - if (lbDevices != null) { - - ExternalLoadBalancerDeviceVO maxFreeCapacityLbdevice = null; - long maxFreeCapacity = 0; - - // loop through the LB device in the physical network and pick the one with maximum free capacity - for (ExternalLoadBalancerDeviceVO lbdevice : lbDevices) { - - // skip if device is not enabled - if (lbdevice.getState() != LBDeviceState.Enabled) { - continue; - } - - // get the used capacity from the list of guest networks that are mapped to this load balancer - List mappedNetworks = _networkExternalLBDao.listByLoadBalancerDeviceId(lbdevice.getId()); - long usedCapacity = ((mappedNetworks == null) || (mappedNetworks.isEmpty())) ? 0 : mappedNetworks.size(); - - // get the configured capacity for this device - long fullCapacity = lbdevice.getCapacity(); - if (fullCapacity == 0) { - fullCapacity = _defaultLbCapacity; // if capacity not configured then use the default - } - - long freeCapacity = fullCapacity - usedCapacity; - if (freeCapacity > 0) { - if (maxFreeCapacityLbdevice == null) { - maxFreeCapacityLbdevice = lbdevice; - maxFreeCapacity = freeCapacity; - } else if (freeCapacity > maxFreeCapacity) { - maxFreeCapacityLbdevice = lbdevice; - maxFreeCapacity = freeCapacity; - } - } - } - - // return the device with maximum free capacity and is meant for shared use - if (maxFreeCapacityLbdevice != null) { - return maxFreeCapacityLbdevice; - } - } - - // if we are here then there are no existing LB devices in shared use or the devices in shared use has no -// free capacity left - // so allocate a new load balancer configured for shared use from the pool of free LB devices - lbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Free); - if (lbDevices != null && !lbDevices.isEmpty()) { - for (ExternalLoadBalancerDeviceVO lbdevice : lbDevices) { - if (lbdevice.getState() == LBDeviceState.Enabled && !lbdevice.getIsDedicatedDevice()) { - return lbdevice; - } - } - } - } - - // there are no devices which capacity - throw new InsufficientNetworkCapacityException("Unable to find a load balancing provider with sufficient capcity " + - " to implement the network", Network.class, network.getId()); - } - - @DB - protected boolean freeLoadBalancerForNetwork(Network guestConfig) { - Transaction txn = Transaction.currentTxn(); - GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock"); - - try { - if (deviceMapLock.lock(120)) { - txn.start(); - // since network is shutdown remove the network mapping to the load balancer device - NetworkExternalLoadBalancerVO networkLBDevice = _networkExternalLBDao.findByNetworkId(guestConfig.getId()); - long lbDeviceId = networkLBDevice.getExternalLBDeviceId(); - _networkExternalLBDao.remove(networkLBDevice.getId()); - - List ntwksMapped = _networkExternalLBDao.listByLoadBalancerDeviceId(networkLBDevice.getExternalLBDeviceId()); - ExternalLoadBalancerDeviceVO lbDevice = _externalLoadBalancerDeviceDao.findById(lbDeviceId); - boolean lbInUse = !(ntwksMapped == null || ntwksMapped.isEmpty()); - boolean lbCloudManaged = lbDevice.getIsManagedDevice(); - - if (!lbInUse && !lbCloudManaged) { - // this is the last network mapped to the load balancer device so set device allocation state to be -// free - lbDevice.setAllocationState(LBDeviceAllocationState.Free); - _externalLoadBalancerDeviceDao.update(lbDevice.getId(), lbDevice); - } - - // commit the changes before sending agent command to destroy cloudstack managed LB - txn.commit(); - - if (!lbInUse && lbCloudManaged) { - // send DestroyLoadBalancerApplianceCommand to the host where load balancer appliance is provisioned - Host lbHost = _hostDao.findById(lbDevice.getHostId()); - String lbIP = lbHost.getPrivateIpAddress(); - DestroyLoadBalancerApplianceCommand lbDeleteCmd = new DestroyLoadBalancerApplianceCommand(lbIP); - DestroyLoadBalancerApplianceAnswer answer = null; - try { - answer = (DestroyLoadBalancerApplianceAnswer) _agentMgr.easySend(lbDevice.getParentHostId(), lbDeleteCmd); - if (answer == null || !answer.getResult()) { - s_logger.warn("Failed to destoy load balancer appliance used by the network" + guestConfig.getId() + " due to " + answer.getDetails()); - } - } catch (Exception e) { - s_logger.warn("Failed to destroy load balancer appliance used by the network" + guestConfig.getId() + " due to " + e.getMessage()); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully destroyed load balancer appliance used for the network" + guestConfig.getId()); - } - deviceMapLock.unlock(); - - // remove the provisioned load balancer appliance from cloudstack - deleteExternalLoadBalancer(lbHost.getId()); - - // release the private IP back to dc pool, as the load balancer appliance is now destroyed - _dcDao.releasePrivateIpAddress(lbHost.getPrivateIpAddress(), guestConfig.getDataCenterId(), null); - - // release the public IP allocated for this LB appliance - DetailVO publicIpDetail = _hostDetailDao.findDetail(lbHost.getId(), "publicip"); - IPAddressVO ipVo = _ipAddressDao.findByIpAndDcId(guestConfig.getDataCenterId(), publicIpDetail.toString()); - _networkMgr.disassociatePublicIpAddress(ipVo.getId(), _accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount()); - } else { - deviceMapLock.unlock(); - } - - return true; - } else { - s_logger.error("Failed to release load balancer device for the network" + guestConfig.getId() + "as failed to acquire lock "); - return false; - } - } catch (Exception exception) { - txn.rollback(); - s_logger.error("Failed to release load balancer device for the network" + guestConfig.getId() + " due to " + exception.getMessage()); - } finally { - deviceMapLock.releaseRef(); - } - - return false; - } - - HostVO getFirewallProviderForNetwork(Network network) { - HostVO fwHost = null; - - // get the firewall provider (could be either virtual router or external firewall device) for the network - String fwProvider = _ntwkSrvcProviderDao.getProviderForServiceInNetwork(network.getId(), Service.Firewall); - - if (fwProvider.equalsIgnoreCase("VirtualRouter")) { - // FIXME: use network service provider container framework support to implement on virtual router - } else { - NetworkExternalFirewallVO fwDeviceForNetwork = _networkExternalFirewallDao.findByNetworkId(network.getId()); - assert (fwDeviceForNetwork != null) : "Why firewall provider is not ready for the network to apply static nat rules?"; - long fwDeviceId = fwDeviceForNetwork.getExternalFirewallDeviceId(); - ExternalFirewallDeviceVO fwDevice = _externalFirewallDeviceDao.findById(fwDeviceId); - fwHost = _hostDao.findById(fwDevice.getHostId()); - } - - return fwHost; - } - - private boolean externalLoadBalancerIsInline(HostVO externalLoadBalancer) { - DetailVO detail = _hostDetailDao.findDetail(externalLoadBalancer.getId(), "inline"); - return (detail != null && detail.getValue().equals("true")); - } - - private NicVO savePlaceholderNic(Network network, String ipAddress) { - NicVO nic = new NicVO(null, null, network.getId(), null); - nic.setIp4Address(ipAddress); - nic.setReservationStrategy(ReservationStrategy.PlaceHolder); - nic.setState(State.Reserved); - return _nicDao.persist(nic); - } - - private NicVO getPlaceholderNic(Network network) { - List guestIps = _nicDao.listByNetworkId(network.getId()); - for (NicVO guestIp : guestIps) { - // only external firewall and external load balancer will create NicVO with PlaceHolder reservation strategy - if (guestIp.getReservationStrategy().equals(ReservationStrategy.PlaceHolder) && guestIp.getVmType() == null - && guestIp.getReserver() == null && !guestIp.getIp4Address().equals(network.getGateway())) { - return guestIp; - } - } - return null; - } - - private void applyStaticNatRuleForInlineLBRule(DataCenterVO zone, Network network, HostVO firewallHost, boolean revoked, String publicIp, String privateIp) throws ResourceUnavailableException { - List staticNatRules = new ArrayList(); - IPAddressVO ipVO = _ipAddressDao.listByDcIdIpAddress(zone.getId(), publicIp).get(0); - VlanVO vlan = _vlanDao.findById(ipVO.getVlanId()); - FirewallRuleVO fwRule = new FirewallRuleVO(null, ipVO.getId(), -1, -1, "any", network.getId(), network.getAccountId(), network.getDomainId(), Purpose.StaticNat, null, null, null, null, null); - FirewallRule.State state = !revoked ? FirewallRule.State.Add : FirewallRule.State.Revoke; - fwRule.setState(state); - StaticNatRule rule = new StaticNatRuleImpl(fwRule, privateIp); - StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, vlan.getVlanTag(), publicIp, privateIp); - staticNatRules.add(ruleTO); - - applyStaticNatRules(staticNatRules, network, firewallHost.getId()); - } - - protected void applyStaticNatRules(List staticNatRules, Network network, long firewallHostId) throws ResourceUnavailableException { - if (!staticNatRules.isEmpty()) { - SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(staticNatRules, null); - Answer answer = _agentMgr.easySend(firewallHostId, cmd); - if (answer == null || !answer.getResult()) { - String details = (answer != null) ? answer.getDetails() : "details unavailable"; - String msg = "firewall provider for the network was unable to apply static nat rules due to: " + details + "."; - s_logger.error(msg); - throw new ResourceUnavailableException(msg, Network.class, network.getId()); - } - } - } - - @Override - public boolean applyLoadBalancerRules(Network network, List rules) throws ResourceUnavailableException { - // Find the external load balancer in this zone - long zoneId = network.getDataCenterId(); - DataCenterVO zone = _dcDao.findById(zoneId); - - List loadBalancingRules = new ArrayList(); - - for (FirewallRule rule : rules) { - if (rule.getPurpose().equals(Purpose.LoadBalancing)) { - loadBalancingRules.add((LoadBalancingRule) rule); - } - } - - if (loadBalancingRules == null || loadBalancingRules.isEmpty()) { - return true; - } - - ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); - if (lbDeviceVO == null) { - s_logger.warn("There is no external load balancer device assigned to this network either network is not implement are already shutdown so just returning"); - return true; - } - - HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - - boolean externalLoadBalancerIsInline = externalLoadBalancerIsInline(externalLoadBalancer); - - if (network.getState() == Network.State.Allocated) { - s_logger.debug("External load balancer was asked to apply LB rules for network with ID " + network.getId() + "; this network is not implemented. Skipping backend commands."); - return true; - } - - List loadBalancersToApply = new ArrayList(); - for (int i = 0; i < loadBalancingRules.size(); i++) { - LoadBalancingRule rule = loadBalancingRules.get(i); - - boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); - String protocol = rule.getProtocol(); - String algorithm = rule.getAlgorithm(); - String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr(); - int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); - List sourceCidrs = rule.getSourceCidrList(); - - if (externalLoadBalancerIsInline) { - InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(srcIp); - NicVO loadBalancingIpNic = null; - HostVO firewallProviderHost = null; - - if (externalLoadBalancerIsInline) { - firewallProviderHost = getFirewallProviderForNetwork(network); - } - - if (!revoked) { - if (mapping == null) { - // Acquire a new guest IP address and save it as the load balancing IP address - String loadBalancingIpAddress = _networkMgr.acquireGuestIpAddress(network, null); - - if (loadBalancingIpAddress == null) { - String msg = "Ran out of guest IP addresses."; - s_logger.error(msg); - throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); - } - - // If a NIC doesn't exist for the load balancing IP address, create one - loadBalancingIpNic = _nicDao.findByIp4AddressAndNetworkId(loadBalancingIpAddress, network.getId()); - if (loadBalancingIpNic == null) { - loadBalancingIpNic = savePlaceholderNic(network, loadBalancingIpAddress); - } - - // Save a mapping between the source IP address and the load balancing IP address NIC - mapping = new InlineLoadBalancerNicMapVO(rule.getId(), srcIp, loadBalancingIpNic.getId()); - _inlineLoadBalancerNicMapDao.persist(mapping); - - // On the firewall provider for the network, create a static NAT rule between the source IP -// address and the load balancing IP address - applyStaticNatRuleForInlineLBRule(zone, network, firewallProviderHost, revoked, srcIp, loadBalancingIpNic.getIp4Address()); - } else { - loadBalancingIpNic = _nicDao.findById(mapping.getNicId()); - } - } else { - if (mapping != null) { - // Find the NIC that the mapping refers to - loadBalancingIpNic = _nicDao.findById(mapping.getNicId()); - - // On the firewall provider for the network, delete the static NAT rule between the source IP -// address and the load balancing IP address - applyStaticNatRuleForInlineLBRule(zone, network, firewallProviderHost, revoked, srcIp, loadBalancingIpNic.getIp4Address()); - - // Delete the mapping between the source IP address and the load balancing IP address - _inlineLoadBalancerNicMapDao.expunge(mapping.getId()); - - // Delete the NIC - _nicDao.expunge(loadBalancingIpNic.getId()); - } else { - s_logger.debug("Revoking a rule for an inline load balancer that has not been programmed yet."); - continue; - } - } - - // Change the source IP address for the load balancing rule to be the load balancing IP address - srcIp = loadBalancingIpNic.getIp4Address(); - } - - if (destinations != null && !destinations.isEmpty()) { - LoadBalancerTO loadBalancer = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations, rule.getStickinessPolicies()); - loadBalancersToApply.add(loadBalancer); - } - } - - if (loadBalancersToApply.size() > 0) { - int numLoadBalancersForCommand = loadBalancersToApply.size(); - LoadBalancerTO[] loadBalancersForCommand = loadBalancersToApply.toArray(new LoadBalancerTO[numLoadBalancersForCommand]); - LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(loadBalancersForCommand, null); - long guestVlanTag = Integer.parseInt(network.getBroadcastUri().getHost()); - cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); - Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); - if (answer == null || !answer.getResult()) { - String details = (answer != null) ? answer.getDetails() : "details unavailable"; - String msg = "Unable to apply load balancer rules to the external load balancer appliance in zone " + zone.getName() + " due to: " + details + "."; - s_logger.error(msg); - throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); - } - } - - return true; - } - - @Override - public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network guestConfig) throws ResourceUnavailableException, InsufficientCapacityException { - if (guestConfig.getTrafficType() != TrafficType.Guest) { - s_logger.trace("External load balancer can only be used for guest networks."); - return false; - } - - long zoneId = guestConfig.getDataCenterId(); - DataCenterVO zone = _dcDao.findById(zoneId); - HostVO externalLoadBalancer = null; - - if (add) { - ExternalLoadBalancerDeviceVO lbDeviceVO = allocateLoadBalancerForNetwork(guestConfig); - if (lbDeviceVO == null) { - String msg = "failed to alloacate a external load balancer for the network " + guestConfig.getId(); - s_logger.error(msg); - throw new InsufficientNetworkCapacityException(msg, DataCenter.class, guestConfig.getDataCenterId()); - } - externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - s_logger.debug("Allocated external load balancer device:" + lbDeviceVO.getId() + " for the network: " + guestConfig.getId()); - } else { - // find the load balancer device allocated for the network - ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(guestConfig); - if (lbDeviceVO == null) { - s_logger.warn("Network shutdwon requested on external load balancer element, which did not implement the network." + - " Either network implement failed half way through or already network shutdown is completed. So just returning."); - return true; - } - - externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - assert (externalLoadBalancer != null) : "There is no device assigned to this network how did shutdown network ended up here??"; - } - - // Send a command to the external load balancer to implement or shutdown the guest network - long guestVlanTag = Long.parseLong(guestConfig.getBroadcastUri().getHost()); - String selfIp = null; - String guestVlanNetmask = NetUtils.cidr2Netmask(guestConfig.getCidr()); - Integer networkRate = _networkMgr.getNetworkRate(guestConfig.getId(), null); - - if (add) { - // Acquire a self-ip address from the guest network IP address range - selfIp = _networkMgr.acquireGuestIpAddress(guestConfig, null); - if (selfIp == null) { - String msg = "failed to acquire guest IP address so not implementing the network on the external load balancer "; - s_logger.error(msg); - throw new InsufficientNetworkCapacityException(msg, Network.class, guestConfig.getId()); - } - } else { - // get the self-ip used by the load balancer - NicVO selfipNic = getPlaceholderNic(guestConfig); - if (selfipNic == null) { - s_logger.warn("Network shutdwon requested on external load balancer element, which did not implement the network." + - " Either network implement failed half way through or already network shutdown is completed. So just returning."); - return true; - } - selfIp = selfipNic.getIp4Address(); - } - - IpAddressTO ip = new IpAddressTO(guestConfig.getAccountId(), null, add, false, true, String.valueOf(guestVlanTag), selfIp, guestVlanNetmask, null, null, networkRate, false); - IpAddressTO[] ips = new IpAddressTO[1]; - ips[0] = ip; - IpAssocCommand cmd = new IpAssocCommand(ips); - Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); - - if (answer == null || !answer.getResult()) { - String action = add ? "implement" : "shutdown"; - String answerDetails = (answer != null) ? answer.getDetails() : "answer was null"; - String msg = "External load balancer was unable to " + action + " the guest network on the external load balancer in zone " + zone.getName() + " due to " + answerDetails; - s_logger.error(msg); - throw new ResourceUnavailableException(msg, Network.class, guestConfig.getId()); - } - - if (add) { - // Insert a new NIC for this guest network to reserve the self IP - savePlaceholderNic(guestConfig, selfIp); - } else { - // release the self-ip obtained from guest network - NicVO selfipNic = getPlaceholderNic(guestConfig); - _nicDao.remove(selfipNic.getId()); - - // release the load balancer allocated for the network - boolean releasedLB = freeLoadBalancerForNetwork(guestConfig); - if (!releasedLB) { - String msg = "Failed to release the external load balancer used for the network: " + guestConfig.getId(); - s_logger.error(msg); - } - } - - if (s_logger.isDebugEnabled()) { - Account account = _accountDao.findByIdIncludingRemoved(guestConfig.getAccountId()); - String action = add ? "implemented" : "shut down"; - s_logger.debug("External load balancer has " + action + " the guest network for account " + account.getAccountName() + "(id = " + account.getAccountId() + ") with VLAN tag " + guestVlanTag); - } - - return true; - } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - super.configure(name, params); - _defaultLbCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); - _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); - return true; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - return true; - } - - @Override - public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) { - // TODO Auto-generated method stub - return null; - } - - @Override - public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, - Map details, List hostTags) { - if (!(startup[0] instanceof StartupExternalLoadBalancerCommand)) { - return null; - } - host.setType(Host.Type.ExternalLoadBalancer); - return host; - } - - @Override - public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException { - if (host.getType() != com.cloud.host.Host.Type.ExternalLoadBalancer) { - return null; - } - return new DeleteHostAnswer(true); - } - -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.StartupExternalLoadBalancerCommand; +import com.cloud.agent.api.routing.CreateLoadBalancerApplianceCommand; +import com.cloud.agent.api.routing.DestroyLoadBalancerApplianceCommand; +import com.cloud.agent.api.routing.IpAssocCommand; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.routing.SetStaticNatRulesCommand; +import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.agent.api.to.StaticNatRuleTO; +import com.cloud.api.ApiConstants; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterIpAddressVO; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.Pod; +import com.cloud.dc.Vlan.VlanType; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientNetworkCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.DetailVO; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.host.dao.HostDetailsDao; +import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState; +import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; +import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; +import com.cloud.network.Network.Service; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.addr.PublicIp; +import com.cloud.network.dao.ExternalFirewallDeviceDao; +import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.InlineLoadBalancerNicMapDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkExternalFirewallDao; +import com.cloud.network.dao.NetworkExternalLoadBalancerDao; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmGroup; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.resource.CreateLoadBalancerApplianceAnswer; +import com.cloud.network.resource.DestroyLoadBalancerApplianceAnswer; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.network.rules.StaticNatRule; +import com.cloud.network.rules.StaticNatRuleImpl; +import com.cloud.network.rules.dao.PortForwardingRulesDao; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.resource.ResourceManager; +import com.cloud.resource.ResourceState; +import com.cloud.resource.ResourceStateAdapter; +import com.cloud.resource.ServerResource; +import com.cloud.resource.UnableDeleteHostException; +import com.cloud.server.api.response.ExternalLoadBalancerResponse; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.Inject; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; +import com.cloud.utils.net.UrlUtil; +import com.cloud.vm.Nic.ReservationStrategy; +import com.cloud.vm.Nic.State; +import com.cloud.vm.NicVO; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; +public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase implements ExternalLoadBalancerDeviceManager, ResourceStateAdapter { + + @Inject + NetworkExternalLoadBalancerDao _networkExternalLBDao; + @Inject + ExternalLoadBalancerDeviceDao _externalLoadBalancerDeviceDao; + @Inject + HostDao _hostDao; + @Inject + DataCenterDao _dcDao; + @Inject + NetworkManager _networkMgr; + @Inject + InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao; + @Inject + NicDao _nicDao; + @Inject + AgentManager _agentMgr; + @Inject + ResourceManager _resourceMgr; + @Inject + IPAddressDao _ipAddressDao; + @Inject + VlanDao _vlanDao; + @Inject + NetworkOfferingDao _networkOfferingDao; + @Inject + AccountDao _accountDao; + @Inject + PhysicalNetworkDao _physicalNetworkDao; + @Inject + PhysicalNetworkServiceProviderDao _physicalNetworkServiceProviderDao; + @Inject + AccountManager _accountMgr; + @Inject + UserStatisticsDao _userStatsDao; + @Inject + NetworkDao _networkDao; + @Inject + DomainRouterDao _routerDao; + @Inject + LoadBalancerDao _loadBalancerDao; + @Inject + PortForwardingRulesDao _portForwardingRulesDao; + @Inject + ConfigurationDao _configDao; + @Inject + HostDetailsDao _hostDetailDao; + @Inject + NetworkExternalLoadBalancerDao _networkLBDao; + @Inject + NetworkServiceMapDao _ntwkSrvcProviderDao; + @Inject + NetworkExternalFirewallDao _networkExternalFirewallDao; + @Inject + ExternalFirewallDeviceDao _externalFirewallDeviceDao; + @Inject + protected HostPodDao _podDao = null; + + private long _defaultLbCapacity; + private static final org.apache.log4j.Logger s_logger = Logger.getLogger(ExternalLoadBalancerDeviceManagerImpl.class); + + @Override + @DB + public ExternalLoadBalancerDeviceVO addExternalLoadBalancer(long physicalNetworkId, String url, String username, String password, String deviceName, ServerResource resource) { + + PhysicalNetworkVO pNetwork = null; + NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName); + long zoneId; + + if ((ntwkDevice == null) || (url == null) || (username == null) || (resource == null) || (password == null)) { + throw new InvalidParameterValueException("Atleast one of the required parameters (url, username, password," + + " server resource, zone id/physical network id) is not specified or a valid parameter."); + } + + pNetwork = _physicalNetworkDao.findById(physicalNetworkId); + if (pNetwork == null) { + throw new InvalidParameterValueException("Could not find phyical network with ID: " + physicalNetworkId); + } + zoneId = pNetwork.getDataCenterId(); + + PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder()); + if (ntwkSvcProvider == null) { + throw new CloudRuntimeException("Network Service Provider: " + ntwkDevice.getNetworkServiceProvder() + + " is not enabled in the physical network: " + physicalNetworkId + "to add this device"); + } else if (ntwkSvcProvider.getState() == PhysicalNetworkServiceProvider.State.Shutdown) { + throw new CloudRuntimeException("Network Service Provider: " + ntwkSvcProvider.getProviderName() + + " is in shutdown state in the physical network: " + physicalNetworkId + "to add this device"); + } + + URI uri; + try { + uri = new URI(url); + } catch (Exception e) { + s_logger.debug(e); + throw new InvalidParameterValueException(e.getMessage()); + } + + String ipAddress = uri.getHost(); + Map hostDetails = new HashMap(); + String hostName = getExternalLoadBalancerResourceGuid(pNetwork.getId(), deviceName, ipAddress); + hostDetails.put("name", hostName); + hostDetails.put("guid", UUID.randomUUID().toString()); + hostDetails.put("zoneId", String.valueOf(pNetwork.getDataCenterId())); + hostDetails.put("ip", ipAddress); + hostDetails.put("physicalNetworkId", String.valueOf(pNetwork.getId())); + hostDetails.put("username", username); + hostDetails.put("password", password); + hostDetails.put("deviceName", deviceName); + + // leave parameter validation to be part server resource configure + Map configParams = new HashMap(); + UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams); + hostDetails.putAll(configParams); + + Transaction txn = Transaction.currentTxn(); + try { + resource.configure(hostName, hostDetails); + + Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails); + if (host != null) { + + boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false; + boolean inline = (configParams.get(ApiConstants.INLINE) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.INLINE)) : false; + long capacity = NumbersUtil.parseLong((String) configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_CAPACITY), 0); + if (capacity == 0) { + capacity = _defaultLbCapacity; + } + + txn.start(); + ExternalLoadBalancerDeviceVO lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(), + deviceName, capacity, dedicatedUse, inline); + _externalLoadBalancerDeviceDao.persist(lbDeviceVO); + + DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId())); + _hostDetailDao.persist(hostDetail); + + txn.commit(); + return lbDeviceVO; + } else { + throw new CloudRuntimeException("Failed to add load balancer device due to internal error."); + } + } catch (ConfigurationException e) { + txn.rollback(); + throw new CloudRuntimeException(e.getMessage()); + } + } + + @Override + public boolean deleteExternalLoadBalancer(long hostId) { + HostVO externalLoadBalancer = _hostDao.findById(hostId); + if (externalLoadBalancer == null) { + throw new InvalidParameterValueException("Could not find an external load balancer with ID: " + hostId); + } + + DetailVO lbHostDetails = _hostDetailDao.findDetail(hostId, ApiConstants.LOAD_BALANCER_DEVICE_ID); + long lbDeviceId = Long.parseLong(lbHostDetails.getValue()); + + ExternalLoadBalancerDeviceVO lbDeviceVo = _externalLoadBalancerDeviceDao.findById(lbDeviceId); + if (lbDeviceVo.getAllocationState() == LBDeviceAllocationState.Provider) { + // check if cloudstack has provisioned any load balancer appliance on the device before deleting + List lbDevices = _externalLoadBalancerDeviceDao.listAll(); + if (lbDevices != null) { + for (ExternalLoadBalancerDeviceVO lbDevice : lbDevices) { + if (lbDevice.getParentHostId() == hostId) { + throw new CloudRuntimeException("This load balancer device can not be deleted as there are one or more load balancers applainces provisioned by cloudstack on the device."); + } + } + } + } else { + // check if any networks are using this load balancer device + List networks = _networkLBDao.listByLoadBalancerDeviceId(lbDeviceId); + if ((networks != null) && !networks.isEmpty()) { + throw new CloudRuntimeException("Delete can not be done as there are networks using this load balancer device "); + } + } + + try { + // put the host in maintenance state in order for it to be deleted + externalLoadBalancer.setResourceState(ResourceState.Maintenance); + _hostDao.update(hostId, externalLoadBalancer); + _resourceMgr.deleteHost(hostId, false, false); + + // delete the external load balancer entry + _externalLoadBalancerDeviceDao.remove(lbDeviceId); + + return true; + } catch (Exception e) { + s_logger.debug(e); + return false; + } + } + + @Override + public List listExternalLoadBalancers(long physicalNetworkId, String deviceName) { + List lbHosts = new ArrayList(); + NetworkDevice lbNetworkDevice = NetworkDevice.getNetworkDevice(deviceName); + PhysicalNetworkVO pNetwork = null; + + pNetwork = _physicalNetworkDao.findById(physicalNetworkId); + + if ((pNetwork == null) || (lbNetworkDevice == null)) { + throw new InvalidParameterValueException("Atleast one of the required parameter physical networkId, device name is invalid."); + } + + PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), + lbNetworkDevice.getNetworkServiceProvder()); + // if provider not configured in to physical network, then there can be no instances + if (ntwkSvcProvider == null) { + return null; + } + + List lbDevices = _externalLoadBalancerDeviceDao.listByPhysicalNetworkAndProvider(physicalNetworkId, + ntwkSvcProvider.getProviderName()); + for (ExternalLoadBalancerDeviceVO provderInstance : lbDevices) { + lbHosts.add(_hostDao.findById(provderInstance.getHostId())); + } + return lbHosts; + } + + public ExternalLoadBalancerResponse createExternalLoadBalancerResponse(Host externalLoadBalancer) { + Map lbDetails = _hostDetailDao.findDetails(externalLoadBalancer.getId()); + ExternalLoadBalancerResponse response = new ExternalLoadBalancerResponse(); + response.setId(externalLoadBalancer.getId()); + response.setIpAddress(externalLoadBalancer.getPrivateIpAddress()); + response.setUsername(lbDetails.get("username")); + response.setPublicInterface(lbDetails.get("publicInterface")); + response.setPrivateInterface(lbDetails.get("privateInterface")); + response.setNumRetries(lbDetails.get("numRetries")); + return response; + } + + public String getExternalLoadBalancerResourceGuid(long physicalNetworkId, String deviceName, String ip) { + return physicalNetworkId + "-" + deviceName + "-" + ip; + } + + @Override + public ExternalLoadBalancerDeviceVO getExternalLoadBalancerForNetwork(Network network) { + NetworkExternalLoadBalancerVO lbDeviceForNetwork = _networkExternalLBDao.findByNetworkId(network.getId()); + if (lbDeviceForNetwork != null) { + long lbDeviceId = lbDeviceForNetwork.getExternalLBDeviceId(); + ExternalLoadBalancerDeviceVO lbDeviceVo = _externalLoadBalancerDeviceDao.findById(lbDeviceId); + assert (lbDeviceVo != null); + return lbDeviceVo; + } + return null; + } + + public void setExternalLoadBalancerForNetwork(Network network, long externalLBDeviceID) { + NetworkExternalLoadBalancerVO lbDeviceForNetwork = new NetworkExternalLoadBalancerVO(network.getId(), externalLBDeviceID); + _networkExternalLBDao.persist(lbDeviceForNetwork); + } + + @DB + protected ExternalLoadBalancerDeviceVO allocateLoadBalancerForNetwork(Network guestConfig) throws InsufficientCapacityException { + boolean retry = true; + boolean tryLbProvisioning = false; + ExternalLoadBalancerDeviceVO lbDevice = null; + long physicalNetworkId = guestConfig.getPhysicalNetworkId(); + NetworkOfferingVO offering = _networkOfferingDao.findById(guestConfig.getNetworkOfferingId()); + String provider = _ntwkSrvcProviderDao.getProviderForServiceInNetwork(guestConfig.getId(), Service.Lb); + + while (retry) { + GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock"); + Transaction txn = Transaction.currentTxn(); + try { + if (deviceMapLock.lock(120)) { + try { + boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated +// load balancer? + long lbDeviceId; + + txn.start(); + try { + // FIXME: should the device allocation be done during network implement phase or do a + // lazy allocation when first rule for the network is configured?? + + // find a load balancer device for this network as per the network offering + lbDevice = findSuitableLoadBalancerForNetwork(guestConfig, dedicatedLB); + lbDeviceId = lbDevice.getId(); + + // persist the load balancer device id that will be used for this network. Once a network + // is implemented on a LB device then later on all rules will be programmed on to same +// device + NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), lbDeviceId); + _networkExternalLBDao.persist(networkLB); + + // mark device to be either dedicated or shared use + lbDevice.setAllocationState(dedicatedLB ? LBDeviceAllocationState.Dedicated : LBDeviceAllocationState.Shared); + _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice); + + txn.commit(); + + // allocated load balancer for the network, so skip retry + tryLbProvisioning = false; + retry = false; + } catch (InsufficientCapacityException exception) { + // if already attempted to provision load balancer then throw out of capacity exception, + if (tryLbProvisioning) { + retry = false; + // TODO: throwing warning instead of error for now as its possible another provider can +// service this network + s_logger.warn("There are no load balancer device with the capacity for implementing this network"); + throw exception; + } else { + tryLbProvisioning = true; // if possible provision a LB appliance in to the physical +// network + } + } + } finally { + deviceMapLock.unlock(); + if (lbDevice == null) { + txn.rollback(); + } + } + } + } finally { + deviceMapLock.releaseRef(); + } + + // there are no LB devices or there is no free capacity on the devices in the physical network so provision +// a new LB appliance + if (tryLbProvisioning) { + // check if LB appliance can be dynamically provisioned + List providerLbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Provider); + if ((providerLbDevices != null) && (!providerLbDevices.isEmpty())) { + for (ExternalLoadBalancerDeviceVO lbProviderDevice : providerLbDevices) { + if (lbProviderDevice.getState() == LBDeviceState.Enabled) { + // acquire a private IP from the data center which will be used as management IP of +// provisioned LB appliance, + DataCenterIpAddressVO dcPrivateIp = _dcDao.allocatePrivateIpAddress(guestConfig.getDataCenterId(), lbProviderDevice.getUuid()); + if (dcPrivateIp == null) { + throw new InsufficientNetworkCapacityException("failed to acquire a priavate IP in the zone " + guestConfig.getDataCenterId() + + " needed for management IP of the load balancer appliance", DataCenter.class, guestConfig.getDataCenterId()); + } + Pod pod = _podDao.findById(dcPrivateIp.getPodId()); + String lbIP = dcPrivateIp.getIpAddress(); + String netmask = NetUtils.getCidrNetmask(pod.getCidrSize()); + String gateway = pod.getGateway(); + + // send CreateLoadBalancerApplianceCommand to the host capable of provisioning + CreateLoadBalancerApplianceCommand lbProvisionCmd = new CreateLoadBalancerApplianceCommand(lbIP, netmask, gateway); + CreateLoadBalancerApplianceAnswer createLbAnswer = null; + try { + createLbAnswer = (CreateLoadBalancerApplianceAnswer) _agentMgr.easySend(lbProviderDevice.getHostId(), lbProvisionCmd); + if (createLbAnswer == null || !createLbAnswer.getResult()) { + s_logger.error("Could not provision load balancer instance on the load balancer device " + lbProviderDevice.getId()); + continue; + } + } catch (Exception agentException) { + s_logger.error("Could not provision load balancer instance on the load balancer device " + lbProviderDevice.getId() + " due to " + agentException.getMessage()); + continue; + } + + String username = createLbAnswer.getUsername(); + String password = createLbAnswer.getPassword(); + String publicIf = createLbAnswer.getPublicInterface(); + String privateIf = createLbAnswer.getPrivateInterface(); + + // we have provisioned load balancer so add the appliance as cloudstack provisioned external +// load balancer + String dedicatedLb = offering.getDedicatedLB() ? "true" : "false"; + String capacity = Long.toString(lbProviderDevice.getCapacity()); + + // acquire a public IP to associate with lb appliance (used as subnet IP to make the +// appliance part of private network) + PublicIp publicIp = _networkMgr.assignPublicIpAddress(guestConfig.getDataCenterId(), null, _accountMgr.getSystemAccount(), VlanType.VirtualNetwork, null, null, false); + String publicIPNetmask = publicIp.getVlanNetmask(); + String publicIPgateway = publicIp.getVlanGateway(); + String publicIPVlanTag = publicIp.getVlanTag(); + String publicIP = publicIp.getAddress().toString(); + + String url = "https://" + lbIP + "?publicinterface=" + publicIf + "&privateinterface=" + privateIf + "&lbdevicededicated=" + dedicatedLb + + "&cloudmanaged=true" + "&publicip=" + publicIP + "&publicipnetmask=" + publicIPNetmask + "&lbdevicecapacity=" + capacity + + "&publicipvlan=" + publicIPVlanTag + "&publicipgateway=" + publicIPgateway; + ExternalLoadBalancerDeviceVO lbAppliance = null; + try { + lbAppliance = addExternalLoadBalancer(physicalNetworkId, url, username, password, createLbAnswer.getDeviceName(), createLbAnswer.getServerResource()); + } catch (Exception e) { + s_logger.error("Failed to add load balancer appliance in to cloudstack due to " + e.getMessage() + ". So provisioned load balancer appliance will be destroyed."); + } + + if (lbAppliance != null) { + // mark the load balancer as cloudstack managed and set parent host id on which lb +// appliance is provisioned + ExternalLoadBalancerDeviceVO managedLb = _externalLoadBalancerDeviceDao.findById(lbAppliance.getId()); + managedLb.setIsManagedDevice(true); + managedLb.setParentHostId(lbProviderDevice.getHostId()); + _externalLoadBalancerDeviceDao.update(lbAppliance.getId(), managedLb); + } else { + // failed to add the provisioned load balancer into cloudstack so destroy the appliance + DestroyLoadBalancerApplianceCommand lbDeleteCmd = new DestroyLoadBalancerApplianceCommand(lbIP); + DestroyLoadBalancerApplianceAnswer answer = null; + try { + answer = (DestroyLoadBalancerApplianceAnswer) _agentMgr.easySend(lbProviderDevice.getHostId(), lbDeleteCmd); + if (answer == null || !answer.getResult()) { + s_logger.warn("Failed to destroy load balancer appliance created"); + } else { + // release the public & private IP back to dc pool, as the load balancer +// appliance is now destroyed + _dcDao.releasePrivateIpAddress(lbIP, guestConfig.getDataCenterId(), null); + _networkMgr.disassociatePublicIpAddress(publicIp.getId(), _accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount()); + } + } catch (Exception e) { + s_logger.warn("Failed to destroy load balancer appliance created for the network" + guestConfig.getId() + " due to " + e.getMessage()); + } + } + } + } + } + } + } + + return lbDevice; + } + + @Override + public ExternalLoadBalancerDeviceVO findSuitableLoadBalancerForNetwork(Network network, boolean dedicatedLb) throws InsufficientCapacityException { + long physicalNetworkId = network.getPhysicalNetworkId(); + List lbDevices = null; + String provider = _ntwkSrvcProviderDao.getProviderForServiceInNetwork(network.getId(), Service.Lb); + assert (provider != null); + + if (dedicatedLb) { + lbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Free); + if (lbDevices != null && !lbDevices.isEmpty()) { + // return first device that is free, fully configured and meant for dedicated use + for (ExternalLoadBalancerDeviceVO lbdevice : lbDevices) { + if (lbdevice.getState() == LBDeviceState.Enabled && lbdevice.getIsDedicatedDevice()) { + return lbdevice; + } + } + } + } else { + // get the LB devices that are already allocated for shared use + lbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Shared); + + if (lbDevices != null) { + + ExternalLoadBalancerDeviceVO maxFreeCapacityLbdevice = null; + long maxFreeCapacity = 0; + + // loop through the LB device in the physical network and pick the one with maximum free capacity + for (ExternalLoadBalancerDeviceVO lbdevice : lbDevices) { + + // skip if device is not enabled + if (lbdevice.getState() != LBDeviceState.Enabled) { + continue; + } + + // get the used capacity from the list of guest networks that are mapped to this load balancer + List mappedNetworks = _networkExternalLBDao.listByLoadBalancerDeviceId(lbdevice.getId()); + long usedCapacity = ((mappedNetworks == null) || (mappedNetworks.isEmpty())) ? 0 : mappedNetworks.size(); + + // get the configured capacity for this device + long fullCapacity = lbdevice.getCapacity(); + if (fullCapacity == 0) { + fullCapacity = _defaultLbCapacity; // if capacity not configured then use the default + } + + long freeCapacity = fullCapacity - usedCapacity; + if (freeCapacity > 0) { + if (maxFreeCapacityLbdevice == null) { + maxFreeCapacityLbdevice = lbdevice; + maxFreeCapacity = freeCapacity; + } else if (freeCapacity > maxFreeCapacity) { + maxFreeCapacityLbdevice = lbdevice; + maxFreeCapacity = freeCapacity; + } + } + } + + // return the device with maximum free capacity and is meant for shared use + if (maxFreeCapacityLbdevice != null) { + return maxFreeCapacityLbdevice; + } + } + + // if we are here then there are no existing LB devices in shared use or the devices in shared use has no +// free capacity left + // so allocate a new load balancer configured for shared use from the pool of free LB devices + lbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider, LBDeviceAllocationState.Free); + if (lbDevices != null && !lbDevices.isEmpty()) { + for (ExternalLoadBalancerDeviceVO lbdevice : lbDevices) { + if (lbdevice.getState() == LBDeviceState.Enabled && !lbdevice.getIsDedicatedDevice()) { + return lbdevice; + } + } + } + } + + // there are no devices which capacity + throw new InsufficientNetworkCapacityException("Unable to find a load balancing provider with sufficient capcity " + + " to implement the network", Network.class, network.getId()); + } + + @DB + protected boolean freeLoadBalancerForNetwork(Network guestConfig) { + Transaction txn = Transaction.currentTxn(); + GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock"); + + try { + if (deviceMapLock.lock(120)) { + txn.start(); + // since network is shutdown remove the network mapping to the load balancer device + NetworkExternalLoadBalancerVO networkLBDevice = _networkExternalLBDao.findByNetworkId(guestConfig.getId()); + long lbDeviceId = networkLBDevice.getExternalLBDeviceId(); + _networkExternalLBDao.remove(networkLBDevice.getId()); + + List ntwksMapped = _networkExternalLBDao.listByLoadBalancerDeviceId(networkLBDevice.getExternalLBDeviceId()); + ExternalLoadBalancerDeviceVO lbDevice = _externalLoadBalancerDeviceDao.findById(lbDeviceId); + boolean lbInUse = !(ntwksMapped == null || ntwksMapped.isEmpty()); + boolean lbCloudManaged = lbDevice.getIsManagedDevice(); + + if (!lbInUse && !lbCloudManaged) { + // this is the last network mapped to the load balancer device so set device allocation state to be +// free + lbDevice.setAllocationState(LBDeviceAllocationState.Free); + _externalLoadBalancerDeviceDao.update(lbDevice.getId(), lbDevice); + } + + // commit the changes before sending agent command to destroy cloudstack managed LB + txn.commit(); + + if (!lbInUse && lbCloudManaged) { + // send DestroyLoadBalancerApplianceCommand to the host where load balancer appliance is provisioned + Host lbHost = _hostDao.findById(lbDevice.getHostId()); + String lbIP = lbHost.getPrivateIpAddress(); + DestroyLoadBalancerApplianceCommand lbDeleteCmd = new DestroyLoadBalancerApplianceCommand(lbIP); + DestroyLoadBalancerApplianceAnswer answer = null; + try { + answer = (DestroyLoadBalancerApplianceAnswer) _agentMgr.easySend(lbDevice.getParentHostId(), lbDeleteCmd); + if (answer == null || !answer.getResult()) { + s_logger.warn("Failed to destoy load balancer appliance used by the network" + guestConfig.getId() + " due to " + answer.getDetails()); + } + } catch (Exception e) { + s_logger.warn("Failed to destroy load balancer appliance used by the network" + guestConfig.getId() + " due to " + e.getMessage()); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Successfully destroyed load balancer appliance used for the network" + guestConfig.getId()); + } + deviceMapLock.unlock(); + + // remove the provisioned load balancer appliance from cloudstack + deleteExternalLoadBalancer(lbHost.getId()); + + // release the private IP back to dc pool, as the load balancer appliance is now destroyed + _dcDao.releasePrivateIpAddress(lbHost.getPrivateIpAddress(), guestConfig.getDataCenterId(), null); + + // release the public IP allocated for this LB appliance + DetailVO publicIpDetail = _hostDetailDao.findDetail(lbHost.getId(), "publicip"); + IPAddressVO ipVo = _ipAddressDao.findByIpAndDcId(guestConfig.getDataCenterId(), publicIpDetail.toString()); + _networkMgr.disassociatePublicIpAddress(ipVo.getId(), _accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount()); + } else { + deviceMapLock.unlock(); + } + + return true; + } else { + s_logger.error("Failed to release load balancer device for the network" + guestConfig.getId() + "as failed to acquire lock "); + return false; + } + } catch (Exception exception) { + txn.rollback(); + s_logger.error("Failed to release load balancer device for the network" + guestConfig.getId() + " due to " + exception.getMessage()); + } finally { + deviceMapLock.releaseRef(); + } + + return false; + } + + HostVO getFirewallProviderForNetwork(Network network) { + HostVO fwHost = null; + + // get the firewall provider (could be either virtual router or external firewall device) for the network + String fwProvider = _ntwkSrvcProviderDao.getProviderForServiceInNetwork(network.getId(), Service.Firewall); + + if (fwProvider.equalsIgnoreCase("VirtualRouter")) { + // FIXME: use network service provider container framework support to implement on virtual router + } else { + NetworkExternalFirewallVO fwDeviceForNetwork = _networkExternalFirewallDao.findByNetworkId(network.getId()); + assert (fwDeviceForNetwork != null) : "Why firewall provider is not ready for the network to apply static nat rules?"; + long fwDeviceId = fwDeviceForNetwork.getExternalFirewallDeviceId(); + ExternalFirewallDeviceVO fwDevice = _externalFirewallDeviceDao.findById(fwDeviceId); + fwHost = _hostDao.findById(fwDevice.getHostId()); + } + + return fwHost; + } + + private boolean externalLoadBalancerIsInline(HostVO externalLoadBalancer) { + DetailVO detail = _hostDetailDao.findDetail(externalLoadBalancer.getId(), "inline"); + return (detail != null && detail.getValue().equals("true")); + } + + private NicVO savePlaceholderNic(Network network, String ipAddress) { + NicVO nic = new NicVO(null, null, network.getId(), null); + nic.setIp4Address(ipAddress); + nic.setReservationStrategy(ReservationStrategy.PlaceHolder); + nic.setState(State.Reserved); + return _nicDao.persist(nic); + } + + private NicVO getPlaceholderNic(Network network) { + List guestIps = _nicDao.listByNetworkId(network.getId()); + for (NicVO guestIp : guestIps) { + // only external firewall and external load balancer will create NicVO with PlaceHolder reservation strategy + if (guestIp.getReservationStrategy().equals(ReservationStrategy.PlaceHolder) && guestIp.getVmType() == null + && guestIp.getReserver() == null && !guestIp.getIp4Address().equals(network.getGateway())) { + return guestIp; + } + } + return null; + } + + private void applyStaticNatRuleForInlineLBRule(DataCenterVO zone, Network network, HostVO firewallHost, boolean revoked, String publicIp, String privateIp) throws ResourceUnavailableException { + List staticNatRules = new ArrayList(); + IPAddressVO ipVO = _ipAddressDao.listByDcIdIpAddress(zone.getId(), publicIp).get(0); + VlanVO vlan = _vlanDao.findById(ipVO.getVlanId()); + FirewallRuleVO fwRule = new FirewallRuleVO(null, ipVO.getId(), -1, -1, "any", network.getId(), network.getAccountId(), network.getDomainId(), Purpose.StaticNat, null, null, null, null, null); + FirewallRule.State state = !revoked ? FirewallRule.State.Add : FirewallRule.State.Revoke; + fwRule.setState(state); + StaticNatRule rule = new StaticNatRuleImpl(fwRule, privateIp); + StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, vlan.getVlanTag(), publicIp, privateIp); + staticNatRules.add(ruleTO); + + applyStaticNatRules(staticNatRules, network, firewallHost.getId()); + } + + protected void applyStaticNatRules(List staticNatRules, Network network, long firewallHostId) throws ResourceUnavailableException { + if (!staticNatRules.isEmpty()) { + SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(staticNatRules, null); + Answer answer = _agentMgr.easySend(firewallHostId, cmd); + if (answer == null || !answer.getResult()) { + String details = (answer != null) ? answer.getDetails() : "details unavailable"; + String msg = "firewall provider for the network was unable to apply static nat rules due to: " + details + "."; + s_logger.error(msg); + throw new ResourceUnavailableException(msg, Network.class, network.getId()); + } + } + } + + @Override + public boolean applyLoadBalancerRules(Network network, List rules) throws ResourceUnavailableException { + // Find the external load balancer in this zone + long zoneId = network.getDataCenterId(); + DataCenterVO zone = _dcDao.findById(zoneId); + + List loadBalancingRules = new ArrayList(); + + for (FirewallRule rule : rules) { + if (rule.getPurpose().equals(Purpose.LoadBalancing)) { + loadBalancingRules.add((LoadBalancingRule) rule); + } + } + + if (loadBalancingRules == null || loadBalancingRules.isEmpty()) { + return true; + } + + ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); + if (lbDeviceVO == null) { + s_logger.warn("There is no external load balancer device assigned to this network either network is not implement are already shutdown so just returning"); + return true; + } + + HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + + boolean externalLoadBalancerIsInline = externalLoadBalancerIsInline(externalLoadBalancer); + + if (network.getState() == Network.State.Allocated) { + s_logger.debug("External load balancer was asked to apply LB rules for network with ID " + network.getId() + "; this network is not implemented. Skipping backend commands."); + return true; + } + + List loadBalancersToApply = new ArrayList(); + for (int i = 0; i < loadBalancingRules.size(); i++) { + LoadBalancingRule rule = loadBalancingRules.get(i); + + boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); + String protocol = rule.getProtocol(); + String algorithm = rule.getAlgorithm(); + Long lbId = rule.getId(); + String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr(); + int srcPort = rule.getSourcePortStart(); + List destinations = rule.getDestinations(); + List sourceCidrs = rule.getSourceCidrList(); + + if (externalLoadBalancerIsInline) { + InlineLoadBalancerNicMapVO mapping = _inlineLoadBalancerNicMapDao.findByPublicIpAddress(srcIp); + NicVO loadBalancingIpNic = null; + HostVO firewallProviderHost = null; + + if (externalLoadBalancerIsInline) { + firewallProviderHost = getFirewallProviderForNetwork(network); + } + + if (!revoked) { + if (mapping == null) { + // Acquire a new guest IP address and save it as the load balancing IP address + String loadBalancingIpAddress = _networkMgr.acquireGuestIpAddress(network, null); + + if (loadBalancingIpAddress == null) { + String msg = "Ran out of guest IP addresses."; + s_logger.error(msg); + throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); + } + + // If a NIC doesn't exist for the load balancing IP address, create one + loadBalancingIpNic = _nicDao.findByIp4AddressAndNetworkId(loadBalancingIpAddress, network.getId()); + if (loadBalancingIpNic == null) { + loadBalancingIpNic = savePlaceholderNic(network, loadBalancingIpAddress); + } + + // Save a mapping between the source IP address and the load balancing IP address NIC + mapping = new InlineLoadBalancerNicMapVO(rule.getId(), srcIp, loadBalancingIpNic.getId()); + _inlineLoadBalancerNicMapDao.persist(mapping); + + // On the firewall provider for the network, create a static NAT rule between the source IP +// address and the load balancing IP address + applyStaticNatRuleForInlineLBRule(zone, network, firewallProviderHost, revoked, srcIp, loadBalancingIpNic.getIp4Address()); + } else { + loadBalancingIpNic = _nicDao.findById(mapping.getNicId()); + } + } else { + if (mapping != null) { + // Find the NIC that the mapping refers to + loadBalancingIpNic = _nicDao.findById(mapping.getNicId()); + + // On the firewall provider for the network, delete the static NAT rule between the source IP +// address and the load balancing IP address + applyStaticNatRuleForInlineLBRule(zone, network, firewallProviderHost, revoked, srcIp, loadBalancingIpNic.getIp4Address()); + + // Delete the mapping between the source IP address and the load balancing IP address + _inlineLoadBalancerNicMapDao.expunge(mapping.getId()); + + // Delete the NIC + _nicDao.expunge(loadBalancingIpNic.getId()); + } else { + s_logger.debug("Revoking a rule for an inline load balancer that has not been programmed yet."); + continue; + } + } + + // Change the source IP address for the load balancing rule to be the load balancing IP address + srcIp = loadBalancingIpNic.getIp4Address(); + } + + if ((destinations != null && !destinations.isEmpty()) || rule.isAutoScaleConfig()) { + LoadBalancerTO loadBalancer = new LoadBalancerTO(lbId, srcIp, srcPort, protocol, algorithm, revoked, false, destinations, rule.getStickinessPolicies()); + if(rule.isAutoScaleConfig()) + loadBalancer.setAutoScaleVmGroup(rule.getAutoScaleVmGroup()); + loadBalancersToApply.add(loadBalancer); + } + } + + if (loadBalancersToApply.size() > 0) { + int numLoadBalancersForCommand = loadBalancersToApply.size(); + LoadBalancerTO[] loadBalancersForCommand = loadBalancersToApply.toArray(new LoadBalancerTO[numLoadBalancersForCommand]); + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(loadBalancersForCommand, null); + long guestVlanTag = Integer.parseInt(network.getBroadcastUri().getHost()); + cmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); + Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); + if (answer == null || !answer.getResult()) { + String details = (answer != null) ? answer.getDetails() : "details unavailable"; + String msg = "Unable to apply load balancer rules to the external load balancer appliance in zone " + zone.getName() + " due to: " + details + "."; + s_logger.error(msg); + throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); + } + } + + return true; + } + + @Override + public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network guestConfig) throws ResourceUnavailableException, InsufficientCapacityException { + if (guestConfig.getTrafficType() != TrafficType.Guest) { + s_logger.trace("External load balancer can only be used for guest networks."); + return false; + } + + long zoneId = guestConfig.getDataCenterId(); + DataCenterVO zone = _dcDao.findById(zoneId); + HostVO externalLoadBalancer = null; + + if (add) { + ExternalLoadBalancerDeviceVO lbDeviceVO = allocateLoadBalancerForNetwork(guestConfig); + if (lbDeviceVO == null) { + String msg = "failed to alloacate a external load balancer for the network " + guestConfig.getId(); + s_logger.error(msg); + throw new InsufficientNetworkCapacityException(msg, DataCenter.class, guestConfig.getDataCenterId()); + } + externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + s_logger.debug("Allocated external load balancer device:" + lbDeviceVO.getId() + " for the network: " + guestConfig.getId()); + } else { + // find the load balancer device allocated for the network + ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(guestConfig); + if (lbDeviceVO == null) { + s_logger.warn("Network shutdwon requested on external load balancer element, which did not implement the network." + + " Either network implement failed half way through or already network shutdown is completed. So just returning."); + return true; + } + + externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + assert (externalLoadBalancer != null) : "There is no device assigned to this network how did shutdown network ended up here??"; + } + + // Send a command to the external load balancer to implement or shutdown the guest network + long guestVlanTag = Long.parseLong(guestConfig.getBroadcastUri().getHost()); + String selfIp = null; + String guestVlanNetmask = NetUtils.cidr2Netmask(guestConfig.getCidr()); + Integer networkRate = _networkMgr.getNetworkRate(guestConfig.getId(), null); + + if (add) { + // Acquire a self-ip address from the guest network IP address range + selfIp = _networkMgr.acquireGuestIpAddress(guestConfig, null); + if (selfIp == null) { + String msg = "failed to acquire guest IP address so not implementing the network on the external load balancer "; + s_logger.error(msg); + throw new InsufficientNetworkCapacityException(msg, Network.class, guestConfig.getId()); + } + } else { + // get the self-ip used by the load balancer + NicVO selfipNic = getPlaceholderNic(guestConfig); + if (selfipNic == null) { + s_logger.warn("Network shutdwon requested on external load balancer element, which did not implement the network." + + " Either network implement failed half way through or already network shutdown is completed. So just returning."); + return true; + } + selfIp = selfipNic.getIp4Address(); + } + + IpAddressTO ip = new IpAddressTO(guestConfig.getAccountId(), null, add, false, true, String.valueOf(guestVlanTag), selfIp, guestVlanNetmask, null, null, networkRate, false); + IpAddressTO[] ips = new IpAddressTO[1]; + ips[0] = ip; + IpAssocCommand cmd = new IpAssocCommand(ips); + Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); + + if (answer == null || !answer.getResult()) { + String action = add ? "implement" : "shutdown"; + String answerDetails = (answer != null) ? answer.getDetails() : "answer was null"; + String msg = "External load balancer was unable to " + action + " the guest network on the external load balancer in zone " + zone.getName() + " due to " + answerDetails; + s_logger.error(msg); + throw new ResourceUnavailableException(msg, Network.class, guestConfig.getId()); + } + + if (add) { + // Insert a new NIC for this guest network to reserve the self IP + savePlaceholderNic(guestConfig, selfIp); + } else { + // release the self-ip obtained from guest network + NicVO selfipNic = getPlaceholderNic(guestConfig); + _nicDao.remove(selfipNic.getId()); + + // release the load balancer allocated for the network + boolean releasedLB = freeLoadBalancerForNetwork(guestConfig); + if (!releasedLB) { + String msg = "Failed to release the external load balancer used for the network: " + guestConfig.getId(); + s_logger.error(msg); + } + } + + if (s_logger.isDebugEnabled()) { + Account account = _accountDao.findByIdIncludingRemoved(guestConfig.getAccountId()); + String action = add ? "implemented" : "shut down"; + s_logger.debug("External load balancer has " + action + " the guest network for account " + account.getAccountName() + "(id = " + account.getAccountId() + ") with VLAN tag " + guestVlanTag); + } + + return true; + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + super.configure(name, params); + _defaultLbCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); + return true; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) { + // TODO Auto-generated method stub + return null; + } + + @Override + public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, + Map details, List hostTags) { + if (!(startup[0] instanceof StartupExternalLoadBalancerCommand)) { + return null; + } + host.setType(Host.Type.ExternalLoadBalancer); + return host; + } + + @Override + public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException { + if (host.getType() != com.cloud.host.Host.Type.ExternalLoadBalancer) { + return null; + } + return new DeleteHostAnswer(true); + } + +} diff --git a/server/src/com/cloud/network/as/AutoScaleManager.java b/server/src/com/cloud/network/as/AutoScaleManager.java new file mode 100644 index 00000000000..fbfdc085665 --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScaleManager.java @@ -0,0 +1,16 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +public interface AutoScaleManager extends AutoScaleService { +} diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java new file mode 100644 index 00000000000..df38f0ace73 --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -0,0 +1,909 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.acl.ControlledEntity; +import com.cloud.api.ApiConstants; +import com.cloud.api.ApiDispatcher; +import com.cloud.api.BaseListAccountResourcesCmd; +import com.cloud.api.commands.CreateAutoScalePolicyCmd; +import com.cloud.api.commands.CreateAutoScaleVmGroupCmd; +import com.cloud.api.commands.CreateAutoScaleVmProfileCmd; +import com.cloud.api.commands.CreateConditionCmd; +import com.cloud.api.commands.CreateCounterCmd; +import com.cloud.api.commands.DeployVMCmd; +import com.cloud.api.commands.ListAutoScalePoliciesCmd; +import com.cloud.api.commands.ListAutoScaleVmGroupsCmd; +import com.cloud.api.commands.ListAutoScaleVmProfilesCmd; +import com.cloud.api.commands.ListConditionsCmd; +import com.cloud.api.commands.ListCountersCmd; +import com.cloud.api.commands.UpdateAutoScalePolicyCmd; +import com.cloud.api.commands.UpdateAutoScaleVmGroupCmd; +import com.cloud.api.commands.UpdateAutoScaleVmProfileCmd; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.event.ActionEvent; +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceInUseException; +import com.cloud.network.LoadBalancerVMMapVO; +import com.cloud.network.LoadBalancerVO; +import com.cloud.network.Network.Capability; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScalePolicyConditionMapVO; +import com.cloud.network.as.AutoScalePolicyVO; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO; +import com.cloud.network.as.AutoScaleVmGroupVO; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.as.AutoScaleVmProfileVO; +import com.cloud.network.as.Condition; +import com.cloud.network.as.ConditionVO; +import com.cloud.network.as.Counter; +import com.cloud.network.as.CounterVO; +import com.cloud.network.as.dao.AutoScalePolicyConditionMapDao; +import com.cloud.network.as.dao.AutoScalePolicyDao; +import com.cloud.network.as.dao.AutoScaleVmGroupDao; +import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDao; +import com.cloud.network.as.dao.AutoScaleVmProfileDao; +import com.cloud.network.as.dao.ConditionDao; +import com.cloud.network.as.dao.CounterDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.LoadBalancerVMMapDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.projects.Project.ListProjectResourcesCriteria; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.User; +import com.cloud.user.UserContext; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.Ternary; +import com.cloud.utils.component.Inject; +import com.cloud.utils.component.Manager; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.JoinBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.net.NetUtils; + +@Local(value = { AutoScaleService.class }) +public class AutoScaleManagerImpl implements AutoScaleService, Manager { + private static final Logger s_logger = Logger.getLogger(AutoScaleManagerImpl.class); + + String _name; + @Inject + AccountDao _accountDao; + @Inject + AccountManager _accountMgr; + @Inject + LoadBalancingRulesManager _lbRulesMgr; + @Inject + NetworkDao _networkDao; + @Inject + CounterDao _counterDao; + @Inject + ConditionDao _conditionDao; + @Inject + LoadBalancerVMMapDao _lb2VmMapDao; + @Inject + LoadBalancerDao _lbDao; + @Inject + AutoScaleVmProfileDao _autoScaleVmProfileDao; + @Inject + AutoScalePolicyDao _autoScalePolicyDao; + @Inject + AutoScalePolicyConditionMapDao _autoScalePolicyConditionMapDao; + @Inject + AutoScaleVmGroupDao _autoScaleVmGroupDao; + @Inject + AutoScaleVmGroupPolicyMapDao _autoScaleVmGroupPolicyMapDao; + @Inject + DataCenterDao _dcDao = null; + @Inject + UserDao _userDao; + @Inject + IPAddressDao _ipAddressDao; + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; + return true; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + public List getSupportedAutoScaleCounters(long networkid) + { + String autoScaleCapability = _lbRulesMgr.getLBCapability(networkid, Capability.AutoScaleCounters.getName()); + if (autoScaleCapability == null || autoScaleCapability.length() == 0) { + return null; + } + return Arrays.asList(autoScaleCapability.split(",")); + } + + public void validateAutoScaleCounters(long networkid, List counters) + { + List supportedCounters = getSupportedAutoScaleCounters(networkid); + if (supportedCounters == null) { + throw new InvalidParameterException("AutoScale is not supported in the network"); + } + for (Counter counter : counters) { + if (!supportedCounters.contains(counter.getSource())) { + throw new InvalidParameterException("AutoScale counter with source='" + counter.getSource() + "' is not supported " + + "in the network where lb is configured"); + } + } + } + + + private VO getEntityInDatabase(String paramName, Long id, GenericDao dao) + { + + VO vo = dao.findById(id); + + if (vo == null) { + throw new InvalidParameterValueException("Unable to find " + paramName); + } + + _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, (ControlledEntity) vo); + + return vo; + } + + private boolean isAutoScaleScaleUpPolicy(AutoScalePolicy policyVO) + { + return policyVO.getAction().equals("scaleup"); + } + + private List getAutoScalePolicies(String paramName, List policyIds, List counters, Integer interval, boolean scaleUpPolicies) + { + SearchBuilder policySearch = _autoScalePolicyDao.createSearchBuilder(); + policySearch.and("ids", policySearch.entity().getId(), Op.IN); + policySearch.done(); + SearchCriteria sc = policySearch.create(); + + sc.setParameters("ids", policyIds.toArray(new Object[0])); + List policies = _autoScalePolicyDao.search(sc, null); + + Integer prevQuietTime = 0; + + for (AutoScalePolicyVO policy : policies) { + Integer quietTime = policy.getQuietTime(); + if (prevQuietTime == 0) + prevQuietTime = quietTime; + Integer duration = policy.getDuration(); + if (interval != null && duration < interval) { + throw new InvalidParameterValueException("duration - " + duration + " specified in a policy cannot be less than vm group's interval - " + interval); + } + + if (interval != null && quietTime < interval) { + throw new InvalidParameterValueException("quietTime - " + quietTime + " specified in a policy cannot be less than vm group's interval - " + interval); + } + + if (quietTime != prevQuietTime) { + throw new InvalidParameterValueException("quietTime should be same for all the policies specified in " + paramName); + } + + if (scaleUpPolicies) { + if (!isAutoScaleScaleUpPolicy(policy)) { + throw new InvalidParameterValueException("Only provision policies can be specified in scaleuppolicyids"); + } + } + else { + if (isAutoScaleScaleUpPolicy(policy)) { + throw new InvalidParameterValueException("Only de-provision policies can be specified in scaledownpolicyids"); + } + } + List policyConditionMapVOs = _autoScalePolicyConditionMapDao.listByAll(policy.getId(), null); + for (AutoScalePolicyConditionMapVO policyConditionMapVO : policyConditionMapVOs) { + long conditionid = policyConditionMapVO.getConditionId(); + Condition condition = _conditionDao.findById(conditionid); + Counter counter = _counterDao.findById(condition.getCounterid()); + counters.add(counter); + } + policies.add(policy); + } + return policies; + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMPROFILE_CREATE, eventDescription = "creating autoscale vm profile") + public AutoScaleVmProfile createAutoScaleVmProfile(CreateAutoScaleVmProfileCmd cmd) { + + Account owner = _accountDao.findById(cmd.getAccountId()); + Account caller = UserContext.current().getCaller(); + _accountMgr.checkAccess(caller, null, true, owner); + + // validations + HashMap deployParams = cmd.getDeployParamMap(); + /* + * Just for making sure the values are right in other deploy params. + * For ex. if projectId is given as a string instead of an long value, this + * will be throwing an error. + */ + ApiDispatcher.setupParameters(new DeployVMCmd(), deployParams); + Long autoscaleUserId = cmd.getAutoscaleUserId(); + + if (autoscaleUserId != null) { + User autoscaleUser = _userDao.findById(autoscaleUserId); + if (autoscaleUser.getAccountId() != cmd.getEntityOwnerId()) { + throw new InvalidParameterValueException("AutoScale User id does not belong to the same account"); + } + } + else { + autoscaleUserId = UserContext.current().getCallerUserId(); + } + AutoScaleVmProfileVO profileVO = new AutoScaleVmProfileVO(cmd.getZoneId(), cmd.getDomainId(), cmd.getAccountId(), cmd.getServiceOfferingId(), cmd.getTemplateId(), cmd.getOtherDeployParams(), + cmd.getSnmpCommunity(), cmd.getSnmpPort(), cmd.getDestroyVmGraceperiod(), autoscaleUserId); + _autoScaleVmProfileDao.persist(profileVO); + return profileVO; + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMPROFILE_DELETE, eventDescription = "deleting autoscale vm profile") + public boolean deleteAutoScaleVmProfile(long id) { + /* Check if entity is in database */ + getEntityInDatabase("AutoScale Vm Profile", id, _autoScaleVmProfileDao); + if (_autoScaleVmGroupDao.isProfileInUse(id)) { + throw new InvalidParameterValueException("Cannot delete AutoScale Vm Profile when it is in use by one more vm groups"); + } + return _autoScaleVmProfileDao.remove(id); + } + + @Override + public List listAutoScaleVmProfiles(ListAutoScaleVmProfilesCmd cmd) { + Long id = cmd.getId(); + Long templateId = cmd.getTemplateId(); + String otherDeployParams = cmd.getOtherDeployParams(); + + SearchWrapper searchWrapper = new SearchWrapper(_autoScaleVmProfileDao, AutoScaleVmProfileVO.class, cmd, cmd.getId()); + SearchBuilder sb = searchWrapper.getSearchBuilder(); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("templateId", sb.entity().getTemplateId(), SearchCriteria.Op.EQ); + sb.and("otherDeployParams", sb.entity().getOtherDeployParams(), SearchCriteria.Op.LIKE); + SearchCriteria sc = searchWrapper.buildSearchCriteria(); + + if (id != null) { + sc.setParameters("id", id); + } + if (templateId != null) { + sc.setParameters("templateId", templateId); + } + if (otherDeployParams != null) { + sc.addAnd("otherDeployParams", SearchCriteria.Op.LIKE, "%" + otherDeployParams + "%"); + } + return searchWrapper.search(); + } + + @Override + public AutoScaleVmProfile updateAutoScaleVmProfile(UpdateAutoScaleVmProfileCmd cmd) { + Long profileId = cmd.getId(); + Long templateId = cmd.getTemplateId(); + String otherDeployParams = cmd.getOtherDeployParams(); + AutoScaleVmProfileVO vmProfile = getEntityInDatabase("Auto Scale Vm Profile", profileId, _autoScaleVmProfileDao); + + if (templateId != null) { + vmProfile.setTemplateId(templateId); + } + + if (otherDeployParams != null) { + vmProfile.setOtherDeployParams(otherDeployParams); + } + + List vmGroupList = _autoScaleVmGroupDao.listByAll(null, profileId); + for (AutoScaleVmGroupVO vmGroupVO : vmGroupList) { + if (vmGroupVO.getState() != "disabled") { + throw new InvalidParameterValueException("Cannot delete AutoScale Vm Profile when it is being used in one or more Enabled AutoScale Vm Groups."); + } + } + boolean success = _autoScaleVmProfileDao.update(profileId, vmProfile); + + if (success) { + s_logger.debug("Updated Auto Scale Vm Profile id=" + profileId); + return vmProfile; + } else + return null; + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEPOLICY_CREATE, eventDescription = "creating autoscale policy") + public AutoScalePolicy createAutoScalePolicy(CreateAutoScalePolicyCmd cmd) { + + // Account owner = _accountDao.findById(cmd.getAccountId()); + // Account caller = UserContext.current().getCaller(); + // _accountMgr.checkAccess(caller, null, true, owner); + + Integer duration = cmd.getDuration(); + Integer quietTime = cmd.getQuietTime(); + String action = cmd.getAction(); + + if (duration != null && duration < 0) { + throw new InvalidParameterValueException("duration is an invalid value: " + duration); + } + + if (quietTime != null && quietTime < 0) { + throw new InvalidParameterValueException("quiettime is an invalid value: " + quietTime); + } + + if (!NetUtils.isValidAutoScaleAction(action)) { + throw new InvalidParameterValueException("action is invalid, only 'provision' and 'de-provision' is supported"); + } + action = action.toLowerCase(); + + SearchBuilder policySearch = _conditionDao.createSearchBuilder(); + policySearch.and("ids", policySearch.entity().getId(), Op.IN); + policySearch.done(); + SearchCriteria sc = policySearch.create(); + + List conditionIds = cmd.getConditionIds(); + sc.setParameters("ids", conditionIds.toArray(new Object[0])); + List conditions = _conditionDao.search(sc, null); + + ArrayList counterIds = new ArrayList(); + ControlledEntity[] sameOwnerEntities = conditions.toArray(new ControlledEntity[conditions.size() + 1]); + AutoScalePolicyVO policyVO = new AutoScalePolicyVO(cmd.getDomainId(), cmd.getAccountId(), duration, quietTime, action); + sameOwnerEntities[sameOwnerEntities.length - 1] = policyVO; + _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, sameOwnerEntities); + + if (conditionIds.size() != conditions.size()) { + // TODO report the condition id which could not be found + throw new InvalidParameterValueException("Unable to find a condition specified"); + } + for (ConditionVO condition : conditions) { + if (counterIds.contains(condition.getCounterid())) { + throw new InvalidParameterValueException("atleast two conditions in the conditionids have the same counter. It is not right to apply two different conditions for the same counter"); + } + } + + final Transaction txn = Transaction.currentTxn(); + txn.start(); + + policyVO = _autoScalePolicyDao.persist(policyVO); + + for (Long conditionId : conditionIds) { + AutoScalePolicyConditionMapVO policyConditionMapVO = new AutoScalePolicyConditionMapVO(policyVO.getId(), conditionId); + _autoScalePolicyConditionMapDao.persist(policyConditionMapVO); + } + + txn.commit(); + + return policyVO; + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEPOLICY_DELETE, eventDescription = "deleting autoscale policy") + public boolean deleteAutoScalePolicy(long id) { + /* Check if entity is in database */ + getEntityInDatabase("AutoScale Policy", id, _autoScalePolicyDao); + + if (_autoScaleVmGroupPolicyMapDao.isAutoScalePolicyInUse(id)) { + throw new InvalidParameterValueException("Cannot delete AutoScale Policy when it is in use by one or more AutoScale Vm Groups"); + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + boolean success = true; + success = _autoScalePolicyDao.remove(id); + if (success) { + success = _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(id); + } + if (success) { + txn.commit(); + } + return success; // successful + } + + public void checkCallerAccess(String accountName, Long domainId) + { + Account caller = UserContext.current().getCaller(); + Account owner = _accountDao.findActiveAccount(accountName, domainId); + if (owner == null) { + throw new InvalidParameterValueException("Unable to find account " + accountName + " in domain " + domainId); + } + _accountMgr.checkAccess(caller, null, true, owner); + } + + private class SearchWrapper { + GenericDao dao; + SearchBuilder searchBuilder; + SearchCriteria searchCriteria; + Long domainId; + boolean isRecursive; + List permittedAccounts = new ArrayList(); + ListProjectResourcesCriteria listProjectResourcesCriteria; + Filter searchFilter; + + public SearchWrapper(GenericDao dao, Class entityClass, BaseListAccountResourcesCmd cmd, Long id) + { + this.dao = dao; + this.searchBuilder = dao.createSearchBuilder(); + domainId = cmd.getDomainId(); + String accountName = cmd.getAccountName(); + isRecursive = cmd.isRecursive(); + boolean listAll = cmd.listAll(); + long startIndex = cmd.getStartIndex(); + long pageSizeVal = cmd.getPageSizeVal(); + Account caller = UserContext.current().getCaller(); + + Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); + _accountMgr.buildACLSearchParameters(caller, id, accountName, null, permittedAccounts, domainIdRecursiveListProject, + listAll, false); + domainId = domainIdRecursiveListProject.first(); + isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + _accountMgr.buildACLSearchBuilder(searchBuilder, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + searchFilter = new Filter(entityClass, "id", false, startIndex, pageSizeVal); + } + + public SearchBuilder getSearchBuilder() { + return searchBuilder; + } + + public SearchCriteria buildSearchCriteria() + { + searchCriteria = searchBuilder.create(); + _accountMgr.buildACLSearchCriteria(searchCriteria, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + return searchCriteria; + } + + public List search() { + return dao.search(searchCriteria, searchFilter); + } + } + + @Override + public List listAutoScalePolicies(ListAutoScalePoliciesCmd cmd) { + SearchWrapper searchWrapper = new SearchWrapper(_autoScalePolicyDao, AutoScalePolicyVO.class, cmd, cmd.getId()); + SearchBuilder sb = searchWrapper.getSearchBuilder(); + Long id = cmd.getId(); + Long conditionId = cmd.getConditionId(); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + + if (conditionId != null) { + SearchBuilder asPolicyConditionSearch = _autoScalePolicyConditionMapDao.createSearchBuilder(); + asPolicyConditionSearch.and("conditionId", asPolicyConditionSearch.entity().getConditionId(), SearchCriteria.Op.EQ); + sb.join("asPolicyConditionSearch", asPolicyConditionSearch, sb.entity().getId(), asPolicyConditionSearch.entity().getPolicyId(), JoinBuilder.JoinType.INNER); + } + + SearchCriteria sc = searchWrapper.buildSearchCriteria(); + + if (id != null) { + sc.setParameters("id", id); + } + + if (conditionId != null) { + sc.setJoinParameters("asPolicyConditionSearch", "conditionId", conditionId); + } + return searchWrapper.search(); + } + + @Override + public AutoScalePolicy updateAutoScalePolicy(UpdateAutoScalePolicyCmd cmd) { + Long policyId = cmd.getId(); + Integer duration = cmd.getDuration(); + Integer quietTime = cmd.getQuietTime(); + AutoScalePolicyVO policy = getEntityInDatabase("Auto Scale Policy", policyId, _autoScalePolicyDao); + + if (duration != null) { + policy.setDuration(duration); + } + + if (quietTime != null) { + policy.setQuietTime(quietTime); + } + + List vmGroupPolicyList = _autoScaleVmGroupPolicyMapDao.listByPolicyId(policyId); + for (AutoScaleVmGroupPolicyMapVO vmGroupPolicy : vmGroupPolicyList) { + AutoScaleVmGroupVO vmGroupVO = _autoScaleVmGroupDao.findById(vmGroupPolicy.getVmGroupId()); + if (vmGroupVO.getState() != "disabled") { + throw new InvalidParameterValueException("Cannot delete AutoScale Policy when it is being used in one or more Enabled AutoScale Vm Groups."); + } + } + boolean success = _autoScalePolicyDao.update(policyId, policy); + + if (success) { + s_logger.debug("Updated Auto Scale Policy id=" + policyId); + return policy; + } else + return null; + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMGROUP_CREATE, eventDescription = "creating autoscale vm group") + public AutoScaleVmGroup createAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) { + int minMembers = cmd.getMinMembers(); + int maxMembers = cmd.getMaxMembers(); + + if (minMembers < 0) { + throw new InvalidParameterValueException(ApiConstants.MIN_MEMBERS + " is an invalid value: " + minMembers); + } + + if (maxMembers < 0) { + throw new InvalidParameterValueException(ApiConstants.MAX_MEMBERS + " is an invalid value: " + maxMembers); + } + if (minMembers > maxMembers) { + throw new InvalidParameterValueException(ApiConstants.MIN_MEMBERS + " cannot be greater than " + ApiConstants.MAX_MEMBERS + ", range is invalid: " + minMembers + "-" + maxMembers); + } + + Integer interval = cmd.getInterval(); + if (interval != null && interval < 0) { + throw new InvalidParameterValueException("interval is an invalid value: " + interval); + } + + LoadBalancerVO loadBalancer = getEntityInDatabase(ApiConstants.LBID, cmd.getLbRuleId(), _lbDao); + + // Account owner = _accountDao.findById(loadBalancer.getAccountId()); + // Account caller = UserContext.current().getCaller(); + // _accountMgr.checkAccess(caller, null, true, owner); + + Long zoneId = _ipAddressDao.findById(loadBalancer.getSourceIpAddressId()).getDataCenterId(); + + AutoScaleVmProfileVO profileVO = getEntityInDatabase(ApiConstants.VMPROFILE_ID, cmd.getProfileId(), _autoScaleVmProfileDao); + + List existingVmGroupVO = _autoScaleVmGroupDao.listByAll(loadBalancer.getId(), null); + if (existingVmGroupVO.size() > 0) { + throw new InvalidParameterValueException("an AutoScaleVmGroup is already attached to the lb rule, the existing vm group has to be first deleted"); + } + + List mappedInstances = _lb2VmMapDao.listByLoadBalancerId(loadBalancer.getId(), false); + if (mappedInstances.size() > 0) { + throw new InvalidParameterValueException("there are Vms already bound to the specified LoadBalancing Rule. User bound Vms and AutoScaled Vm Group cannot co-exist on a Load Balancing Rule"); + } + + List counters = new ArrayList(); + List policies = new ArrayList(); + policies.addAll(getAutoScalePolicies("scaleuppolicyid", cmd.getScaleUpPolicyIds(), counters, interval, true)); + policies.addAll(getAutoScalePolicies("scaledownpolicyid", cmd.getScaleDownPolicyIds(), counters, interval, false)); + + ControlledEntity[] sameOwnerEntities = policies.toArray(new ControlledEntity[policies.size() + 2]); + sameOwnerEntities[sameOwnerEntities.length - 2] = loadBalancer; + sameOwnerEntities[sameOwnerEntities.length - 1] = profileVO; + _accountMgr.checkAccess(UserContext.current().getCaller(), null, true, sameOwnerEntities); + + // validateAutoScaleCounters(loadBalancer.getNetworkId(), counters); + + final Transaction txn = Transaction.currentTxn(); + txn.start(); + + AutoScaleVmGroupVO vmGroupVO = new AutoScaleVmGroupVO(cmd.getLbRuleId(), zoneId, loadBalancer.getDomainId(), loadBalancer.getAccountId(), minMembers, maxMembers, loadBalancer.getDefaultPortStart(), interval, + cmd.getProfileId(), "enabled"); + vmGroupVO = _autoScaleVmGroupDao.persist(vmGroupVO); + + for (AutoScalePolicyVO autoScalePolicyVO : policies) { + _autoScaleVmGroupPolicyMapDao.persist(new AutoScaleVmGroupPolicyMapVO(vmGroupVO.getId(), autoScalePolicyVO.getId())); + } + txn.commit(); + return vmGroupVO; + } + + @Override + public boolean configureAutoScaleVmGroup(CreateAutoScaleVmGroupCmd cmd) { + return _lbRulesMgr.configureLbAutoScaleVmGroup(cmd.getEntityId(), true); + } + + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMGROUP_DELETE, eventDescription = "deleting autoscale vm group") + public boolean deleteAutoScaleVmGroup(long id) { + /* Check if entity is in database */ + AutoScaleVmGroupVO autoScaleVmGroupVO = getEntityInDatabase("AutoScale Vm Group", id, _autoScaleVmGroupDao); + autoScaleVmGroupVO.setRevoke(true); + + // TODO: call configureAutoScaleVmGroup + + Transaction txn = Transaction.currentTxn(); + txn.start(); + boolean success = _autoScaleVmGroupDao.remove(id); + if (success) + success = _autoScaleVmGroupPolicyMapDao.remove(id); + if (success) + txn.commit(); + return success; + } + + @Override + public List listAutoScaleVmGroups(ListAutoScaleVmGroupsCmd cmd) { + Long id = cmd.getId(); + Long policyId = cmd.getPolicyId(); + Long loadBalancerId = cmd.getLoadBalancerId(); + Long profileId = cmd.getProfileId(); + Long zoneId = cmd.getZoneId(); + + SearchWrapper searchWrapper = new SearchWrapper(_autoScaleVmGroupDao, AutoScaleVmGroupVO.class, cmd, cmd.getId()); + SearchBuilder sb = searchWrapper.getSearchBuilder(); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("loadBalancerId", sb.entity().getLoadBalancerId(), SearchCriteria.Op.EQ); + sb.and("profileId", sb.entity().getProfileId(), SearchCriteria.Op.EQ); + sb.and("zoneId", sb.entity().getZoneId(), SearchCriteria.Op.EQ); + + if (policyId != null) { + SearchBuilder asVmGroupPolicySearch = _autoScaleVmGroupPolicyMapDao.createSearchBuilder(); + asVmGroupPolicySearch.and("policyId", asVmGroupPolicySearch.entity().getPolicyId(), SearchCriteria.Op.EQ); + sb.join("asVmGroupPolicySearch", asVmGroupPolicySearch, sb.entity().getId(), asVmGroupPolicySearch.entity().getVmGroupId(), JoinBuilder.JoinType.INNER); + } + + SearchCriteria sc = searchWrapper.buildSearchCriteria(); + if (id != null) { + sc.setParameters("id", id); + } + if (loadBalancerId != null) { + sc.setParameters("loadBalancerId", loadBalancerId); + } + if (profileId != null) { + sc.setParameters("profileId", profileId); + } + if (zoneId != null) { + sc.setParameters("zoneId", zoneId); + } + if (policyId != null) { + sc.setJoinParameters("asVmGroupPolicySearch", "policyId", policyId); + } + return searchWrapper.search(); + } + + @Override + public AutoScaleVmGroup updateAutoScaleVmGroup(UpdateAutoScaleVmGroupCmd cmd) { + Long vmGroupId = cmd.getId(); + Integer minMembers = cmd.getMinMembers(); + Integer maxMembers = cmd.getMaxMembers(); + List scaleUpPolicyIds = cmd.getScaleUpPolicyIds(); + List scaleDownPolicyIds = cmd.getScaleDownPolicyIds(); + + AutoScaleVmGroupVO vmGroupVO = getEntityInDatabase("Auto Scale Vm Group", vmGroupId, _autoScaleVmGroupDao); + + if (minMembers < 0) { + throw new InvalidParameterValueException(ApiConstants.MIN_MEMBERS + " is an invalid value: " + minMembers); + } + + if (maxMembers < 0) { + throw new InvalidParameterValueException(ApiConstants.MAX_MEMBERS + " is an invalid value: " + maxMembers); + } + if (minMembers > maxMembers) { + throw new InvalidParameterValueException(ApiConstants.MIN_MEMBERS + " cannot be greater than " + ApiConstants.MAX_MEMBERS + ", range is invalid: " + minMembers + "-" + maxMembers); + } + + if (vmGroupVO.getState() == "enabled") { + throw new InvalidParameterValueException("Cannot delete AutoScale Vm Groups when it is in Enabled state."); + } + + if (minMembers != null) { + vmGroupVO.setMinMembers(minMembers); + } + + if (maxMembers != null) { + vmGroupVO.setMaxMembers(maxMembers); + } + if (scaleDownPolicyIds != null) { + // TODO - checkIDs and set + } + + if (scaleUpPolicyIds != null) { + // TODO - checkIDs and set + } + + boolean success = _autoScaleVmGroupDao.update(vmGroupId, vmGroupVO); + + if (success) { + s_logger.debug("Updated Auto Scale VmGroup id=" + vmGroupId); + return vmGroupVO; + } else + return null; + } + + @Override + public AutoScaleVmGroup enableAutoScaleVmGroup(Long id) { + AutoScaleVmGroupVO vmGroup = getEntityInDatabase("Auto Scale Vm Group", id, _autoScaleVmGroupDao); + boolean success = false; + if (vmGroup.getState() == "enabled") { + throw new InvalidParameterValueException("The AutoScale Vm Group is already in Enabled state."); + } else { + vmGroup.setState("enabled"); + success = _lbRulesMgr.configureLbAutoScaleVmGroup(id, false); + } + if (success) + return vmGroup; + else + return null; + } + + @Override + public AutoScaleVmGroup disableAutoScaleVmGroup(Long id) { + AutoScaleVmGroupVO vmGroup = getEntityInDatabase("Auto Scale Vm Group", id, _autoScaleVmGroupDao); + boolean success = false; + if (vmGroup.getState() == "disabled") { + throw new InvalidParameterValueException("The AutoScale Vm Group is already in Disabled state."); + } else { + vmGroup.setState("disabled"); + success = _lbRulesMgr.configureLbAutoScaleVmGroup(id, false); + } + if (success) + return vmGroup; + else + return null; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_COUNTER_CREATE, eventDescription = "Counter", create = true) + @DB + public Counter createCounter(CreateCounterCmd cmd) { + String source = cmd.getSource().toLowerCase(); + String name = cmd.getName(); + Counter.Source src; + // Validate Source + try { + src = Counter.Source.valueOf(source); + } catch (Exception ex) { + throw new InvalidParameterValueException("The Source " + source + " does not exist; Unable to create Counter"); + } + + CounterVO counter = null; + + s_logger.debug("Adding Counter " + name); + counter = _counterDao.persist(new CounterVO(src, name, cmd.getValue())); + + UserContext.current().setEventDetails(" Id: " + counter.getId() + " Name: " + name); + return counter; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_CONDITION_CREATE, eventDescription = "Condition", create = true) + @DB + public Condition createCondition(CreateConditionCmd cmd) { + checkCallerAccess(cmd.getAccountName(), cmd.getDomainId()); + String opr = cmd.getRelationalOperator().toUpperCase(); + long cid = cmd.getCounterId(); + long threshold = cmd.getThreshold(); + Condition.Operator op; + // Validate Relational Operator + try { + op = Condition.Operator.valueOf(opr); + } catch (IllegalArgumentException ex) { + throw new InvalidParameterValueException("The Operator " + opr + " does not exist; Unable to create Condition."); + } + // TODO - Validate threshold + + CounterVO counter = _counterDao.findById(cid); + + if (counter == null) { + throw new InvalidParameterValueException("Unable to find condition - " + cid); + } + ConditionVO condition = null; + + s_logger.debug("Adding Condition "); + condition = _conditionDao.persist(new ConditionVO(cid, threshold, cmd.getEntityOwnerId(), cmd.getDomainId(), op)); + + UserContext.current().setEventDetails(" Id: " + condition.getId()); + return condition; + } + + @Override + public List listCounters(ListCountersCmd cmd) { + String name = cmd.getName(); + Long id = cmd.getId(); + String source = cmd.getSource(); + if(source != null ) + source = source.toLowerCase(); + + Filter searchFilter = new Filter(CounterVO.class, "created", false, cmd.getStartIndex(), cmd.getPageSizeVal()); + + List counters = _counterDao.listCounters(id, name, source, cmd.getKeyword(), searchFilter); + + return counters; + } + + @Override + public List listConditions(ListConditionsCmd cmd) { + Long id = cmd.getId(); + Long counterId = cmd.getCounterId(); + SearchWrapper searchWrapper = new SearchWrapper(_conditionDao, ConditionVO.class, cmd, cmd.getId()); + SearchBuilder sb = searchWrapper.getSearchBuilder(); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("counterId", sb.entity().getCounterid(), SearchCriteria.Op.EQ); + + // now set the SC criteria... + SearchCriteria sc = searchWrapper.buildSearchCriteria(); + + if (id != null) { + sc.addAnd("id", SearchCriteria.Op.EQ, id); + } + + if (counterId != null) { + sc.addAnd("counterId", SearchCriteria.Op.EQ, counterId); + } + + return searchWrapper.search(); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_COUNTER_DELETE, eventDescription = "counter") + public boolean deleteCounter(long counterId) throws ResourceInUseException { + // Verify Counter id + CounterVO counter = _counterDao.findById(counterId); + if (counter == null) { + throw new InvalidParameterValueException("Unable to find Counter"); + } + + // Verify if it is used in any Condition + + ConditionVO condition = _conditionDao.findByCounterId(counterId); + if (condition != null) { + s_logger.info("Cannot delete counter " + counter.getName() + " as it is being used in a condition."); + throw new ResourceInUseException("Counter is in use."); + } + + s_logger.debug("Deleting Counter " + counter.getName()); + return _counterDao.remove(counterId); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_COUNTER_DELETE, eventDescription = "condition") + public boolean deleteCondition(long conditionId) throws ResourceInUseException { + /* Check if entity is in database */ + ConditionVO condition = getEntityInDatabase("Condition", conditionId, _conditionDao); + if (condition == null) { + throw new InvalidParameterValueException("Unable to find Condition"); + } + + // Verify if condition is used in any autoscale policy + if (_autoScalePolicyConditionMapDao.isConditionInUse(conditionId)) { + s_logger.info("Cannot delete condition " + conditionId + " as it is being used in a condition."); + throw new ResourceInUseException("Cannot delete Condition when it is in use by one or more AutoScale Policies."); + } + s_logger.debug("Deleting Condition " + condition.getId()); + return _conditionDao.remove(conditionId); + } + +} diff --git a/server/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java b/server/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java new file mode 100644 index 00000000000..434f7cd21f7 --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScalePolicyConditionMapVO.java @@ -0,0 +1,71 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name=("autoscale_policy_condition_map")) +public class AutoScalePolicyConditionMapVO { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="id") + private long id; + + @Column(name="policy_id") + private long policyId; + + @Column(name="condition_id") + private long conditionId; + + @Column(name="revoke") + private boolean revoke = false; + + public AutoScalePolicyConditionMapVO() { } + + public AutoScalePolicyConditionMapVO(long policyId, long conditionId) { + this.policyId = policyId; + this.conditionId = conditionId; + } + + public AutoScalePolicyConditionMapVO(long policyId, long conditionId, boolean revoke) { + this(policyId, conditionId); + this.revoke = revoke; + } + + public long getId() { + return id; + } + + public long getPolicyId() { + return policyId; + } + + public long getConditionId() { + return conditionId; + } + + public boolean isRevoke() { + return revoke; + } + + public void setRevoke(boolean revoke) { + this.revoke = revoke; + } +} diff --git a/server/src/com/cloud/network/as/AutoScalePolicyVO.java b/server/src/com/cloud/network/as/AutoScalePolicyVO.java new file mode 100644 index 00000000000..3417a0939a0 --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScalePolicyVO.java @@ -0,0 +1,132 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import java.util.Date; +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; + +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.net.NetUtils; + +@Entity +@Table(name = "autoscale_policies") +@Inheritance(strategy = InheritanceType.JOINED) +public class AutoScalePolicyVO implements AutoScalePolicy { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + long id; + + @Column(name = "uuid") + String uuid; + + @Column(name = "domain_id") + private long domainId; + + @Column(name = "account_id") + private long accountId; + + @Column(name = "duration") + private Integer duration; + + @Column(name = "quiet_time", updatable = true, nullable = false) + private Integer quietTime = NetUtils.DEFAULT_AUTOSCALE_POLICY_QUIET_TIME; + + @Column(name = "action", updatable = false, nullable = false) + private String action; + + @Column(name = GenericDao.REMOVED_COLUMN) + protected Date removed; + + @Column(name = GenericDao.CREATED_COLUMN) + protected Date created; + + public AutoScalePolicyVO() { + } + + public AutoScalePolicyVO(long domainId, long accountId, Integer duration, Integer quietTime, String action) { + this.uuid = UUID.randomUUID().toString(); + this.domainId = domainId; + this.accountId = accountId; + this.duration = duration; + if (quietTime != null) { + this.quietTime = quietTime; + } + this.action = action; + } + + @Override + public String toString() { + return new StringBuilder("AutoScalePolicy[").append("id-").append(id).append("]").toString(); + } + + @Override + public long getId() { + return id; + } + + public String getUuid() { + return uuid; + } + + @Override + public long getDomainId() { + return domainId; + } + + @Override + public long getAccountId() { + return accountId; + } + + @Override + public Integer getDuration() { + return duration; + } + + @Override + public Integer getQuietTime() { + return quietTime; + } + + @Override + public String getAction() { + return action; + } + + public Date getRemoved() { + return removed; + } + + public Date getCreated() { + return created; + } + + public void setDuration(Integer duration) { + this.duration = duration; + } + + public void setQuietTime(Integer quietTime) { + this.quietTime = quietTime; + } +} diff --git a/server/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java b/server/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java new file mode 100644 index 00000000000..07c6c917770 --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScaleVmGroupPolicyMapVO.java @@ -0,0 +1,70 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name=("autoscale_vmgroup_policy_map")) +public class AutoScaleVmGroupPolicyMapVO { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="id") + private long id; + + @Column(name="vmgroup_id") + private long vmGroupId; + + @Column(name="policy_id") + private long policyId; + + @Column(name="revoke") + private boolean revoke = false; + + public AutoScaleVmGroupPolicyMapVO() { } + + public AutoScaleVmGroupPolicyMapVO(long vmGroupId, long policyId) { + this.vmGroupId = vmGroupId; + this.policyId = policyId; + } + + public AutoScaleVmGroupPolicyMapVO(long vmgroupId, long policyId, boolean revoke) { + this(vmgroupId, policyId); + this.revoke = revoke; + } + + public long getId() { + return id; + } + + public long getVmGroupId() { + return vmGroupId; + } + + public long getPolicyId() { + return policyId; + } + + public boolean isRevoke() { + return revoke; + } + + public void setRevoke(boolean revoke) { + this.revoke = revoke; + } +} diff --git a/server/src/com/cloud/network/as/AutoScaleVmGroupVO.java b/server/src/com/cloud/network/as/AutoScaleVmGroupVO.java new file mode 100644 index 00000000000..fb4a5c68ddb --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScaleVmGroupVO.java @@ -0,0 +1,187 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import java.util.Date; +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; + +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.net.NetUtils; + +@Entity +@Table(name = "autoscale_vmgroups") +@Inheritance(strategy = InheritanceType.JOINED) +public class AutoScaleVmGroupVO implements AutoScaleVmGroup { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + long id; + + @Column(name = "uuid") + String uuid; + + @Column(name = "zone_id", updatable = false) + private long zoneId; + + @Column(name = "domain_id", updatable = false) + private long domainId; + + @Column(name = "account_id") + private long accountId; + + @Column(name = "load_balancer_id") + private long loadBalancerId; + + @Column(name = "min_members", updatable = true) + private int minMembers; + + @Column(name = "max_members", updatable = true) + private int maxMembers; + + @Column(name = "member_port") + private int memberPort; + + @Column(name = "interval") + private Integer interval = NetUtils.DEFAULT_AUTOSCALE_POLICY_INTERVAL_TIME; + + @Column(name = "profile_id") + private long profileId; + + @Column(name = GenericDao.REMOVED_COLUMN) + protected Date removed; + + @Column(name = GenericDao.CREATED_COLUMN) + protected Date created; + + @Column(name = "revoke") + private boolean revoke = false; + + @Column(name = "state") + private String state; + + public AutoScaleVmGroupVO() { + } + + public AutoScaleVmGroupVO(long lbRuleId, long zoneId, long domainId, long accountId, Integer minMembers, Integer maxMembers, Integer memberPort, Integer interval, long profileId, String state) { + this.uuid = UUID.randomUUID().toString(); + this.minMembers = minMembers; + this.maxMembers = maxMembers; + this.memberPort = memberPort; + this.profileId = profileId; + this.accountId = accountId; + this.domainId = domainId; + this.zoneId = zoneId; + this.state = state; + if (interval != null) { + this.interval = interval; + } + } + + @Override + public String toString() { + return new StringBuilder("AutoScaleVmGroupVO[").append("id").append("]").toString(); + } + + @Override + public long getId() { + return id; + } + + public long getZoneId() { + return zoneId; + } + + @Override + public long getDomainId() { + return domainId; + } + + @Override + public long getAccountId() { + return accountId; + } + + @Override + public long getLoadBalancerId() { + return loadBalancerId; + } + + @Override + public int getMinMembers() { + return minMembers; + } + + @Override + public int getMaxMembers() { + return maxMembers; + } + + @Override + public int getMemberPort() { + return memberPort; + } + + @Override + public int getInterval() { + return interval; + } + + @Override + public long getProfileId() { + return profileId; + } + + public Date getRemoved() { + return removed; + } + + public Date getCreated() { + return created; + } + + @Override + public boolean isRevoke() { + return false; + } + + public void setRevoke(boolean revoke) { + this.revoke = revoke; + } + + @Override + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public void setMinMembers(int minMembers) { + this.minMembers = minMembers; + } + + public void setMaxMembers(int maxMembers) { + this.maxMembers = maxMembers; + } +} diff --git a/server/src/com/cloud/network/as/AutoScaleVmProfileVO.java b/server/src/com/cloud/network/as/AutoScaleVmProfileVO.java new file mode 100644 index 00000000000..ecda5e65e88 --- /dev/null +++ b/server/src/com/cloud/network/as/AutoScaleVmProfileVO.java @@ -0,0 +1,212 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as; + +import java.util.Date; +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.Table; + +import com.cloud.api.Identity; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.net.NetUtils; + +@Entity +@Table(name = "autoscale_vmprofiles") +@Inheritance(strategy = InheritanceType.JOINED) +public class AutoScaleVmProfileVO implements AutoScaleVmProfile, Identity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + protected long id; + + @Column(name = "uuid") + protected String uuid; + + @Column(name = "zone_id", updatable = true, nullable = false) + protected Long zoneId; + + @Column(name = "domain_id", updatable = true) + private long domainId; + + @Column(name = "account_id") + private long accountId; + + @Column(name = "autoscale_user_id") + private long autoscaleUserId; + + @Column(name = "service_offering_id", updatable = true, nullable = false) + private Long serviceOfferingId; + + @Column(name = "template_id", updatable = true, nullable = false, length = 17) + private Long templateId; + + @Column(name = "other_deploy_params", updatable = true, length = 1024) + private String otherDeployParams; + + @Column(name = "destroy_vm_grace_period", updatable = true) + private Integer destroyVmGraceperiod = NetUtils.DEFAULT_AUTOSCALE_VM_DESTROY_TIME; + + @Column(name = "snmp_community", updatable = true) + private String snmpCommunity = NetUtils.DEFAULT_SNMP_COMMUNITY; + + @Column(name = "snmp_port", updatable = true) + private Integer snmpPort = NetUtils.DEFAULT_SNMP_PORT; + + @Column(name = GenericDao.REMOVED_COLUMN) + protected Date removed; + + @Column(name = GenericDao.CREATED_COLUMN) + protected Date created; + + public AutoScaleVmProfileVO() { + } + + public AutoScaleVmProfileVO(long zoneId, long domainId, long accountId, long serviceOfferingId, long templateId, String otherDeployParams, String snmpCommunity, Integer snmpPort, Integer destroyVmGraceperiod, + long autoscaleUserId) { + this.uuid = UUID.randomUUID().toString(); + setZoneId(zoneId); + setDomainId(domainId); + setAccountId(accountId); + setServiceOfferingId(serviceOfferingId); + setTemplateId(templateId); + setOtherDeployParams(otherDeployParams); + setAutoscaleUserId(autoscaleUserId); + if (destroyVmGraceperiod != null) { + setDestroyVmGraceperiod(destroyVmGraceperiod); + } + if (snmpCommunity != null) { + setSnmpCommunity(snmpCommunity); + } + if (snmpPort != null) { + setSnmpPort(snmpPort); + } + } + + @Override + public String toString() { + return new StringBuilder("AutoScaleVMProfileVO[").append("id").append(id).append("-").append("templateId").append("-").append(templateId).append("]").toString(); + } + + @Override + public Long getTemplateId() { + return templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + @Override + public Long getServiceOfferingId() { + return serviceOfferingId; + } + + public void setServiceOfferingId(Long serviceOfferingId) { + this.serviceOfferingId = serviceOfferingId; + } + + @Override + public String getOtherDeployParams() { + return otherDeployParams; + } + + public void setOtherDeployParams(String otherDeployParams) { + this.otherDeployParams = otherDeployParams; + } + + @Override + public String getSnmpCommunity() { + return snmpCommunity; + } + + public void setSnmpCommunity(String snmpCommunity) { + this.snmpCommunity = snmpCommunity; + } + + @Override + public Integer getSnmpPort() { + return snmpPort; + } + + public void setSnmpPort(Integer snmpPort) { + this.snmpPort = snmpPort; + } + + @Override + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public void setZoneId(long zoneId) { + this.zoneId = zoneId; + } + + public void setAutoscaleUserId(long autoscaleUserId) { + this.autoscaleUserId = autoscaleUserId; + } + + @Override + public Long getZoneId() { + return zoneId; + } + + public void setAccountId(long accountId) { + this.accountId = accountId; + } + + @Override + public long getAccountId() { + return accountId; + } + + public void setDomainId(Long domainId) { + this.domainId = domainId; + } + + @Override + public long getDomainId() { + return domainId; + } + + @Override + public long getId() { + return id; + } + + @Override + public Integer getDestroyVmGraceperiod() { + return destroyVmGraceperiod; + } + + public void setDestroyVmGraceperiod(Integer destroyVmGraceperiod) { + this.destroyVmGraceperiod = destroyVmGraceperiod; + } + + @Override + public long getAutoScaleUserId() { + return autoscaleUserId; + } +} diff --git a/server/src/com/cloud/network/as/ConditionVO.java b/server/src/com/cloud/network/as/ConditionVO.java new file mode 100644 index 00000000000..7c004cf0894 --- /dev/null +++ b/server/src/com/cloud/network/as/ConditionVO.java @@ -0,0 +1,132 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as; + +import java.util.Date; +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.cloud.api.Identity; +import com.cloud.utils.db.GenericDao; + +@Entity +@Table(name = "conditions") +public class ConditionVO implements Condition, Identity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "counter_id") + private long counterid; + + @Column(name = "threshold") + private long threshold; + + @Column(name = "relational_operator") + @Enumerated(value = EnumType.STRING) + private Operator relationalOperator; + + @Column(name = "domain_id") + protected long domainId; + + @Column(name = "account_id") + protected long accountId; + + @Column(name = "uuid") + private String uuid; + + @Column(name = GenericDao.REMOVED_COLUMN) + Date removed; + + @Column(name = GenericDao.CREATED_COLUMN) + Date created; + + public ConditionVO() { + } + + public ConditionVO(long counterid, long threshold, long accountId, long domainId, Operator relationalOperator) { + this.counterid = counterid; + this.threshold = threshold; + this.relationalOperator = relationalOperator; + this.accountId = accountId; + this.domainId = domainId; + this.uuid = UUID.randomUUID().toString(); + } + + public Date getCreated() { + return created; + } + + @Override + public long getId() { + return id; + } + + @Override + public String toString() { + return new StringBuilder("Condition[").append("id-").append(id).append("]").toString(); + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public long getCounterid() { + return counterid; + } + + @Override + public long getThreshold() { + return threshold; + } + + @Override + public Operator getRelationalOperator() { + return relationalOperator; + } + + @Override + public long getAccountId() { + return accountId; + } + + @Override + public long getDomainId() { + return domainId; + } + + @Override + public String getUuid() { + return this.uuid; + } + + public Date getRemoved() { + return removed; + } +} \ No newline at end of file diff --git a/server/src/com/cloud/network/as/CounterVO.java b/server/src/com/cloud/network/as/CounterVO.java new file mode 100644 index 00000000000..aad81aaf817 --- /dev/null +++ b/server/src/com/cloud/network/as/CounterVO.java @@ -0,0 +1,114 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as; + +import java.util.Date; +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.cloud.api.Identity; +import com.cloud.utils.db.GenericDao; + +@Entity +@Table(name = "counter") +public class CounterVO implements Counter, Identity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "source") + @Enumerated(value = EnumType.STRING) + private Source source; + + @Column(name = "name") + private String name; + + @Column(name = "value") + private String value; + + @Column(name = "uuid") + private String uuid; + + @Column(name = GenericDao.REMOVED_COLUMN) + Date removed; + + @Column(name = GenericDao.CREATED_COLUMN) + Date created; + + public CounterVO() { + } + + public CounterVO(Source source, String name, String value) { + this.source = source; + this.name = name; + this.value = value; + this.uuid = UUID.randomUUID().toString(); + } + + @Override + public String toString() { + return new StringBuilder("Counter[").append("id-").append(id).append("]").toString(); + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public Source getSource() { + return source; + } + + @Override + public long getId() { + return id; + } + + @Override + public String getUuid() { + return this.uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public Date getRemoved() { + return removed; + } + + public Date getCreated() { + return created; + } +} \ No newline at end of file diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java b/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java new file mode 100644 index 00000000000..13624aa8b1f --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDao.java @@ -0,0 +1,24 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import java.util.List; + +import com.cloud.network.as.AutoScalePolicyConditionMapVO; +import com.cloud.utils.db.GenericDao; + +public interface AutoScalePolicyConditionMapDao extends GenericDao { + List listByAll(Long policyId, Long conditionId); + public boolean isConditionInUse(Long conditionId); + boolean removeByAutoScalePolicyId(long id); +} diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java new file mode 100644 index 00000000000..886b3ec931b --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScalePolicyConditionMapDaoImpl.java @@ -0,0 +1,54 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.network.as.AutoScalePolicyConditionMapVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchCriteria; + +@Local(value={AutoScalePolicyConditionMapDao.class}) +public class AutoScalePolicyConditionMapDaoImpl extends GenericDaoBase implements AutoScalePolicyConditionMapDao { + + private SearchCriteria getSearchCriteria(Long policyId, Long conditionId) + { + SearchCriteria sc = createSearchCriteria(); + + if(policyId != null) + sc.addAnd("policyId", SearchCriteria.Op.EQ, policyId); + + if(conditionId != null) + sc.addAnd("conditionId", SearchCriteria.Op.EQ, conditionId); + + return sc; + } + + @Override + public List listByAll(Long policyId, Long conditionId) { + return listBy(getSearchCriteria(policyId, conditionId)); + } + + public boolean isConditionInUse(Long conditionId) { + return findOneBy(getSearchCriteria(null, conditionId)) != null; + } + + @Override + public boolean removeByAutoScalePolicyId(long policyId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("policyId", SearchCriteria.Op.EQ, policyId); + return expunge(sc) > 0; + } +} diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyDao.java b/server/src/com/cloud/network/as/dao/AutoScalePolicyDao.java new file mode 100644 index 00000000000..646fa364a7e --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScalePolicyDao.java @@ -0,0 +1,19 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import com.cloud.network.as.AutoScalePolicyVO; +import com.cloud.utils.db.GenericDao; + +public interface AutoScalePolicyDao extends GenericDao { +} diff --git a/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java new file mode 100644 index 00000000000..868398dc35e --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScalePolicyDaoImpl.java @@ -0,0 +1,22 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import javax.ejb.Local; + +import com.cloud.network.as.AutoScalePolicyVO; +import com.cloud.utils.db.GenericDaoBase; + +@Local(value = { AutoScalePolicyDao.class }) +public class AutoScalePolicyDaoImpl extends GenericDaoBase implements AutoScalePolicyDao { +} diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java new file mode 100644 index 00000000000..d98093a4ba1 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDao.java @@ -0,0 +1,24 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import java.util.List; + +import com.cloud.network.as.AutoScaleVmGroupVO; +import com.cloud.utils.db.GenericDao; + +public interface AutoScaleVmGroupDao extends GenericDao { + List listByAll(Long loadBalancerId, Long profileId); + boolean isProfileInUse(long profileId); + boolean isAutoScaleLoadBalancer(Long loadBalancerId); +} diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java new file mode 100644 index 00000000000..5735272b2f6 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupDaoImpl.java @@ -0,0 +1,58 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.network.as.AutoScaleVmGroupVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Func; + +@Local(value = { AutoScaleVmGroupDao.class }) +public class AutoScaleVmGroupDaoImpl extends GenericDaoBase implements AutoScaleVmGroupDao { + + @Override + public List listByAll(Long loadBalancerId, Long profileId) { + SearchCriteria sc = createSearchCriteria(); + + if(loadBalancerId != null) + sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); + + if(profileId != null) + sc.addAnd("profileId", SearchCriteria.Op.EQ, profileId); + + return listBy(sc); + } + + @Override + public boolean isProfileInUse(long profileId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("profileId", SearchCriteria.Op.EQ, profileId); + return findOneBy(sc) != null; + } + + @Override + public boolean isAutoScaleLoadBalancer(Long loadBalancerId) { + GenericSearchBuilder CountByAccount = createSearchBuilder(Long.class); + CountByAccount.select(null, Func.COUNT, null); + CountByAccount.and("loadBalancerId", CountByAccount.entity().getLoadBalancerId(), SearchCriteria.Op.EQ); + + SearchCriteria sc = CountByAccount.create(); + sc.setParameters("loadBalancerId", loadBalancerId); + return customSearch(sc, null).get(0) > 0; + } +} diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java new file mode 100644 index 00000000000..83c5e1546f4 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDao.java @@ -0,0 +1,26 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import java.util.List; + +import com.cloud.network.LoadBalancerVMMapVO; +import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO; +import com.cloud.utils.db.GenericDao; + +public interface AutoScaleVmGroupPolicyMapDao extends GenericDao { + boolean removeByGroupId(long vmGroupId); + List listByVmGroupId(long vmGroupId); + List listByPolicyId(long policyId); + public boolean isAutoScalePolicyInUse(long policyId); +} diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java new file mode 100644 index 00000000000..e4d42e98a91 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmGroupPolicyMapDaoImpl.java @@ -0,0 +1,55 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchCriteria; + +@Local(value={AutoScaleVmGroupPolicyMapDao.class}) +public class AutoScaleVmGroupPolicyMapDaoImpl extends GenericDaoBase implements AutoScaleVmGroupPolicyMapDao { + + @Override + public boolean removeByGroupId(long vmGroupId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("vmGroupId", SearchCriteria.Op.EQ, vmGroupId); + + return expunge(sc) > 0; + } + + @Override + public List listByVmGroupId(long vmGroupId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("vmGroupId", SearchCriteria.Op.EQ, vmGroupId); + return listBy(sc); + } + + @Override + public List listByPolicyId(long policyId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("policyId", SearchCriteria.Op.EQ, policyId); + + return listBy(sc); + } + + public boolean isAutoScalePolicyInUse(long policyId) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("policyId", SearchCriteria.Op.EQ, policyId); + return findOneBy(sc) != null; + } + +} diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java b/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java new file mode 100644 index 00000000000..c45e71ec4fd --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDao.java @@ -0,0 +1,19 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import com.cloud.network.as.AutoScaleVmProfileVO; +import com.cloud.utils.db.GenericDao; + +public interface AutoScaleVmProfileDao extends GenericDao { +} diff --git a/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java b/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java new file mode 100644 index 00000000000..38d0f6d44d0 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/AutoScaleVmProfileDaoImpl.java @@ -0,0 +1,22 @@ +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.as.dao; + +import javax.ejb.Local; + +import com.cloud.network.as.AutoScaleVmProfileVO; +import com.cloud.utils.db.GenericDaoBase; + +@Local(value = { AutoScaleVmProfileDao.class }) +public class AutoScaleVmProfileDaoImpl extends GenericDaoBase implements AutoScaleVmProfileDao { +} diff --git a/server/src/com/cloud/network/as/dao/ConditionDao.java b/server/src/com/cloud/network/as/dao/ConditionDao.java new file mode 100644 index 00000000000..1ff4d208b89 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/ConditionDao.java @@ -0,0 +1,27 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as.dao; + +import com.cloud.network.as.ConditionVO; +import com.cloud.utils.db.GenericDao; + +public interface ConditionDao extends GenericDao { + + ConditionVO findByCounterId(long ctrId); + +} \ No newline at end of file diff --git a/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java b/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java new file mode 100644 index 00000000000..338fe19d767 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/ConditionDaoImpl.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as.dao; + +import javax.ejb.Local; + +import com.cloud.network.as.ConditionVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + +@Local(value = ConditionDao.class) +public class ConditionDaoImpl extends GenericDaoBase implements ConditionDao { + final SearchBuilder AllFieldsSearch; + + protected ConditionDaoImpl() { + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ); + AllFieldsSearch.and("counterId", AllFieldsSearch.entity().getCounterid(), Op.EQ); + AllFieldsSearch.done(); + } + + @Override + public ConditionVO findByCounterId(long ctrId) { + // TODO - may consider indexing counterId field in db-schema + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("counterId", ctrId); + return findOneBy(sc); + } +} diff --git a/server/src/com/cloud/network/as/dao/CounterDao.java b/server/src/com/cloud/network/as/dao/CounterDao.java new file mode 100644 index 00000000000..dd9cf08e9d6 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/CounterDao.java @@ -0,0 +1,29 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as.dao; + +import java.util.List; + +import com.cloud.network.as.CounterVO; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.GenericDao; + +public interface CounterDao extends GenericDao { + public List listCounters(Long id, String name, String source, String keyword, Filter filter); + +} \ No newline at end of file diff --git a/server/src/com/cloud/network/as/dao/CounterDaoImpl.java b/server/src/com/cloud/network/as/dao/CounterDaoImpl.java new file mode 100644 index 00000000000..a8cbfbc1e26 --- /dev/null +++ b/server/src/com/cloud/network/as/dao/CounterDaoImpl.java @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.network.as.dao; + +import java.util.List; + +import javax.ejb.Local; + +import com.cloud.network.as.CounterVO; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; + +@Local(value = CounterDao.class) +public class CounterDaoImpl extends GenericDaoBase implements CounterDao { + final SearchBuilder AllFieldsSearch; + + protected CounterDaoImpl() { + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), Op.EQ); + AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), Op.LIKE); + AllFieldsSearch.and("source", AllFieldsSearch.entity().getSource(), Op.EQ); + AllFieldsSearch.done(); + } + + @Override + public List listCounters(Long id, String name, String source, String keyword, Filter filter) { + SearchCriteria sc = AllFieldsSearch.create(); + + if (keyword != null) { + SearchCriteria ssc = createSearchCriteria(); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("name", SearchCriteria.Op.SC, ssc); + } + + if (name != null) { + sc.addAnd("name", SearchCriteria.Op.LIKE, "%" + name + "%"); + } + + if (id != null) { + sc.addAnd("id", SearchCriteria.Op.EQ, id); + } + + if (source != null) { + sc.addAnd("source", SearchCriteria.Op.EQ, source); + } + return listBy(sc, filter); + } + +} diff --git a/server/src/com/cloud/network/element/NetscalerElement.java b/server/src/com/cloud/network/element/NetscalerElement.java index 3febd9aaa64..16c1970e126 100644 --- a/server/src/com/cloud/network/element/NetscalerElement.java +++ b/server/src/com/cloud/network/element/NetscalerElement.java @@ -1,675 +1,675 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.element; - -import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ejb.Local; - -import org.apache.log4j.Logger; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.SetStaticNatRulesAnswer; -import com.cloud.agent.api.routing.SetStaticNatRulesCommand; -import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.StaticNatRuleTO; -import com.cloud.api.ApiConstants; -import com.cloud.api.commands.AddNetscalerLoadBalancerCmd; -import com.cloud.api.commands.ConfigureNetscalerLoadBalancerCmd; -import com.cloud.api.commands.DeleteNetscalerLoadBalancerCmd; -import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd; -import com.cloud.api.commands.ListNetscalerLoadBalancersCmd; -import com.cloud.api.response.NetscalerLoadBalancerResponse; -import com.cloud.configuration.Config; -import com.cloud.configuration.ConfigurationManager; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.deploy.DeployDestination; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientNetworkCapacityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.host.Host; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.host.dao.HostDetailsDao; -import com.cloud.network.ExternalLoadBalancerDeviceManager; -import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl; -import com.cloud.network.ExternalLoadBalancerDeviceVO; -import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; -import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; -import com.cloud.network.IpAddress; -import com.cloud.network.Network; -import com.cloud.network.Network.Capability; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.network.NetworkExternalLoadBalancerVO; -import com.cloud.network.NetworkManager; -import com.cloud.network.NetworkVO; -import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PhysicalNetworkServiceProvider; -import com.cloud.network.PhysicalNetworkVO; -import com.cloud.network.PublicIpAddress; -import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkExternalLoadBalancerDao; -import com.cloud.network.dao.NetworkServiceMapDao; -import com.cloud.network.dao.PhysicalNetworkDao; -import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.resource.NetscalerResource; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.LbStickinessMethod; -import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; -import com.cloud.network.rules.StaticNat; -import com.cloud.offering.NetworkOffering; -import com.cloud.resource.ServerResource; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.component.Inject; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.UrlUtil; -import com.cloud.vm.NicProfile; -import com.cloud.vm.ReservationContext; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachineProfile; -import com.google.gson.Gson; - -@Local(value = NetworkElement.class) -public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider, NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer, - StaticNatServiceProvider { - - private static final Logger s_logger = Logger.getLogger(NetscalerElement.class); - - @Inject - NetworkManager _networkManager; - @Inject - ConfigurationManager _configMgr; - @Inject - NetworkServiceMapDao _ntwkSrvcDao; - @Inject - AgentManager _agentMgr; - @Inject - NetworkManager _networkMgr; - @Inject - HostDao _hostDao; - @Inject - DataCenterDao _dcDao; - @Inject - ExternalLoadBalancerDeviceDao _lbDeviceDao; - @Inject - NetworkExternalLoadBalancerDao _networkLBDao; - @Inject - PhysicalNetworkDao _physicalNetworkDao; - @Inject - NetworkDao _networkDao; - @Inject - HostDetailsDao _detailsDao; - @Inject - ConfigurationDao _configDao; - - private boolean canHandle(Network config, Service service) { - DataCenter zone = _dcDao.findById(config.getDataCenterId()); - boolean handleInAdvanceZone = (zone.getNetworkType() == NetworkType.Advanced && config.getGuestType() == Network.GuestType.Isolated && config.getTrafficType() == TrafficType.Guest); - boolean handleInBasicZone = (zone.getNetworkType() == NetworkType.Basic && config.getGuestType() == Network.GuestType.Shared && config.getTrafficType() == TrafficType.Guest); - - if (!(handleInAdvanceZone || handleInBasicZone)) { - s_logger.trace("Not handling network with Type " + config.getGuestType() + " and traffic type " + config.getTrafficType() + " in zone of type " + zone.getNetworkType()); - return false; - } - - return (_networkManager.isProviderForNetwork(getProvider(), config.getId()) && _ntwkSrvcDao.canProviderSupportServiceInNetwork(config.getId(), service, Network.Provider.Netscaler)); - } - - private boolean isBasicZoneNetwok(Network config) { - DataCenter zone = _dcDao.findById(config.getDataCenterId()); - return (zone.getNetworkType() == NetworkType.Basic && config.getGuestType() == Network.GuestType.Shared && config.getTrafficType() == TrafficType.Guest); - } - - @Override - public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, - InsufficientNetworkCapacityException { - - if (!canHandle(guestConfig, Service.Lb)) { - return false; - } - - if (_ntwkSrvcDao.canProviderSupportServiceInNetwork(guestConfig.getId(), Service.StaticNat, Network.Provider.Netscaler) && !isBasicZoneNetwok(guestConfig)) { - s_logger.error("NetScaler provider can not be Static Nat service provider for the network " + guestConfig.getGuestType() + - " and traffic type " + guestConfig.getTrafficType()); - return false; - } - - try { - return manageGuestNetworkWithExternalLoadBalancer(true, guestConfig); - } catch (InsufficientCapacityException capacityException) { - throw new ResourceUnavailableException("There are no NetScaler load balancer devices with the free capacity for implementing this network", DataCenter.class, guestConfig.getDataCenterId()); - } - } - - @Override - public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, - InsufficientNetworkCapacityException, ResourceUnavailableException { - return true; - } - - @Override - public boolean release(Network config, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) { - return true; - } - - @Override - public boolean shutdown(Network guestConfig, ReservationContext context, boolean cleanup) throws ResourceUnavailableException, ConcurrentOperationException { - if (!canHandle(guestConfig, Service.Lb)) { - return false; - } - - try { - return manageGuestNetworkWithExternalLoadBalancer(false, guestConfig); - } catch (InsufficientCapacityException capacityException) { - // TODO: handle out of capacity exception gracefully in case of multple providers available - return false; - } - } - - @Override - public boolean destroy(Network config) { - return true; - } - - @Override - public boolean validateLBRule(Network network, LoadBalancingRule rule) { - return true; - } - - @Override - public boolean applyLBRules(Network config, List rules) throws ResourceUnavailableException { - if (!canHandle(config, Service.Lb)) { - return false; - } - - if (isBasicZoneNetwok(config)) { - return applyElasticLoadBalancerRules(config, rules); - } else { - return applyLoadBalancerRules(config, rules); - } - } - - @Override - public Map> getCapabilities() { - Map> capabilities = new HashMap>(); - - // Set capabilities for LB service - Map lbCapabilities = new HashMap(); - - // Specifies that the RoundRobin and Leastconn algorithms are supported for load balancing rules - lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn"); - - // specifies that Netscaler network element can provided both shared and isolation modes - lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated, shared"); - - // Specifies that load balancing rules can be made for either TCP or UDP traffic - lbCapabilities.put(Capability.SupportedProtocols, "tcp,udp"); - - // Specifies that this element can measure network usage on a per public IP basis - lbCapabilities.put(Capability.TrafficStatistics, "per public ip"); - - // Specifies that load balancing rules can only be made with public IPs that aren't source NAT IPs - lbCapabilities.put(Capability.LoadBalancingSupportedIps, "additional"); - - LbStickinessMethod method; - List methodList = new ArrayList(); - method = new LbStickinessMethod(StickinessMethodType.LBCookieBased, "This is cookie based sticky method, can be used only for http"); - methodList.add(method); - method.addParam("holdtime", false, "time period in minutes for which persistence is in effect.", false); - - method = new LbStickinessMethod(StickinessMethodType.AppCookieBased, "This is app session based sticky method, can be used only for http"); - methodList.add(method); - method.addParam("name", true, "cookie name passed in http header by apllication to the client", false); - - method = new LbStickinessMethod(StickinessMethodType.SourceBased, "This is source based sticky method, can be used for any type of protocol."); - methodList.add(method); - method.addParam("holdtime", false, "time period for which persistence is in effect.", false); - - Gson gson = new Gson(); - String stickyMethodList = gson.toJson(methodList); - lbCapabilities.put(Capability.SupportedStickinessMethods, stickyMethodList); - - lbCapabilities.put(Capability.ElasticLb, "true"); - - capabilities.put(Service.Lb, lbCapabilities); - - Map staticNatCapabilities = new HashMap(); - staticNatCapabilities.put(Capability.ElasticIp, "true"); - capabilities.put(Service.StaticNat, staticNatCapabilities); - - // TODO - Murali, please put correct capabilities here - Map firewallCapabilities = new HashMap(); - firewallCapabilities.put(Capability.TrafficStatistics, "per public ip"); - firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp,icmp"); - firewallCapabilities.put(Capability.MultipleIps, "true"); - capabilities.put(Service.Firewall, firewallCapabilities); - - return capabilities; - } - - @Override - public ExternalLoadBalancerDeviceVO addNetscalerLoadBalancer(AddNetscalerLoadBalancerCmd cmd) { - String deviceName = cmd.getDeviceType(); - - if (!isNetscalerDevice(deviceName)) { - throw new InvalidParameterValueException("Invalid Netscaler device type"); - } - - URI uri; - try { - uri = new URI(cmd.getUrl()); - } catch (Exception e) { - String msg = "Error parsing the url parameter specified in addNetscalerLoadBalancer command due to " + e.getMessage(); - s_logger.debug(msg); - throw new InvalidParameterValueException(msg); - } - Map configParams = new HashMap(); - UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams); - boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false; - - if (dedicatedUse && !deviceName.equals(NetworkDevice.NetscalerVPXLoadBalancer.getName())) { - String msg = "Only Netscaler VPX load balancers can be specified for dedicated use"; - s_logger.debug(msg); - throw new InvalidParameterValueException(msg); - } - - ExternalLoadBalancerDeviceVO lbDeviceVO = addExternalLoadBalancer(cmd.getPhysicalNetworkId(), cmd.getUrl(), cmd.getUsername(), cmd.getPassword(), deviceName, (ServerResource) new NetscalerResource()); - return lbDeviceVO; - } - - @Override - public boolean deleteNetscalerLoadBalancer(DeleteNetscalerLoadBalancerCmd cmd) { - Long lbDeviceId = cmd.getLoadBalancerDeviceId(); - - ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); - if ((lbDeviceVo == null) || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { - throw new InvalidParameterValueException("No netscaler device found with ID: " + lbDeviceId); - } - - return deleteExternalLoadBalancer(lbDeviceVo.getHostId()); - } - - @Override - public ExternalLoadBalancerDeviceVO configureNetscalerLoadBalancer(ConfigureNetscalerLoadBalancerCmd cmd) { - Long lbDeviceId = cmd.getLoadBalancerDeviceId(); - Boolean dedicatedUse = cmd.getLoadBalancerDedicated(); - Boolean inline = cmd.getLoadBalancerInline(); - Long capacity = cmd.getLoadBalancerCapacity(); - - try { - return configureNetscalerLoadBalancer(lbDeviceId, capacity, inline, dedicatedUse); - } catch (Exception e) { - throw new CloudRuntimeException("failed to configure netscaler device due to " + e.getMessage()); - } - } - - @DB - private ExternalLoadBalancerDeviceVO configureNetscalerLoadBalancer(long lbDeviceId, Long capacity, Boolean inline, Boolean dedicatedUse) { - ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); - Map lbDetails = _detailsDao.findDetails(lbDeviceVo.getHostId()); - - if ((lbDeviceVo == null) || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { - throw new InvalidParameterValueException("No netscaler device found with ID: " + lbDeviceId); - } - - String deviceName = lbDeviceVo.getDeviceName(); - if (dedicatedUse != null || capacity != null || inline != null) { - if (NetworkDevice.NetscalerSDXLoadBalancer.getName().equalsIgnoreCase(deviceName) || - NetworkDevice.NetscalerMPXLoadBalancer.getName().equalsIgnoreCase(deviceName)) { - if (dedicatedUse != null && dedicatedUse == true) { - throw new InvalidParameterValueException("Netscaler MPX and SDX device should be shared and can not be dedicated to a single account."); - } - } - - // check if any networks are using this netscaler device - List networks = _networkLBDao.listByLoadBalancerDeviceId(lbDeviceId); - if ((networks != null) && !networks.isEmpty()) { - if (capacity != null && capacity < networks.size()) { - throw new CloudRuntimeException("There are more number of networks already using this netscaler device than configured capacity"); - } - - if (dedicatedUse != null && dedicatedUse == true) { - throw new CloudRuntimeException("There are networks already using this netscaler device to make device dedicated"); - } - - if (inline != null) { - boolean _setInline = Boolean.parseBoolean((String) lbDetails.get("inline")); - if (inline != _setInline) { - throw new CloudRuntimeException("There are networks already using this netscaler device to change the device inline or side-by-side configuration"); - } - } - } - } - - if (!NetworkDevice.NetscalerSDXLoadBalancer.getName().equalsIgnoreCase(deviceName)) { - if (capacity != null) { - lbDeviceVo.setCapacity(capacity); - } - } else { - // FIXME how to interpret configured capacity of the SDX device - } - - if (dedicatedUse != null) { - lbDeviceVo.setIsDedicatedDevice(dedicatedUse); - } - - if (inline != null && inline == true) { - lbDeviceVo.setIsInlineMode(true); - lbDetails.put("inline", "true"); - } else { - lbDeviceVo.setIsInlineMode(false); - lbDetails.put("inline", "false"); - } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - _lbDeviceDao.update(lbDeviceId, lbDeviceVo); - - // FIXME get the row lock to avoid race condition - _detailsDao.persist(lbDeviceVo.getHostId(), lbDetails); - HostVO host = _hostDao.findById(lbDeviceVo.getHostId()); - txn.commit(); - - _agentMgr.reconnect(host.getId()); - return lbDeviceVo; - } - - @Override - public String getPropertiesFile() { - return "netscalerloadbalancer_commands.properties"; - } - - @Override - public List listNetworks(ListNetscalerLoadBalancerNetworksCmd cmd) { - Long lbDeviceId = cmd.getLoadBalancerDeviceId(); - List networks = new ArrayList(); - - ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); - if (lbDeviceVo == null || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { - throw new InvalidParameterValueException("Could not find Netscaler load balancer device with ID " + lbDeviceId); - } - - List networkLbMaps = _networkLBDao.listByLoadBalancerDeviceId(lbDeviceId); - if (networkLbMaps != null && !networkLbMaps.isEmpty()) { - for (NetworkExternalLoadBalancerVO networkLbMap : networkLbMaps) { - NetworkVO network = _networkDao.findById(networkLbMap.getNetworkId()); - networks.add(network); - } - } - - return networks; - } - - @Override - public List listNetscalerLoadBalancers(ListNetscalerLoadBalancersCmd cmd) { - Long physcialNetworkId = cmd.getPhysicalNetworkId(); - Long lbDeviceId = cmd.getLoadBalancerDeviceId(); - PhysicalNetworkVO pNetwork = null; - List lbDevices = new ArrayList(); - - if (physcialNetworkId == null && lbDeviceId == null) { - throw new InvalidParameterValueException("Either physical network Id or load balancer device Id must be specified"); - } - - if (lbDeviceId != null) { - ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); - if (lbDeviceVo == null || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { - throw new InvalidParameterValueException("Could not find Netscaler load balancer device with ID: " + lbDeviceId); - } - lbDevices.add(lbDeviceVo); - return lbDevices; - } - - if (physcialNetworkId != null) { - pNetwork = _physicalNetworkDao.findById(physcialNetworkId); - if (pNetwork == null) { - throw new InvalidParameterValueException("Could not find phyical network with ID: " + physcialNetworkId); - } - lbDevices = _lbDeviceDao.listByPhysicalNetworkAndProvider(physcialNetworkId, Provider.Netscaler.getName()); - return lbDevices; - } - - return null; - } - - @Override - public NetscalerLoadBalancerResponse createNetscalerLoadBalancerResponse(ExternalLoadBalancerDeviceVO lbDeviceVO) { - NetscalerLoadBalancerResponse response = new NetscalerLoadBalancerResponse(); - Host lbHost = _hostDao.findById(lbDeviceVO.getHostId()); - Map lbDetails = _detailsDao.findDetails(lbDeviceVO.getHostId()); - - response.setId(lbDeviceVO.getId()); - response.setIpAddress(lbHost.getPrivateIpAddress()); - response.setPhysicalNetworkId(lbDeviceVO.getPhysicalNetworkId()); - response.setPublicInterface(lbDetails.get("publicInterface")); - response.setPrivateInterface(lbDetails.get("privateInterface")); - response.setDeviceName(lbDeviceVO.getDeviceName()); - if (lbDeviceVO.getCapacity() == 0) { - long defaultLbCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); - response.setDeviceCapacity(defaultLbCapacity); - } else { - response.setDeviceCapacity(lbDeviceVO.getCapacity()); - } - response.setInlineMode(lbDeviceVO.getIsInLineMode()); - response.setDedicatedLoadBalancer(lbDeviceVO.getIsDedicatedDevice()); - response.setProvider(lbDeviceVO.getProviderName()); - response.setDeviceState(lbDeviceVO.getState().name()); - response.setObjectName("netscalerloadbalancer"); - return response; - } - - @Override - public Provider getProvider() { - return Provider.Netscaler; - } - - @Override - public boolean isReady(PhysicalNetworkServiceProvider provider) { - List lbDevices = _lbDeviceDao.listByPhysicalNetworkAndProvider(provider.getPhysicalNetworkId(), Provider.Netscaler.getName()); - - // true if at-least one Netscaler device is added in to physical network and is in configured (in enabled state) -// state - if (lbDevices != null && !lbDevices.isEmpty()) { - for (ExternalLoadBalancerDeviceVO lbDevice : lbDevices) { - if (lbDevice.getState() == LBDeviceState.Enabled) { - return true; - } - } - } - return false; - } - - @Override - public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException, - ResourceUnavailableException { - // TODO reset the configuration on all of the netscaler devices in this physical network - return true; - } - - @Override - public boolean canEnableIndividualServices() { - return true; - } - - private boolean isNetscalerDevice(String deviceName) { - if ((deviceName == null) || ((!deviceName.equalsIgnoreCase(NetworkDevice.NetscalerMPXLoadBalancer.getName())) && - (!deviceName.equalsIgnoreCase(NetworkDevice.NetscalerSDXLoadBalancer.getName())) && - (!deviceName.equalsIgnoreCase(NetworkDevice.NetscalerVPXLoadBalancer.getName())))) { - return false; - } else { - return true; - } - } - - @Override - public boolean verifyServicesCombination(List services) { - List netscalerServices = new ArrayList(); - netscalerServices.add(Service.Lb.getName()); - netscalerServices.add(Service.StaticNat.getName()); - - // NetScaler can only act as Lb and Static Nat service provider - if (services != null && !services.isEmpty() && !netscalerServices.containsAll(services)) { - s_logger.warn("NetScaler network element can only support LB and Static NAT services and service combination " - + services + " is not supported."); - return false; - } - - return true; - } - - @Override - public boolean applyIps(Network network, List ipAddress, Set service) throws ResourceUnavailableException { - // return true, as IP will be associated as part of LB rule configuration - return false; - } - - @Override - public IpDeployer getIpDeployer(Network network) { - return this; - } - - public boolean applyElasticLoadBalancerRules(Network network, List rules) throws ResourceUnavailableException { - - List loadBalancingRules = new ArrayList(); - for (FirewallRule rule : rules) { - if (rule.getPurpose().equals(Purpose.LoadBalancing)) { - loadBalancingRules.add((LoadBalancingRule) rule); - } - } - - if (loadBalancingRules == null || loadBalancingRules.isEmpty()) { - return true; - } - - String errMsg = null; - ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); - if (lbDeviceVO == null) { - try { - lbDeviceVO = allocateLoadBalancerForNetwork(network); - } catch (Exception e) { - errMsg = "Could not allocate a NetSclaer load balancer for configuring elastic load balancer rules due to " + e.getMessage(); - s_logger.error(errMsg); - throw new ResourceUnavailableException(errMsg, this.getClass(), 0); - } - } - - if (!isNetscalerDevice(lbDeviceVO.getDeviceName())) { - errMsg = "There are no NetScaler load balancer assigned for this network. So NetScaler element can not be handle elastic load balancer rules."; - s_logger.error(errMsg); - throw new ResourceUnavailableException(errMsg, this.getClass(), 0); - } - - List loadBalancersToApply = new ArrayList(); - for (int i = 0; i < loadBalancingRules.size(); i++) { - LoadBalancingRule rule = loadBalancingRules.get(i); - boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); - String protocol = rule.getProtocol(); - String algorithm = rule.getAlgorithm(); - String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr(); - int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); - - if (destinations != null && !destinations.isEmpty()) { - LoadBalancerTO loadBalancer = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations, rule.getStickinessPolicies()); - loadBalancersToApply.add(loadBalancer); - } - } - - if (loadBalancersToApply.size() > 0) { - int numLoadBalancersForCommand = loadBalancersToApply.size(); - LoadBalancerTO[] loadBalancersForCommand = loadBalancersToApply.toArray(new LoadBalancerTO[numLoadBalancersForCommand]); - LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(loadBalancersForCommand, null); - - HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); - Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); - if (answer == null || !answer.getResult()) { - String details = (answer != null) ? answer.getDetails() : "details unavailable"; - String msg = "Unable to apply elastic load balancer rules to the external load balancer appliance in zone " + network.getDataCenterId() + " due to: " + details + "."; - s_logger.error(msg); - throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); - } - } - - return true; - } - - @Override - public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { - - if (!canHandle(config, Service.StaticNat)) { - return false; - } - - String errMsg; - ExternalLoadBalancerDeviceVO lbDevice = getExternalLoadBalancerForNetwork(config); - if (lbDevice == null) { - try { - lbDevice = allocateLoadBalancerForNetwork(config); - } catch (Exception e) { - errMsg = "Could not allocate a NetSclaer load balancer for configuring static NAT rules due to" + e.getMessage(); - s_logger.error(errMsg); - throw new ResourceUnavailableException(errMsg, this.getClass(), 0); - } - } - - if (!isNetscalerDevice(lbDevice.getDeviceName())) { - errMsg = "There are no NetScaler load balancer assigned for this network. So NetScaler element will not be handling the static nat rules."; - s_logger.error(errMsg); - throw new ResourceUnavailableException(errMsg, this.getClass(), 0); - } - - SetStaticNatRulesAnswer answer = null; - try { - List rulesTO = null; - if (rules != null) { - rulesTO = new ArrayList(); - for (StaticNat rule : rules) { - IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); - StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), false); - rulesTO.add(ruleTO); - } - } - - SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, null); - answer = (SetStaticNatRulesAnswer) _agentMgr.send(lbDevice.getHostId(), cmd); - if (answer == null) { - return false; - } else { - return answer.getResult(); - } - } catch (Exception e) { - s_logger.error("Failed to configure StaticNat rule due to " + e.getMessage()); - return false; - } - } - -} \ No newline at end of file +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.element; + +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.SetStaticNatRulesAnswer; +import com.cloud.agent.api.routing.SetStaticNatRulesCommand; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.agent.api.to.StaticNatRuleTO; +import com.cloud.api.ApiConstants; +import com.cloud.api.commands.AddNetscalerLoadBalancerCmd; +import com.cloud.api.commands.ConfigureNetscalerLoadBalancerCmd; +import com.cloud.api.commands.DeleteNetscalerLoadBalancerCmd; +import com.cloud.api.commands.ListNetscalerLoadBalancerNetworksCmd; +import com.cloud.api.commands.ListNetscalerLoadBalancersCmd; +import com.cloud.api.response.NetscalerLoadBalancerResponse; +import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientNetworkCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.host.dao.HostDetailsDao; +import com.cloud.network.ExternalLoadBalancerDeviceManager; +import com.cloud.network.ExternalLoadBalancerDeviceManagerImpl; +import com.cloud.network.ExternalLoadBalancerDeviceVO; +import com.cloud.network.ExternalLoadBalancerDeviceVO.LBDeviceState; +import com.cloud.network.ExternalNetworkDeviceManager.NetworkDevice; +import com.cloud.network.IpAddress; +import com.cloud.network.Network; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.NetworkExternalLoadBalancerVO; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.PhysicalNetworkVO; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.dao.ExternalLoadBalancerDeviceDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkExternalLoadBalancerDao; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.resource.NetscalerResource; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.LbStickinessMethod; +import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType; +import com.cloud.network.rules.StaticNat; +import com.cloud.offering.NetworkOffering; +import com.cloud.resource.ServerResource; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.component.Inject; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.UrlUtil; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.google.gson.Gson; + +@Local(value = NetworkElement.class) +public class NetscalerElement extends ExternalLoadBalancerDeviceManagerImpl implements LoadBalancingServiceProvider, NetscalerLoadBalancerElementService, ExternalLoadBalancerDeviceManager, IpDeployer, + StaticNatServiceProvider { + + private static final Logger s_logger = Logger.getLogger(NetscalerElement.class); + + @Inject + NetworkManager _networkManager; + @Inject + ConfigurationManager _configMgr; + @Inject + NetworkServiceMapDao _ntwkSrvcDao; + @Inject + AgentManager _agentMgr; + @Inject + NetworkManager _networkMgr; + @Inject + HostDao _hostDao; + @Inject + DataCenterDao _dcDao; + @Inject + ExternalLoadBalancerDeviceDao _lbDeviceDao; + @Inject + NetworkExternalLoadBalancerDao _networkLBDao; + @Inject + PhysicalNetworkDao _physicalNetworkDao; + @Inject + NetworkDao _networkDao; + @Inject + HostDetailsDao _detailsDao; + @Inject + ConfigurationDao _configDao; + + private boolean canHandle(Network config, Service service) { + DataCenter zone = _dcDao.findById(config.getDataCenterId()); + boolean handleInAdvanceZone = (zone.getNetworkType() == NetworkType.Advanced && config.getGuestType() == Network.GuestType.Isolated && config.getTrafficType() == TrafficType.Guest); + boolean handleInBasicZone = (zone.getNetworkType() == NetworkType.Basic && config.getGuestType() == Network.GuestType.Shared && config.getTrafficType() == TrafficType.Guest); + + if (!(handleInAdvanceZone || handleInBasicZone)) { + s_logger.trace("Not handling network with Type " + config.getGuestType() + " and traffic type " + config.getTrafficType() + " in zone of type " + zone.getNetworkType()); + return false; + } + + return (_networkManager.isProviderForNetwork(getProvider(), config.getId()) && _ntwkSrvcDao.canProviderSupportServiceInNetwork(config.getId(), service, Network.Provider.Netscaler)); + } + + private boolean isBasicZoneNetwok(Network config) { + DataCenter zone = _dcDao.findById(config.getDataCenterId()); + return (zone.getNetworkType() == NetworkType.Basic && config.getGuestType() == Network.GuestType.Shared && config.getTrafficType() == TrafficType.Guest); + } + + @Override + public boolean implement(Network guestConfig, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, + InsufficientNetworkCapacityException { + + if (!canHandle(guestConfig, Service.Lb)) { + return false; + } + + if (_ntwkSrvcDao.canProviderSupportServiceInNetwork(guestConfig.getId(), Service.StaticNat, Network.Provider.Netscaler) && !isBasicZoneNetwok(guestConfig)) { + s_logger.error("NetScaler provider can not be Static Nat service provider for the network " + guestConfig.getGuestType() + + " and traffic type " + guestConfig.getTrafficType()); + return false; + } + + try { + return manageGuestNetworkWithExternalLoadBalancer(true, guestConfig); + } catch (InsufficientCapacityException capacityException) { + throw new ResourceUnavailableException("There are no NetScaler load balancer devices with the free capacity for implementing this network", DataCenter.class, guestConfig.getDataCenterId()); + } + } + + @Override + public boolean prepare(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, + InsufficientNetworkCapacityException, ResourceUnavailableException { + return true; + } + + @Override + public boolean release(Network config, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) { + return true; + } + + @Override + public boolean shutdown(Network guestConfig, ReservationContext context, boolean cleanup) throws ResourceUnavailableException, ConcurrentOperationException { + if (!canHandle(guestConfig, Service.Lb)) { + return false; + } + + try { + return manageGuestNetworkWithExternalLoadBalancer(false, guestConfig); + } catch (InsufficientCapacityException capacityException) { + // TODO: handle out of capacity exception gracefully in case of multple providers available + return false; + } + } + + @Override + public boolean destroy(Network config) { + return true; + } + + @Override + public boolean validateLBRule(Network network, LoadBalancingRule rule) { + return true; + } + + @Override + public boolean applyLBRules(Network config, List rules) throws ResourceUnavailableException { + if (!canHandle(config, Service.Lb)) { + return false; + } + + if (isBasicZoneNetwok(config)) { + return applyElasticLoadBalancerRules(config, rules); + } else { + return applyLoadBalancerRules(config, rules); + } + } + + @Override + public Map> getCapabilities() { + Map> capabilities = new HashMap>(); + + // Set capabilities for LB service + Map lbCapabilities = new HashMap(); + + // Specifies that the RoundRobin and Leastconn algorithms are supported for load balancing rules + lbCapabilities.put(Capability.SupportedLBAlgorithms, "roundrobin,leastconn"); + + // specifies that Netscaler network element can provided both shared and isolation modes + lbCapabilities.put(Capability.SupportedLBIsolation, "dedicated, shared"); + + // Specifies that load balancing rules can be made for either TCP or UDP traffic + lbCapabilities.put(Capability.SupportedProtocols, "tcp,udp"); + + // Specifies that this element can measure network usage on a per public IP basis + lbCapabilities.put(Capability.TrafficStatistics, "per public ip"); + + // Specifies that load balancing rules can only be made with public IPs that aren't source NAT IPs + lbCapabilities.put(Capability.LoadBalancingSupportedIps, "additional"); + + LbStickinessMethod method; + List methodList = new ArrayList(); + method = new LbStickinessMethod(StickinessMethodType.LBCookieBased, "This is cookie based sticky method, can be used only for http"); + methodList.add(method); + method.addParam("holdtime", false, "time period in minutes for which persistence is in effect.", false); + + method = new LbStickinessMethod(StickinessMethodType.AppCookieBased, "This is app session based sticky method, can be used only for http"); + methodList.add(method); + method.addParam("name", true, "cookie name passed in http header by apllication to the client", false); + + method = new LbStickinessMethod(StickinessMethodType.SourceBased, "This is source based sticky method, can be used for any type of protocol."); + methodList.add(method); + method.addParam("holdtime", false, "time period for which persistence is in effect.", false); + + Gson gson = new Gson(); + String stickyMethodList = gson.toJson(methodList); + lbCapabilities.put(Capability.SupportedStickinessMethods, stickyMethodList); + + lbCapabilities.put(Capability.ElasticLb, "true"); + + capabilities.put(Service.Lb, lbCapabilities); + + Map staticNatCapabilities = new HashMap(); + staticNatCapabilities.put(Capability.ElasticIp, "true"); + capabilities.put(Service.StaticNat, staticNatCapabilities); + + // TODO - Murali, please put correct capabilities here + Map firewallCapabilities = new HashMap(); + firewallCapabilities.put(Capability.TrafficStatistics, "per public ip"); + firewallCapabilities.put(Capability.SupportedProtocols, "tcp,udp,icmp"); + firewallCapabilities.put(Capability.MultipleIps, "true"); + capabilities.put(Service.Firewall, firewallCapabilities); + + return capabilities; + } + + @Override + public ExternalLoadBalancerDeviceVO addNetscalerLoadBalancer(AddNetscalerLoadBalancerCmd cmd) { + String deviceName = cmd.getDeviceType(); + + if (!isNetscalerDevice(deviceName)) { + throw new InvalidParameterValueException("Invalid Netscaler device type"); + } + + URI uri; + try { + uri = new URI(cmd.getUrl()); + } catch (Exception e) { + String msg = "Error parsing the url parameter specified in addNetscalerLoadBalancer command due to " + e.getMessage(); + s_logger.debug(msg); + throw new InvalidParameterValueException(msg); + } + Map configParams = new HashMap(); + UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams); + boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false; + + if (dedicatedUse && !deviceName.equals(NetworkDevice.NetscalerVPXLoadBalancer.getName())) { + String msg = "Only Netscaler VPX load balancers can be specified for dedicated use"; + s_logger.debug(msg); + throw new InvalidParameterValueException(msg); + } + + ExternalLoadBalancerDeviceVO lbDeviceVO = addExternalLoadBalancer(cmd.getPhysicalNetworkId(), cmd.getUrl(), cmd.getUsername(), cmd.getPassword(), deviceName, (ServerResource) new NetscalerResource()); + return lbDeviceVO; + } + + @Override + public boolean deleteNetscalerLoadBalancer(DeleteNetscalerLoadBalancerCmd cmd) { + Long lbDeviceId = cmd.getLoadBalancerDeviceId(); + + ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); + if ((lbDeviceVo == null) || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { + throw new InvalidParameterValueException("No netscaler device found with ID: " + lbDeviceId); + } + + return deleteExternalLoadBalancer(lbDeviceVo.getHostId()); + } + + @Override + public ExternalLoadBalancerDeviceVO configureNetscalerLoadBalancer(ConfigureNetscalerLoadBalancerCmd cmd) { + Long lbDeviceId = cmd.getLoadBalancerDeviceId(); + Boolean dedicatedUse = cmd.getLoadBalancerDedicated(); + Boolean inline = cmd.getLoadBalancerInline(); + Long capacity = cmd.getLoadBalancerCapacity(); + + try { + return configureNetscalerLoadBalancer(lbDeviceId, capacity, inline, dedicatedUse); + } catch (Exception e) { + throw new CloudRuntimeException("failed to configure netscaler device due to " + e.getMessage()); + } + } + + @DB + private ExternalLoadBalancerDeviceVO configureNetscalerLoadBalancer(long lbDeviceId, Long capacity, Boolean inline, Boolean dedicatedUse) { + ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); + Map lbDetails = _detailsDao.findDetails(lbDeviceVo.getHostId()); + + if ((lbDeviceVo == null) || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { + throw new InvalidParameterValueException("No netscaler device found with ID: " + lbDeviceId); + } + + String deviceName = lbDeviceVo.getDeviceName(); + if (dedicatedUse != null || capacity != null || inline != null) { + if (NetworkDevice.NetscalerSDXLoadBalancer.getName().equalsIgnoreCase(deviceName) || + NetworkDevice.NetscalerMPXLoadBalancer.getName().equalsIgnoreCase(deviceName)) { + if (dedicatedUse != null && dedicatedUse == true) { + throw new InvalidParameterValueException("Netscaler MPX and SDX device should be shared and can not be dedicated to a single account."); + } + } + + // check if any networks are using this netscaler device + List networks = _networkLBDao.listByLoadBalancerDeviceId(lbDeviceId); + if ((networks != null) && !networks.isEmpty()) { + if (capacity != null && capacity < networks.size()) { + throw new CloudRuntimeException("There are more number of networks already using this netscaler device than configured capacity"); + } + + if (dedicatedUse != null && dedicatedUse == true) { + throw new CloudRuntimeException("There are networks already using this netscaler device to make device dedicated"); + } + + if (inline != null) { + boolean _setInline = Boolean.parseBoolean((String) lbDetails.get("inline")); + if (inline != _setInline) { + throw new CloudRuntimeException("There are networks already using this netscaler device to change the device inline or side-by-side configuration"); + } + } + } + } + + if (!NetworkDevice.NetscalerSDXLoadBalancer.getName().equalsIgnoreCase(deviceName)) { + if (capacity != null) { + lbDeviceVo.setCapacity(capacity); + } + } else { + // FIXME how to interpret configured capacity of the SDX device + } + + if (dedicatedUse != null) { + lbDeviceVo.setIsDedicatedDevice(dedicatedUse); + } + + if (inline != null && inline == true) { + lbDeviceVo.setIsInlineMode(true); + lbDetails.put("inline", "true"); + } else { + lbDeviceVo.setIsInlineMode(false); + lbDetails.put("inline", "false"); + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + _lbDeviceDao.update(lbDeviceId, lbDeviceVo); + + // FIXME get the row lock to avoid race condition + _detailsDao.persist(lbDeviceVo.getHostId(), lbDetails); + HostVO host = _hostDao.findById(lbDeviceVo.getHostId()); + txn.commit(); + + _agentMgr.reconnect(host.getId()); + return lbDeviceVo; + } + + @Override + public String getPropertiesFile() { + return "netscalerloadbalancer_commands.properties"; + } + + @Override + public List listNetworks(ListNetscalerLoadBalancerNetworksCmd cmd) { + Long lbDeviceId = cmd.getLoadBalancerDeviceId(); + List networks = new ArrayList(); + + ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); + if (lbDeviceVo == null || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { + throw new InvalidParameterValueException("Could not find Netscaler load balancer device with ID " + lbDeviceId); + } + + List networkLbMaps = _networkLBDao.listByLoadBalancerDeviceId(lbDeviceId); + if (networkLbMaps != null && !networkLbMaps.isEmpty()) { + for (NetworkExternalLoadBalancerVO networkLbMap : networkLbMaps) { + NetworkVO network = _networkDao.findById(networkLbMap.getNetworkId()); + networks.add(network); + } + } + + return networks; + } + + @Override + public List listNetscalerLoadBalancers(ListNetscalerLoadBalancersCmd cmd) { + Long physcialNetworkId = cmd.getPhysicalNetworkId(); + Long lbDeviceId = cmd.getLoadBalancerDeviceId(); + PhysicalNetworkVO pNetwork = null; + List lbDevices = new ArrayList(); + + if (physcialNetworkId == null && lbDeviceId == null) { + throw new InvalidParameterValueException("Either physical network Id or load balancer device Id must be specified"); + } + + if (lbDeviceId != null) { + ExternalLoadBalancerDeviceVO lbDeviceVo = _lbDeviceDao.findById(lbDeviceId); + if (lbDeviceVo == null || !isNetscalerDevice(lbDeviceVo.getDeviceName())) { + throw new InvalidParameterValueException("Could not find Netscaler load balancer device with ID: " + lbDeviceId); + } + lbDevices.add(lbDeviceVo); + return lbDevices; + } + + if (physcialNetworkId != null) { + pNetwork = _physicalNetworkDao.findById(physcialNetworkId); + if (pNetwork == null) { + throw new InvalidParameterValueException("Could not find phyical network with ID: " + physcialNetworkId); + } + lbDevices = _lbDeviceDao.listByPhysicalNetworkAndProvider(physcialNetworkId, Provider.Netscaler.getName()); + return lbDevices; + } + + return null; + } + + @Override + public NetscalerLoadBalancerResponse createNetscalerLoadBalancerResponse(ExternalLoadBalancerDeviceVO lbDeviceVO) { + NetscalerLoadBalancerResponse response = new NetscalerLoadBalancerResponse(); + Host lbHost = _hostDao.findById(lbDeviceVO.getHostId()); + Map lbDetails = _detailsDao.findDetails(lbDeviceVO.getHostId()); + + response.setId(lbDeviceVO.getId()); + response.setIpAddress(lbHost.getPrivateIpAddress()); + response.setPhysicalNetworkId(lbDeviceVO.getPhysicalNetworkId()); + response.setPublicInterface(lbDetails.get("publicInterface")); + response.setPrivateInterface(lbDetails.get("privateInterface")); + response.setDeviceName(lbDeviceVO.getDeviceName()); + if (lbDeviceVO.getCapacity() == 0) { + long defaultLbCapacity = NumbersUtil.parseLong(_configDao.getValue(Config.DefaultExternalLoadBalancerCapacity.key()), 50); + response.setDeviceCapacity(defaultLbCapacity); + } else { + response.setDeviceCapacity(lbDeviceVO.getCapacity()); + } + response.setInlineMode(lbDeviceVO.getIsInLineMode()); + response.setDedicatedLoadBalancer(lbDeviceVO.getIsDedicatedDevice()); + response.setProvider(lbDeviceVO.getProviderName()); + response.setDeviceState(lbDeviceVO.getState().name()); + response.setObjectName("netscalerloadbalancer"); + return response; + } + + @Override + public Provider getProvider() { + return Provider.Netscaler; + } + + @Override + public boolean isReady(PhysicalNetworkServiceProvider provider) { + List lbDevices = _lbDeviceDao.listByPhysicalNetworkAndProvider(provider.getPhysicalNetworkId(), Provider.Netscaler.getName()); + + // true if at-least one Netscaler device is added in to physical network and is in configured (in enabled state) +// state + if (lbDevices != null && !lbDevices.isEmpty()) { + for (ExternalLoadBalancerDeviceVO lbDevice : lbDevices) { + if (lbDevice.getState() == LBDeviceState.Enabled) { + return true; + } + } + } + return false; + } + + @Override + public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException, + ResourceUnavailableException { + // TODO reset the configuration on all of the netscaler devices in this physical network + return true; + } + + @Override + public boolean canEnableIndividualServices() { + return true; + } + + private boolean isNetscalerDevice(String deviceName) { + if ((deviceName == null) || ((!deviceName.equalsIgnoreCase(NetworkDevice.NetscalerMPXLoadBalancer.getName())) && + (!deviceName.equalsIgnoreCase(NetworkDevice.NetscalerSDXLoadBalancer.getName())) && + (!deviceName.equalsIgnoreCase(NetworkDevice.NetscalerVPXLoadBalancer.getName())))) { + return false; + } else { + return true; + } + } + + @Override + public boolean verifyServicesCombination(List services) { + List netscalerServices = new ArrayList(); + netscalerServices.add(Service.Lb.getName()); + netscalerServices.add(Service.StaticNat.getName()); + + // NetScaler can only act as Lb and Static Nat service provider + if (services != null && !services.isEmpty() && !netscalerServices.containsAll(services)) { + s_logger.warn("NetScaler network element can only support LB and Static NAT services and service combination " + + services + " is not supported."); + return false; + } + + return true; + } + + @Override + public boolean applyIps(Network network, List ipAddress, Set service) throws ResourceUnavailableException { + // return true, as IP will be associated as part of LB rule configuration + return false; + } + + @Override + public IpDeployer getIpDeployer(Network network) { + return this; + } + + public boolean applyElasticLoadBalancerRules(Network network, List rules) throws ResourceUnavailableException { + + List loadBalancingRules = new ArrayList(); + for (FirewallRule rule : rules) { + if (rule.getPurpose().equals(Purpose.LoadBalancing)) { + loadBalancingRules.add((LoadBalancingRule) rule); + } + } + + if (loadBalancingRules == null || loadBalancingRules.isEmpty()) { + return true; + } + + String errMsg = null; + ExternalLoadBalancerDeviceVO lbDeviceVO = getExternalLoadBalancerForNetwork(network); + if (lbDeviceVO == null) { + try { + lbDeviceVO = allocateLoadBalancerForNetwork(network); + } catch (Exception e) { + errMsg = "Could not allocate a NetSclaer load balancer for configuring elastic load balancer rules due to " + e.getMessage(); + s_logger.error(errMsg); + throw new ResourceUnavailableException(errMsg, this.getClass(), 0); + } + } + + if (!isNetscalerDevice(lbDeviceVO.getDeviceName())) { + errMsg = "There are no NetScaler load balancer assigned for this network. So NetScaler element can not be handle elastic load balancer rules."; + s_logger.error(errMsg); + throw new ResourceUnavailableException(errMsg, this.getClass(), 0); + } + + List loadBalancersToApply = new ArrayList(); + for (int i = 0; i < loadBalancingRules.size(); i++) { + LoadBalancingRule rule = loadBalancingRules.get(i); + boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); + String protocol = rule.getProtocol(); + String algorithm = rule.getAlgorithm(); + String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr(); + int srcPort = rule.getSourcePortStart(); + List destinations = rule.getDestinations(); + + if (destinations != null && !destinations.isEmpty()) { + LoadBalancerTO loadBalancer = new LoadBalancerTO(rule.getId(), srcIp, srcPort, protocol, algorithm, revoked, false, destinations, rule.getStickinessPolicies()); + loadBalancersToApply.add(loadBalancer); + } + } + + if (loadBalancersToApply.size() > 0) { + int numLoadBalancersForCommand = loadBalancersToApply.size(); + LoadBalancerTO[] loadBalancersForCommand = loadBalancersToApply.toArray(new LoadBalancerTO[numLoadBalancersForCommand]); + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(loadBalancersForCommand, null); + + HostVO externalLoadBalancer = _hostDao.findById(lbDeviceVO.getHostId()); + Answer answer = _agentMgr.easySend(externalLoadBalancer.getId(), cmd); + if (answer == null || !answer.getResult()) { + String details = (answer != null) ? answer.getDetails() : "details unavailable"; + String msg = "Unable to apply elastic load balancer rules to the external load balancer appliance in zone " + network.getDataCenterId() + " due to: " + details + "."; + s_logger.error(msg); + throw new ResourceUnavailableException(msg, DataCenter.class, network.getDataCenterId()); + } + } + + return true; + } + + @Override + public boolean applyStaticNats(Network config, List rules) throws ResourceUnavailableException { + + if (!canHandle(config, Service.StaticNat)) { + return false; + } + + String errMsg; + ExternalLoadBalancerDeviceVO lbDevice = getExternalLoadBalancerForNetwork(config); + if (lbDevice == null) { + try { + lbDevice = allocateLoadBalancerForNetwork(config); + } catch (Exception e) { + errMsg = "Could not allocate a NetSclaer load balancer for configuring static NAT rules due to" + e.getMessage(); + s_logger.error(errMsg); + throw new ResourceUnavailableException(errMsg, this.getClass(), 0); + } + } + + if (!isNetscalerDevice(lbDevice.getDeviceName())) { + errMsg = "There are no NetScaler load balancer assigned for this network. So NetScaler element will not be handling the static nat rules."; + s_logger.error(errMsg); + throw new ResourceUnavailableException(errMsg, this.getClass(), 0); + } + + SetStaticNatRulesAnswer answer = null; + try { + List rulesTO = null; + if (rules != null) { + rulesTO = new ArrayList(); + for (StaticNat rule : rules) { + IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); + StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), false); + rulesTO.add(ruleTO); + } + } + + SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, null); + answer = (SetStaticNatRulesAnswer) _agentMgr.send(lbDevice.getHostId(), cmd); + if (answer == null) { + return false; + } else { + return answer.getResult(); + } + } catch (Exception e) { + s_logger.error("Failed to configure StaticNat rule due to " + e.getMessage()); + return false; + } + } + +} diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 7285da80519..06a44f15707 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -1,1038 +1,1038 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.lb; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.AgentManager.OnError; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.StopAnswer; -import com.cloud.agent.api.check.CheckSshAnswer; -import com.cloud.agent.api.check.CheckSshCommand; -import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.NetworkElementCommand; -import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.NicTO; -import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.agent.manager.Commands; -import com.cloud.api.commands.CreateLoadBalancerRuleCmd; -import com.cloud.configuration.Config; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.Pod; -import com.cloud.dc.PodVlanMapVO; -import com.cloud.dc.Vlan.VlanType; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.dc.dao.PodVlanMapDao; -import com.cloud.dc.dao.VlanDao; -import com.cloud.deploy.DataCenterDeployment; -import com.cloud.deploy.DeployDestination; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.StorageUnavailableException; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.ElasticLbVmMapVO; -import com.cloud.network.IPAddressVO; -import com.cloud.network.LoadBalancerVO; -import com.cloud.network.Network; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.network.NetworkManager; -import com.cloud.network.NetworkVO; -import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PhysicalNetworkServiceProvider; -import com.cloud.network.VirtualRouterProvider; -import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType; -import com.cloud.network.addr.PublicIp; -import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.LoadBalancerDao; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; -import com.cloud.network.dao.VirtualRouterProviderDao; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; -import com.cloud.network.lb.dao.ElasticLbVmMapDao; -import com.cloud.network.router.VirtualNetworkApplianceManager; -import com.cloud.network.router.VirtualRouter; -import com.cloud.network.router.VirtualRouter.RedundantState; -import com.cloud.network.router.VirtualRouter.Role; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.LoadBalancer; -import com.cloud.offering.ServiceOffering; -import com.cloud.offerings.NetworkOfferingVO; -import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.user.Account; -import com.cloud.user.AccountService; -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.Pair; -import com.cloud.utils.component.Inject; -import com.cloud.utils.component.Manager; -import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.DomainRouterVO; -import com.cloud.vm.NicProfile; -import com.cloud.vm.ReservationContext; -import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.VirtualMachineGuru; -import com.cloud.vm.VirtualMachineManager; -import com.cloud.vm.VirtualMachineName; -import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.VirtualMachineProfile.Param; -import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.NicDao; - -@Local(value = { ElasticLoadBalancerManager.class }) -public class ElasticLoadBalancerManagerImpl implements - ElasticLoadBalancerManager, Manager, VirtualMachineGuru { - private static final Logger s_logger = Logger - .getLogger(ElasticLoadBalancerManagerImpl.class); - - @Inject - IPAddressDao _ipAddressDao; - @Inject - AgentManager _agentMgr; - @Inject - NetworkManager _networkMgr; - @Inject - LoadBalancerDao _loadBalancerDao = null; - @Inject - LoadBalancingRulesManager _lbMgr; - @Inject - VirtualNetworkApplianceManager _routerMgr; - @Inject - DomainRouterDao _routerDao = null; - @Inject - protected HostPodDao _podDao = null; - @Inject - protected ClusterDao _clusterDao; - @Inject - DataCenterDao _dcDao = null; - @Inject - protected NetworkDao _networkDao; - @Inject - protected NetworkOfferingDao _networkOfferingDao; - @Inject - VMTemplateDao _templateDao = null; - @Inject - VirtualMachineManager _itMgr; - @Inject - ConfigurationDao _configDao; - @Inject - ServiceOfferingDao _serviceOfferingDao = null; - @Inject - AccountService _accountService; - @Inject - LoadBalancerDao _lbDao; - @Inject - VlanDao _vlanDao; - @Inject - PodVlanMapDao _podVlanMapDao; - @Inject - ElasticLbVmMapDao _elbVmMapDao; - @Inject - NetworkDao _networksDao; - @Inject - AccountDao _accountDao; - @Inject - PhysicalNetworkServiceProviderDao _physicalProviderDao; - @Inject - VirtualRouterProviderDao _vrProviderDao; - @Inject - NicDao _nicDao; - - - String _name; - String _instance; - static final private String _elbVmNamePrefix = "l"; - static final private String _systemVmType = "elbvm"; - - boolean _enabled; - TrafficType _frontendTrafficType = TrafficType.Guest; - - Account _systemAcct; - ServiceOfferingVO _elasticLbVmOffering; - ScheduledExecutorService _gcThreadPool; - String _mgmtCidr; - String _mgmtHost; - - Set _gcCandidateElbVmIds = Collections.newSetFromMap(new ConcurrentHashMap()); - - int _elasticLbVmRamSize; - int _elasticLbvmCpuMHz; - int _elasticLbvmNumCpu; - - private Long getPodIdForDirectIp(IPAddressVO ipAddr) { - PodVlanMapVO podVlanMaps = _podVlanMapDao.listPodVlanMapsByVlan(ipAddr.getVlanId()); - if (podVlanMaps == null) { - return null; - } else { - return podVlanMaps.getPodId(); - } - } - - - public DomainRouterVO deployLoadBalancerVM(Long networkId, IPAddressVO ipAddr, Long accountId) { - NetworkVO network = _networkDao.findById(networkId); - DataCenter dc = _dcDao.findById(network.getDataCenterId()); - Long podId = getPodIdForDirectIp(ipAddr); - Pod pod = podId == null?null:_podDao.findById(podId); - Map params = new HashMap( - 1); - params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); - Account owner = _accountService.getActiveAccountByName("system", new Long(1)); - DeployDestination dest = new DeployDestination(dc, pod, null, null); - s_logger.debug("About to deploy ELB vm "); - - try { - DomainRouterVO elbVm = deployELBVm(network, dest, owner, params); - if (elbVm == null) { - throw new InvalidParameterValueException("Could not deploy or find existing ELB VM"); - } - s_logger.debug("Deployed ELB vm = " + elbVm); - - return elbVm; - - } catch (Throwable t) { - s_logger.warn("Error while deploying ELB VM: ", t); - return null; - } - - } - - private boolean sendCommandsToRouter(final DomainRouterVO elbVm, - Commands cmds) throws AgentUnavailableException { - Answer[] answers = null; - try { - answers = _agentMgr.send(elbVm.getHostId(), cmds); - } catch (OperationTimedoutException e) { - s_logger.warn("ELB: Timed Out", e); - throw new AgentUnavailableException( - "Unable to send commands to virtual elbVm ", - elbVm.getHostId(), e); - } - - if (answers == null) { - return false; - } - - if (answers.length != cmds.size()) { - return false; - } - - // FIXME: Have to return state for individual command in the future - if (answers.length > 0) { - Answer ans = answers[0]; - return ans.getResult(); - } - return true; - } - - private void createApplyLoadBalancingRulesCommands( - List rules, DomainRouterVO elbVm, Commands cmds, long guestNetworkId) { - - - LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; - int i = 0; - for (LoadBalancingRule rule : rules) { - boolean revoked = (rule.getState() - .equals(FirewallRule.State.Revoke)); - String protocol = rule.getProtocol(); - String algorithm = rule.getAlgorithm(); - - String elbIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress() - .addr(); - int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); - LoadBalancerTO lb = new LoadBalancerTO(elbIp, srcPort, protocol, algorithm, revoked, false, destinations); - lbs[i++] = lb; - } - - LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs,elbVm.getPublicIpAddress(), - _nicDao.getIpAddress(guestNetworkId, elbVm.getId()),elbVm.getPrivateIpAddress(), null, null); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, - elbVm.getPrivateIpAddress()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, - elbVm.getInstanceName()); - //FIXME: why are we setting attributes directly? Ick!! There should be accessors and - //the constructor should set defaults. - cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key()); - cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key()); - cmd.lbStatsAuth = _configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key()); - cmd.lbStatsPort = _configDao.getValue(Config.NetworkLBHaproxyStatsPort.key()); - - cmds.addCommand(cmd); - - } - - protected boolean applyLBRules(DomainRouterVO elbVm, - List rules, long guestNetworkId) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createApplyLoadBalancingRulesCommands(rules, elbVm, cmds, guestNetworkId); - // Send commands to elbVm - return sendCommandsToRouter(elbVm, cmds); - } - - protected DomainRouterVO findElbVmForLb(FirewallRule lb) {//TODO: use a table to lookup - ElasticLbVmMapVO map = _elbVmMapDao.findOneByIp(lb.getSourceIpAddressId()); - if (map == null) { - return null; - } - DomainRouterVO elbVm = _routerDao.findById(map.getElbVmId()); - return elbVm; - } - - public boolean applyLoadBalancerRules(Network network, - List rules) - throws ResourceUnavailableException { - if (rules == null || rules.isEmpty()) { - return true; - } - if (rules.get(0).getPurpose() != Purpose.LoadBalancing) { - s_logger.warn("ELB: Not handling non-LB firewall rules"); - return false; - } - - DomainRouterVO elbVm = findElbVmForLb(rules.get(0)); - - if (elbVm == null) { - s_logger.warn("Unable to apply lb rules, ELB vm doesn't exist in the network " - + network.getId()); - throw new ResourceUnavailableException("Unable to apply lb rules", - DataCenter.class, network.getDataCenterId()); - } - - if (elbVm.getState() == State.Running) { - //resend all rules for the public ip - List lbs = _lbDao.listByIpAddress(rules.get(0).getSourceIpAddressId()); - List lbRules = new ArrayList(); - for (LoadBalancerVO lb : lbs) { - List dstList = _lbMgr.getExistingDestinations(lb.getId()); - List policyList = _lbMgr.getStickinessPolicies(lb.getId()); - LoadBalancingRule loadBalancing = new LoadBalancingRule( - lb, dstList, policyList); - lbRules.add(loadBalancing); - } - return applyLBRules(elbVm, lbRules, network.getId()); - } else if (elbVm.getState() == State.Stopped - || elbVm.getState() == State.Stopping) { - s_logger.debug("ELB VM is in " - + elbVm.getState() - + ", so not sending apply LoadBalancing rules commands to the backend"); - return true; - } else { - s_logger.warn("Unable to apply loadbalancing rules, ELB VM is not in the right state " - + elbVm.getState()); - throw new ResourceUnavailableException( - "Unable to apply loadbalancing rules, ELB VM is not in the right state", - VirtualRouter.class, elbVm.getId()); - } - } - - @Override - public boolean configure(String name, Map params) - throws ConfigurationException { - _name = name; - final Map configs = _configDao.getConfiguration("AgentManager", params); - _systemAcct = _accountService.getSystemAccount(); - _instance = configs.get("instance.name"); - if (_instance == null) { - _instance = "VM"; - } - _mgmtCidr = _configDao.getValue(Config.ManagementNetwork.key()); - _mgmtHost = _configDao.getValue(Config.ManagementHostIPAdr.key()); - - boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); - - _elasticLbVmRamSize = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmMemory.key()), DEFAULT_ELB_VM_RAMSIZE); - _elasticLbvmCpuMHz = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmCpuMhz.key()), DEFAULT_ELB_VM_CPU_MHZ); - _elasticLbvmNumCpu = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmNumVcpu.key()), 1); - _elasticLbVmOffering = new ServiceOfferingVO("System Offering For Elastic LB VM", _elasticLbvmNumCpu, - _elasticLbVmRamSize, _elasticLbvmCpuMHz, 0, 0, true, null, useLocalStorage, - true, null, true, VirtualMachine.Type.ElasticLoadBalancerVm, true); - _elasticLbVmOffering.setUniqueName(ServiceOffering.elbVmDefaultOffUniqueName); - _elasticLbVmOffering = _serviceOfferingDao.persistSystemServiceOffering(_elasticLbVmOffering); - - - - String enabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); - _enabled = (enabled == null) ? false: Boolean.parseBoolean(enabled); - s_logger.info("Elastic Load balancer enabled: " + _enabled); - if (_enabled) { - String traffType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key()); - if ("guest".equalsIgnoreCase(traffType)) { - _frontendTrafficType = TrafficType.Guest; - } else if ("public".equalsIgnoreCase(traffType)){ - _frontendTrafficType = TrafficType.Public; - } else - throw new ConfigurationException("ELB: Traffic type for front end of load balancer has to be guest or public; found : " + traffType); - s_logger.info("ELB: Elastic Load Balancer: will balance on " + traffType ); - int gcIntervalMinutes = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmGcInterval.key()), 5); - if (gcIntervalMinutes < 5) - gcIntervalMinutes = 5; - s_logger.info("ELB: Elastic Load Balancer: scheduling GC to run every " + gcIntervalMinutes + " minutes" ); - _gcThreadPool = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ELBVM-GC")); - _gcThreadPool.scheduleAtFixedRate(new CleanupThread(), gcIntervalMinutes, gcIntervalMinutes, TimeUnit.MINUTES); - _itMgr.registerGuru(VirtualMachine.Type.ElasticLoadBalancerVm, this); - } - - - return true; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - return true; - } - - @Override - public String getName() { - return _name; - } - - private DomainRouterVO findELBVmWithCapacity(Network guestNetwork, IPAddressVO ipAddr) { - List unusedElbVms = _elbVmMapDao.listUnusedElbVms(); - if (unusedElbVms.size() > 0) { - List candidateVms = new ArrayList(); - for (DomainRouterVO candidateVm: unusedElbVms) { - if (candidateVm.getPodIdToDeployIn() == getPodIdForDirectIp(ipAddr)) - candidateVms.add(candidateVm); - } - return candidateVms.size()==0?null:candidateVms.get(new Random().nextInt(candidateVms.size())); - } - return null; - } - - public DomainRouterVO deployELBVm(Network guestNetwork, DeployDestination dest, Account owner, Map params) throws - ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { - long dcId = dest.getDataCenter().getId(); - - // lock guest network - Long guestNetworkId = guestNetwork.getId(); - guestNetwork = _networkDao.acquireInLockTable(guestNetworkId); - - if (guestNetwork == null) { - throw new ConcurrentOperationException("Unable to acquire network lock: " + guestNetworkId); - } - - try { - - if (_networkMgr.isNetworkSystem(guestNetwork) || guestNetwork.getGuestType() == Network.GuestType.Shared) { - owner = _accountService.getSystemAccount(); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Starting a ELB vm for network configurations: " + guestNetwork + " in " + dest); - } - assert guestNetwork.getState() == Network.State.Implemented - || guestNetwork.getState() == Network.State.Setup - || guestNetwork.getState() == Network.State.Implementing - : "Network is not yet fully implemented: "+ guestNetwork; - - DataCenterDeployment plan = null; - DomainRouterVO elbVm = null; - - plan = new DataCenterDeployment(dcId, dest.getPod().getId(), null, null, null, null); - - if (elbVm == null) { - long id = _routerDao.getNextInSequence(Long.class, "id"); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Creating the ELB vm " + id); - } - - List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork); - NetworkOfferingVO controlOffering = offerings.get(0); - NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); - - List> networks = new ArrayList>(2); - NicProfile guestNic = new NicProfile(); - guestNic.setDefaultNic(true); - networks.add(new Pair(controlConfig, null)); - networks.add(new Pair((NetworkVO) guestNetwork, guestNic)); - - - VMTemplateVO template = _templateDao.findSystemVMTemplate(dcId); - - String typeString = "ElasticLoadBalancerVm"; - Long physicalNetworkId = _networkMgr.getPhysicalNetworkId(guestNetwork); - PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(physicalNetworkId, typeString); - if (provider == null) { - throw new CloudRuntimeException("Cannot find service provider " + typeString + " in physical network " + physicalNetworkId); - } - VirtualRouterProvider vrProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), VirtualRouterProviderType.ElasticLoadBalancerVm); - if (vrProvider == null) { - throw new CloudRuntimeException("Cannot find virtual router provider " + typeString + " as service provider " + provider.getId()); - } - - elbVm = new DomainRouterVO(id, _elasticLbVmOffering.getId(), vrProvider.getId(), - VirtualMachineName.getSystemVmName(id, _instance, _elbVmNamePrefix), template.getId(), template.getHypervisorType(), - template.getGuestOSId(), owner.getDomainId(), owner.getId(), false, 0, false, RedundantState.UNKNOWN, - _elasticLbVmOffering.getOfferHA(), false, VirtualMachine.Type.ElasticLoadBalancerVm, null); - elbVm.setRole(Role.LB); - elbVm = _itMgr.allocate(elbVm, template, _elasticLbVmOffering, networks, plan, null, owner); - //TODO: create usage stats - } - - State state = elbVm.getState(); - if (state != State.Running) { - elbVm = this.start(elbVm, _accountService.getSystemUser(), _accountService.getSystemAccount(), params); - } - - - return elbVm; - } finally { - _networkDao.releaseFromLockTable(guestNetworkId); - } - } - - private DomainRouterVO start(DomainRouterVO elbVm, User user, Account caller, Map params) throws StorageUnavailableException, InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - s_logger.debug("Starting ELB VM " + elbVm); - if (_itMgr.start(elbVm, params, user, caller) != null) { - return _routerDao.findById(elbVm.getId()); - } else { - return null; - } - } - - - private DomainRouterVO stop(DomainRouterVO elbVm, boolean forced, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { - s_logger.debug("Stopping ELB vm " + elbVm); - try { - if (_itMgr.advanceStop( elbVm, forced, user, caller)) { - return _routerDao.findById(elbVm.getId()); - } else { - return null; - } - } catch (OperationTimedoutException e) { - throw new CloudRuntimeException("Unable to stop " + elbVm, e); - } - } - - protected List findExistingLoadBalancers(String lbName, Long ipId, Long accountId, Long domainId, Integer publicPort) { - SearchBuilder sb = _lbDao.createSearchBuilder(); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); - sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); - sb.and("publicPort", sb.entity().getSourcePortStart(), SearchCriteria.Op.EQ); - if (ipId != null) { - sb.and("sourceIpAddress", sb.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ); - } - if (domainId != null) { - sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); - } - if (publicPort != null) { - sb.and("publicPort", sb.entity().getSourcePortStart(), SearchCriteria.Op.EQ); - } - SearchCriteria sc = sb.create(); - sc.setParameters("name", lbName); - sc.setParameters("accountId", accountId); - if (ipId != null) { - sc.setParameters("sourceIpAddress", ipId); - } - if (domainId != null) { - sc.setParameters("domainId",domainId); - } - if (publicPort != null) { - sc.setParameters("publicPort", publicPort); - } - List lbs = _lbDao.search(sc, null); - - return lbs == null || lbs.size()==0 ? null: lbs; - } - - @DB - public PublicIp allocDirectIp(Account account, long guestNetworkId) throws InsufficientAddressCapacityException { - Network frontEndNetwork = _networkMgr.getNetwork(guestNetworkId); - Transaction txn = Transaction.currentTxn(); - txn.start(); - - PublicIp ip = _networkMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true); - IPAddressVO ipvo = _ipAddressDao.findById(ip.getId()); - ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId()); - _ipAddressDao.update(ipvo.getId(), ipvo); - txn.commit(); - s_logger.info("Acquired frontend IP for ELB " + ip); - - return ip; - } - - public void releaseIp(long ipId, long userId, Account caller) { - s_logger.info("ELB: Release public IP for loadbalancing " + ipId); - IPAddressVO ipvo = _ipAddressDao.findById(ipId); - ipvo.setAssociatedWithNetworkId(null); - _ipAddressDao.update(ipvo.getId(), ipvo); - _networkMgr.disassociatePublicIpAddress(ipId, userId, caller); - _ipAddressDao.unassignIpAddress(ipId); - } - - @Override - @DB - public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account account, long networkId) throws InsufficientAddressCapacityException, NetworkRuleConflictException { - //this part of code is executed when the LB provider is Elastic Load Balancer vm - if (!_networkMgr.isProviderSupportServiceInNetwork(lb.getNetworkId(), Service.Lb, Provider.ElasticLoadBalancerVm)) { - return null; - } - - Long ipId = lb.getSourceIpAddressId(); - if (ipId != null) { - return null; - } - boolean newIp = false; - account = _accountDao.acquireInLockTable(account.getId()); - if (account == null) { - s_logger.warn("ELB: CreateLoadBalancer: Failed to acquire lock on account"); - throw new CloudRuntimeException("Failed to acquire lock on account"); - } - try { - List existingLbs = findExistingLoadBalancers(lb.getName(), lb.getSourceIpAddressId(), lb.getAccountId(), lb.getDomainId(), lb.getSourcePortStart()); - if (existingLbs == null ){ - existingLbs = findExistingLoadBalancers(lb.getName(), lb.getSourceIpAddressId(), lb.getAccountId(), lb.getDomainId(), null); - if (existingLbs == null) { - if (lb.getSourceIpAddressId() != null) { - existingLbs = findExistingLoadBalancers(lb.getName(), null, lb.getAccountId(), lb.getDomainId(), null); - if (existingLbs != null) { - throw new InvalidParameterValueException("Supplied LB name " + lb.getName() + " is not associated with IP " + lb.getSourceIpAddressId() ); - } - } else { - s_logger.debug("Could not find any existing frontend ips for this account for this LB rule, acquiring a new frontent IP for ELB"); - PublicIp ip = allocDirectIp(account, networkId); - ipId = ip.getId(); - newIp = true; - } - } else { - ipId = existingLbs.get(0).getSourceIpAddressId(); - s_logger.debug("ELB: Found existing frontend ip for this account for this LB rule " + ipId); - } - } else { - s_logger.warn("ELB: Found existing load balancers matching requested new LB"); - throw new NetworkRuleConflictException("ELB: Found existing load balancers matching requested new LB"); - } - - Network network = _networkMgr.getNetwork(networkId); - IPAddressVO ipAddr = _ipAddressDao.findById(ipId); - - LoadBalancer result = null; - try { - lb.setSourceIpAddressId(ipId); - result = _lbMgr.createLoadBalancer(lb, false); - } catch (NetworkRuleConflictException e) { - s_logger.warn("Failed to create LB rule, not continuing with ELB deployment"); - if (newIp) { - releaseIp(ipId, UserContext.current().getCallerUserId(), account); - } - throw e; - } - - DomainRouterVO elbVm = null; - - - if (existingLbs == null) { - elbVm = findELBVmWithCapacity(network, ipAddr); - if (elbVm == null) { - elbVm = deployLoadBalancerVM(networkId, ipAddr, account.getId()); - if (elbVm == null) { - s_logger.warn("Failed to deploy a new ELB vm for ip " + ipAddr + " in network " + network + "lb name=" + lb.getName()); - if (newIp) - releaseIp(ipId, UserContext.current().getCallerUserId(), account); - } - } - - } else { - ElasticLbVmMapVO elbVmMap = _elbVmMapDao.findOneByIp(ipId); - if (elbVmMap != null) { - elbVm = _routerDao.findById(elbVmMap.getElbVmId()); - } - } - - if (elbVm == null) { - s_logger.warn("No ELB VM can be found or deployed"); - s_logger.warn("Deleting LB since we failed to deploy ELB VM"); - _lbDao.remove(result.getId()); - return null; - } - - ElasticLbVmMapVO mapping = new ElasticLbVmMapVO(ipId, elbVm.getId(), result.getId()); - _elbVmMapDao.persist(mapping); - return result; - - } finally { - if (account != null) { - _accountDao.releaseFromLockTable(account.getId()); - } - } - - } - - void garbageCollectUnusedElbVms() { - List unusedElbVms = _elbVmMapDao.listUnusedElbVms(); - if (unusedElbVms != null && unusedElbVms.size() > 0) - s_logger.info("Found " + unusedElbVms.size() + " unused ELB vms"); - Set currentGcCandidates = new HashSet(); - for (DomainRouterVO elbVm: unusedElbVms) { - currentGcCandidates.add(elbVm.getId()); - } - _gcCandidateElbVmIds.retainAll(currentGcCandidates); - currentGcCandidates.removeAll(_gcCandidateElbVmIds); - User user = _accountService.getSystemUser(); - for (Long elbVmId : _gcCandidateElbVmIds) { - DomainRouterVO elbVm = _routerDao.findById(elbVmId); - boolean gceed = false; - - try { - s_logger.info("Attempting to stop ELB VM: " + elbVm); - stop(elbVm, true, user, _systemAcct); - gceed = true; - } catch (ConcurrentOperationException e) { - s_logger.warn("Unable to stop unused ELB vm " + elbVm + " due to ", e); - } catch (ResourceUnavailableException e) { - s_logger.warn("Unable to stop unused ELB vm " + elbVm + " due to ", e); - continue; - } - if (gceed) { - try { - s_logger.info("Attempting to destroy ELB VM: " + elbVm); - _itMgr.expunge(elbVm, user, _systemAcct); - } catch (ResourceUnavailableException e) { - s_logger.warn("Unable to destroy unused ELB vm " + elbVm + " due to ", e); - gceed = false; - } - } - if (!gceed) { - currentGcCandidates.add(elbVm.getId()); - } - - } - _gcCandidateElbVmIds = currentGcCandidates; - } - - public class CleanupThread implements Runnable { - @Override - public void run() { - garbageCollectUnusedElbVms(); - - } - - CleanupThread() { - - } - } - - @Override - public void handleDeleteLoadBalancerRule(LoadBalancer lb, long userId, Account caller) { - if (!_enabled) { - return; - } - List remainingLbs = _loadBalancerDao.listByIpAddress(lb.getSourceIpAddressId()); - if (remainingLbs.size() == 0) { - s_logger.debug("ELB mgr: releasing ip " + lb.getSourceIpAddressId() + " since no LB rules remain for this ip address"); - releaseIp(lb.getSourceIpAddressId(), userId, caller); - } - } - - - @Override - public DomainRouterVO findByName(String name) { - if (!VirtualMachineName.isValidSystemVmName(name, _instance, _elbVmNamePrefix)) { - return null; - } - - return _routerDao.findById(VirtualMachineName.getSystemVmId(name)); - } - - - @Override - public DomainRouterVO findById(long id) { - return _routerDao.findById(id); - } - - - @Override - public DomainRouterVO persist(DomainRouterVO elbVm) { - return _routerDao.persist(elbVm); - } - - - @Override - public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { - DomainRouterVO elbVm = profile.getVirtualMachine(); - - List elbNics = profile.getNics(); - Long guestNtwkId = null; - for (NicProfile routerNic : elbNics) { - if (routerNic.getTrafficType() == TrafficType.Guest) { - guestNtwkId = routerNic.getNetworkId(); - break; - } - } - - NetworkVO guestNetwork = _networkDao.findById(guestNtwkId); - - DataCenter dc = dest.getDataCenter(); - - StringBuilder buf = profile.getBootArgsBuilder(); - buf.append(" template=domP type=" + _systemVmType); - buf.append(" name=").append(profile.getHostName()); - NicProfile controlNic = null; - String defaultDns1 = null; - String defaultDns2 = null; - - for (NicProfile nic : profile.getNics()) { - int deviceId = nic.getDeviceId(); - buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); - buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); - if (nic.isDefaultNic()) { - buf.append(" gateway=").append(nic.getGateway()); - defaultDns1 = nic.getDns1(); - defaultDns2 = nic.getDns2(); - } - if (nic.getTrafficType() == TrafficType.Management) { - buf.append(" localgw=").append(dest.getPod().getGateway()); - } else if (nic.getTrafficType() == TrafficType.Control) { - // control command is sent over management network in VMware - if (dest.getHost().getHypervisorType() == HypervisorType.VMware) { - if (s_logger.isInfoEnabled()) { - s_logger.info("Check if we need to add management server explicit route to ELB vm. pod cidr: " + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize() - + ", pod gateway: " + dest.getPod().getGateway() + ", management host: " + _mgmtHost); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Added management server explicit route to ELB vm."); - } - // always add management explicit route, for basic networking setup - buf.append(" mgmtcidr=").append(_mgmtCidr); - buf.append(" localgw=").append(dest.getPod().getGateway()); - - if (dc.getNetworkType() == NetworkType.Basic) { - // ask elb vm to setup SSH on guest network - buf.append(" sshonguest=true"); - } - - } - - controlNic = nic; - } - } - String domain = guestNetwork.getNetworkDomain(); - if (domain != null) { - buf.append(" domain=" + domain); - } - - buf.append(" dns1=").append(defaultDns1); - if (defaultDns2 != null) { - buf.append(" dns2=").append(defaultDns2); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); - } - - if (controlNic == null) { - throw new CloudRuntimeException("Didn't start a control port"); - } - - return true; - } - - - @Override - public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException { - DomainRouterVO elbVm = profile.getVirtualMachine(); - - List nics = profile.getNics(); - for (NicProfile nic : nics) { - if (nic.getTrafficType() == TrafficType.Public) { - elbVm.setPublicIpAddress(nic.getIp4Address()); - elbVm.setPublicNetmask(nic.getNetmask()); - elbVm.setPublicMacAddress(nic.getMacAddress()); - } else if (nic.getTrafficType() == TrafficType.Control) { - elbVm.setPrivateIpAddress(nic.getIp4Address()); - elbVm.setPrivateMacAddress(nic.getMacAddress()); - } - } - _routerDao.update(elbVm.getId(), elbVm); - - finalizeCommandsOnStart(cmds, profile); - return true; - } - - - @Override - public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) { - CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh"); - if (answer == null || !answer.getResult()) { - s_logger.warn("Unable to ssh to the ELB VM: " + answer.getDetails()); - return false; - } - - return true; - } - - - @Override - public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile profile) { - DomainRouterVO elbVm = profile.getVirtualMachine(); - DataCenterVO dcVo = _dcDao.findById(elbVm.getDataCenterIdToDeployIn()); - - NicProfile controlNic = null; - Long guestNetworkId = null; - - if(profile.getHypervisorType() == HypervisorType.VMware && dcVo.getNetworkType() == NetworkType.Basic) { - // TODO this is a ugly to test hypervisor type here - // for basic network mode, we will use the guest NIC for control NIC - for (NicProfile nic : profile.getNics()) { - if (nic.getTrafficType() == TrafficType.Guest && nic.getIp4Address() != null) { - controlNic = nic; - guestNetworkId = nic.getNetworkId(); - } - } - } else { - for (NicProfile nic : profile.getNics()) { - if (nic.getTrafficType() == TrafficType.Control && nic.getIp4Address() != null) { - controlNic = nic; - } else if (nic.getTrafficType() == TrafficType.Guest) { - guestNetworkId = nic.getNetworkId(); - } - } - } - - if (controlNic == null) { - s_logger.error("Control network doesn't exist for the ELB vm " + elbVm); - return false; - } - - cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922)); - - // Re-apply load balancing rules - List lbs = _elbVmMapDao.listLbsForElbVm(elbVm.getId()); - List lbRules = new ArrayList(); - for (LoadBalancerVO lb : lbs) { - List dstList = _lbMgr.getExistingDestinations(lb.getId()); - List policyList = _lbMgr.getStickinessPolicies(lb.getId()); - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); - lbRules.add(loadBalancing); - } - - s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of ELB vm " + elbVm + " start."); - if (!lbRules.isEmpty()) { - createApplyLoadBalancingRulesCommands(lbRules, elbVm, cmds, guestNetworkId); - } - - return true; - } - - - @Override - public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { - if (answer != null) { - VMInstanceVO vm = profile.getVirtualMachine(); - DomainRouterVO elbVm = _routerDao.findById(vm.getId()); - processStopOrRebootAnswer(elbVm, answer); - } - } - - public void processStopOrRebootAnswer(final DomainRouterVO elbVm, Answer answer) { - //TODO: process network usage stats - } - - - @Override - public void finalizeExpunge(DomainRouterVO vm) { - // no-op - - } - - @Override - public Long convertToId(String vmName) { - if (!VirtualMachineName.isValidSystemVmName(vmName, _instance, _elbVmNamePrefix)) { - return null; - } - - return VirtualMachineName.getSystemVmId(vmName); - } - - @Override - public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm, - ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException, - InsufficientCapacityException { - //not supported - throw new UnsupportedOperationException("Plug nic is not supported for vm of type " + vm.getType()); - } - - - @Override - public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, - ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException { - //not supported - throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); - } - - - @Override - public void prepareStop(VirtualMachineProfile profile) { - - } - - - @Override - public boolean recreateNeeded( - VirtualMachineProfile profile, long hostId, - Commands cmds, ReservationContext context) { - // TODO Auto-generated method stub - return false; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.lb; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.AgentManager.OnError; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.StopAnswer; +import com.cloud.agent.api.check.CheckSshAnswer; +import com.cloud.agent.api.check.CheckSshCommand; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.agent.api.to.NicTO; +import com.cloud.agent.api.to.VirtualMachineTO; +import com.cloud.agent.manager.Commands; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.Pod; +import com.cloud.dc.PodVlanMapVO; +import com.cloud.dc.Vlan.VlanType; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.PodVlanMapDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DataCenterDeployment; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.StorageUnavailableException; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.ElasticLbVmMapVO; +import com.cloud.network.IPAddressVO; +import com.cloud.network.LoadBalancerVO; +import com.cloud.network.Network; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.VirtualRouterProvider; +import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType; +import com.cloud.network.addr.PublicIp; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.VirtualRouterProviderDao; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; +import com.cloud.network.lb.dao.ElasticLbVmMapDao; +import com.cloud.network.router.VirtualNetworkApplianceManager; +import com.cloud.network.router.VirtualRouter; +import com.cloud.network.router.VirtualRouter.RedundantState; +import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.offering.ServiceOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.user.Account; +import com.cloud.user.AccountService; +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.Pair; +import com.cloud.utils.component.Inject; +import com.cloud.utils.component.Manager; +import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachineGuru; +import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachineProfile.Param; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; + +@Local(value = { ElasticLoadBalancerManager.class }) +public class ElasticLoadBalancerManagerImpl implements + ElasticLoadBalancerManager, Manager, VirtualMachineGuru { + private static final Logger s_logger = Logger + .getLogger(ElasticLoadBalancerManagerImpl.class); + + @Inject + IPAddressDao _ipAddressDao; + @Inject + AgentManager _agentMgr; + @Inject + NetworkManager _networkMgr; + @Inject + LoadBalancerDao _loadBalancerDao = null; + @Inject + LoadBalancingRulesManager _lbMgr; + @Inject + VirtualNetworkApplianceManager _routerMgr; + @Inject + DomainRouterDao _routerDao = null; + @Inject + protected HostPodDao _podDao = null; + @Inject + protected ClusterDao _clusterDao; + @Inject + DataCenterDao _dcDao = null; + @Inject + protected NetworkDao _networkDao; + @Inject + protected NetworkOfferingDao _networkOfferingDao; + @Inject + VMTemplateDao _templateDao = null; + @Inject + VirtualMachineManager _itMgr; + @Inject + ConfigurationDao _configDao; + @Inject + ServiceOfferingDao _serviceOfferingDao = null; + @Inject + AccountService _accountService; + @Inject + LoadBalancerDao _lbDao; + @Inject + VlanDao _vlanDao; + @Inject + PodVlanMapDao _podVlanMapDao; + @Inject + ElasticLbVmMapDao _elbVmMapDao; + @Inject + NetworkDao _networksDao; + @Inject + AccountDao _accountDao; + @Inject + PhysicalNetworkServiceProviderDao _physicalProviderDao; + @Inject + VirtualRouterProviderDao _vrProviderDao; + @Inject + NicDao _nicDao; + + + String _name; + String _instance; + static final private String _elbVmNamePrefix = "l"; + static final private String _systemVmType = "elbvm"; + + boolean _enabled; + TrafficType _frontendTrafficType = TrafficType.Guest; + + Account _systemAcct; + ServiceOfferingVO _elasticLbVmOffering; + ScheduledExecutorService _gcThreadPool; + String _mgmtCidr; + String _mgmtHost; + + Set _gcCandidateElbVmIds = Collections.newSetFromMap(new ConcurrentHashMap()); + + int _elasticLbVmRamSize; + int _elasticLbvmCpuMHz; + int _elasticLbvmNumCpu; + + private Long getPodIdForDirectIp(IPAddressVO ipAddr) { + PodVlanMapVO podVlanMaps = _podVlanMapDao.listPodVlanMapsByVlan(ipAddr.getVlanId()); + if (podVlanMaps == null) { + return null; + } else { + return podVlanMaps.getPodId(); + } + } + + + public DomainRouterVO deployLoadBalancerVM(Long networkId, IPAddressVO ipAddr, Long accountId) { + NetworkVO network = _networkDao.findById(networkId); + DataCenter dc = _dcDao.findById(network.getDataCenterId()); + Long podId = getPodIdForDirectIp(ipAddr); + Pod pod = podId == null?null:_podDao.findById(podId); + Map params = new HashMap( + 1); + params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true); + Account owner = _accountService.getActiveAccountByName("system", new Long(1)); + DeployDestination dest = new DeployDestination(dc, pod, null, null); + s_logger.debug("About to deploy ELB vm "); + + try { + DomainRouterVO elbVm = deployELBVm(network, dest, owner, params); + if (elbVm == null) { + throw new InvalidParameterValueException("Could not deploy or find existing ELB VM"); + } + s_logger.debug("Deployed ELB vm = " + elbVm); + + return elbVm; + + } catch (Throwable t) { + s_logger.warn("Error while deploying ELB VM: ", t); + return null; + } + + } + + private boolean sendCommandsToRouter(final DomainRouterVO elbVm, + Commands cmds) throws AgentUnavailableException { + Answer[] answers = null; + try { + answers = _agentMgr.send(elbVm.getHostId(), cmds); + } catch (OperationTimedoutException e) { + s_logger.warn("ELB: Timed Out", e); + throw new AgentUnavailableException( + "Unable to send commands to virtual elbVm ", + elbVm.getHostId(), e); + } + + if (answers == null) { + return false; + } + + if (answers.length != cmds.size()) { + return false; + } + + // FIXME: Have to return state for individual command in the future + if (answers.length > 0) { + Answer ans = answers[0]; + return ans.getResult(); + } + return true; + } + + private void createApplyLoadBalancingRulesCommands( + List rules, DomainRouterVO elbVm, Commands cmds, long guestNetworkId) { + + + LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; + int i = 0; + for (LoadBalancingRule rule : rules) { + boolean revoked = (rule.getState() + .equals(FirewallRule.State.Revoke)); + String protocol = rule.getProtocol(); + String algorithm = rule.getAlgorithm(); + + String elbIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress() + .addr(); + int srcPort = rule.getSourcePortStart(); + List destinations = rule.getDestinations(); + LoadBalancerTO lb = new LoadBalancerTO(rule.getId(), elbIp, srcPort, protocol, algorithm, revoked, false, destinations); + lbs[i++] = lb; + } + + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs,elbVm.getPublicIpAddress(), + _nicDao.getIpAddress(guestNetworkId, elbVm.getId()),elbVm.getPrivateIpAddress(), null, null); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, + elbVm.getPrivateIpAddress()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, + elbVm.getInstanceName()); + //FIXME: why are we setting attributes directly? Ick!! There should be accessors and + //the constructor should set defaults. + cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key()); + cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key()); + cmd.lbStatsAuth = _configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key()); + cmd.lbStatsPort = _configDao.getValue(Config.NetworkLBHaproxyStatsPort.key()); + + cmds.addCommand(cmd); + + } + + protected boolean applyLBRules(DomainRouterVO elbVm, + List rules, long guestNetworkId) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createApplyLoadBalancingRulesCommands(rules, elbVm, cmds, guestNetworkId); + // Send commands to elbVm + return sendCommandsToRouter(elbVm, cmds); + } + + protected DomainRouterVO findElbVmForLb(FirewallRule lb) {//TODO: use a table to lookup + ElasticLbVmMapVO map = _elbVmMapDao.findOneByIp(lb.getSourceIpAddressId()); + if (map == null) { + return null; + } + DomainRouterVO elbVm = _routerDao.findById(map.getElbVmId()); + return elbVm; + } + + public boolean applyLoadBalancerRules(Network network, + List rules) + throws ResourceUnavailableException { + if (rules == null || rules.isEmpty()) { + return true; + } + if (rules.get(0).getPurpose() != Purpose.LoadBalancing) { + s_logger.warn("ELB: Not handling non-LB firewall rules"); + return false; + } + + DomainRouterVO elbVm = findElbVmForLb(rules.get(0)); + + if (elbVm == null) { + s_logger.warn("Unable to apply lb rules, ELB vm doesn't exist in the network " + + network.getId()); + throw new ResourceUnavailableException("Unable to apply lb rules", + DataCenter.class, network.getDataCenterId()); + } + + if (elbVm.getState() == State.Running) { + //resend all rules for the public ip + List lbs = _lbDao.listByIpAddress(rules.get(0).getSourceIpAddressId()); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + List policyList = _lbMgr.getStickinessPolicies(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule( + lb, dstList, policyList); + lbRules.add(loadBalancing); + } + return applyLBRules(elbVm, lbRules, network.getId()); + } else if (elbVm.getState() == State.Stopped + || elbVm.getState() == State.Stopping) { + s_logger.debug("ELB VM is in " + + elbVm.getState() + + ", so not sending apply LoadBalancing rules commands to the backend"); + return true; + } else { + s_logger.warn("Unable to apply loadbalancing rules, ELB VM is not in the right state " + + elbVm.getState()); + throw new ResourceUnavailableException( + "Unable to apply loadbalancing rules, ELB VM is not in the right state", + VirtualRouter.class, elbVm.getId()); + } + } + + @Override + public boolean configure(String name, Map params) + throws ConfigurationException { + _name = name; + final Map configs = _configDao.getConfiguration("AgentManager", params); + _systemAcct = _accountService.getSystemAccount(); + _instance = configs.get("instance.name"); + if (_instance == null) { + _instance = "VM"; + } + _mgmtCidr = _configDao.getValue(Config.ManagementNetwork.key()); + _mgmtHost = _configDao.getValue(Config.ManagementHostIPAdr.key()); + + boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); + + _elasticLbVmRamSize = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmMemory.key()), DEFAULT_ELB_VM_RAMSIZE); + _elasticLbvmCpuMHz = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmCpuMhz.key()), DEFAULT_ELB_VM_CPU_MHZ); + _elasticLbvmNumCpu = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmNumVcpu.key()), 1); + _elasticLbVmOffering = new ServiceOfferingVO("System Offering For Elastic LB VM", _elasticLbvmNumCpu, + _elasticLbVmRamSize, _elasticLbvmCpuMHz, 0, 0, true, null, useLocalStorage, + true, null, true, VirtualMachine.Type.ElasticLoadBalancerVm, true); + _elasticLbVmOffering.setUniqueName(ServiceOffering.elbVmDefaultOffUniqueName); + _elasticLbVmOffering = _serviceOfferingDao.persistSystemServiceOffering(_elasticLbVmOffering); + + + + String enabled = _configDao.getValue(Config.ElasticLoadBalancerEnabled.key()); + _enabled = (enabled == null) ? false: Boolean.parseBoolean(enabled); + s_logger.info("Elastic Load balancer enabled: " + _enabled); + if (_enabled) { + String traffType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key()); + if ("guest".equalsIgnoreCase(traffType)) { + _frontendTrafficType = TrafficType.Guest; + } else if ("public".equalsIgnoreCase(traffType)){ + _frontendTrafficType = TrafficType.Public; + } else + throw new ConfigurationException("ELB: Traffic type for front end of load balancer has to be guest or public; found : " + traffType); + s_logger.info("ELB: Elastic Load Balancer: will balance on " + traffType ); + int gcIntervalMinutes = NumbersUtil.parseInt(configs.get(Config.ElasticLoadBalancerVmGcInterval.key()), 5); + if (gcIntervalMinutes < 5) + gcIntervalMinutes = 5; + s_logger.info("ELB: Elastic Load Balancer: scheduling GC to run every " + gcIntervalMinutes + " minutes" ); + _gcThreadPool = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ELBVM-GC")); + _gcThreadPool.scheduleAtFixedRate(new CleanupThread(), gcIntervalMinutes, gcIntervalMinutes, TimeUnit.MINUTES); + _itMgr.registerGuru(VirtualMachine.Type.ElasticLoadBalancerVm, this); + } + + + return true; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + private DomainRouterVO findELBVmWithCapacity(Network guestNetwork, IPAddressVO ipAddr) { + List unusedElbVms = _elbVmMapDao.listUnusedElbVms(); + if (unusedElbVms.size() > 0) { + List candidateVms = new ArrayList(); + for (DomainRouterVO candidateVm: unusedElbVms) { + if (candidateVm.getPodIdToDeployIn() == getPodIdForDirectIp(ipAddr)) + candidateVms.add(candidateVm); + } + return candidateVms.size()==0?null:candidateVms.get(new Random().nextInt(candidateVms.size())); + } + return null; + } + + public DomainRouterVO deployELBVm(Network guestNetwork, DeployDestination dest, Account owner, Map params) throws + ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + long dcId = dest.getDataCenter().getId(); + + // lock guest network + Long guestNetworkId = guestNetwork.getId(); + guestNetwork = _networkDao.acquireInLockTable(guestNetworkId); + + if (guestNetwork == null) { + throw new ConcurrentOperationException("Unable to acquire network lock: " + guestNetworkId); + } + + try { + + if (_networkMgr.isNetworkSystem(guestNetwork) || guestNetwork.getGuestType() == Network.GuestType.Shared) { + owner = _accountService.getSystemAccount(); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Starting a ELB vm for network configurations: " + guestNetwork + " in " + dest); + } + assert guestNetwork.getState() == Network.State.Implemented + || guestNetwork.getState() == Network.State.Setup + || guestNetwork.getState() == Network.State.Implementing + : "Network is not yet fully implemented: "+ guestNetwork; + + DataCenterDeployment plan = null; + DomainRouterVO elbVm = null; + + plan = new DataCenterDeployment(dcId, dest.getPod().getId(), null, null, null, null); + + if (elbVm == null) { + long id = _routerDao.getNextInSequence(Long.class, "id"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating the ELB vm " + id); + } + + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork); + NetworkOfferingVO controlOffering = offerings.get(0); + NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); + + List> networks = new ArrayList>(2); + NicProfile guestNic = new NicProfile(); + guestNic.setDefaultNic(true); + networks.add(new Pair(controlConfig, null)); + networks.add(new Pair((NetworkVO) guestNetwork, guestNic)); + + + VMTemplateVO template = _templateDao.findSystemVMTemplate(dcId); + + String typeString = "ElasticLoadBalancerVm"; + Long physicalNetworkId = _networkMgr.getPhysicalNetworkId(guestNetwork); + PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(physicalNetworkId, typeString); + if (provider == null) { + throw new CloudRuntimeException("Cannot find service provider " + typeString + " in physical network " + physicalNetworkId); + } + VirtualRouterProvider vrProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), VirtualRouterProviderType.ElasticLoadBalancerVm); + if (vrProvider == null) { + throw new CloudRuntimeException("Cannot find virtual router provider " + typeString + " as service provider " + provider.getId()); + } + + elbVm = new DomainRouterVO(id, _elasticLbVmOffering.getId(), vrProvider.getId(), + VirtualMachineName.getSystemVmName(id, _instance, _elbVmNamePrefix), template.getId(), template.getHypervisorType(), + template.getGuestOSId(), owner.getDomainId(), owner.getId(), false, 0, false, RedundantState.UNKNOWN, + _elasticLbVmOffering.getOfferHA(), false, VirtualMachine.Type.ElasticLoadBalancerVm, null); + elbVm.setRole(Role.LB); + elbVm = _itMgr.allocate(elbVm, template, _elasticLbVmOffering, networks, plan, null, owner); + //TODO: create usage stats + } + + State state = elbVm.getState(); + if (state != State.Running) { + elbVm = this.start(elbVm, _accountService.getSystemUser(), _accountService.getSystemAccount(), params); + } + + + return elbVm; + } finally { + _networkDao.releaseFromLockTable(guestNetworkId); + } + } + + private DomainRouterVO start(DomainRouterVO elbVm, User user, Account caller, Map params) throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Starting ELB VM " + elbVm); + if (_itMgr.start(elbVm, params, user, caller) != null) { + return _routerDao.findById(elbVm.getId()); + } else { + return null; + } + } + + + private DomainRouterVO stop(DomainRouterVO elbVm, boolean forced, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Stopping ELB vm " + elbVm); + try { + if (_itMgr.advanceStop( elbVm, forced, user, caller)) { + return _routerDao.findById(elbVm.getId()); + } else { + return null; + } + } catch (OperationTimedoutException e) { + throw new CloudRuntimeException("Unable to stop " + elbVm, e); + } + } + + protected List findExistingLoadBalancers(String lbName, Long ipId, Long accountId, Long domainId, Integer publicPort) { + SearchBuilder sb = _lbDao.createSearchBuilder(); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.EQ); + sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ); + sb.and("publicPort", sb.entity().getSourcePortStart(), SearchCriteria.Op.EQ); + if (ipId != null) { + sb.and("sourceIpAddress", sb.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ); + } + if (domainId != null) { + sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); + } + if (publicPort != null) { + sb.and("publicPort", sb.entity().getSourcePortStart(), SearchCriteria.Op.EQ); + } + SearchCriteria sc = sb.create(); + sc.setParameters("name", lbName); + sc.setParameters("accountId", accountId); + if (ipId != null) { + sc.setParameters("sourceIpAddress", ipId); + } + if (domainId != null) { + sc.setParameters("domainId",domainId); + } + if (publicPort != null) { + sc.setParameters("publicPort", publicPort); + } + List lbs = _lbDao.search(sc, null); + + return lbs == null || lbs.size()==0 ? null: lbs; + } + + @DB + public PublicIp allocDirectIp(Account account, long guestNetworkId) throws InsufficientAddressCapacityException { + Network frontEndNetwork = _networkMgr.getNetwork(guestNetworkId); + Transaction txn = Transaction.currentTxn(); + txn.start(); + + PublicIp ip = _networkMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true); + IPAddressVO ipvo = _ipAddressDao.findById(ip.getId()); + ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId()); + _ipAddressDao.update(ipvo.getId(), ipvo); + txn.commit(); + s_logger.info("Acquired frontend IP for ELB " + ip); + + return ip; + } + + public void releaseIp(long ipId, long userId, Account caller) { + s_logger.info("ELB: Release public IP for loadbalancing " + ipId); + IPAddressVO ipvo = _ipAddressDao.findById(ipId); + ipvo.setAssociatedWithNetworkId(null); + _ipAddressDao.update(ipvo.getId(), ipvo); + _networkMgr.disassociatePublicIpAddress(ipId, userId, caller); + _ipAddressDao.unassignIpAddress(ipId); + } + + @Override + @DB + public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account account, long networkId) throws InsufficientAddressCapacityException, NetworkRuleConflictException { + //this part of code is executed when the LB provider is Elastic Load Balancer vm + if (!_networkMgr.isProviderSupportServiceInNetwork(lb.getNetworkId(), Service.Lb, Provider.ElasticLoadBalancerVm)) { + return null; + } + + Long ipId = lb.getSourceIpAddressId(); + if (ipId != null) { + return null; + } + boolean newIp = false; + account = _accountDao.acquireInLockTable(account.getId()); + if (account == null) { + s_logger.warn("ELB: CreateLoadBalancer: Failed to acquire lock on account"); + throw new CloudRuntimeException("Failed to acquire lock on account"); + } + try { + List existingLbs = findExistingLoadBalancers(lb.getName(), lb.getSourceIpAddressId(), lb.getAccountId(), lb.getDomainId(), lb.getSourcePortStart()); + if (existingLbs == null ){ + existingLbs = findExistingLoadBalancers(lb.getName(), lb.getSourceIpAddressId(), lb.getAccountId(), lb.getDomainId(), null); + if (existingLbs == null) { + if (lb.getSourceIpAddressId() != null) { + existingLbs = findExistingLoadBalancers(lb.getName(), null, lb.getAccountId(), lb.getDomainId(), null); + if (existingLbs != null) { + throw new InvalidParameterValueException("Supplied LB name " + lb.getName() + " is not associated with IP " + lb.getSourceIpAddressId() ); + } + } else { + s_logger.debug("Could not find any existing frontend ips for this account for this LB rule, acquiring a new frontent IP for ELB"); + PublicIp ip = allocDirectIp(account, networkId); + ipId = ip.getId(); + newIp = true; + } + } else { + ipId = existingLbs.get(0).getSourceIpAddressId(); + s_logger.debug("ELB: Found existing frontend ip for this account for this LB rule " + ipId); + } + } else { + s_logger.warn("ELB: Found existing load balancers matching requested new LB"); + throw new NetworkRuleConflictException("ELB: Found existing load balancers matching requested new LB"); + } + + Network network = _networkMgr.getNetwork(networkId); + IPAddressVO ipAddr = _ipAddressDao.findById(ipId); + + LoadBalancer result = null; + try { + lb.setSourceIpAddressId(ipId); + result = _lbMgr.createLoadBalancer(lb, false); + } catch (NetworkRuleConflictException e) { + s_logger.warn("Failed to create LB rule, not continuing with ELB deployment"); + if (newIp) { + releaseIp(ipId, UserContext.current().getCallerUserId(), account); + } + throw e; + } + + DomainRouterVO elbVm = null; + + + if (existingLbs == null) { + elbVm = findELBVmWithCapacity(network, ipAddr); + if (elbVm == null) { + elbVm = deployLoadBalancerVM(networkId, ipAddr, account.getId()); + if (elbVm == null) { + s_logger.warn("Failed to deploy a new ELB vm for ip " + ipAddr + " in network " + network + "lb name=" + lb.getName()); + if (newIp) + releaseIp(ipId, UserContext.current().getCallerUserId(), account); + } + } + + } else { + ElasticLbVmMapVO elbVmMap = _elbVmMapDao.findOneByIp(ipId); + if (elbVmMap != null) { + elbVm = _routerDao.findById(elbVmMap.getElbVmId()); + } + } + + if (elbVm == null) { + s_logger.warn("No ELB VM can be found or deployed"); + s_logger.warn("Deleting LB since we failed to deploy ELB VM"); + _lbDao.remove(result.getId()); + return null; + } + + ElasticLbVmMapVO mapping = new ElasticLbVmMapVO(ipId, elbVm.getId(), result.getId()); + _elbVmMapDao.persist(mapping); + return result; + + } finally { + if (account != null) { + _accountDao.releaseFromLockTable(account.getId()); + } + } + + } + + void garbageCollectUnusedElbVms() { + List unusedElbVms = _elbVmMapDao.listUnusedElbVms(); + if (unusedElbVms != null && unusedElbVms.size() > 0) + s_logger.info("Found " + unusedElbVms.size() + " unused ELB vms"); + Set currentGcCandidates = new HashSet(); + for (DomainRouterVO elbVm: unusedElbVms) { + currentGcCandidates.add(elbVm.getId()); + } + _gcCandidateElbVmIds.retainAll(currentGcCandidates); + currentGcCandidates.removeAll(_gcCandidateElbVmIds); + User user = _accountService.getSystemUser(); + for (Long elbVmId : _gcCandidateElbVmIds) { + DomainRouterVO elbVm = _routerDao.findById(elbVmId); + boolean gceed = false; + + try { + s_logger.info("Attempting to stop ELB VM: " + elbVm); + stop(elbVm, true, user, _systemAcct); + gceed = true; + } catch (ConcurrentOperationException e) { + s_logger.warn("Unable to stop unused ELB vm " + elbVm + " due to ", e); + } catch (ResourceUnavailableException e) { + s_logger.warn("Unable to stop unused ELB vm " + elbVm + " due to ", e); + continue; + } + if (gceed) { + try { + s_logger.info("Attempting to destroy ELB VM: " + elbVm); + _itMgr.expunge(elbVm, user, _systemAcct); + } catch (ResourceUnavailableException e) { + s_logger.warn("Unable to destroy unused ELB vm " + elbVm + " due to ", e); + gceed = false; + } + } + if (!gceed) { + currentGcCandidates.add(elbVm.getId()); + } + + } + _gcCandidateElbVmIds = currentGcCandidates; + } + + public class CleanupThread implements Runnable { + @Override + public void run() { + garbageCollectUnusedElbVms(); + + } + + CleanupThread() { + + } + } + + @Override + public void handleDeleteLoadBalancerRule(LoadBalancer lb, long userId, Account caller) { + if (!_enabled) { + return; + } + List remainingLbs = _loadBalancerDao.listByIpAddress(lb.getSourceIpAddressId()); + if (remainingLbs.size() == 0) { + s_logger.debug("ELB mgr: releasing ip " + lb.getSourceIpAddressId() + " since no LB rules remain for this ip address"); + releaseIp(lb.getSourceIpAddressId(), userId, caller); + } + } + + + @Override + public DomainRouterVO findByName(String name) { + if (!VirtualMachineName.isValidSystemVmName(name, _instance, _elbVmNamePrefix)) { + return null; + } + + return _routerDao.findById(VirtualMachineName.getSystemVmId(name)); + } + + + @Override + public DomainRouterVO findById(long id) { + return _routerDao.findById(id); + } + + + @Override + public DomainRouterVO persist(DomainRouterVO elbVm) { + return _routerDao.persist(elbVm); + } + + + @Override + public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) { + DomainRouterVO elbVm = profile.getVirtualMachine(); + + List elbNics = profile.getNics(); + Long guestNtwkId = null; + for (NicProfile routerNic : elbNics) { + if (routerNic.getTrafficType() == TrafficType.Guest) { + guestNtwkId = routerNic.getNetworkId(); + break; + } + } + + NetworkVO guestNetwork = _networkDao.findById(guestNtwkId); + + DataCenter dc = dest.getDataCenter(); + + StringBuilder buf = profile.getBootArgsBuilder(); + buf.append(" template=domP type=" + _systemVmType); + buf.append(" name=").append(profile.getHostName()); + NicProfile controlNic = null; + String defaultDns1 = null; + String defaultDns2 = null; + + for (NicProfile nic : profile.getNics()) { + int deviceId = nic.getDeviceId(); + buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); + buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); + if (nic.isDefaultNic()) { + buf.append(" gateway=").append(nic.getGateway()); + defaultDns1 = nic.getDns1(); + defaultDns2 = nic.getDns2(); + } + if (nic.getTrafficType() == TrafficType.Management) { + buf.append(" localgw=").append(dest.getPod().getGateway()); + } else if (nic.getTrafficType() == TrafficType.Control) { + // control command is sent over management network in VMware + if (dest.getHost().getHypervisorType() == HypervisorType.VMware) { + if (s_logger.isInfoEnabled()) { + s_logger.info("Check if we need to add management server explicit route to ELB vm. pod cidr: " + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize() + + ", pod gateway: " + dest.getPod().getGateway() + ", management host: " + _mgmtHost); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Added management server explicit route to ELB vm."); + } + // always add management explicit route, for basic networking setup + buf.append(" mgmtcidr=").append(_mgmtCidr); + buf.append(" localgw=").append(dest.getPod().getGateway()); + + if (dc.getNetworkType() == NetworkType.Basic) { + // ask elb vm to setup SSH on guest network + buf.append(" sshonguest=true"); + } + + } + + controlNic = nic; + } + } + String domain = guestNetwork.getNetworkDomain(); + if (domain != null) { + buf.append(" domain=" + domain); + } + + buf.append(" dns1=").append(defaultDns1); + if (defaultDns2 != null) { + buf.append(" dns2=").append(defaultDns2); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); + } + + if (controlNic == null) { + throw new CloudRuntimeException("Didn't start a control port"); + } + + return true; + } + + + @Override + public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException { + DomainRouterVO elbVm = profile.getVirtualMachine(); + + List nics = profile.getNics(); + for (NicProfile nic : nics) { + if (nic.getTrafficType() == TrafficType.Public) { + elbVm.setPublicIpAddress(nic.getIp4Address()); + elbVm.setPublicNetmask(nic.getNetmask()); + elbVm.setPublicMacAddress(nic.getMacAddress()); + } else if (nic.getTrafficType() == TrafficType.Control) { + elbVm.setPrivateIpAddress(nic.getIp4Address()); + elbVm.setPrivateMacAddress(nic.getMacAddress()); + } + } + _routerDao.update(elbVm.getId(), elbVm); + + finalizeCommandsOnStart(cmds, profile); + return true; + } + + + @Override + public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, ReservationContext context) { + CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh"); + if (answer == null || !answer.getResult()) { + s_logger.warn("Unable to ssh to the ELB VM: " + answer.getDetails()); + return false; + } + + return true; + } + + + @Override + public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile profile) { + DomainRouterVO elbVm = profile.getVirtualMachine(); + DataCenterVO dcVo = _dcDao.findById(elbVm.getDataCenterIdToDeployIn()); + + NicProfile controlNic = null; + Long guestNetworkId = null; + + if(profile.getHypervisorType() == HypervisorType.VMware && dcVo.getNetworkType() == NetworkType.Basic) { + // TODO this is a ugly to test hypervisor type here + // for basic network mode, we will use the guest NIC for control NIC + for (NicProfile nic : profile.getNics()) { + if (nic.getTrafficType() == TrafficType.Guest && nic.getIp4Address() != null) { + controlNic = nic; + guestNetworkId = nic.getNetworkId(); + } + } + } else { + for (NicProfile nic : profile.getNics()) { + if (nic.getTrafficType() == TrafficType.Control && nic.getIp4Address() != null) { + controlNic = nic; + } else if (nic.getTrafficType() == TrafficType.Guest) { + guestNetworkId = nic.getNetworkId(); + } + } + } + + if (controlNic == null) { + s_logger.error("Control network doesn't exist for the ELB vm " + elbVm); + return false; + } + + cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922)); + + // Re-apply load balancing rules + List lbs = _elbVmMapDao.listLbsForElbVm(elbVm.getId()); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + List policyList = _lbMgr.getStickinessPolicies(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); + lbRules.add(loadBalancing); + } + + s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of ELB vm " + elbVm + " start."); + if (!lbRules.isEmpty()) { + createApplyLoadBalancingRulesCommands(lbRules, elbVm, cmds, guestNetworkId); + } + + return true; + } + + + @Override + public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { + if (answer != null) { + VMInstanceVO vm = profile.getVirtualMachine(); + DomainRouterVO elbVm = _routerDao.findById(vm.getId()); + processStopOrRebootAnswer(elbVm, answer); + } + } + + public void processStopOrRebootAnswer(final DomainRouterVO elbVm, Answer answer) { + //TODO: process network usage stats + } + + + @Override + public void finalizeExpunge(DomainRouterVO vm) { + // no-op + + } + + @Override + public Long convertToId(String vmName) { + if (!VirtualMachineName.isValidSystemVmName(vmName, _instance, _elbVmNamePrefix)) { + return null; + } + + return VirtualMachineName.getSystemVmId(vmName); + } + + @Override + public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm, + ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException, + InsufficientCapacityException { + //not supported + throw new UnsupportedOperationException("Plug nic is not supported for vm of type " + vm.getType()); + } + + + @Override + public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, + ReservationContext context, DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException { + //not supported + throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); + } + + + @Override + public void prepareStop(VirtualMachineProfile profile) { + + } + + + @Override + public boolean recreateNeeded( + VirtualMachineProfile profile, long hostId, + Commands cmds, ReservationContext context) { + // TODO Auto-generated method stub + return false; + } +} diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java index b11695b3fd6..708d20e9cbc 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java @@ -8,7 +8,7 @@ // 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. -// +// // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.network.lb; @@ -24,21 +24,23 @@ import com.cloud.network.rules.LoadBalancer; import com.cloud.user.Account; public interface LoadBalancingRulesManager extends LoadBalancingRulesService { - + LoadBalancer createLoadBalancer(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException; - + boolean removeAllLoadBalanacersForIp(long ipId, Account caller, long callerUserId); boolean removeAllLoadBalanacersForNetwork(long networkId, Account caller, long callerUserId); List getExistingDestinations(long lbId); List getStickinessPolicies(long lbId); List getStickinessMethods(long networkid); - + /** * Remove vm from all load balancers * @param vmId * @return true if removal is successful */ boolean removeVmFromLoadBalancers(long vmId); - + boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException; + String getLBCapability(long networkid, String capabilityName); + boolean configureLbAutoScaleVmGroup(long vmGroupid, boolean vmGroupCreation); } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 88c3d11dea5..a63fd57c5be 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -1,1365 +1,1550 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.lb; - -import java.security.InvalidParameterException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - -import com.cloud.api.commands.CreateLBStickinessPolicyCmd; -import com.cloud.api.commands.CreateLoadBalancerRuleCmd; -import com.cloud.api.commands.ListLBStickinessPoliciesCmd; -import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd; -import com.cloud.api.commands.ListLoadBalancerRulesCmd; -import com.cloud.api.commands.UpdateLoadBalancerRuleCmd; -import com.cloud.api.response.ServiceResponse; -import com.cloud.configuration.ConfigurationManager; -import com.cloud.dc.dao.VlanDao; -import com.cloud.domain.dao.DomainDao; -import com.cloud.event.ActionEvent; -import com.cloud.event.EventTypes; -import com.cloud.event.UsageEventVO; -import com.cloud.event.dao.EventDao; -import com.cloud.event.dao.UsageEventDao; -import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.ExternalLoadBalancerUsageManager; -import com.cloud.network.IPAddressVO; -import com.cloud.network.IpAddress; -import com.cloud.network.LBStickinessPolicyVO; -import com.cloud.network.LoadBalancerVMMapVO; -import com.cloud.network.LoadBalancerVO; -import com.cloud.network.Network; -import com.cloud.network.Network.Capability; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.network.NetworkManager; -import com.cloud.network.NetworkVO; -import com.cloud.network.dao.FirewallRulesCidrsDao; -import com.cloud.network.dao.FirewallRulesDao; -import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.LBStickinessPolicyDao; -import com.cloud.network.dao.LoadBalancerDao; -import com.cloud.network.dao.LoadBalancerVMMapDao; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.NetworkServiceMapDao; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; -import com.cloud.network.rules.FirewallManager; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.FirewallRuleType; -import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.FirewallRuleVO; -import com.cloud.network.rules.LbStickinessMethod; -import com.cloud.network.rules.LbStickinessMethod.LbStickinessMethodParam; -import com.cloud.network.rules.LoadBalancer; -import com.cloud.network.rules.RulesManager; -import com.cloud.network.rules.StickinessPolicy; -import com.cloud.offering.NetworkOffering; -import com.cloud.projects.Project.ListProjectResourcesCriteria; -import com.cloud.server.ResourceTag.TaggedResourceType; -import com.cloud.tags.ResourceTagVO; -import com.cloud.tags.dao.ResourceTagDao; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.DomainService; -import com.cloud.user.UserContext; -import com.cloud.user.dao.AccountDao; -import com.cloud.uservm.UserVm; -import com.cloud.utils.IdentityProxy; -import com.cloud.utils.Ternary; -import com.cloud.utils.component.Inject; -import com.cloud.utils.component.Manager; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Filter; -import com.cloud.utils.db.JoinBuilder; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.NetUtils; -import com.cloud.vm.Nic; -import com.cloud.vm.UserVmVO; -import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.dao.NicDao; -import com.cloud.vm.dao.UserVmDao; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -@Local(value = { LoadBalancingRulesManager.class, LoadBalancingRulesService.class }) -public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, LoadBalancingRulesService, Manager { - private static final Logger s_logger = Logger.getLogger(LoadBalancingRulesManagerImpl.class); - - String _name; - - @Inject - NetworkManager _networkMgr; - @Inject - RulesManager _rulesMgr; - @Inject - AccountManager _accountMgr; - @Inject - IPAddressDao _ipAddressDao; - @Inject - LoadBalancerDao _lbDao; - @Inject - VlanDao _vlanDao; - @Inject - EventDao _eventDao; - @Inject - LoadBalancerVMMapDao _lb2VmMapDao; - @Inject - LBStickinessPolicyDao _lb2stickinesspoliciesDao; - @Inject - UserVmDao _vmDao; - @Inject - AccountDao _accountDao; - @Inject - DomainDao _domainDao; - @Inject - NicDao _nicDao; - @Inject - UsageEventDao _usageEventDao; - @Inject - FirewallRulesCidrsDao _firewallCidrsDao; - @Inject - FirewallManager _firewallMgr; - @Inject - ElasticLoadBalancerManager _elbMgr; - @Inject - NetworkDao _networkDao; - @Inject - FirewallRulesDao _firewallDao; - @Inject - DomainService _domainMgr; - @Inject - ConfigurationManager _configMgr; - @Inject - ExternalLoadBalancerUsageManager _externalLBUsageMgr; - @Inject - NetworkServiceMapDao _ntwkSrvcDao; - @Inject - ResourceTagDao _resourceTagDao; - - private String getLBStickinessCapability(long networkid) { - Map> serviceCapabilitiesMap = _networkMgr.getNetworkCapabilities(networkid); - if (serviceCapabilitiesMap != null) { - for (Service service : serviceCapabilitiesMap.keySet()) { - ServiceResponse serviceResponse = new ServiceResponse(); - serviceResponse.setName(service.getName()); - if ("Lb".equalsIgnoreCase(service.getName())) { - Map serviceCapabilities = serviceCapabilitiesMap - .get(service); - if (serviceCapabilities != null) { - for (Capability capability : serviceCapabilities - .keySet()) { - if (Capability.SupportedStickinessMethods.getName() - .equals(capability.getName())) { - return serviceCapabilities.get(capability); - } - } - } - } - } - } - return null; - } - - private boolean genericValidator(CreateLBStickinessPolicyCmd cmd) throws InvalidParameterValueException { - LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId()); - /* Validation : check for valid Method name and params */ - List stickinessMethodList = getStickinessMethods(loadBalancer - .getNetworkId()); - boolean methodMatch = false; - - if (stickinessMethodList == null) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); - throw new InvalidParameterValueException("Failed: No Stickiness method available for LB rule with specified id", idList); - } - for (LbStickinessMethod method : stickinessMethodList) { - if (method.getMethodName().equalsIgnoreCase(cmd.getStickinessMethodName())) { - methodMatch = true; - Map apiParamList = cmd.getparamList(); - List methodParamList = method.getParamList(); - Map tempParamList = new HashMap(); - - /* - * validation-1: check for any extra params that are not - * required by the policymethod(capability), FIXME: make the - * below loop simple without using raw data type - */ - if (apiParamList != null) { - Collection userGroupCollection = apiParamList.values(); - Iterator iter = userGroupCollection.iterator(); - while (iter.hasNext()) { - HashMap paramKVpair = (HashMap) iter.next(); - String paramName = paramKVpair.get("name"); - String paramValue = paramKVpair.get("value"); - - tempParamList.put(paramName, paramValue); - Boolean found = false; - for (LbStickinessMethodParam param : methodParamList) { - if (param.getParamName().equalsIgnoreCase(paramName)) { - if ((param.getIsflag() == false) && (paramValue == null)) { - throw new InvalidParameterValueException("Failed : Value expected for the Param :" + param.getParamName(), null); - } - found = true; - break; - } - } - if (!found) { - throw new InvalidParameterValueException("Failed : Stickiness policy does not support param name :" + paramName, null); - } - } - } - - /* validation-2: check for mandatory params */ - for (LbStickinessMethodParam param : methodParamList) { - if (param.getRequired()) { - if (tempParamList.get(param.getParamName()) == null) { - throw new InvalidParameterValueException("Failed : Missing Manadatory Param :" + param.getParamName(), null); - } - } - } - /* Successfully completed the Validation */ - break; - } - } - if (methodMatch == false) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); - throw new InvalidParameterValueException("Failed to match Stickiness method name for LB rule whose id is specified", idList); - } - - /* Validation : check for the multiple policies to the rule id */ - List stickinessPolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId(), false); - if (stickinessPolicies.size() > 0) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); - throw new InvalidParameterValueException("Failed to create Stickiness policy: Policy already attached", idList); - } - return true; - } - - @SuppressWarnings("rawtypes") - @Override - @DB - @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_CREATE, eventDescription = "create lb stickinesspolicy to load balancer", create = true) - public StickinessPolicy createLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws NetworkRuleConflictException { - UserContext caller = UserContext.current(); - - /* Validation : check corresponding load balancer rule exist */ - LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId()); - if (loadBalancer == null) { - throw new InvalidParameterValueException("Failed: LB rule provided not present", null); - } - - _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer); - if (loadBalancer.getState() == FirewallRule.State.Revoke) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); - throw new InvalidParameterValueException("Failed: LB rule with specified id is in deleting state: ", idList); - } - - /* Generic validations */ - if (!genericValidator(cmd)) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); - throw new InvalidParameterValueException("Failed to create Stickiness policy: Validation of rule with specified id failed", idList); - } - - /* Specific validations using network element validator for specific validations */ - LBStickinessPolicyVO lbpolicy = new LBStickinessPolicyVO(loadBalancer.getId(), cmd.getLBStickinessPolicyName(), cmd.getStickinessMethodName(), cmd.getparamList(), cmd.getDescription()); - List policyList = new ArrayList(); - policyList.add(new LbStickinessPolicy(cmd.getStickinessMethodName(), lbpolicy.getParams())); - LoadBalancingRule lbRule = new LoadBalancingRule(loadBalancer, getExistingDestinations(lbpolicy.getId()), policyList); - if (!_networkMgr.validateRule(lbRule)) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); - throw new InvalidParameterValueException("Failed to create Stickiness policy: Validation of rule with specified id failed ", idList); - } - - /* Finally Insert into DB */ - LBStickinessPolicyVO policy = new LBStickinessPolicyVO(loadBalancer.getId(), cmd.getLBStickinessPolicyName(), cmd.getStickinessMethodName(), cmd.getparamList(), cmd.getDescription()); - policy = _lb2stickinesspoliciesDao.persist(policy); - - return policy; - } - - @Override - @DB - @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_CREATE, eventDescription = "Apply Stickinesspolicy to load balancer ", async = true) - public boolean applyLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) { - boolean success = true; - - LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId()); - if (loadBalancer == null) { - throw new InvalidParameterException("Invalid Load balancer Id:" + cmd.getLbRuleId()); - } - FirewallRule.State backupState = loadBalancer.getState(); - loadBalancer.setState(FirewallRule.State.Add); - _lbDao.persist(loadBalancer); - try { - applyLoadBalancerConfig(cmd.getLbRuleId()); - } catch (ResourceUnavailableException e) { - s_logger.warn("Unable to apply Stickiness policy to the lb rule: " + cmd.getLbRuleId() + " because resource is unavaliable:", e); - if (isRollBackAllowedForProvider(loadBalancer)) { - loadBalancer.setState(backupState); - _lbDao.persist(loadBalancer); - s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating sticky policy" ); - } - deleteLBStickinessPolicy(cmd.getEntityId(), false); - success = false; - } - - return success; - } - - @Override - @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_DELETE, eventDescription = "revoking LB Stickiness policy ", async = true) - public boolean deleteLBStickinessPolicy(long stickinessPolicyId, boolean apply) { - boolean success = true; - - UserContext caller = UserContext.current(); - LBStickinessPolicyVO stickinessPolicy = _lb2stickinesspoliciesDao.findById(stickinessPolicyId); - - if (stickinessPolicy == null) { - throw new InvalidParameterException("Invalid Stickiness policy id value: " + stickinessPolicyId); - } - LoadBalancerVO loadBalancer = _lbDao.findById(Long.valueOf(stickinessPolicy.getLoadBalancerId())); - if (loadBalancer == null) { - throw new InvalidParameterException("Invalid Load balancer : " + stickinessPolicy.getLoadBalancerId() + " for Stickiness policy id: " + stickinessPolicyId); - } - long loadBalancerId = loadBalancer.getId(); - FirewallRule.State backupState = loadBalancer.getState(); - _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer); - - - if (apply) { - if (loadBalancer.getState() == FirewallRule.State.Active) { - loadBalancer.setState(FirewallRule.State.Add); - _lbDao.persist(loadBalancer); - } - - boolean backupStickyState = stickinessPolicy.isRevoke(); - stickinessPolicy.setRevoke(true); - _lb2stickinesspoliciesDao.persist(stickinessPolicy); - s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", stickinesspolicyID " + stickinessPolicyId); - - try { - if (!applyLoadBalancerConfig(loadBalancerId)) { - s_logger.warn("Failed to remove load balancer rule id " + loadBalancerId + " for stickinesspolicyID " + stickinessPolicyId); - throw new CloudRuntimeException("Failed to remove load balancer rule id " + loadBalancerId + " for stickinesspolicyID " + stickinessPolicyId); - } - } catch (ResourceUnavailableException e) { - if (isRollBackAllowedForProvider(loadBalancer)) { - stickinessPolicy.setRevoke(backupStickyState); - _lb2stickinesspoliciesDao.persist(stickinessPolicy); - loadBalancer.setState(backupState); - _lbDao.persist(loadBalancer); - s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " while deleting sticky policy: " + stickinessPolicyId); - } - s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); - success = false; - } - }else{ - _lb2stickinesspoliciesDao.remove(stickinessPolicy.getLoadBalancerId()); - } - - return success; - } - - private boolean isRollBackAllowedForProvider(LoadBalancerVO loadBalancer) { - Network network = _networkDao.findById(loadBalancer.getNetworkId()); - Provider provider = Network.Provider.Netscaler; - return _ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(), Service.Lb, provider); - } - @Override - @DB - @ActionEvent(eventType = EventTypes.EVENT_ASSIGN_TO_LOAD_BALANCER_RULE, eventDescription = "assigning to load balancer", async = true) - public boolean assignToLoadBalancer(long loadBalancerId, List instanceIds) { - UserContext ctx = UserContext.current(); - Account caller = ctx.getCaller(); - - LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); - if (loadBalancer == null) { - throw new InvalidParameterValueException("Failed to assign to load balancer; the load balancer was not found.", null); - } - - List mappedInstances = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId, false); - Set mappedInstanceIds = new HashSet(); - for (LoadBalancerVMMapVO mappedInstance : mappedInstances) { - mappedInstanceIds.add(Long.valueOf(mappedInstance.getInstanceId())); - } - - List vmsToAdd = new ArrayList(); - - for (Long instanceId : instanceIds) { - if (mappedInstanceIds.contains(instanceId)) { - List idList = new ArrayList(); - idList.add(new IdentityProxy("user_vm", instanceId, "vmId")); - throw new InvalidParameterValueException("VM with specified id is already mapped to load balancer", idList); - } - - UserVm vm = _vmDao.findById(instanceId); - if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging) { - throw new InvalidParameterValueException("Couldn't locate vm instance by id", null); - } - - _rulesMgr.checkRuleAndUserVm(loadBalancer, vm, caller); - - if (vm.getAccountId() != loadBalancer.getAccountId()) { - throw new PermissionDeniedException("Cannot add virtual machines that do not belong to the same owner."); - } - - // Let's check to make sure the vm has a nic in the same network as the load balancing rule. - List nics = _networkMgr.getNics(vm.getId()); - Nic nicInSameNetwork = null; - for (Nic nic : nics) { - if (nic.getNetworkId() == loadBalancer.getNetworkId()) { - nicInSameNetwork = nic; - break; - } - } - - if (nicInSameNetwork == null) { - List idList = new ArrayList(); - idList.add(new IdentityProxy(vm, instanceId, "vmId")); - throw new InvalidParameterValueException("VM with specified id cannot be added because it doesn't belong in the same network.", idList); - - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Adding " + vm + " to the load balancer pool"); - } - vmsToAdd.add(vm); - } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - for (UserVm vm : vmsToAdd) { - LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false); - map = _lb2VmMapDao.persist(map); - } - txn.commit(); - - boolean success = false; - FirewallRule.State backupState = loadBalancer.getState(); - try { - loadBalancer.setState(FirewallRule.State.Add); - _lbDao.persist(loadBalancer); - applyLoadBalancerConfig(loadBalancerId); - success = true; - } catch (ResourceUnavailableException e) { - if (isRollBackAllowedForProvider(loadBalancer)) { - List vmInstanceIds = new ArrayList(); - txn = Transaction.currentTxn(); - txn.start(); - for (UserVm vm : vmsToAdd) { - vmInstanceIds.add(vm.getId()); - } - txn.commit(); - if (!vmInstanceIds.isEmpty()) { - _lb2VmMapDao.remove(loadBalancer.getId(), vmInstanceIds, null); - s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " while attaching VM: " + vmInstanceIds); - } - loadBalancer.setState(backupState); - _lbDao.persist(loadBalancer); - } - s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); - } - - if(!success){ - CloudRuntimeException ex = new CloudRuntimeException("Failed to add specified loadbalancerruleid for vms " + instanceIds); - ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId"); - // TBD: Also pack in the instanceIds in the exception using the right VO object or table name. - throw ex; - } - - return success; - } - - @Override - @ActionEvent(eventType = EventTypes.EVENT_REMOVE_FROM_LOAD_BALANCER_RULE, eventDescription = "removing from load balancer", async = true) - public boolean removeFromLoadBalancer(long loadBalancerId, List instanceIds) { - return removeFromLoadBalancerInternal(loadBalancerId, instanceIds, true); - } - - private boolean removeFromLoadBalancerInternal(long loadBalancerId, List instanceIds, boolean rollBack) { - UserContext caller = UserContext.current(); - - LoadBalancerVO loadBalancer = _lbDao.findById(Long.valueOf(loadBalancerId)); - if (loadBalancer == null) { - throw new InvalidParameterException("Invalid load balancer value: " + loadBalancerId); - } - - _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer); - - boolean success = false; - FirewallRule.State backupState = loadBalancer.getState(); - try { - loadBalancer.setState(FirewallRule.State.Add); - _lbDao.persist(loadBalancer); - - for (long instanceId : instanceIds) { - LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId); - map.setRevoke(true); - _lb2VmMapDao.persist(map); - s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + instanceId); - } - - if (!applyLoadBalancerConfig(loadBalancerId)) { - s_logger.warn("Failed to remove load balancer rule id " + loadBalancerId + " for vms " + instanceIds); - CloudRuntimeException ex = new CloudRuntimeException("Failed to remove specified load balancer rule id for vms " + instanceIds); - ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId"); - throw ex; - } - success = true; - } catch (ResourceUnavailableException e) { - if (rollBack && isRollBackAllowedForProvider(loadBalancer)) { - - for (long instanceId : instanceIds) { - LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId); - map.setRevoke(false); - _lb2VmMapDao.persist(map); - s_logger.debug("LB Rollback rule id: " + loadBalancerId + ",while removing vmId " + instanceId); - } - - loadBalancer.setState(backupState); - _lbDao.persist(loadBalancer); - s_logger.debug("LB Rollback rule id: " + loadBalancerId + " while removing vm instances"); - } - s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); - } - if(!success){ - CloudRuntimeException ex = new CloudRuntimeException("Failed to remove specified load balancer rule id for vms " + instanceIds); - ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId"); - throw ex; - } - return success; - } - - @Override - public boolean removeVmFromLoadBalancers(long instanceId) { - boolean success = true; - List maps = _lb2VmMapDao.listByInstanceId(instanceId); - if (maps == null || maps.isEmpty()) { - return true; - } - - Map> lbsToReconfigure = new HashMap>(); - - // first set all existing lb mappings with Revoke state - for (LoadBalancerVMMapVO map : maps) { - long lbId = map.getLoadBalancerId(); - List instances = lbsToReconfigure.get(lbId); - if (instances == null) { - instances = new ArrayList(); - } - instances.add(map.getInstanceId()); - lbsToReconfigure.put(lbId, instances); - - map.setRevoke(true); - _lb2VmMapDao.persist(map); - s_logger.debug("Set load balancer rule for revoke: rule id " + map.getLoadBalancerId() + ", vmId " + instanceId); - } - - // Reapply all lbs that had the vm assigned - if (lbsToReconfigure != null) { - for (Map.Entry> lb : lbsToReconfigure.entrySet()) { - if (!removeFromLoadBalancerInternal(lb.getKey(), lb.getValue(), false)) { - success = false; - } - } - } - return success; - } - - @Override - @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_DELETE, eventDescription = "deleting load balancer", async = true) - public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply) { - UserContext ctx = UserContext.current(); - Account caller = ctx.getCaller(); - - LoadBalancerVO rule = _lbDao.findById(loadBalancerId); - if (rule == null) { - throw new InvalidParameterValueException("Unable to find load balancer rule by id", null); - } - - _accountMgr.checkAccess(caller, null, true, rule); - - boolean result = deleteLoadBalancerRule(loadBalancerId, apply, caller, ctx.getCallerUserId(), true); - if (!result) { - throw new CloudRuntimeException("Unable to remove load balancer rule " + loadBalancerId); - } - return result; - } - - @DB - public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply, Account caller, long callerUserId, boolean rollBack) { - LoadBalancerVO lb = _lbDao.findById(loadBalancerId); - Transaction txn = Transaction.currentTxn(); - boolean generateUsageEvent = false; - boolean success = true; - FirewallRule.State backupState = lb.getState(); - - txn.start(); - if (lb.getState() == FirewallRule.State.Staged) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb); - } - generateUsageEvent = true; - } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) { - lb.setState(FirewallRule.State.Revoke); - _lbDao.persist(lb); - generateUsageEvent = true; - } - List backupMaps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); - List maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); - if (maps != null) { - for (LoadBalancerVMMapVO map : maps) { - map.setRevoke(true); - _lb2VmMapDao.persist(map); - s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + map.getInstanceId()); - } - } - - if (generateUsageEvent) { - // Generate usage event right after all rules were marked for revoke - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(), null); - _usageEventDao.persist(usageEvent); - } - - txn.commit(); - - // gather external network usage stats for this lb rule - NetworkVO network = _networkDao.findById(lb.getNetworkId()); - if (network != null) { - if (_networkMgr.networkIsConfiguredForExternalNetworking(network.getDataCenterId(), network.getId())) { - _externalLBUsageMgr.updateExternalLoadBalancerNetworkUsageStats(loadBalancerId); - } - } - - if (apply) { - try { - if (!applyLoadBalancerConfig(loadBalancerId)) { - s_logger.warn("Unable to apply the load balancer config"); - return false; - } - } catch (ResourceUnavailableException e) { - if (rollBack && isRollBackAllowedForProvider(lb)) { - if (backupMaps != null) { - for (LoadBalancerVMMapVO map : backupMaps) { - _lb2VmMapDao.persist(map); - s_logger.debug("LB Rollback rule id: " + loadBalancerId + ", vmId " + map.getInstanceId()); - } - } - lb.setState(backupState); - _lbDao.persist(lb); - s_logger.debug("LB Rollback rule id: " + loadBalancerId + " while deleting LB rule."); - } else { - s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); - } - return false; - } - } - - FirewallRuleVO relatedRule = _firewallDao.findByRelatedId(lb.getId()); - if (relatedRule != null) { - s_logger.warn("Unable to remove firewall rule id=" + lb.getId() + " as it has related firewall rule id=" + relatedRule.getId() + "; leaving it in Revoke state"); - success = false; - } else { - _firewallMgr.removeRule(lb); - } - - _elbMgr.handleDeleteLoadBalancerRule(lb, callerUserId, caller); - - if (success) { - s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully"); - } - - return success; - } - - @Override - @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_CREATE, eventDescription = "creating load balancer") - public LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException, InsufficientAddressCapacityException { - Account lbOwner = _accountMgr.getAccount(lb.getEntityOwnerId()); - - int defPortStart = lb.getDefaultPortStart(); - int defPortEnd = lb.getDefaultPortEnd(); - - if (!NetUtils.isValidPort(defPortEnd)) { - throw new InvalidParameterValueException("privatePort is an invalid value: " + defPortEnd, null); - } - if (defPortStart > defPortEnd) { - throw new InvalidParameterValueException("private port range is invalid: " + defPortStart + "-" + defPortEnd, null); - } - if ((lb.getAlgorithm() == null) || !NetUtils.isValidAlgorithm(lb.getAlgorithm())) { - throw new InvalidParameterValueException("Invalid algorithm: " + lb.getAlgorithm(), null); - } - - Long ipAddrId = lb.getSourceIpAddressId(); - IPAddressVO ipVO = null; - if (ipAddrId != null) { - ipVO = _ipAddressDao.findById(ipAddrId); - } - - Network network = _networkMgr.getNetwork(lb.getNetworkId()); - - LoadBalancer result = _elbMgr.handleCreateLoadBalancerRule(lb, lbOwner, lb.getNetworkId()); - boolean performedIpAssoc = false; - if (result == null) { - IpAddress systemIp = null; - NetworkOffering off = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); - if (off.getElasticLb() && ipVO == null && network.getVpcId() == null) { - systemIp = _networkMgr.assignSystemIp(lb.getNetworkId(), lbOwner, true, false); - lb.setSourceIpAddressId(systemIp.getId()); - ipVO = _ipAddressDao.findById(systemIp.getId()); - } - - // Validate ip address - if (ipVO == null) { - throw new InvalidParameterValueException("Unable to create load balance rule; can't find/allocate source IP", null); - } else if (ipVO.isOneToOneNat()) { - throw new NetworkRuleConflictException("Can't do load balance on ip address: " + ipVO.getAddress()); - } - - try { - if (ipVO.getAssociatedWithNetworkId() == null) { - boolean assignToVpcNtwk = network.getVpcId() != null - && ipVO.getVpcId() != null && ipVO.getVpcId().longValue() == network.getVpcId(); - if (assignToVpcNtwk) { - //set networkId just for verification purposes - _networkMgr.checkIpForService(ipVO, Service.Lb, lb.getNetworkId()); - - s_logger.debug("The ip is not associated with the VPC network id="+ lb.getNetworkId() + " so assigning"); - ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId(), false); - performedIpAssoc = true; - } - } else { - _networkMgr.checkIpForService(ipVO, Service.Lb, null); - } - - if (ipVO.getAssociatedWithNetworkId() == null) { - throw new InvalidParameterValueException("Ip address " + ipVO + " is not assigned to the network " + network); - } - - if (lb.getSourceIpAddressId() == null) { - throw new CloudRuntimeException("No ip address is defined to assign the LB to"); - } - result = createLoadBalancer(lb, openFirewall); - } catch (Exception ex) { - s_logger.warn("Failed to create load balancer due to ", ex); - if (ex instanceof NetworkRuleConflictException) { - throw (NetworkRuleConflictException) ex; - } - } finally { - if (result == null && systemIp != null) { - s_logger.debug("Releasing system IP address " + systemIp + " as corresponding lb rule failed to create"); - _networkMgr.handleSystemIpRelease(systemIp); - } - // release ip address if ipassoc was perfored - if (performedIpAssoc) { - ipVO = _ipAddressDao.findById(ipVO.getId()); - _networkMgr.unassignIPFromVpcNetwork(ipVO.getId(), lb.getNetworkId()); - - } - } - } - - if (result == null) { - throw new CloudRuntimeException("Failed to create load balancer rule: " + lb.getName()); - } - - return result; - } - - @Override - @DB - public LoadBalancer createLoadBalancer(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException { - UserContext caller = UserContext.current(); - int srcPortStart = lb.getSourcePortStart(); - int defPortStart = lb.getDefaultPortStart(); - int srcPortEnd = lb.getSourcePortEnd(); - long sourceIpId = lb.getSourceIpAddressId(); - - IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId); - // make sure ip address exists - if (ipAddr == null || !ipAddr.readyToUse()) { - InvalidParameterValueException ex = new InvalidParameterValueException("Unable to create load balancer rule, invalid IP address id specified", null); - ex.addProxyObject(ipAddr, sourceIpId, "sourceIpId"); - throw ex; - } else if (ipAddr.isOneToOneNat()) { - InvalidParameterValueException ex = new InvalidParameterValueException("Unable to create load balancer rule; specified sourceip id has static nat enabled", null); - ex.addProxyObject(ipAddr, sourceIpId, "sourceIpId"); - throw ex; - } - - _firewallMgr.validateFirewallRule(caller.getCaller(), ipAddr, srcPortStart, srcPortEnd, lb.getProtocol(), - Purpose.LoadBalancing, FirewallRuleType.User); - - Long networkId = ipAddr.getAssociatedWithNetworkId(); - if (networkId == null) { - List idList = new ArrayList(); - idList.add(new IdentityProxy(ipAddr, sourceIpId, "sourceIpid")); - throw new InvalidParameterValueException("Unable to create load balancer rule ; specified sourceip id is not associated with any network", idList); - - } - NetworkVO network = _networkDao.findById(networkId); - - _accountMgr.checkAccess(caller.getCaller(), null, true, ipAddr); - - // verify that lb service is supported by the network - if (!_networkMgr.areServicesSupportedInNetwork(network.getId(), Service.Lb)) { - List idList = new ArrayList(); - idList.add(new IdentityProxy(network, networkId, "networkId")); - throw new InvalidParameterValueException("LB service is not supported in network with specified id", idList); - } - - Transaction txn = Transaction.currentTxn(); - txn.start(); - - LoadBalancerVO newRule = new LoadBalancerVO(lb.getXid(), lb.getName(), lb.getDescription(), lb.getSourceIpAddressId(), lb.getSourcePortEnd(), lb.getDefaultPortStart(), - lb.getAlgorithm(), network.getId(), ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId()); - - newRule = _lbDao.persist(newRule); - - if (openFirewall) { - _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCaller(), lb.getSourcePortStart(), - lb.getSourcePortEnd(), lb.getProtocol(), null, null, newRule.getId(), networkId); - } - - boolean success = true; - - try { - _firewallMgr.detectRulesConflict(newRule); - if (!_firewallDao.setStateToAdd(newRule)) { - throw new CloudRuntimeException("Unable to update the state to add for " + newRule); - } - s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port " + srcPortStart + ", private port " + defPortStart + " is added successfully."); - UserContext.current().setEventDetails("Load balancer Id: " + newRule.getId()); - UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(), ipAddr.getDataCenterId(), newRule.getId(), null); - _usageEventDao.persist(usageEvent); - txn.commit(); - - return newRule; - } catch (Exception e) { - success = false; - if (e instanceof NetworkRuleConflictException) { - throw (NetworkRuleConflictException) e; - } - throw new CloudRuntimeException("Unable to add rule for ip address id=" + newRule.getSourceIpAddressId(), e); - } finally { - if (!success && newRule != null) { - - txn.start(); - _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false); - removeLBRule(newRule); - - txn.commit(); - } - } - } - - @Override - public boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException { - LoadBalancerVO lb = _lbDao.findById(lbRuleId); - List lbs; - if (isRollBackAllowedForProvider(lb)) { - // this is for Netscalar type of devices. if their is failure the db entries will be rollbacked. - lbs = new ArrayList(1); - lbs.add(_lbDao.findById(lbRuleId)); - } else { - // get all rules in transition state - lbs = _lbDao.listInTransitionStateByNetworkId(lb.getNetworkId()); - } - return applyLoadBalancerRules(lbs, true); - } - - @Override - public boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException { - List lbs = _lbDao.listByNetworkId(networkId); - if (lbs != null) { - return applyLoadBalancerRules(lbs, true); - } else { - s_logger.info("Network id=" + networkId + " doesn't have load balancer rules, nothing to apply"); - return true; - } - } - - @DB - protected boolean applyLoadBalancerRules(List lbs, boolean updateRulesInDB) throws ResourceUnavailableException { - Transaction txn = Transaction.currentTxn(); - List rules = new ArrayList(); - for (LoadBalancerVO lb : lbs) { - List dstList = getExistingDestinations(lb.getId()); - List policyList = getStickinessPolicies(lb.getId()); - - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); - rules.add(loadBalancing); - } - - if (!_networkMgr.applyRules(rules, false)) { - s_logger.debug("LB rules are not completely applied"); - return false; - } - - if (updateRulesInDB) { - for (LoadBalancerVO lb : lbs) { - boolean checkForReleaseElasticIp = false; - txn.start(); - if (lb.getState() == FirewallRule.State.Revoke) { - removeLBRule(lb); - s_logger.debug("LB " + lb.getId() + " is successfully removed"); - checkForReleaseElasticIp = true; - } else if (lb.getState() == FirewallRule.State.Add) { - lb.setState(FirewallRule.State.Active); - s_logger.debug("LB rule " + lb.getId() + " state is set to Active"); - _lbDao.persist(lb); - } - - // remove LB-Vm mappings that were state to revoke - List lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true); - List instanceIds = new ArrayList(); - - for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { - instanceIds.add(lbVmMap.getInstanceId()); - } - - if (!instanceIds.isEmpty()) { - _lb2VmMapDao.remove(lb.getId(), instanceIds, null); - s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds); - } - - if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) { - lb.setState(FirewallRule.State.Add); - _lbDao.persist(lb); - s_logger.debug("LB rule " + lb.getId() + " state is set to Add as there are no more active LB-VM mappings"); - } - - // remove LB-Stickiness policy mapping that were state to revoke - List stickinesspolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(lb.getId(), true); - if (!stickinesspolicies.isEmpty()) { - _lb2stickinesspoliciesDao.remove(lb.getId(), true); - s_logger.debug("Load balancer rule id " + lb.getId() + " is removed stickiness policies"); - } - - txn.commit(); - - if (checkForReleaseElasticIp) { - boolean success = true; - long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId()); - if (count == 0) { - try { - success = handleSystemLBIpRelease(lb); - } catch (Exception ex) { - s_logger.warn("Failed to release system ip as a part of lb rule " + lb + " deletion due to exception ", ex); - success = false; - } finally { - if (!success) { - s_logger.warn("Failed to release system ip as a part of lb rule " + lb + " deletion"); - } - } - } - } - } - } - - return true; - } - - protected boolean handleSystemLBIpRelease(LoadBalancerVO lb) { - IpAddress ip = _ipAddressDao.findById(lb.getSourceIpAddressId()); - boolean success = true; - if (ip.getSystem()) { - s_logger.debug("Releasing system ip address " + lb.getSourceIpAddressId() + " as a part of delete lb rule"); - if (!_networkMgr.disassociatePublicIpAddress(lb.getSourceIpAddressId(), UserContext.current().getCallerUserId(), UserContext.current().getCaller())) { - s_logger.warn("Unable to release system ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); - success = false; - } else { - s_logger.warn("Successfully released system ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); - } - } - - return success; - } - - @Override - public boolean removeAllLoadBalanacersForIp(long ipId, Account caller, long callerUserId) { - List rules = _firewallDao.listByIpAndPurposeAndNotRevoked(ipId, Purpose.LoadBalancing); - if (rules != null) - s_logger.debug("Found " + rules.size() + " lb rules to cleanup"); - for (FirewallRule rule : rules) { - boolean result = deleteLoadBalancerRule(rule.getId(), true, caller, callerUserId, false); - if (result == false) { - s_logger.warn("Unable to remove load balancer rule " + rule.getId()); - return false; - } - } - return true; - } - - @Override - public boolean removeAllLoadBalanacersForNetwork(long networkId, Account caller, long callerUserId) { - List rules = _firewallDao.listByNetworkAndPurposeAndNotRevoked(networkId, Purpose.LoadBalancing); - if (rules != null) - s_logger.debug("Found " + rules.size() + " lb rules to cleanup"); - for (FirewallRule rule : rules) { - boolean result = deleteLoadBalancerRule(rule.getId(), true, caller, callerUserId, false); - if (result == false) { - s_logger.warn("Unable to remove load balancer rule " + rule.getId()); - return false; - } - } - return true; - } - - @Override - public List getStickinessPolicies(long lbId) { - List stickinessPolicies = new ArrayList(); - List sDbpolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(lbId); - - for (LBStickinessPolicyVO sDbPolicy : sDbpolicies) { - LbStickinessPolicy sPolicy = new LbStickinessPolicy(sDbPolicy.getMethodName(), sDbPolicy.getParams(), sDbPolicy.isRevoke()); - stickinessPolicies.add(sPolicy); - } - return stickinessPolicies; - } - - @Override - public List getExistingDestinations(long lbId) { - List dstList = new ArrayList(); - List lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lbId); - LoadBalancerVO lb = _lbDao.findById(lbId); - - String dstIp = null; - for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { - UserVm vm = _vmDao.findById(lbVmMap.getInstanceId()); - Nic nic = _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(lb.getNetworkId(), vm.getId()); - dstIp = nic.getIp4Address(); - LbDestination lbDst = new LbDestination(lb.getDefaultPortStart(), lb.getDefaultPortEnd(), dstIp, lbVmMap.isRevoke()); - dstList.add(lbDst); - } - return dstList; - } - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - _name = name; - return true; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - return true; - } - - @Override - public String getName() { - return _name; - } - - @Override - @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_UPDATE, eventDescription = "updating load balancer", async = true) - public LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd) { - Account caller = UserContext.current().getCaller(); - Long lbRuleId = cmd.getId(); - String name = cmd.getLoadBalancerName(); - String description = cmd.getDescription(); - String algorithm = cmd.getAlgorithm(); - LoadBalancerVO lb = _lbDao.findById(lbRuleId); - LoadBalancerVO lbBackup = _lbDao.findById(lbRuleId); - - if (lb == null) { - throw new InvalidParameterValueException("Unable to find lb rule by id", null); - } - - // check permissions - _accountMgr.checkAccess(caller, null, true, lb); - - if (name != null) { - lb.setName(name); - } - - if (description != null) { - lb.setDescription(description); - } - - if (algorithm != null) { - lb.setAlgorithm(algorithm); - } - - boolean success = _lbDao.update(lbRuleId, lb); - - // If algorithm is changed, have to reapply the lb config - if (algorithm != null) { - try { - lb.setState(FirewallRule.State.Add); - _lbDao.persist(lb); - applyLoadBalancerConfig(lbRuleId); - } catch (ResourceUnavailableException e) { - if (isRollBackAllowedForProvider(lb)) { - /* NOTE : We use lb object to update db instead of lbBackup object since db layer will fail to update if there is no change in the object. - */ - if (lbBackup.getName() != null) { - lb.setName(lbBackup.getName()); - } - if (lbBackup.getDescription() != null) { - lb.setDescription(lbBackup.getDescription()); - } - if (lbBackup.getAlgorithm() != null){ - lb.setAlgorithm(lbBackup.getAlgorithm()); - } - lb.setState(lbBackup.getState()); - _lbDao.update(lb.getId(), lb); - _lbDao.persist(lb); - - s_logger.debug("LB Rollback rule id: " + lbRuleId + " while updating LB rule."); - } - s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); - success = false; - } - } - - if (!success) { - throw new CloudRuntimeException("Failed to update load balancer rule: " + lbRuleId); - } - - return lb; - } - - @Override - public List listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd) throws PermissionDeniedException { - Account caller = UserContext.current().getCaller(); - Long loadBalancerId = cmd.getId(); - Boolean applied = cmd.isApplied(); - - if (applied == null) { - applied = Boolean.TRUE; - } - - LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); - if (loadBalancer == null) { - return null; - } - - _accountMgr.checkAccess(caller, null, true, loadBalancer); - - List loadBalancerInstances = new ArrayList(); - List vmLoadBalancerMappings = null; - - vmLoadBalancerMappings = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); - - List appliedInstanceIdList = new ArrayList(); - if ((vmLoadBalancerMappings != null) && !vmLoadBalancerMappings.isEmpty()) { - for (LoadBalancerVMMapVO vmLoadBalancerMapping : vmLoadBalancerMappings) { - appliedInstanceIdList.add(vmLoadBalancerMapping.getInstanceId()); - } - } - - IPAddressVO addr = _ipAddressDao.findById(loadBalancer.getSourceIpAddressId()); - List userVms = _vmDao.listVirtualNetworkInstancesByAcctAndZone(loadBalancer.getAccountId(), addr.getDataCenterId(), loadBalancer.getNetworkId()); - - for (UserVmVO userVm : userVms) { - // if the VM is destroyed, being expunged, in an error state, or in an unknown state, skip it - switch (userVm.getState()) { - case Destroyed: - case Expunging: - case Error: - case Unknown: - continue; - } - - boolean isApplied = appliedInstanceIdList.contains(userVm.getId()); - if ((isApplied && applied) || (!isApplied && !applied)) { - loadBalancerInstances.add(userVm); - } - } - - return loadBalancerInstances; - } - - @Override - public List getStickinessMethods(long networkid) - { - String capability = getLBStickinessCapability(networkid); - if (capability == null) - return null; - Gson gson = new Gson(); - java.lang.reflect.Type listType = new TypeToken>() { - }.getType(); - List result = gson.fromJson(capability, listType); - return result; - } - - @Override - public List searchForLBStickinessPolicies(ListLBStickinessPoliciesCmd cmd) throws PermissionDeniedException { - Account caller = UserContext.current().getCaller(); - Long loadBalancerId = cmd.getLbRuleId(); - LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); - if (loadBalancer == null) { - return null; - } - - _accountMgr.checkAccess(caller, null, true, loadBalancer); - - List sDbpolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId()); - - return sDbpolicies; - } - - @Override - public List searchForLoadBalancers(ListLoadBalancerRulesCmd cmd) { - Long ipId = cmd.getPublicIpId(); - Long zoneId = cmd.getZoneId(); - Long id = cmd.getId(); - String name = cmd.getLoadBalancerRuleName(); - String keyword = cmd.getKeyword(); - Long instanceId = cmd.getVirtualMachineId(); - Map tags = cmd.getTags(); - - Account caller = UserContext.current().getCaller(); - List permittedAccounts = new ArrayList(); - - Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); - _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); - Long domainId = domainIdRecursiveListProject.first(); - Boolean isRecursive = domainIdRecursiveListProject.second(); - ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); - - Filter searchFilter = new Filter(LoadBalancerVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); - SearchBuilder sb = _lbDao.createSearchBuilder(); - _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); - sb.and("sourceIpAddress", sb.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ); - - if (instanceId != null) { - SearchBuilder lbVMSearch = _lb2VmMapDao.createSearchBuilder(); - lbVMSearch.and("instanceId", lbVMSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); - sb.join("lbVMSearch", lbVMSearch, sb.entity().getId(), lbVMSearch.entity().getLoadBalancerId(), JoinBuilder.JoinType.INNER); - } - - if (zoneId != null) { - SearchBuilder ipSearch = _ipAddressDao.createSearchBuilder(); - ipSearch.and("zoneId", ipSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); - sb.join("ipSearch", ipSearch, sb.entity().getSourceIpAddressId(), ipSearch.entity().getId(), JoinBuilder.JoinType.INNER); - } - - if (tags != null && !tags.isEmpty()) { - SearchBuilder tagSearch = _resourceTagDao.createSearchBuilder(); - for (int count=0; count < tags.size(); count++) { - tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); - tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); - tagSearch.cp(); - } - tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ); - sb.groupBy(sb.entity().getId()); - sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); - } - - SearchCriteria sc = sb.create(); - _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); - - if (keyword != null) { - SearchCriteria ssc = _lbDao.createSearchCriteria(); - ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - sc.addAnd("name", SearchCriteria.Op.SC, ssc); - } - - if (name != null) { - sc.setParameters("name", "%" + name + "%"); - } - - if (id != null) { - sc.setParameters("id", id); - } - - if (ipId != null) { - sc.setParameters("sourceIpAddress", ipId); - } - - if (instanceId != null) { - sc.setJoinParameters("lbVMSearch", "instanceId", instanceId); - } - - if (zoneId != null) { - sc.setJoinParameters("ipSearch", "zoneId", zoneId); - } - - - if (tags != null && !tags.isEmpty()) { - int count = 0; - sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.LoadBalancer.toString()); - for (String key : tags.keySet()) { - sc.setJoinParameters("tagSearch", "key" + String.valueOf(count), key); - sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), tags.get(key)); - count++; - } - } - - return _lbDao.search(sc, searchFilter); - } - - @Override - public List listByNetworkId(long networkId) { - List lbs = _lbDao.listByNetworkId(networkId); - List lbRules = new ArrayList(); - for (LoadBalancerVO lb : lbs) { - List dstList = getExistingDestinations(lb.getId()); - List policyList = this.getStickinessPolicies(lb.getId()); - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); - lbRules.add(loadBalancing); - } - return lbRules; - } - - @Override - public LoadBalancerVO findById(long lbId) { - return _lbDao.findById(lbId); - } - - protected void removeLBRule(LoadBalancerVO rule) { - - //remove the rule - _lbDao.remove(rule.getId()); - - //if the rule is the last one for the ip address assigned to VPC, unassign it from the network - IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId()); - _networkMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId()); - - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.lb; + +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Formatter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiServer; +import com.cloud.api.commands.CreateLBStickinessPolicyCmd; +import com.cloud.api.commands.CreateLoadBalancerRuleCmd; +import com.cloud.api.commands.ListLBStickinessPoliciesCmd; +import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd; +import com.cloud.api.commands.ListLoadBalancerRulesCmd; +import com.cloud.api.commands.UpdateLoadBalancerRuleCmd; +import com.cloud.api.response.ServiceResponse; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.domain.dao.DomainDao; +import com.cloud.event.ActionEvent; +import com.cloud.event.EventTypes; +import com.cloud.event.UsageEventVO; +import com.cloud.event.dao.EventDao; +import com.cloud.event.dao.UsageEventDao; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.ExternalLoadBalancerUsageManager; +import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; +import com.cloud.network.LBStickinessPolicyVO; +import com.cloud.network.LoadBalancerVMMapVO; +import com.cloud.network.LoadBalancerVO; +import com.cloud.network.Network; +import com.cloud.network.Network.Capability; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; +import com.cloud.network.as.AutoScalePolicy; +import com.cloud.network.as.AutoScalePolicyConditionMapVO; +import com.cloud.network.as.AutoScaleVmGroup; +import com.cloud.network.as.AutoScaleVmGroupPolicyMapVO; +import com.cloud.network.as.AutoScaleVmProfile; +import com.cloud.network.as.Condition; +import com.cloud.network.as.Counter; +import com.cloud.network.as.dao.AutoScalePolicyConditionMapDao; +import com.cloud.network.as.dao.AutoScalePolicyDao; +import com.cloud.network.as.dao.AutoScaleVmGroupDao; +import com.cloud.network.as.dao.AutoScaleVmGroupPolicyMapDao; +import com.cloud.network.as.dao.AutoScaleVmProfileDao; +import com.cloud.network.as.dao.ConditionDao; +import com.cloud.network.as.dao.CounterDao; +import com.cloud.network.dao.FirewallRulesCidrsDao; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.LBStickinessPolicyDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.LoadBalancerVMMapDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScalePolicy; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmGroup; +import com.cloud.network.lb.LoadBalancingRule.LbAutoScaleVmProfile; +import com.cloud.network.lb.LoadBalancingRule.LbCondition; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; +import com.cloud.network.rules.FirewallManager; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.FirewallRuleType; +import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.network.rules.LbStickinessMethod; +import com.cloud.network.rules.LbStickinessMethod.LbStickinessMethodParam; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.network.rules.RulesManager; +import com.cloud.network.rules.StickinessPolicy; +import com.cloud.offering.NetworkOffering; +import com.cloud.projects.Project.ListProjectResourcesCriteria; +import com.cloud.server.ResourceTag.TaggedResourceType; +import com.cloud.tags.ResourceTagVO; +import com.cloud.tags.dao.ResourceTagDao; +import com.cloud.template.TemplateManager; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.DomainService; +import com.cloud.user.User; +import com.cloud.user.UserContext; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.uservm.UserVm; +import com.cloud.utils.IdentityProxy; +import com.cloud.utils.Ternary; +import com.cloud.utils.component.Inject; +import com.cloud.utils.component.Manager; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.JoinBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.UserVmDao; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +@Local(value = { LoadBalancingRulesManager.class, LoadBalancingRulesService.class }) +public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, LoadBalancingRulesService, Manager { + private static final Logger s_logger = Logger.getLogger(LoadBalancingRulesManagerImpl.class); + + String _name; + + @Inject + NetworkManager _networkMgr; + @Inject + RulesManager _rulesMgr; + @Inject + AccountManager _accountMgr; + @Inject + IPAddressDao _ipAddressDao; + @Inject + LoadBalancerDao _lbDao; + @Inject + VlanDao _vlanDao; + @Inject + EventDao _eventDao; + @Inject + LoadBalancerVMMapDao _lb2VmMapDao; + @Inject + LBStickinessPolicyDao _lb2stickinesspoliciesDao; + @Inject + UserVmDao _vmDao; + @Inject + AccountDao _accountDao; + @Inject + DomainDao _domainDao; + @Inject + NicDao _nicDao; + @Inject + UsageEventDao _usageEventDao; + @Inject + FirewallRulesCidrsDao _firewallCidrsDao; + @Inject + FirewallManager _firewallMgr; + @Inject + ElasticLoadBalancerManager _elbMgr; + @Inject + NetworkDao _networkDao; + @Inject + FirewallRulesDao _firewallDao; + @Inject + DomainService _domainMgr; + @Inject + ConfigurationManager _configMgr; + @Inject + TemplateManager _templateMgr; + @Inject + ExternalLoadBalancerUsageManager _externalLBUsageMgr; + @Inject + NetworkServiceMapDao _ntwkSrvcDao; + @Inject + ResourceTagDao _resourceTagDao; + @Inject + CounterDao _counterDao; + @Inject + ConditionDao _conditionDao; + @Inject + AutoScaleVmProfileDao _autoScaleVmProfileDao; + @Inject + AutoScalePolicyDao _autoScalePolicyDao; + @Inject + AutoScalePolicyConditionMapDao _autoScalePolicyConditionMapDao; + @Inject + AutoScaleVmGroupDao _autoScaleVmGroupDao; + @Inject + AutoScaleVmGroupPolicyMapDao _autoScaleVmGroupPolicyMapDao; + @Inject + DataCenterDao _dcDao = null; + @Inject + UserDao _userDao; + + // Will return a string. For LB Stickiness this will be a json, for autoscale this will be "," separated values + @Override + public String getLBCapability(long networkid, String capabilityName) { + Map> serviceCapabilitiesMap = _networkMgr.getNetworkCapabilities(networkid); + if (serviceCapabilitiesMap != null) { + for (Service service : serviceCapabilitiesMap.keySet()) { + ServiceResponse serviceResponse = new ServiceResponse(); + serviceResponse.setName(service.getName()); + if ("Lb".equalsIgnoreCase(service.getName())) { + Map serviceCapabilities = serviceCapabilitiesMap + .get(service); + if (serviceCapabilities != null) { + for (Capability capability : serviceCapabilities + .keySet()) { + if (capabilityName.equals(capability.getName())) { + return serviceCapabilities.get(capability); + } + } + } + } + } + } + return null; + } + + private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroup vmGroup) { + List vmGroupPolicyMapList = _autoScaleVmGroupPolicyMapDao.listByVmGroupId(vmGroup.getId()); + List autoScalePolicies = new ArrayList(); + for (AutoScaleVmGroupPolicyMapVO vmGroupPolicyMap : vmGroupPolicyMapList) { + AutoScalePolicy autoScalePolicy = _autoScalePolicyDao.findById(vmGroupPolicyMap.getPolicyId()); + List autoScalePolicyConditionMapList = _autoScalePolicyConditionMapDao.listByAll(autoScalePolicy.getId(), null); + List lbConditions = new ArrayList(); + for (AutoScalePolicyConditionMapVO autoScalePolicyConditionMap : autoScalePolicyConditionMapList) { + Condition condition = _conditionDao.findById(autoScalePolicyConditionMap.getConditionId()); + Counter counter = _counterDao.findById(condition.getCounterid()); + lbConditions.add(new LbCondition(counter, condition)); + } + autoScalePolicies.add(new LbAutoScalePolicy(autoScalePolicy, lbConditions)); + } + ApiServer apiserver = ApiServer.getInstance(); + String apiIpAddress = apiserver.getServerIpAddress(); + String apiPort = apiserver.getServerPort(); + StringBuilder sb = new StringBuilder(); + + Formatter formatter = new Formatter(sb, java.util.Locale.US); + formatter.format("https://%s:%s/client/api?", apiIpAddress, apiPort); + String csurl = sb.toString(); + AutoScaleVmProfile autoScaleVmProfile = _autoScaleVmProfileDao.findById(vmGroup.getProfileId()); + Long autoscaleUserId = autoScaleVmProfile.getAutoScaleUserId(); + User user = _userDao.findById(autoscaleUserId); + String apiKey = user.getApiKey(); + String secretKey = user.getSecretKey(); + LbAutoScaleVmProfile lbAutoScaleVmProfile = new LbAutoScaleVmProfile(autoScaleVmProfile, csurl, apiKey, secretKey); + return new LbAutoScaleVmGroup(vmGroup, autoScalePolicies, lbAutoScaleVmProfile); + } + + private boolean applyAutoScaleConfig(LoadBalancerVO lb, LoadBalancingRule rule, boolean updateRulesInDB) throws ResourceUnavailableException { + if (!isRollBackAllowedForProvider(lb)) { + // this is for Netscalar type of devices. if their is failure the db entries will be rollbacked. + return false; + } + + List rules = Arrays.asList(rule); + + if (!_networkMgr.applyRules(rules, false)) { + s_logger.debug("LB rules are not completely applied"); + return false; + } + + if (updateRulesInDB) { + } + + return true; + } + + @Override + @DB + public boolean configureLbAutoScaleVmGroup(long vmGroupid, boolean vmGroupCreation) { + AutoScaleVmGroup vmGroup = _autoScaleVmGroupDao.findById(vmGroupid); + boolean success = true; + + LoadBalancerVO loadBalancer = _lbDao.findById(vmGroup.getLoadBalancerId()); + + List vmLoadBalancerMappings = _lb2VmMapDao.listByLoadBalancerId(loadBalancer.getId()); + + boolean loadBalancerCreation = false; + + if (vmLoadBalancerMappings.size() == 0 && vmGroupCreation) { // No manual binding exists, a loadbalancer will be + // created eventually, setting to lb to Add state + loadBalancerCreation = true; + } + + FirewallRule.State backupState = loadBalancer.getState(); + + if (loadBalancerCreation) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + loadBalancer.setState(FirewallRule.State.Add); + _lbDao.persist(loadBalancer); + txn.commit(); + } + + // LBTODO + try { + LbAutoScaleVmGroup lbAutoScaleVmGroup = getLbAutoScaleVmGroup(vmGroup); + LoadBalancingRule rule = new LoadBalancingRule(loadBalancer, null, null); + rule.setAutoScaleVmGroup(lbAutoScaleVmGroup); + success = applyAutoScaleConfig(loadBalancer, rule, true); + } catch (ResourceUnavailableException e) { + s_logger.warn("Unable to configure AutoScaleVmGroup to the lb rule: " + loadBalancer.getId() + " because resource is unavaliable:", e); + if (isRollBackAllowedForProvider(loadBalancer)) { + loadBalancer.setState(backupState); + _lbDao.persist(loadBalancer); + s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating AutoscaleVmGroup"); + } + success = false; + } + + return success; + } + + private boolean genericValidator(CreateLBStickinessPolicyCmd cmd) throws InvalidParameterValueException { + LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId()); + /* Validation : check for valid Method name and params */ + List stickinessMethodList = getStickinessMethods(loadBalancer + .getNetworkId()); + boolean methodMatch = false; + + if (stickinessMethodList == null) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); + throw new InvalidParameterValueException("Failed: No Stickiness method available for LB rule with specified id", idList); + } + for (LbStickinessMethod method : stickinessMethodList) { + if (method.getMethodName().equalsIgnoreCase(cmd.getStickinessMethodName())) { + methodMatch = true; + Map apiParamList = cmd.getparamList(); + List methodParamList = method.getParamList(); + Map tempParamList = new HashMap(); + + /* + * validation-1: check for any extra params that are not + * required by the policymethod(capability), FIXME: make the + * below loop simple without using raw data type + */ + if (apiParamList != null) { + Collection userGroupCollection = apiParamList.values(); + Iterator iter = userGroupCollection.iterator(); + while (iter.hasNext()) { + HashMap paramKVpair = (HashMap) iter.next(); + String paramName = paramKVpair.get("name"); + String paramValue = paramKVpair.get("value"); + + tempParamList.put(paramName, paramValue); + Boolean found = false; + for (LbStickinessMethodParam param : methodParamList) { + if (param.getParamName().equalsIgnoreCase(paramName)) { + if ((param.getIsflag() == false) && (paramValue == null)) { + throw new InvalidParameterValueException("Failed : Value expected for the Param :" + param.getParamName(), null); + } + found = true; + break; + } + } + if (!found) { + throw new InvalidParameterValueException("Failed : Stickiness policy does not support param name :" + paramName, null); + } + } + } + + /* validation-2: check for mandatory params */ + for (LbStickinessMethodParam param : methodParamList) { + if (param.getRequired()) { + if (tempParamList.get(param.getParamName()) == null) { + throw new InvalidParameterValueException("Failed : Missing Manadatory Param :" + param.getParamName(), null); + } + } + } + /* Successfully completed the Validation */ + break; + } + } + if (methodMatch == false) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); + throw new InvalidParameterValueException("Failed to match Stickiness method name for LB rule whose id is specified", idList); + } + + /* Validation : check for the multiple policies to the rule id */ + List stickinessPolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId(), false); + if (stickinessPolicies.size() > 0) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); + throw new InvalidParameterValueException("Failed to create Stickiness policy: Policy already attached", idList); + } + return true; + } + + @SuppressWarnings("rawtypes") + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_CREATE, eventDescription = "create lb stickinesspolicy to load balancer", create = true) + public StickinessPolicy createLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) throws NetworkRuleConflictException { + UserContext caller = UserContext.current(); + + /* Validation : check corresponding load balancer rule exist */ + LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId()); + if (loadBalancer == null) { + throw new InvalidParameterValueException("Failed: LB rule provided not present", null); + } + + _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer); + if (loadBalancer.getState() == FirewallRule.State.Revoke) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); + throw new InvalidParameterValueException("Failed: LB rule with specified id is in deleting state: ", idList); + } + + /* Generic validations */ + if (!genericValidator(cmd)) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); + throw new InvalidParameterValueException("Failed to create Stickiness policy: Validation of rule with specified id failed", idList); + } + + /* Specific validations using network element validator for specific validations */ + LBStickinessPolicyVO lbpolicy = new LBStickinessPolicyVO(loadBalancer.getId(), cmd.getLBStickinessPolicyName(), cmd.getStickinessMethodName(), cmd.getparamList(), cmd.getDescription()); + List policyList = new ArrayList(); + policyList.add(new LbStickinessPolicy(cmd.getStickinessMethodName(), lbpolicy.getParams())); + LoadBalancingRule lbRule = new LoadBalancingRule(loadBalancer, getExistingDestinations(lbpolicy.getId()), policyList); + if (!_networkMgr.validateRule(lbRule)) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("firewall_rules", cmd.getLbRuleId(), "ruleId")); + throw new InvalidParameterValueException("Failed to create Stickiness policy: Validation of rule with specified id failed ", idList); + } + + /* Finally Insert into DB */ + LBStickinessPolicyVO policy = new LBStickinessPolicyVO(loadBalancer.getId(), cmd.getLBStickinessPolicyName(), cmd.getStickinessMethodName(), cmd.getparamList(), cmd.getDescription()); + policy = _lb2stickinesspoliciesDao.persist(policy); + + return policy; + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_CREATE, eventDescription = "Apply Stickinesspolicy to load balancer ", async = true) + public boolean applyLBStickinessPolicy(CreateLBStickinessPolicyCmd cmd) { + boolean success = true; + + LoadBalancerVO loadBalancer = _lbDao.findById(cmd.getLbRuleId()); + if (loadBalancer == null) { + throw new InvalidParameterException("Invalid Load balancer Id:" + cmd.getLbRuleId()); + } + FirewallRule.State backupState = loadBalancer.getState(); + loadBalancer.setState(FirewallRule.State.Add); + _lbDao.persist(loadBalancer); + try { + applyLoadBalancerConfig(cmd.getLbRuleId()); + } catch (ResourceUnavailableException e) { + s_logger.warn("Unable to apply Stickiness policy to the lb rule: " + cmd.getLbRuleId() + " because resource is unavaliable:", e); + if (isRollBackAllowedForProvider(loadBalancer)) { + loadBalancer.setState(backupState); + _lbDao.persist(loadBalancer); + s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " lb state rolback while creating sticky policy" ); + } + deleteLBStickinessPolicy(cmd.getEntityId(), false); + success = false; + } + + return success; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_LB_STICKINESSPOLICY_DELETE, eventDescription = "revoking LB Stickiness policy ", async = true) + public boolean deleteLBStickinessPolicy(long stickinessPolicyId, boolean apply) { + boolean success = true; + + UserContext caller = UserContext.current(); + LBStickinessPolicyVO stickinessPolicy = _lb2stickinesspoliciesDao.findById(stickinessPolicyId); + + if (stickinessPolicy == null) { + throw new InvalidParameterException("Invalid Stickiness policy id value: " + stickinessPolicyId); + } + LoadBalancerVO loadBalancer = _lbDao.findById(Long.valueOf(stickinessPolicy.getLoadBalancerId())); + if (loadBalancer == null) { + throw new InvalidParameterException("Invalid Load balancer : " + stickinessPolicy.getLoadBalancerId() + " for Stickiness policy id: " + stickinessPolicyId); + } + long loadBalancerId = loadBalancer.getId(); + FirewallRule.State backupState = loadBalancer.getState(); + _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer); + + if (apply) { + if (loadBalancer.getState() == FirewallRule.State.Active) { + loadBalancer.setState(FirewallRule.State.Add); + _lbDao.persist(loadBalancer); + } + + boolean backupStickyState = stickinessPolicy.isRevoke(); + stickinessPolicy.setRevoke(true); + _lb2stickinesspoliciesDao.persist(stickinessPolicy); + s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", stickinesspolicyID " + stickinessPolicyId); + + try { + if (!applyLoadBalancerConfig(loadBalancerId)) { + s_logger.warn("Failed to remove load balancer rule id " + loadBalancerId + " for stickinesspolicyID " + stickinessPolicyId); + throw new CloudRuntimeException("Failed to remove load balancer rule id " + loadBalancerId + " for stickinesspolicyID " + stickinessPolicyId); + } + } catch (ResourceUnavailableException e) { + if (isRollBackAllowedForProvider(loadBalancer)) { + stickinessPolicy.setRevoke(backupStickyState); + _lb2stickinesspoliciesDao.persist(stickinessPolicy); + loadBalancer.setState(backupState); + _lbDao.persist(loadBalancer); + s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " while deleting sticky policy: " + stickinessPolicyId); + } + s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); + success = false; + } + }else{ + _lb2stickinesspoliciesDao.remove(stickinessPolicy.getLoadBalancerId()); + } + + return success; + } + + private boolean isRollBackAllowedForProvider(LoadBalancerVO loadBalancer) { + Network network = _networkDao.findById(loadBalancer.getNetworkId()); + Provider provider = Network.Provider.Netscaler; + return _ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(), Service.Lb, provider); + } + + @Override + @DB + @ActionEvent(eventType = EventTypes.EVENT_ASSIGN_TO_LOAD_BALANCER_RULE, eventDescription = "assigning to load balancer", async = true) + public boolean assignToLoadBalancer(long loadBalancerId, List instanceIds) { + UserContext ctx = UserContext.current(); + Account caller = ctx.getCaller(); + + LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); + if (loadBalancer == null) { + throw new InvalidParameterValueException("Failed to assign to load balancer; the load balancer was not found.", null); + } + + + List mappedInstances = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId, false); + Set mappedInstanceIds = new HashSet(); + for (LoadBalancerVMMapVO mappedInstance : mappedInstances) { + mappedInstanceIds.add(Long.valueOf(mappedInstance.getInstanceId())); + } + + List vmsToAdd = new ArrayList(); + + for (Long instanceId : instanceIds) { + if (mappedInstanceIds.contains(instanceId)) { + List idList = new ArrayList(); + idList.add(new IdentityProxy("user_vm", instanceId, "vmId")); + throw new InvalidParameterValueException("VM with specified id is already mapped to load balancer", idList); + } + + UserVm vm = _vmDao.findById(instanceId); + if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging) { + throw new InvalidParameterValueException("Couldn't locate vm instance by id", null); + } + + _rulesMgr.checkRuleAndUserVm(loadBalancer, vm, caller); + + if (vm.getAccountId() != loadBalancer.getAccountId()) { + throw new PermissionDeniedException("Cannot add virtual machines that do not belong to the same owner."); + } + + // Let's check to make sure the vm has a nic in the same network as the load balancing rule. + List nics = _networkMgr.getNics(vm.getId()); + Nic nicInSameNetwork = null; + for (Nic nic : nics) { + if (nic.getNetworkId() == loadBalancer.getNetworkId()) { + nicInSameNetwork = nic; + break; + } + } + + if (nicInSameNetwork == null) { + List idList = new ArrayList(); + idList.add(new IdentityProxy(vm, instanceId, "vmId")); + throw new InvalidParameterValueException("VM with specified id cannot be added because it doesn't belong in the same network.", idList); + + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Adding " + vm + " to the load balancer pool"); + } + vmsToAdd.add(vm); + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + for (UserVm vm : vmsToAdd) { + LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false); + map = _lb2VmMapDao.persist(map); + } + txn.commit(); + + if(_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancerId)) { + // Nothing needs to be done for an autoscaled loadbalancer, + // just persist and proceed. + return true; + } + + boolean success = false; + FirewallRule.State backupState = loadBalancer.getState(); + try { + loadBalancer.setState(FirewallRule.State.Add); + _lbDao.persist(loadBalancer); + applyLoadBalancerConfig(loadBalancerId); + success = true; + } catch (ResourceUnavailableException e) { + if (isRollBackAllowedForProvider(loadBalancer)) { + List vmInstanceIds = new ArrayList(); + txn = Transaction.currentTxn(); + txn.start(); + for (UserVm vm : vmsToAdd) { + vmInstanceIds.add(vm.getId()); + } + txn.commit(); + if (!vmInstanceIds.isEmpty()) { + _lb2VmMapDao.remove(loadBalancer.getId(), vmInstanceIds, null); + s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " while attaching VM: " + vmInstanceIds); + } + loadBalancer.setState(backupState); + _lbDao.persist(loadBalancer); + } + s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); + } + + if(!success){ + CloudRuntimeException ex = new CloudRuntimeException("Failed to add specified loadbalancerruleid for vms " + instanceIds); + ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId"); + // TBD: Also pack in the instanceIds in the exception using the right VO object or table name. + throw ex; + } + + return success; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_REMOVE_FROM_LOAD_BALANCER_RULE, eventDescription = "removing from load balancer", async = true) + public boolean removeFromLoadBalancer(long loadBalancerId, List instanceIds) { + return removeFromLoadBalancerInternal(loadBalancerId, instanceIds, true); + } + + private boolean removeFromLoadBalancerInternal(long loadBalancerId, List instanceIds, boolean rollBack) { + UserContext caller = UserContext.current(); + + LoadBalancerVO loadBalancer = _lbDao.findById(Long.valueOf(loadBalancerId)); + if (loadBalancer == null) { + throw new InvalidParameterException("Invalid load balancer value: " + loadBalancerId); + } + + _accountMgr.checkAccess(caller.getCaller(), null, true, loadBalancer); + + boolean success = false; + FirewallRule.State backupState = loadBalancer.getState(); + try { + loadBalancer.setState(FirewallRule.State.Add); + _lbDao.persist(loadBalancer); + + for (long instanceId : instanceIds) { + LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId); + map.setRevoke(true); + _lb2VmMapDao.persist(map); + s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + instanceId); + } + + if(_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancerId)) { + // Nothing needs to be done for an autoscaled loadbalancer, + // just persist and proceed. + return true; + } + + if (!applyLoadBalancerConfig(loadBalancerId)) { + s_logger.warn("Failed to remove load balancer rule id " + loadBalancerId + " for vms " + instanceIds); + CloudRuntimeException ex = new CloudRuntimeException("Failed to remove specified load balancer rule id for vms " + instanceIds); + ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId"); + throw ex; + } + success = true; + } catch (ResourceUnavailableException e) { + if (rollBack && isRollBackAllowedForProvider(loadBalancer)) { + + for (long instanceId : instanceIds) { + LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId); + map.setRevoke(false); + _lb2VmMapDao.persist(map); + s_logger.debug("LB Rollback rule id: " + loadBalancerId + ",while removing vmId " + instanceId); + } + + loadBalancer.setState(backupState); + _lbDao.persist(loadBalancer); + s_logger.debug("LB Rollback rule id: " + loadBalancerId + " while removing vm instances"); + } + s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); + } + if(!success){ + CloudRuntimeException ex = new CloudRuntimeException("Failed to remove specified load balancer rule id for vms " + instanceIds); + ex.addProxyObject(loadBalancer, loadBalancerId, "loadBalancerId"); + throw ex; + } + return success; + } + + @Override + public boolean removeVmFromLoadBalancers(long instanceId) { + boolean success = true; + List maps = _lb2VmMapDao.listByInstanceId(instanceId); + if (maps == null || maps.isEmpty()) { + return true; + } + + Map> lbsToReconfigure = new HashMap>(); + + // first set all existing lb mappings with Revoke state + for (LoadBalancerVMMapVO map : maps) { + long lbId = map.getLoadBalancerId(); + List instances = lbsToReconfigure.get(lbId); + if (instances == null) { + instances = new ArrayList(); + } + instances.add(map.getInstanceId()); + lbsToReconfigure.put(lbId, instances); + + map.setRevoke(true); + _lb2VmMapDao.persist(map); + s_logger.debug("Set load balancer rule for revoke: rule id " + map.getLoadBalancerId() + ", vmId " + instanceId); + } + + // Reapply all lbs that had the vm assigned + if (lbsToReconfigure != null) { + for (Map.Entry> lb : lbsToReconfigure.entrySet()) { + if (!removeFromLoadBalancerInternal(lb.getKey(), lb.getValue(), false)) { + success = false; + } + } + } + return success; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_DELETE, eventDescription = "deleting load balancer", async = true) + public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply) { + UserContext ctx = UserContext.current(); + Account caller = ctx.getCaller(); + + LoadBalancerVO rule = _lbDao.findById(loadBalancerId); + if (rule == null) { + throw new InvalidParameterValueException("Unable to find load balancer rule by id", null); + } + + _accountMgr.checkAccess(caller, null, true, rule); + + boolean result = deleteLoadBalancerRule(loadBalancerId, apply, caller, ctx.getCallerUserId(), true); + if (!result) { + throw new CloudRuntimeException("Unable to remove load balancer rule " + loadBalancerId); + } + return result; + } + + @DB + public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply, Account caller, long callerUserId, boolean rollBack) { + LoadBalancerVO lb = _lbDao.findById(loadBalancerId); + Transaction txn = Transaction.currentTxn(); + boolean generateUsageEvent = false; + boolean success = true; + FirewallRule.State backupState = lb.getState(); + + txn.start(); + if (lb.getState() == FirewallRule.State.Staged) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb); + } + generateUsageEvent = true; + } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) { + lb.setState(FirewallRule.State.Revoke); + _lbDao.persist(lb); + generateUsageEvent = true; + } + List backupMaps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); + List maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); + if (maps != null) { + for (LoadBalancerVMMapVO map : maps) { + map.setRevoke(true); + _lb2VmMapDao.persist(map); + s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + map.getInstanceId()); + } + } + + if (generateUsageEvent) { + // Generate usage event right after all rules were marked for revoke + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(), null); + _usageEventDao.persist(usageEvent); + } + + txn.commit(); + + // gather external network usage stats for this lb rule + NetworkVO network = _networkDao.findById(lb.getNetworkId()); + if (network != null) { + if (_networkMgr.networkIsConfiguredForExternalNetworking(network.getDataCenterId(), network.getId())) { + _externalLBUsageMgr.updateExternalLoadBalancerNetworkUsageStats(loadBalancerId); + } + } + + if (apply) { + try { + if (!applyLoadBalancerConfig(loadBalancerId)) { + s_logger.warn("Unable to apply the load balancer config"); + return false; + } + } catch (ResourceUnavailableException e) { + if (rollBack && isRollBackAllowedForProvider(lb)) { + if (backupMaps != null) { + for (LoadBalancerVMMapVO map : backupMaps) { + _lb2VmMapDao.persist(map); + s_logger.debug("LB Rollback rule id: " + loadBalancerId + ", vmId " + map.getInstanceId()); + } + } + lb.setState(backupState); + _lbDao.persist(lb); + s_logger.debug("LB Rollback rule id: " + loadBalancerId + " while deleting LB rule."); + } else { + s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); + } + return false; + } + } + + FirewallRuleVO relatedRule = _firewallDao.findByRelatedId(lb.getId()); + if (relatedRule != null) { + s_logger.warn("Unable to remove firewall rule id=" + lb.getId() + " as it has related firewall rule id=" + relatedRule.getId() + "; leaving it in Revoke state"); + success = false; + } else { + _firewallMgr.removeRule(lb); + } + + _elbMgr.handleDeleteLoadBalancerRule(lb, callerUserId, caller); + + if (success) { + s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully"); + } + + return success; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_CREATE, eventDescription = "creating load balancer") + public LoadBalancer createLoadBalancerRule(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException, InsufficientAddressCapacityException { + Account lbOwner = _accountMgr.getAccount(lb.getEntityOwnerId()); + + int defPortStart = lb.getDefaultPortStart(); + int defPortEnd = lb.getDefaultPortEnd(); + + if (!NetUtils.isValidPort(defPortEnd)) { + throw new InvalidParameterValueException("privatePort is an invalid value: " + defPortEnd, null); + } + if (defPortStart > defPortEnd) { + throw new InvalidParameterValueException("private port range is invalid: " + defPortStart + "-" + defPortEnd, null); + } + if ((lb.getAlgorithm() == null) || !NetUtils.isValidAlgorithm(lb.getAlgorithm())) { + throw new InvalidParameterValueException("Invalid algorithm: " + lb.getAlgorithm(), null); + } + + Long ipAddrId = lb.getSourceIpAddressId(); + IPAddressVO ipVO = null; + if (ipAddrId != null) { + ipVO = _ipAddressDao.findById(ipAddrId); + } + + Network network = _networkMgr.getNetwork(lb.getNetworkId()); + + LoadBalancer result = _elbMgr.handleCreateLoadBalancerRule(lb, lbOwner, lb.getNetworkId()); + boolean performedIpAssoc = false; + if (result == null) { + IpAddress systemIp = null; + NetworkOffering off = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); + if (off.getElasticLb() && ipVO == null && network.getVpcId() == null) { + systemIp = _networkMgr.assignSystemIp(lb.getNetworkId(), lbOwner, true, false); + lb.setSourceIpAddressId(systemIp.getId()); + ipVO = _ipAddressDao.findById(systemIp.getId()); + } + + // Validate ip address + if (ipVO == null) { + throw new InvalidParameterValueException("Unable to create load balance rule; can't find/allocate source IP", null); + } else if (ipVO.isOneToOneNat()) { + throw new NetworkRuleConflictException("Can't do load balance on ip address: " + ipVO.getAddress()); + } + + try { + if (ipVO.getAssociatedWithNetworkId() == null) { + boolean assignToVpcNtwk = network.getVpcId() != null + && ipVO.getVpcId() != null && ipVO.getVpcId().longValue() == network.getVpcId(); + if (assignToVpcNtwk) { + //set networkId just for verification purposes + _networkMgr.checkIpForService(ipVO, Service.Lb, lb.getNetworkId()); + + s_logger.debug("The ip is not associated with the VPC network id="+ lb.getNetworkId() + " so assigning"); + ipVO = _networkMgr.associateIPToGuestNetwork(ipAddrId, lb.getNetworkId(), false); + performedIpAssoc = true; + } + } else { + _networkMgr.checkIpForService(ipVO, Service.Lb, null); + } + + if (ipVO.getAssociatedWithNetworkId() == null) { + throw new InvalidParameterValueException("Ip address " + ipVO + " is not assigned to the network " + network); + } + + if (lb.getSourceIpAddressId() == null) { + throw new CloudRuntimeException("No ip address is defined to assign the LB to"); + } + result = createLoadBalancer(lb, openFirewall); + } catch (Exception ex) { + s_logger.warn("Failed to create load balancer due to ", ex); + if (ex instanceof NetworkRuleConflictException) { + throw (NetworkRuleConflictException) ex; + } + } finally { + if (result == null && systemIp != null) { + s_logger.debug("Releasing system IP address " + systemIp + " as corresponding lb rule failed to create"); + _networkMgr.handleSystemIpRelease(systemIp); + } + // release ip address if ipassoc was perfored + if (performedIpAssoc) { + ipVO = _ipAddressDao.findById(ipVO.getId()); + _networkMgr.unassignIPFromVpcNetwork(ipVO.getId(), lb.getNetworkId()); + + } + } + } + + if (result == null) { + throw new CloudRuntimeException("Failed to create load balancer rule: " + lb.getName()); + } + + return result; + } + + @Override + @DB + public LoadBalancer createLoadBalancer(CreateLoadBalancerRuleCmd lb, boolean openFirewall) throws NetworkRuleConflictException { + UserContext caller = UserContext.current(); + int srcPortStart = lb.getSourcePortStart(); + int defPortStart = lb.getDefaultPortStart(); + int srcPortEnd = lb.getSourcePortEnd(); + long sourceIpId = lb.getSourceIpAddressId(); + + IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId); + // make sure ip address exists + if (ipAddr == null || !ipAddr.readyToUse()) { + InvalidParameterValueException ex = new InvalidParameterValueException("Unable to create load balancer rule, invalid IP address id specified", null); + ex.addProxyObject(ipAddr, sourceIpId, "sourceIpId"); + throw ex; + } else if (ipAddr.isOneToOneNat()) { + InvalidParameterValueException ex = new InvalidParameterValueException("Unable to create load balancer rule; specified sourceip id has static nat enabled", null); + ex.addProxyObject(ipAddr, sourceIpId, "sourceIpId"); + throw ex; + } + + _firewallMgr.validateFirewallRule(caller.getCaller(), ipAddr, srcPortStart, srcPortEnd, lb.getProtocol(), + Purpose.LoadBalancing, FirewallRuleType.User); + + Long networkId = ipAddr.getAssociatedWithNetworkId(); + if (networkId == null) { + List idList = new ArrayList(); + idList.add(new IdentityProxy(ipAddr, sourceIpId, "sourceIpid")); + throw new InvalidParameterValueException("Unable to create load balancer rule ; specified sourceip id is not associated with any network", idList); + + } + NetworkVO network = _networkDao.findById(networkId); + + _accountMgr.checkAccess(caller.getCaller(), null, true, ipAddr); + + // verify that lb service is supported by the network + if (!_networkMgr.areServicesSupportedInNetwork(network.getId(), Service.Lb)) { + List idList = new ArrayList(); + idList.add(new IdentityProxy(network, networkId, "networkId")); + throw new InvalidParameterValueException("LB service is not supported in network with specified id", idList); + } + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + LoadBalancerVO newRule = new LoadBalancerVO(lb.getXid(), lb.getName(), lb.getDescription(), lb.getSourceIpAddressId(), lb.getSourcePortEnd(), lb.getDefaultPortStart(), + lb.getAlgorithm(), network.getId(), ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId()); + + newRule = _lbDao.persist(newRule); + + if (openFirewall) { + _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCaller(), lb.getSourcePortStart(), + lb.getSourcePortEnd(), lb.getProtocol(), null, null, newRule.getId(), networkId); + } + + boolean success = true; + + try { + _firewallMgr.detectRulesConflict(newRule); + if (!_firewallDao.setStateToAdd(newRule)) { + throw new CloudRuntimeException("Unable to update the state to add for " + newRule); + } + s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port " + srcPortStart + ", private port " + defPortStart + " is added successfully."); + UserContext.current().setEventDetails("Load balancer Id: " + newRule.getId()); + UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(), ipAddr.getDataCenterId(), newRule.getId(), null); + _usageEventDao.persist(usageEvent); + txn.commit(); + + return newRule; + } catch (Exception e) { + success = false; + if (e instanceof NetworkRuleConflictException) { + throw (NetworkRuleConflictException) e; + } + throw new CloudRuntimeException("Unable to add rule for ip address id=" + newRule.getSourceIpAddressId(), e); + } finally { + if (!success && newRule != null) { + + txn.start(); + _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false); + removeLBRule(newRule); + + txn.commit(); + } + } + } + + @Override + public boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException { + LoadBalancerVO lb = _lbDao.findById(lbRuleId); + List lbs; + if (isRollBackAllowedForProvider(lb)) { + // this is for Netscalar type of devices. if their is failure the db entries will be rollbacked. + lbs = Arrays.asList(lb); + } else { + // get all rules in transition state + lbs = _lbDao.listInTransitionStateByNetworkId(lb.getNetworkId()); + } + return applyLoadBalancerRules(lbs, true); + } + + @Override + public boolean applyLoadBalancersForNetwork(long networkId) throws ResourceUnavailableException { + List lbs = _lbDao.listByNetworkId(networkId); + if (lbs != null) { + return applyLoadBalancerRules(lbs, true); + } else { + s_logger.info("Network id=" + networkId + " doesn't have load balancer rules, nothing to apply"); + return true; + } + } + + @DB + protected boolean applyLoadBalancerRules(List lbs, boolean updateRulesInDB) throws ResourceUnavailableException { + Transaction txn = Transaction.currentTxn(); + List rules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = getExistingDestinations(lb.getId()); + List policyList = getStickinessPolicies(lb.getId()); + + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); + rules.add(loadBalancing); + } + + if (!_networkMgr.applyRules(rules, false)) { + s_logger.debug("LB rules are not completely applied"); + return false; + } + + if (updateRulesInDB) { + for (LoadBalancerVO lb : lbs) { + boolean checkForReleaseElasticIp = false; + txn.start(); + if (lb.getState() == FirewallRule.State.Revoke) { + removeLBRule(lb); + s_logger.debug("LB " + lb.getId() + " is successfully removed"); + checkForReleaseElasticIp = true; + } else if (lb.getState() == FirewallRule.State.Add) { + lb.setState(FirewallRule.State.Active); + s_logger.debug("LB rule " + lb.getId() + " state is set to Active"); + _lbDao.persist(lb); + } + + // remove LB-Vm mappings that were state to revoke + List lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true); + List instanceIds = new ArrayList(); + + for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { + instanceIds.add(lbVmMap.getInstanceId()); + } + + if (!instanceIds.isEmpty()) { + _lb2VmMapDao.remove(lb.getId(), instanceIds, null); + s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds); + } + + if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) { + lb.setState(FirewallRule.State.Add); + _lbDao.persist(lb); + s_logger.debug("LB rule " + lb.getId() + " state is set to Add as there are no more active LB-VM mappings"); + } + + // remove LB-Stickiness policy mapping that were state to revoke + List stickinesspolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(lb.getId(), true); + if (!stickinesspolicies.isEmpty()) { + _lb2stickinesspoliciesDao.remove(lb.getId(), true); + s_logger.debug("Load balancer rule id " + lb.getId() + " is removed stickiness policies"); + } + + txn.commit(); + + if (checkForReleaseElasticIp) { + boolean success = true; + long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId()); + if (count == 0) { + try { + success = handleSystemLBIpRelease(lb); + } catch (Exception ex) { + s_logger.warn("Failed to release system ip as a part of lb rule " + lb + " deletion due to exception ", ex); + success = false; + } finally { + if (!success) { + s_logger.warn("Failed to release system ip as a part of lb rule " + lb + " deletion"); + } + } + } + } + } + } + + return true; + } + + protected boolean handleSystemLBIpRelease(LoadBalancerVO lb) { + IpAddress ip = _ipAddressDao.findById(lb.getSourceIpAddressId()); + boolean success = true; + if (ip.getSystem()) { + s_logger.debug("Releasing system ip address " + lb.getSourceIpAddressId() + " as a part of delete lb rule"); + if (!_networkMgr.disassociatePublicIpAddress(lb.getSourceIpAddressId(), UserContext.current().getCallerUserId(), UserContext.current().getCaller())) { + s_logger.warn("Unable to release system ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); + success = false; + } else { + s_logger.warn("Successfully released system ip address id=" + lb.getSourceIpAddressId() + " as a part of delete lb rule"); + } + } + + return success; + } + + @Override + public boolean removeAllLoadBalanacersForIp(long ipId, Account caller, long callerUserId) { + List rules = _firewallDao.listByIpAndPurposeAndNotRevoked(ipId, Purpose.LoadBalancing); + if (rules != null) { + s_logger.debug("Found " + rules.size() + " lb rules to cleanup"); + } + for (FirewallRule rule : rules) { + boolean result = deleteLoadBalancerRule(rule.getId(), true, caller, callerUserId, false); + if (result == false) { + s_logger.warn("Unable to remove load balancer rule " + rule.getId()); + return false; + } + } + return true; + } + + @Override + public boolean removeAllLoadBalanacersForNetwork(long networkId, Account caller, long callerUserId) { + List rules = _firewallDao.listByNetworkAndPurposeAndNotRevoked(networkId, Purpose.LoadBalancing); + if (rules != null) { + s_logger.debug("Found " + rules.size() + " lb rules to cleanup"); + } + for (FirewallRule rule : rules) { + boolean result = deleteLoadBalancerRule(rule.getId(), true, caller, callerUserId, false); + if (result == false) { + s_logger.warn("Unable to remove load balancer rule " + rule.getId()); + return false; + } + } + return true; + } + + @Override + public List getStickinessPolicies(long lbId) { + List stickinessPolicies = new ArrayList(); + List sDbpolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(lbId); + + for (LBStickinessPolicyVO sDbPolicy : sDbpolicies) { + LbStickinessPolicy sPolicy = new LbStickinessPolicy(sDbPolicy.getMethodName(), sDbPolicy.getParams(), sDbPolicy.isRevoke()); + stickinessPolicies.add(sPolicy); + } + return stickinessPolicies; + } + + @Override + public List getExistingDestinations(long lbId) { + List dstList = new ArrayList(); + List lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lbId); + LoadBalancerVO lb = _lbDao.findById(lbId); + + String dstIp = null; + for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { + UserVm vm = _vmDao.findById(lbVmMap.getInstanceId()); + Nic nic = _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(lb.getNetworkId(), vm.getId()); + dstIp = nic.getIp4Address(); + LbDestination lbDst = new LbDestination(lb.getDefaultPortStart(), lb.getDefaultPortEnd(), dstIp, lbVmMap.isRevoke()); + dstList.add(lbDst); + } + return dstList; + } + + public List getExistingPolicyConditions(long policyId) { + List conditionList = new ArrayList(); + return conditionList; + // List lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lbId); + // LoadBalancerVO lb = _lbDao.findById(lbId); + // + // String dstIp = null; + // for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { + // UserVm vm = _vmDao.findById(lbVmMap.getInstanceId()); + // Nic nic = _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(lb.getNetworkId(), vm.getId()); + // dstIp = nic.getIp4Address(); + // LbDestination lbDst = new LbDestination(lb.getDefaultPortStart(), lb.getDefaultPortEnd(), dstIp, + // lbVmMap.isRevoke()); + // dstList.add(lbDst); + // } + // return dstList; + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _name = name; + return true; + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public String getName() { + return _name; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_LOAD_BALANCER_UPDATE, eventDescription = "updating load balancer", async = true) + public LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd) { + Account caller = UserContext.current().getCaller(); + Long lbRuleId = cmd.getId(); + String name = cmd.getLoadBalancerName(); + String description = cmd.getDescription(); + String algorithm = cmd.getAlgorithm(); + LoadBalancerVO lb = _lbDao.findById(lbRuleId); + LoadBalancerVO lbBackup = _lbDao.findById(lbRuleId); + + if (lb == null) { + throw new InvalidParameterValueException("Unable to find lb rule by id", null); + } + + // check permissions + _accountMgr.checkAccess(caller, null, true, lb); + + if (name != null) { + lb.setName(name); + } + + if (description != null) { + lb.setDescription(description); + } + + if (algorithm != null) { + lb.setAlgorithm(algorithm); + } + + boolean success = _lbDao.update(lbRuleId, lb); + + // If algorithm is changed, have to reapply the lb config + if (algorithm != null) { + try { + lb.setState(FirewallRule.State.Add); + _lbDao.persist(lb); + applyLoadBalancerConfig(lbRuleId); + } catch (ResourceUnavailableException e) { + if (isRollBackAllowedForProvider(lb)) { + /* + * NOTE : We use lb object to update db instead of lbBackup object since db layer will fail to + * update if there is no change in the object. + */ + if (lbBackup.getName() != null) { + lb.setName(lbBackup.getName()); + } + if (lbBackup.getDescription() != null) { + lb.setDescription(lbBackup.getDescription()); + } + if (lbBackup.getAlgorithm() != null){ + lb.setAlgorithm(lbBackup.getAlgorithm()); + } + lb.setState(lbBackup.getState()); + _lbDao.update(lb.getId(), lb); + _lbDao.persist(lb); + + s_logger.debug("LB Rollback rule id: " + lbRuleId + " while updating LB rule."); + } + s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e); + success = false; + } + } + + if (!success) { + throw new CloudRuntimeException("Failed to update load balancer rule: " + lbRuleId); + } + + return lb; + } + + @Override + public List listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd) throws PermissionDeniedException { + Account caller = UserContext.current().getCaller(); + Long loadBalancerId = cmd.getId(); + Boolean applied = cmd.isApplied(); + + if (applied == null) { + applied = Boolean.TRUE; + } + + LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); + if (loadBalancer == null) { + return null; + } + + _accountMgr.checkAccess(caller, null, true, loadBalancer); + + List loadBalancerInstances = new ArrayList(); + List vmLoadBalancerMappings = null; + + vmLoadBalancerMappings = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); + + List appliedInstanceIdList = new ArrayList(); + if ((vmLoadBalancerMappings != null) && !vmLoadBalancerMappings.isEmpty()) { + for (LoadBalancerVMMapVO vmLoadBalancerMapping : vmLoadBalancerMappings) { + appliedInstanceIdList.add(vmLoadBalancerMapping.getInstanceId()); + } + } + + IPAddressVO addr = _ipAddressDao.findById(loadBalancer.getSourceIpAddressId()); + List userVms = _vmDao.listVirtualNetworkInstancesByAcctAndZone(loadBalancer.getAccountId(), addr.getDataCenterId(), loadBalancer.getNetworkId()); + + for (UserVmVO userVm : userVms) { + // if the VM is destroyed, being expunged, in an error state, or in an unknown state, skip it + switch (userVm.getState()) { + case Destroyed: + case Expunging: + case Error: + case Unknown: + continue; + } + + boolean isApplied = appliedInstanceIdList.contains(userVm.getId()); + if ((isApplied && applied) || (!isApplied && !applied)) { + loadBalancerInstances.add(userVm); + } + } + + return loadBalancerInstances; + } + + public List getSupportedAutoScaleCounters(long networkid) + { + String capability = getLBCapability(networkid, Capability.AutoScaleCounters.getName()); + if (capability == null || capability.length() == 0) { + return null; + } + return Arrays.asList(capability.split(",")); + } + + @Override + public List getStickinessMethods(long networkid) + { + String capability = getLBCapability(networkid, Capability.SupportedStickinessMethods.getName()); + if (capability == null) { + return null; + } + Gson gson = new Gson(); + java.lang.reflect.Type listType = new TypeToken>() { + }.getType(); + List result = gson.fromJson(capability, listType); + return result; + } + + @Override + public List searchForLBStickinessPolicies(ListLBStickinessPoliciesCmd cmd) throws PermissionDeniedException { + Account caller = UserContext.current().getCaller(); + Long loadBalancerId = cmd.getLbRuleId(); + LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId); + if (loadBalancer == null) { + return null; + } + + _accountMgr.checkAccess(caller, null, true, loadBalancer); + + List sDbpolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(cmd.getLbRuleId()); + + return sDbpolicies; + } + + @Override + public List searchForLoadBalancers(ListLoadBalancerRulesCmd cmd) { + Long ipId = cmd.getPublicIpId(); + Long zoneId = cmd.getZoneId(); + Long id = cmd.getId(); + String name = cmd.getLoadBalancerRuleName(); + String keyword = cmd.getKeyword(); + Long instanceId = cmd.getVirtualMachineId(); + Map tags = cmd.getTags(); + + Account caller = UserContext.current().getCaller(); + List permittedAccounts = new ArrayList(); + + Ternary domainIdRecursiveListProject = new Ternary(cmd.getDomainId(), cmd.isRecursive(), null); + _accountMgr.buildACLSearchParameters(caller, id, cmd.getAccountName(), cmd.getProjectId(), permittedAccounts, domainIdRecursiveListProject, cmd.listAll(), false); + Long domainId = domainIdRecursiveListProject.first(); + Boolean isRecursive = domainIdRecursiveListProject.second(); + ListProjectResourcesCriteria listProjectResourcesCriteria = domainIdRecursiveListProject.third(); + + Filter searchFilter = new Filter(LoadBalancerVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + SearchBuilder sb = _lbDao.createSearchBuilder(); + _accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); + sb.and("sourceIpAddress", sb.entity().getSourceIpAddressId(), SearchCriteria.Op.EQ); + + if (instanceId != null) { + SearchBuilder lbVMSearch = _lb2VmMapDao.createSearchBuilder(); + lbVMSearch.and("instanceId", lbVMSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); + sb.join("lbVMSearch", lbVMSearch, sb.entity().getId(), lbVMSearch.entity().getLoadBalancerId(), JoinBuilder.JoinType.INNER); + } + + if (zoneId != null) { + SearchBuilder ipSearch = _ipAddressDao.createSearchBuilder(); + ipSearch.and("zoneId", ipSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + sb.join("ipSearch", ipSearch, sb.entity().getSourceIpAddressId(), ipSearch.entity().getId(), JoinBuilder.JoinType.INNER); + } + + if (tags != null && !tags.isEmpty()) { + SearchBuilder tagSearch = _resourceTagDao.createSearchBuilder(); + for (int count=0; count < tags.size(); count++) { + tagSearch.or().op("key" + String.valueOf(count), tagSearch.entity().getKey(), SearchCriteria.Op.EQ); + tagSearch.and("value" + String.valueOf(count), tagSearch.entity().getValue(), SearchCriteria.Op.EQ); + tagSearch.cp(); + } + tagSearch.and("resourceType", tagSearch.entity().getResourceType(), SearchCriteria.Op.EQ); + sb.groupBy(sb.entity().getId()); + sb.join("tagSearch", tagSearch, sb.entity().getId(), tagSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); + } + + SearchCriteria sc = sb.create(); + _accountMgr.buildACLSearchCriteria(sc, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria); + + if (keyword != null) { + SearchCriteria ssc = _lbDao.createSearchCriteria(); + ssc.addOr("name", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + ssc.addOr("description", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + sc.addAnd("name", SearchCriteria.Op.SC, ssc); + } + + if (name != null) { + sc.setParameters("name", "%" + name + "%"); + } + + if (id != null) { + sc.setParameters("id", id); + } + + if (ipId != null) { + sc.setParameters("sourceIpAddress", ipId); + } + + if (instanceId != null) { + sc.setJoinParameters("lbVMSearch", "instanceId", instanceId); + } + + if (zoneId != null) { + sc.setJoinParameters("ipSearch", "zoneId", zoneId); + } + + if (tags != null && !tags.isEmpty()) { + int count = 0; + sc.setJoinParameters("tagSearch", "resourceType", TaggedResourceType.LoadBalancer.toString()); + for (String key : tags.keySet()) { + sc.setJoinParameters("tagSearch", "key" + String.valueOf(count), key); + sc.setJoinParameters("tagSearch", "value" + String.valueOf(count), tags.get(key)); + count++; + } + } + + return _lbDao.search(sc, searchFilter); + } + + @Override + public List listByNetworkId(long networkId) { + List lbs = _lbDao.listByNetworkId(networkId); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = getExistingDestinations(lb.getId()); + List policyList = this.getStickinessPolicies(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); + lbRules.add(loadBalancing); + } + return lbRules; + } + + @Override + public LoadBalancerVO findById(long lbId) { + return _lbDao.findById(lbId); + } + + protected void removeLBRule(LoadBalancerVO rule) { + + //remove the rule + _lbDao.remove(rule.getId()); + + //if the rule is the last one for the ip address assigned to VPC, unassign it from the network + IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId()); + _networkMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId()); + + } +} diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 1d82ba4913a..4840cc65b44 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1,3298 +1,3298 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.network.router; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TimeZone; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.AgentManager.OnError; -import com.cloud.agent.Listener; -import com.cloud.agent.api.AgentControlAnswer; -import com.cloud.agent.api.AgentControlCommand; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.BumpUpPriorityCommand; -import com.cloud.agent.api.CheckRouterAnswer; -import com.cloud.agent.api.CheckRouterCommand; -import com.cloud.agent.api.Command; -import com.cloud.agent.api.GetDomRVersionAnswer; -import com.cloud.agent.api.GetDomRVersionCmd; -import com.cloud.agent.api.ModifySshKeysCommand; -import com.cloud.agent.api.NetworkUsageAnswer; -import com.cloud.agent.api.NetworkUsageCommand; -import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.api.StopAnswer; -import com.cloud.agent.api.check.CheckSshAnswer; -import com.cloud.agent.api.check.CheckSshCommand; -import com.cloud.agent.api.routing.DhcpEntryCommand; -import com.cloud.agent.api.routing.IpAssocCommand; -import com.cloud.agent.api.routing.LoadBalancerConfigCommand; -import com.cloud.agent.api.routing.NetworkElementCommand; -import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand; -import com.cloud.agent.api.routing.SavePasswordCommand; -import com.cloud.agent.api.routing.SetFirewallRulesCommand; -import com.cloud.agent.api.routing.SetPortForwardingRulesCommand; -import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand; -import com.cloud.agent.api.routing.SetStaticNatRulesCommand; -import com.cloud.agent.api.routing.VmDataCommand; -import com.cloud.agent.api.routing.VpnUsersCfgCommand; -import com.cloud.agent.api.to.FirewallRuleTO; -import com.cloud.agent.api.to.IpAddressTO; -import com.cloud.agent.api.to.LoadBalancerTO; -import com.cloud.agent.api.to.NicTO; -import com.cloud.agent.api.to.PortForwardingRuleTO; -import com.cloud.agent.api.to.StaticNatRuleTO; -import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.agent.manager.Commands; -import com.cloud.alert.AlertManager; -import com.cloud.api.commands.UpgradeRouterCmd; -import com.cloud.cluster.ManagementServerHostVO; -import com.cloud.cluster.ManagementServerNode; -import com.cloud.cluster.dao.ManagementServerHostDao; -import com.cloud.configuration.Config; -import com.cloud.configuration.ConfigurationManager; -import com.cloud.configuration.ZoneConfig; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.ClusterVO; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenter.NetworkType; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; -import com.cloud.dc.Pod; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.dc.dao.VlanDao; -import com.cloud.deploy.DataCenterDeployment; -import com.cloud.deploy.DeployDestination; -import com.cloud.deploy.DeploymentPlan; -import com.cloud.deploy.DeploymentPlanner.ExcludeList; -import com.cloud.event.ActionEvent; -import com.cloud.event.EventTypes; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.ConnectionException; -import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientServerCapacityException; -import com.cloud.exception.InsufficientVirtualNetworkCapcityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.StorageUnavailableException; -import com.cloud.host.HostVO; -import com.cloud.host.Status; -import com.cloud.host.dao.HostDao; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.IPAddressVO; -import com.cloud.network.IpAddress; -import com.cloud.network.LoadBalancerVO; -import com.cloud.network.Network; -import com.cloud.network.Network.GuestType; -import com.cloud.network.Network.Provider; -import com.cloud.network.Network.Service; -import com.cloud.network.NetworkManager; -import com.cloud.network.NetworkVO; -import com.cloud.network.Networks.BroadcastDomainType; -import com.cloud.network.Networks.IsolationType; -import com.cloud.network.Networks.TrafficType; -import com.cloud.network.PhysicalNetworkServiceProvider; -import com.cloud.network.PublicIpAddress; -import com.cloud.network.RemoteAccessVpn; -import com.cloud.network.SshKeysDistriMonitor; -import com.cloud.network.VirtualNetworkApplianceService; -import com.cloud.network.VirtualRouterProvider; -import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType; -import com.cloud.network.VpnUser; -import com.cloud.network.VpnUserVO; -import com.cloud.network.addr.PublicIp; -import com.cloud.network.dao.FirewallRulesDao; -import com.cloud.network.dao.IPAddressDao; -import com.cloud.network.dao.LoadBalancerDao; -import com.cloud.network.dao.LoadBalancerVMMapDao; -import com.cloud.network.dao.NetworkDao; -import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; -import com.cloud.network.dao.RemoteAccessVpnDao; -import com.cloud.network.dao.Site2SiteCustomerGatewayDao; -import com.cloud.network.dao.Site2SiteVpnConnectionDao; -import com.cloud.network.dao.Site2SiteVpnGatewayDao; -import com.cloud.network.dao.VirtualRouterProviderDao; -import com.cloud.network.dao.VpnUserDao; -import com.cloud.network.lb.LoadBalancingRule; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; -import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; -import com.cloud.network.lb.LoadBalancingRulesManager; -import com.cloud.network.router.VirtualRouter.RedundantState; -import com.cloud.network.router.VirtualRouter.Role; -import com.cloud.network.rules.FirewallRule; -import com.cloud.network.rules.FirewallRule.Purpose; -import com.cloud.network.rules.PortForwardingRule; -import com.cloud.network.rules.RulesManager; -import com.cloud.network.rules.StaticNat; -import com.cloud.network.rules.StaticNatImpl; -import com.cloud.network.rules.StaticNatRule; -import com.cloud.network.rules.dao.PortForwardingRulesDao; -import com.cloud.offering.ServiceOffering; -import com.cloud.offerings.NetworkOfferingVO; -import com.cloud.offerings.dao.NetworkOfferingDao; -import com.cloud.resource.ResourceManager; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.GuestOSVO; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Volume.Type; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.GuestOSDao; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VolumeDao; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.User; -import com.cloud.user.UserContext; -import com.cloud.user.UserStatisticsVO; -import com.cloud.user.UserStatsLogVO; -import com.cloud.user.UserVO; -import com.cloud.user.dao.UserDao; -import com.cloud.user.dao.UserStatisticsDao; -import com.cloud.user.dao.UserStatsLogDao; -import com.cloud.uservm.UserVm; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; -import com.cloud.utils.PasswordGenerator; -import com.cloud.utils.StringUtils; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.component.Inject; -import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.Filter; -import com.cloud.utils.db.GlobalLock; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.MacAddress; -import com.cloud.utils.net.NetUtils; -import com.cloud.vm.DomainRouterVO; -import com.cloud.vm.Nic; -import com.cloud.vm.NicProfile; -import com.cloud.vm.NicVO; -import com.cloud.vm.ReservationContext; -import com.cloud.vm.ReservationContextImpl; -import com.cloud.vm.UserVmVO; -import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.VirtualMachineGuru; -import com.cloud.vm.VirtualMachineManager; -import com.cloud.vm.VirtualMachineName; -import com.cloud.vm.VirtualMachineProfile; -import com.cloud.vm.VirtualMachineProfile.Param; -import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.NicDao; -import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.UserVmDetailsDao; - -/** - * VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances available in the Cloud Stack. - */ -@Local(value = { VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class }) -public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService, - VirtualMachineGuru, Listener { - private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class); - - String _name; - @Inject - DataCenterDao _dcDao = null; - @Inject - VlanDao _vlanDao = null; - @Inject - FirewallRulesDao _rulesDao = null; - @Inject - LoadBalancerDao _loadBalancerDao = null; - @Inject - LoadBalancerVMMapDao _loadBalancerVMMapDao = null; - @Inject - IPAddressDao _ipAddressDao = null; - @Inject - VMTemplateDao _templateDao = null; - @Inject - DomainRouterDao _routerDao = null; - @Inject - UserDao _userDao = null; - @Inject - UserStatisticsDao _userStatsDao = null; - @Inject - HostDao _hostDao = null; - @Inject - ConfigurationDao _configDao; - @Inject - HostPodDao _podDao = null; - @Inject - UserStatsLogDao _userStatsLogDao = null; - @Inject - AgentManager _agentMgr; - @Inject - AlertManager _alertMgr; - @Inject - AccountManager _accountMgr; - @Inject - ConfigurationManager _configMgr; - @Inject - ServiceOfferingDao _serviceOfferingDao = null; - @Inject - UserVmDao _userVmDao; - @Inject - UserStatisticsDao _statsDao = null; - @Inject - NetworkOfferingDao _networkOfferingDao = null; - @Inject - GuestOSDao _guestOSDao = null; - @Inject - NetworkManager _networkMgr; - @Inject - VirtualMachineManager _itMgr; - @Inject - VpnUserDao _vpnUsersDao; - @Inject - RemoteAccessVpnDao _remoteAccessVpnDao; - @Inject - RulesManager _rulesMgr; - @Inject - NetworkDao _networkDao; - @Inject - LoadBalancingRulesManager _lbMgr; - @Inject - PortForwardingRulesDao _pfRulesDao; - @Inject - RemoteAccessVpnDao _vpnDao; - @Inject - NicDao _nicDao; - @Inject - VolumeDao _volumeDao = null; - @Inject - UserVmDetailsDao _vmDetailsDao; - @Inject - ClusterDao _clusterDao; - @Inject - ResourceManager _resourceMgr; - @Inject - PhysicalNetworkServiceProviderDao _physicalProviderDao; - @Inject - VirtualRouterProviderDao _vrProviderDao; - @Inject - ManagementServerHostDao _msHostDao; - @Inject - Site2SiteCustomerGatewayDao _s2sCustomerGatewayDao; - @Inject - Site2SiteVpnGatewayDao _s2sVpnGatewayDao; - @Inject - Site2SiteVpnConnectionDao _s2sVpnConnectionDao; - - int _routerRamSize; - int _routerCpuMHz; - int _retry = 2; - String _instance; - String _mgmt_host; - String _mgmt_cidr; - - int _routerStatsInterval = 300; - int _routerCheckInterval = 30; - protected ServiceOfferingVO _offering; - private String _dnsBasicZoneUpdates = "all"; - - private boolean _disable_rp_filter = false; - int _routerExtraPublicNics = 2; - private int _usageAggregationRange = 1440; - private String _usageTimeZone = "GMT"; - private final long mgmtSrvrId = MacAddress.getMacAddress().toLong(); - private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds - - ScheduledExecutorService _executor; - ScheduledExecutorService _checkExecutor; - ScheduledExecutorService _networkStatsUpdateExecutor; - - Account _systemAcct; - - @Override - public boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey) { - ModifySshKeysCommand cmd = new ModifySshKeysCommand(pubKey, prvKey); - final Answer answer = _agentMgr.easySend(hostId, cmd); - - if (answer != null) { - return true; - } else { - return false; - } - } - - @Override - public VirtualRouter destroyRouter(final long routerId) throws ResourceUnavailableException, ConcurrentOperationException { - UserContext context = UserContext.current(); - User user = _accountMgr.getActiveUser(context.getCallerUserId()); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Attempting to destroy router " + routerId); - } - - DomainRouterVO router = _routerDao.findById(routerId); - if (router == null) { - return null; - } - - _accountMgr.checkAccess(context.getCaller(), null, true, router); - - boolean result = _itMgr.expunge(router, user, _accountMgr.getAccount(router.getAccountId())); - - if (result) { - return router; - } - return null; - } - - @Override - @DB - public VirtualRouter upgradeRouter(UpgradeRouterCmd cmd) { - Long routerId = cmd.getId(); - Long serviceOfferingId = cmd.getServiceOfferingId(); - Account caller = UserContext.current().getCaller(); - - DomainRouterVO router = _routerDao.findById(routerId); - if (router == null) { - throw new InvalidParameterValueException("Unable to find router with id " + routerId); - } - - _accountMgr.checkAccess(caller, null, true, router); - - if (router.getServiceOfferingId() == serviceOfferingId) { - s_logger.debug("Router: " + routerId + "already has service offering: " + serviceOfferingId); - return _routerDao.findById(routerId); - } - - ServiceOffering newServiceOffering = _configMgr.getServiceOffering(serviceOfferingId); - if (newServiceOffering == null) { - throw new InvalidParameterValueException("Unable to find service offering with id " + serviceOfferingId); - } - - // check if it is a system service offering, if yes return with error as it cannot be used for user vms - if (!newServiceOffering.getSystemUse()) { - throw new InvalidParameterValueException("Cannot upgrade router vm to a non system service offering " + serviceOfferingId); - } - - // Check that the router is stopped - if (!router.getState().equals(State.Stopped)) { - s_logger.warn("Unable to upgrade router " + router.toString() + " in state " + router.getState()); - throw new InvalidParameterValueException("Unable to upgrade router " + router.toString() + " in state " + router.getState() - + "; make sure the router is stopped and not in an error state before upgrading."); - } - - ServiceOfferingVO currentServiceOffering = _serviceOfferingDao.findById(router.getServiceOfferingId()); - - // Check that the service offering being upgraded to has the same storage pool preference as the VM's current service - // offering - if (currentServiceOffering.getUseLocalStorage() != newServiceOffering.getUseLocalStorage()) { - throw new InvalidParameterValueException("Can't upgrade, due to new local storage status : " + - newServiceOffering.getUseLocalStorage() + " is different from " - + "curruent local storage status: " + currentServiceOffering.getUseLocalStorage()); - } - - router.setServiceOfferingId(serviceOfferingId); - if (_routerDao.update(routerId, router)) { - return _routerDao.findById(routerId); - } else { - throw new CloudRuntimeException("Unable to upgrade router " + routerId); - } - - } - - @Override - public boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List routers) throws ResourceUnavailableException { - if (routers == null || routers.isEmpty()) { - s_logger.warn("Unable save password, router doesn't exist in network " + network.getId()); - throw new CloudRuntimeException("Unable to save password to router"); - } - - UserVm userVm = profile.getVirtualMachine(); - String password = (String) profile.getParameter(Param.VmPassword); - String encodedPassword = PasswordGenerator.rot13(password); - DataCenter dc = _dcDao.findById(userVm.getDataCenterIdToDeployIn()); - - boolean result = true; - for (VirtualRouter router : routers) { - boolean sendPassword = true; - if (dc.getNetworkType() == NetworkType.Basic && userVm.getPodIdToDeployIn().longValue() != router.getPodIdToDeployIn().longValue()) { - sendPassword = false; - } - - if (sendPassword) { - Commands cmds = new Commands(OnError.Continue); - SavePasswordCommand cmd = new SavePasswordCommand(encodedPassword, nic.getIp4Address(), userVm.getHostName()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - cmds.addCommand("password", cmd); - - result = result && sendCommandsToRouter(router, cmds); - } - } - return result; - } - - @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_STOP, eventDescription = "stopping router Vm", async = true) - public VirtualRouter stopRouter(long routerId, boolean forced) throws ResourceUnavailableException, ConcurrentOperationException { - UserContext context = UserContext.current(); - Account account = context.getCaller(); - - // verify parameters - DomainRouterVO router = _routerDao.findById(routerId); - if (router == null) { - throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); - } - - _accountMgr.checkAccess(account, null, true, router); - - UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); - - VirtualRouter virtualRouter = stop(router, forced, user, account); - if(virtualRouter == null){ - throw new CloudRuntimeException("Failed to stop router with id " + routerId); - } - return virtualRouter; - } - - @DB - public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) { - final Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); - for (Long guestNtwkId : routerGuestNtwkIds) { - final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterIdToDeployIn(), - guestNtwkId, null, router.getId(), router.getType().toString()); - if (userStats != null) { - final long currentBytesRcvd = userStats.getCurrentBytesReceived(); - userStats.setCurrentBytesReceived(0); - userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd); - - final long currentBytesSent = userStats.getCurrentBytesSent(); - userStats.setCurrentBytesSent(0); - userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent); - _userStatsDao.update(userStats.getId(), userStats); - s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop"); - } else { - s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterIdToDeployIn()); - } - } - - txn.commit(); - } catch (final Exception e) { - txn.rollback(); - throw new CloudRuntimeException("Problem updating stats after reboot/stop ", e); - } - } - - @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_REBOOT, eventDescription = "rebooting router Vm", async = true) - public VirtualRouter rebootRouter(long routerId, boolean reprogramNetwork) throws ConcurrentOperationException, - ResourceUnavailableException, InsufficientCapacityException { - Account caller = UserContext.current().getCaller(); - - // verify parameters - DomainRouterVO router = _routerDao.findById(routerId); - if (router == null) { - throw new InvalidParameterValueException("Unable to find domain router with id " + routerId + "."); - } - - _accountMgr.checkAccess(caller, null, true, router); - - // Can reboot domain router only in Running state - if (router == null || router.getState() != State.Running) { - s_logger.warn("Unable to reboot, virtual router is not in the right state " + router.getState()); - throw new ResourceUnavailableException("Unable to reboot domR, it is not in right state " + router.getState(), - DataCenter.class, router.getDataCenterIdToDeployIn()); - } - - UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); - s_logger.debug("Stopping and starting router " + router + " as a part of router reboot"); - - if (stop(router, false, user, caller) != null) { - return startRouter(routerId, reprogramNetwork); - } else { - throw new CloudRuntimeException("Failed to reboot router " + router); - } - } - - @Override - public boolean configure(final String name, final Map params) throws ConfigurationException { - _name = name; - - _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor")); - _checkExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterStatusMonitor")); - _networkStatsUpdateExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NetworkStatsUpdater")); - - final ComponentLocator locator = ComponentLocator.getCurrentLocator(); - - final Map configs = _configDao.getConfiguration("AgentManager", params); - - _mgmt_host = configs.get("host"); - _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE); - _routerCpuMHz = NumbersUtil.parseInt(configs.get("router.cpu.mhz"), DEFAULT_ROUTER_CPU_MHZ); - - _routerExtraPublicNics = NumbersUtil.parseInt(_configDao.getValue(Config.RouterExtraPublicNics.key()), 2); - - String value = configs.get("start.retry"); - _retry = NumbersUtil.parseInt(value, 2); - - value = configs.get("router.stats.interval"); - _routerStatsInterval = NumbersUtil.parseInt(value, 300); - - value = configs.get("router.check.interval"); - _routerCheckInterval = NumbersUtil.parseInt(value, 30); - - _instance = configs.get("instance.name"); - if (_instance == null) { - _instance = "DEFAULT"; - } - - String rpValue = configs.get("network.disable.rpfilter"); - if (rpValue != null && rpValue.equalsIgnoreCase("true")) { - _disable_rp_filter = true; - } - - _dnsBasicZoneUpdates = String.valueOf(_configDao.getValue(Config.DnsBasicZoneUpdates.key())); - - s_logger.info("Router configurations: " + "ramsize=" + _routerRamSize); - - final UserStatisticsDao statsDao = locator.getDao(UserStatisticsDao.class); - if (statsDao == null) { - throw new ConfigurationException("Unable to get " + UserStatisticsDao.class.getName()); - } - - _agentMgr.registerForHostEvents(new SshKeysDistriMonitor(_agentMgr, _hostDao, _configDao), true, false, false); - _itMgr.registerGuru(VirtualMachine.Type.DomainRouter, this); - - boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); - _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, _routerCpuMHz, null, - null, true, null, useLocalStorage, true, null, true, VirtualMachine.Type.DomainRouter, true); - _offering.setUniqueName(ServiceOffering.routerDefaultOffUniqueName); - _offering = _serviceOfferingDao.persistSystemServiceOffering(_offering); - - // this can sometimes happen, if DB is manually or programmatically manipulated - if(_offering == null) { - String msg = "Data integrity problem : System Offering For Software router VM has been removed?"; - s_logger.error(msg); - throw new ConfigurationException(msg); - } - - _systemAcct = _accountMgr.getSystemAccount(); - - String aggregationRange = configs.get("usage.stats.job.aggregation.range"); - _usageAggregationRange = NumbersUtil.parseInt(aggregationRange, 1440); - _usageTimeZone = configs.get("usage.aggregation.timezone"); - if(_usageTimeZone == null){ - _usageTimeZone = "GMT"; - } - - _agentMgr.registerForHostEvents(this, true, false, false); - - s_logger.info("DomainRouterManager is configured."); - - return true; - } - - @Override - public String getName() { - return _name; - } - - @Override - public boolean start() { - if (_routerStatsInterval > 0){ - _executor.scheduleAtFixedRate(new NetworkUsageTask(), _routerStatsInterval, _routerStatsInterval, TimeUnit.SECONDS); - }else{ - s_logger.debug("router.stats.interval - " + _routerStatsInterval+ " so not scheduling the router stats thread"); - } - - //Schedule Network stats update task - TimeZone usageTimezone = TimeZone.getTimeZone(_usageTimeZone); - Calendar cal = Calendar.getInstance(usageTimezone); - cal.setTime(new Date()); - long endDate = 0; - int HOURLY_TIME = 60; - final int DAILY_TIME = 60 * 24; - if (_usageAggregationRange == DAILY_TIME) { - cal.roll(Calendar.DAY_OF_YEAR, false); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - cal.roll(Calendar.DAY_OF_YEAR, true); - cal.add(Calendar.MILLISECOND, -1); - endDate = cal.getTime().getTime(); - } else if (_usageAggregationRange == HOURLY_TIME) { - cal.roll(Calendar.HOUR_OF_DAY, false); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - cal.roll(Calendar.HOUR_OF_DAY, true); - cal.add(Calendar.MILLISECOND, -1); - endDate = cal.getTime().getTime(); - } else { - endDate = cal.getTime().getTime(); - } - - _networkStatsUpdateExecutor.scheduleAtFixedRate(new NetworkStatsUpdateTask(), (endDate - System.currentTimeMillis()), - (_usageAggregationRange * 60 * 1000), TimeUnit.MILLISECONDS); - - if (_routerCheckInterval > 0) { - _checkExecutor.scheduleAtFixedRate(new CheckRouterTask(), _routerCheckInterval, _routerCheckInterval, TimeUnit.SECONDS); - } else { - s_logger.debug("router.check.interval - " + _routerCheckInterval+ " so not scheduling the redundant router checking thread"); - } - - return true; - } - - @Override - public boolean stop() { - return true; - } - - protected VirtualNetworkApplianceManagerImpl() { - } - - @Override - public Long convertToId(final String vmName) { - if (!VirtualMachineName.isValidRouterName(vmName, _instance)) { - return null; - } - - return VirtualMachineName.getRouterId(vmName); - } - - private VmDataCommand generateVmDataCommand(VirtualRouter router, String vmPrivateIpAddress, String userData, - String serviceOffering, String zoneName, String guestIpAddress, String vmName, - String vmInstanceName, long vmId, String publicKey, long guestNetworkId) { - VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName); - - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmd.addVmData("userdata", "user-data", userData); - cmd.addVmData("metadata", "service-offering", StringUtils.unicodeEscape(serviceOffering)); - cmd.addVmData("metadata", "availability-zone", StringUtils.unicodeEscape(zoneName)); - cmd.addVmData("metadata", "local-ipv4", guestIpAddress); - cmd.addVmData("metadata", "local-hostname", StringUtils.unicodeEscape(vmName)); - if (dcVo.getNetworkType() == NetworkType.Basic) { - cmd.addVmData("metadata", "public-ipv4", guestIpAddress); - cmd.addVmData("metadata", "public-hostname", StringUtils.unicodeEscape(vmName)); - } else - { - if (router.getPublicIpAddress() == null) { - cmd.addVmData("metadata", "public-ipv4", guestIpAddress); - } else { - cmd.addVmData("metadata", "public-ipv4", router.getPublicIpAddress()); - } - cmd.addVmData("metadata", "public-hostname", router.getPublicIpAddress()); - } - cmd.addVmData("metadata", "instance-id", vmInstanceName); - cmd.addVmData("metadata", "vm-id", String.valueOf(vmId)); - cmd.addVmData("metadata", "public-keys", publicKey); - - String cloudIdentifier = _configDao.getValue("cloud.identifier"); - if (cloudIdentifier == null) { - cloudIdentifier = ""; - } else { - cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}"; - } - cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier); - - return cmd; - } - - protected class NetworkUsageTask implements Runnable { - - public NetworkUsageTask() { - } - - @Override - public void run() { - try{ - final List routers = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId); - s_logger.debug("Found " + routers.size() + " running routers. "); - - for (DomainRouterVO router : routers) { - String privateIP = router.getPrivateIpAddress(); - - if (privateIP != null) { - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); - - for (Long guestNtwkId : routerGuestNtwkIds) { - boolean forVpc = router.getVpcId() != null; - Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); - Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); - NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), - guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), - _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), - _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); - final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), - forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); - UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - NetworkUsageAnswer answer = null; - try { - answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); - } catch (Exception e) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); - continue; - } - - if (answer != null) { - if (!answer.getResult()) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); - continue; - } - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { - s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); - continue; - } - txn.start(); - UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - if (stats == null) { - s_logger.warn("unable to find stats for account: " + router.getAccountId()); - continue; - } - - if(previousStats != null - && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) - || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ - s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + - "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + - answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); - continue; - } - - if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesReceived() - + " Stored: " + stats.getCurrentBytesReceived()); - } - stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); - } - stats.setCurrentBytesReceived(answer.getBytesReceived()); - if (stats.getCurrentBytesSent() > answer.getBytesSent()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesSent() - + " Stored: " + stats.getCurrentBytesSent()); - } - stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); - } - stats.setCurrentBytesSent(answer.getBytesSent()); - _statsDao.update(stats.getId(), stats); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() - + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); - } finally { - txn.close(); - } - } - } - } - } - } catch (Exception e) { - s_logger.warn("Error while collecting network stats", e); - } - } - } - - protected class NetworkStatsUpdateTask implements Runnable { - - public NetworkStatsUpdateTask() { - } - - @Override - public void run() { - GlobalLock scanLock = GlobalLock.getInternLock("network.stats"); - try { - if(scanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { - //Check for ownership - //msHost in UP state with min id should run the job - ManagementServerHostVO msHost = _msHostDao.findOneInUpState(new Filter(ManagementServerHostVO.class, "id", true, 0L, 1L)); - if(msHost == null || (msHost.getMsid() != mgmtSrvrId)){ - s_logger.debug("Skipping aggregate network stats update"); - scanLock.unlock(); - return; - } - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - txn.start(); - //get all stats with delta > 0 - List updatedStats = _statsDao.listUpdatedStats(); - Date updatedTime = new Date(); - for(UserStatisticsVO stat : updatedStats){ - //update agg bytes - stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived()); - stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent()); - _userStatsDao.update(stat.getId(), stat); - //insert into op_user_stats_log - UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(), - stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime); - _userStatsLogDao.persist(statsLog); - } - s_logger.debug("Successfully updated aggregate network stats"); - txn.commit(); - } catch (Exception e){ - txn.rollback(); - s_logger.debug("Failed to update aggregate network stats", e); - } finally { - scanLock.unlock(); - txn.close(); - } - } - } catch (Exception e){ - s_logger.debug("Exception while trying to acquire network stats lock", e); - } finally { - scanLock.releaseRef(); - } - } - } - - - protected void updateRoutersRedundantState(List routers) { - boolean updated = false; - for (DomainRouterVO router : routers) { - updated = false; - if (!router.getIsRedundantRouter()) { - continue; - } - RedundantState prevState = router.getRedundantState(); - if (router.getState() != State.Running) { - router.setRedundantState(RedundantState.UNKNOWN); - router.setIsPriorityBumpUp(false); - updated = true; - } else { - String privateIP = router.getPrivateIpAddress(); - HostVO host = _hostDao.findById(router.getHostId()); - if (host == null || host.getStatus() != Status.Up) { - router.setRedundantState(RedundantState.UNKNOWN); - updated = true; - } else if (host.getManagementServerId() != ManagementServerNode.getManagementServerId()) { - /* Only cover hosts managed by this management server */ - continue; - } else if (privateIP != null) { - final CheckRouterCommand command = new CheckRouterCommand(); - command.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - command.setWait(60); - final Answer origAnswer = _agentMgr.easySend(router.getHostId(), command); - CheckRouterAnswer answer = null; - if (origAnswer instanceof CheckRouterAnswer) { - answer = (CheckRouterAnswer)origAnswer; - } else { - s_logger.warn("Unable to update router " + router.getHostName() + "'s status"); - } - RedundantState state = RedundantState.UNKNOWN; - boolean isBumped = router.getIsPriorityBumpUp(); - if (answer != null && answer.getResult()) { - state = answer.getState(); - isBumped = answer.isBumped(); - } - router.setRedundantState(state); - router.setIsPriorityBumpUp(isBumped); - updated = true; - } - } - if (updated) { - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - txn.start(); - _routerDao.update(router.getId(), router); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unable to update router status for account: " + router.getAccountId()); - } finally { - txn.close(); - } - } - RedundantState currState = router.getRedundantState(); - if (prevState != currState) { - String title = "Redundant virtual router " + router.getInstanceName() + - " just switch from " + prevState + " to " + currState; - String context = "Redundant virtual router (name: " + router.getHostName() + ", id: " + router.getId() + ") " + - " just switch from " + prevState + " to " + currState; - s_logger.info(context); - if (currState == RedundantState.MASTER) { - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, - router.getDataCenterIdToDeployIn(), router.getPodIdToDeployIn(), title, context); - } - } - } - } - - //Ensure router status is update to date before execute this function. The function would try best to recover all routers except MASTER - protected void recoverRedundantNetwork(DomainRouterVO masterRouter, DomainRouterVO backupRouter) { - UserContext context = UserContext.current(); - context.setAccountId(1); - if (masterRouter.getState() == State.Running && backupRouter.getState() == State.Running) { - HostVO masterHost = _hostDao.findById(masterRouter.getHostId()); - HostVO backupHost = _hostDao.findById(backupRouter.getHostId()); - if (masterHost.getStatus() == Status.Up && backupHost.getStatus() == Status.Up) { - String title = "Reboot " + backupRouter.getInstanceName() + " to ensure redundant virtual routers work"; - if (s_logger.isDebugEnabled()) { - s_logger.debug(title); - } - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, - backupRouter.getDataCenterIdToDeployIn(), backupRouter.getPodIdToDeployIn(), title, title); - try { - rebootRouter(backupRouter.getId(), false); - } catch (ConcurrentOperationException e) { - s_logger.warn("Fail to reboot " + backupRouter.getInstanceName(), e); - } catch (ResourceUnavailableException e) { - s_logger.warn("Fail to reboot " + backupRouter.getInstanceName(), e); - } catch (InsufficientCapacityException e) { - s_logger.warn("Fail to reboot " + backupRouter.getInstanceName(), e); - } - } - } - } - - private int getRealPriority(DomainRouterVO router) { - int priority = router.getPriority(); - if (router.getIsPriorityBumpUp()) { - priority += DEFAULT_DELTA; - } - return priority; - } - - protected class CheckRouterTask implements Runnable { - - public CheckRouterTask() { - } - - /* - * In order to make fail-over works well at any time, we have to ensure: - * 1. Backup router's priority = Master's priority - DELTA + 1 - * 2. Backup router's priority hasn't been bumped up. - */ - private void checkSanity(List routers) { - Set checkedNetwork = new HashSet(); - for (DomainRouterVO router : routers) { - if (!router.getIsRedundantRouter()) { - continue; - } - - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); - - for (Long routerGuestNtwkId : routerGuestNtwkIds) { - if (checkedNetwork.contains(routerGuestNtwkId)) { - continue; - } - checkedNetwork.add(routerGuestNtwkId); - List checkingRouters = _routerDao.listByNetworkAndRole(routerGuestNtwkId, Role.VIRTUAL_ROUTER); - if (checkingRouters.size() != 2) { - continue; - } - DomainRouterVO masterRouter = null; - DomainRouterVO backupRouter = null; - for (DomainRouterVO r : checkingRouters) { - if (r.getRedundantState() == RedundantState.MASTER) { - if (masterRouter == null) { - masterRouter = r; - } else { - //Duplicate master! We give up, until the admin fix duplicate MASTER issue - break; - } - } else if (r.getRedundantState() == RedundantState.BACKUP) { - if (backupRouter == null) { - backupRouter = r; - } else { - break; - } - } - } - if (masterRouter != null && backupRouter != null) { - if (getRealPriority(masterRouter) - DEFAULT_DELTA + 1 != getRealPriority(backupRouter) || backupRouter.getIsPriorityBumpUp()) { - recoverRedundantNetwork(masterRouter, backupRouter); - } - } - } - } - } - - private void checkDuplicateMaster(List routers) { - Map networkRouterMaps = new HashMap(); - for (DomainRouterVO router : routers) { - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); - - for (Long routerGuestNtwkId : routerGuestNtwkIds) { - if (router.getRedundantState() == RedundantState.MASTER) { - if (networkRouterMaps.containsKey(routerGuestNtwkId)) { - DomainRouterVO dupRouter = networkRouterMaps.get(routerGuestNtwkId); - String title = "More than one redundant virtual router is in MASTER state! Router " + router.getHostName() + " and router " + dupRouter.getHostName(); - String context = "Virtual router (name: " + router.getHostName() + ", id: " + router.getId() + " and router (name: " - + dupRouter.getHostName() + ", id: " + router.getId() + ") are both in MASTER state! If the problem persist, restart both of routers. "; - - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterIdToDeployIn(), router.getPodIdToDeployIn(), title, context); - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, dupRouter.getDataCenterIdToDeployIn(), dupRouter.getPodIdToDeployIn(), title, context); - } else { - networkRouterMaps.put(routerGuestNtwkId, router); - } - } - } - } - } - - @Override - public void run() { - try { - final List routers = _routerDao.listIsolatedByHostId(null); - s_logger.debug("Found " + routers.size() + " routers. "); - - updateRoutersRedundantState(routers); - - /* FIXME assumed the a pair of redundant routers managed by same mgmt server, - * then the update above can get the latest status */ - checkDuplicateMaster(routers); - checkSanity(routers); - } catch (Exception ex) { - s_logger.error("Fail to complete the CheckRouterTask! ", ex); - } - } - } - - - private final int DEFAULT_PRIORITY = 100; - private final int DEFAULT_DELTA = 2; - - protected int getUpdatedPriority(Network guestNetwork, List routers, DomainRouterVO exclude) throws InsufficientVirtualNetworkCapcityException { - int priority; - if (routers.size() == 0) { - priority = DEFAULT_PRIORITY; - } else { - int maxPriority = 0; - for (DomainRouterVO r : routers) { - if (!r.getIsRedundantRouter()) { - throw new CloudRuntimeException("Redundant router is mixed with single router in one network!"); - } - //FIXME Assume the maxPriority one should be running or just created. - if (r.getId() != exclude.getId() && getRealPriority(r) > maxPriority) { - maxPriority = getRealPriority(r); - } - } - if (maxPriority == 0) { - return DEFAULT_PRIORITY; - } - if (maxPriority < 20) { - s_logger.error("Current maximum priority is too low!"); - throw new InsufficientVirtualNetworkCapcityException("Current maximum priority is too low as " + maxPriority + "!", - guestNetwork.getId()); - } else if (maxPriority > 200) { - s_logger.error("Too many times fail-over happened! Current maximum priority is too high as " + maxPriority + "!"); - throw new InsufficientVirtualNetworkCapcityException("Too many times fail-over happened! Current maximum priority is too high as " - + maxPriority + "!", guestNetwork.getId()); - } - priority = maxPriority - DEFAULT_DELTA + 1; - } - return priority; - } - - /* - * Ovm won't support any system. So we have to choose a partner cluster in the same pod to start domain router for us - */ - private HypervisorType getClusterToStartDomainRouterForOvm(long podId) { - List clusters = _clusterDao.listByPodId(podId); - for (ClusterVO cv : clusters) { - if (cv.getHypervisorType() == HypervisorType.Ovm || cv.getHypervisorType() == HypervisorType.BareMetal) { - continue; - } - - List hosts = _resourceMgr.listAllHostsInCluster(cv.getId()); - if (hosts == null || hosts.isEmpty()) { - continue; - } - - for (HostVO h : hosts) { - if (h.getStatus() == Status.Up) { - s_logger.debug("Pick up host that has hypervisor type " + h.getHypervisorType() + " in cluster " + - cv.getId() + " to start domain router for OVM"); - return h.getHypervisorType(); - } - } - } - - String errMsg = "Cannot find an available cluster in Pod " - + podId - + " to start domain router for Ovm. \n Ovm won't support any system vm including domain router, " + - "please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod" + - " with Ovm cluster. And there is at least one host in UP status in that cluster."; - throw new CloudRuntimeException(errMsg); - } - - @DB - protected List findOrDeployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, - boolean isRedundant, Map params) throws ConcurrentOperationException, - InsufficientCapacityException, ResourceUnavailableException { - - assert guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup || - guestNetwork.getState() == Network.State.Implementing : "Network is not yet fully implemented: " - + guestNetwork; - assert guestNetwork.getTrafficType() == TrafficType.Guest; - - - - //1) Get deployment plan and find out the list of routers - boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || - _networkMgr.areServicesSupportedInNetwork(guestNetwork.getId(), Service.SecurityGroup)) - && guestNetwork.getTrafficType() == TrafficType.Guest; - - Pair> planAndRouters = getDeploymentPlanAndRouters(isPodBased, dest, guestNetwork.getId()); - DeploymentPlan plan = planAndRouters.first(); - List routers = planAndRouters.second(); - - //2) Figure out required routers count - int routerCount = 1; - if (isRedundant) { - routerCount = 2; - } - - /* If it is the single router network, then keep it untouched */ - for (DomainRouterVO router : routers) { - if (!router.getIsRedundantRouter() || isPodBased) { - routerCount = 1; - break; - } - } - - /* If old network is redundant but new is single router, then routers.size() = 2 but routerCount = 1 */ - if (routers.size() >= routerCount) { - return routers; - } - - if (routers.size() >= 5) { - s_logger.error("Too much redundant routers!"); - } - - Network network = _networkDao.acquireInLockTable(guestNetwork.getId()); - if (network == null) { - throw new ConcurrentOperationException("Unable to lock network " + guestNetwork.getId()); - } - - try { - //Check if providers are supported in the physical networks - VirtualRouterProviderType type = VirtualRouterProviderType.VirtualRouter; - Long physicalNetworkId = _networkMgr.getPhysicalNetworkId(network); - PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(physicalNetworkId, type.toString()); - if (provider == null) { - throw new CloudRuntimeException("Cannot find service provider " + type.toString() + " in physical network " + physicalNetworkId); - } - VirtualRouterProvider vrProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), type); - if (vrProvider == null) { - throw new CloudRuntimeException("Cannot find virtual router provider " + type.toString()+ " as service provider " + provider.getId()); - } - - if (_networkMgr.isNetworkSystem(guestNetwork) || guestNetwork.getGuestType() == Network.GuestType.Shared) { - owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM); - } - - //Check if public network has to be set on VR - boolean publicNetwork = false; - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetwork.getId(), Service.SourceNat, Provider.VirtualRouter)) { - publicNetwork = true; - } - if (isRedundant && !publicNetwork) { - s_logger.error("Didn't support redundant virtual router without public network!"); - return null; - } - - Long offeringId = _networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId(); - if (offeringId == null) { - offeringId = _offering.getId(); - } - - PublicIp sourceNatIp = null; - if (publicNetwork) { - sourceNatIp = _networkMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork); - } - - //3) deploy virtual router(s) - int count = routerCount - routers.size(); - for (int i = 0; i < count; i++) { - List> networks = createRouterNetworks(owner, isRedundant, plan, guestNetwork, - new Pair(publicNetwork, sourceNatIp)); - DomainRouterVO router = deployRouter(owner, dest, plan, params, isRedundant, vrProvider, offeringId, - null, networks); - - _routerDao.addRouterToGuestNetwork(router, network); - - routers.add(router); - } - } finally { - if (network != null) { - _networkDao.releaseFromLockTable(network.getId()); - } - } - return routers; - } - - protected DomainRouterVO deployRouter(Account owner, DeployDestination dest, DeploymentPlan plan, Map params, - boolean isRedundant, VirtualRouterProvider vrProvider, long svcOffId, - Long vpcId, List> networks) throws ConcurrentOperationException, - InsufficientAddressCapacityException, InsufficientServerCapacityException, InsufficientCapacityException, - StorageUnavailableException, ResourceUnavailableException { - - long id = _routerDao.getNextInSequence(Long.class, "id"); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Creating the router " + id + " in datacenter " + dest.getDataCenter()); - } - - ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(svcOffId); - - // Router is the network element, we don't know the hypervisor type yet. - //Try to allocate the domR twice using diff hypervisors, and when failed both times, throw the exception up - List supportedHypervisors = new ArrayList(); - HypervisorType defaults = _resourceMgr.getDefaultHypervisor(dest.getDataCenter().getId()); - if (defaults != HypervisorType.None) { - supportedHypervisors.add(defaults); - } - - if (dest.getCluster() != null) { - if (dest.getCluster().getHypervisorType() == HypervisorType.Ovm) { - supportedHypervisors.add(getClusterToStartDomainRouterForOvm(dest.getCluster().getPodId())); - } else { - supportedHypervisors.add(dest.getCluster().getHypervisorType()); - } - } else { - supportedHypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true, - plan.getPodId()); - } - - if (supportedHypervisors.isEmpty()) { - if (plan.getPodId() != null) { - throw new InsufficientServerCapacityException("Unable to create virtual router, " + - "there are no clusters in the pod ", Pod.class, plan.getPodId()); - } - throw new InsufficientServerCapacityException("Unable to create virtual router, " + - "there are no clusters in the zone ", DataCenter.class, dest.getDataCenter().getId()); - } - - int allocateRetry = 0; - int startRetry = 0; - DomainRouterVO router = null; - for (Iterator iter = supportedHypervisors.iterator();iter.hasNext();) { - HypervisorType hType = iter.next(); - try { - s_logger.debug("Allocating the domR with the hypervisor type " + hType); - VMTemplateVO template = _templateDao.findRoutingTemplate(hType); - - if (template == null) { - s_logger.debug(hType + " won't support system vm, skip it"); - continue; - } - - boolean offerHA = routerOffering.getOfferHA(); - /* We don't provide HA to redundant router VMs, admin should own it all, and redundant router themselves are HA */ - if (isRedundant) { - offerHA = false; - } - - router = new DomainRouterVO(id, routerOffering.getId(), vrProvider.getId(), - VirtualMachineName.getRouterName(id, _instance), template.getId(), template.getHypervisorType(), - template.getGuestOSId(), owner.getDomainId(), owner.getId(), isRedundant, 0, false, - RedundantState.UNKNOWN, offerHA, false, vpcId); - router.setRole(Role.VIRTUAL_ROUTER); - router = _itMgr.allocate(router, template, routerOffering, networks, plan, null, owner); - } catch (InsufficientCapacityException ex) { - if (allocateRetry < 2 && iter.hasNext()) { - s_logger.debug("Failed to allocate the domR with hypervisor type " + hType + ", retrying one more time"); - continue; - } else { - throw ex; - } - } finally { - allocateRetry++; - } - - try { - router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params); - break; - } catch (InsufficientCapacityException ex) { - if (startRetry < 2 && iter.hasNext()) { - s_logger.debug("Failed to start the domR " + router + " with hypervisor type " + hType + ", " + - "destroying it and recreating one more time"); - //destroy the router - destroyRouter(router.getId()); - continue; - } else { - throw ex; - } - } finally { - startRetry++; - } - } - - return router; - } - - protected List> createRouterNetworks(Account owner, boolean isRedundant, - DeploymentPlan plan, Network guestNetwork, Pair publicNetwork) throws ConcurrentOperationException, - InsufficientAddressCapacityException { - - - boolean setupPublicNetwork = false; - if (publicNetwork != null) { - setupPublicNetwork = publicNetwork.first(); - } - - //Form networks - List> networks = new ArrayList>(3); - - //1) Guest network - boolean hasGuestNetwork = false; - if (guestNetwork != null) { - s_logger.debug("Adding nic for Virtual Router in Guest network " + guestNetwork); - String defaultNetworkStartIp = null; - if (guestNetwork.getCidr() != null && !setupPublicNetwork) { - String startIp = _networkMgr.getStartIpAddress(guestNetwork.getId()); - if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) { - defaultNetworkStartIp = startIp; - } else if (s_logger.isDebugEnabled()){ - s_logger.debug("First ip " + startIp + " in network id=" + guestNetwork.getId() + - " is already allocated, can't use it for domain router; will get random ip address from the range"); - } - } - - NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp); - if (setupPublicNetwork) { - if (isRedundant) { - gatewayNic.setIp4Address(_networkMgr.acquireGuestIpAddress(guestNetwork, null)); - } else { - gatewayNic.setIp4Address(guestNetwork.getGateway()); - } - gatewayNic.setBroadcastUri(guestNetwork.getBroadcastUri()); - gatewayNic.setBroadcastType(guestNetwork.getBroadcastDomainType()); - gatewayNic.setIsolationUri(guestNetwork.getBroadcastUri()); - gatewayNic.setMode(guestNetwork.getMode()); - String gatewayCidr = guestNetwork.getCidr(); - gatewayNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr)); - } else { - gatewayNic.setDefaultNic(true); - } - - networks.add(new Pair((NetworkVO) guestNetwork, gatewayNic)); - hasGuestNetwork = true; - } - - //2) Control network - s_logger.debug("Adding nic for Virtual Router in Control network "); - List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork); - NetworkOfferingVO controlOffering = offerings.get(0); - NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); - networks.add(new Pair(controlConfig, null)); - - - //3) Public network - if (setupPublicNetwork) { - PublicIp sourceNatIp = publicNetwork.second(); - s_logger.debug("Adding nic for Virtual Router in Public network "); - //if source nat service is supported by the network, get the source nat ip address - NicProfile defaultNic = new NicProfile(); - defaultNic.setDefaultNic(true); - defaultNic.setIp4Address(sourceNatIp.getAddress().addr()); - defaultNic.setGateway(sourceNatIp.getGateway()); - defaultNic.setNetmask(sourceNatIp.getNetmask()); - defaultNic.setMacAddress(sourceNatIp.getMacAddress()); - defaultNic.setBroadcastType(BroadcastDomainType.Vlan); - defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag())); - defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag())); - if (hasGuestNetwork) { - defaultNic.setDeviceId(2); - } - NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork).get(0); - List publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false); - networks.add(new Pair(publicNetworks.get(0), defaultNic)); - } - - return networks; - } - - - protected Pair> getDeploymentPlanAndRouters(boolean isPodBased, - DeployDestination dest, long guestNetworkId) { - long dcId = dest.getDataCenter().getId(); - List routers = null; - DeploymentPlan plan = new DataCenterDeployment(dcId); - if (isPodBased) { - Pod pod = dest.getPod(); - Long podId = null; - if (pod != null) { - podId = pod.getId(); - } else { - throw new CloudRuntimeException("Pod id is expected in deployment destination"); - } - routers = _routerDao.listByNetworkAndPodAndRole(guestNetworkId, podId, Role.VIRTUAL_ROUTER); - plan = new DataCenterDeployment(dcId, podId, null, null, null, null); - } else { - routers = _routerDao.listByNetworkAndRole(guestNetworkId, Role.VIRTUAL_ROUTER); - } - - return new Pair>(plan, routers); - } - - - private DomainRouterVO startVirtualRouter(DomainRouterVO router, User user, Account caller, Map params) - throws StorageUnavailableException, InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - - if (router.getRole() != Role.VIRTUAL_ROUTER || !router.getIsRedundantRouter()) { - return this.start(router, user, caller, params, null); - } - - if (router.getState() == State.Running) { - s_logger.debug("Redundant router " + router.getInstanceName() + " is already running!"); - return router; - } - - DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null); - DomainRouterVO result = null; - assert router.getIsRedundantRouter(); - List routerList = _routerDao.findBy(router.getAccountId(), router.getDataCenterIdToDeployIn()); - DomainRouterVO routerToBeAvoid = null; - for (DomainRouterVO rrouter : routerList) { - if (rrouter.getHostId() != null && rrouter.getIsRedundantRouter() && rrouter.getState() == State.Running) { - if (routerToBeAvoid != null) { - throw new ResourceUnavailableException("Try to start router " + router.getInstanceName() + "(" + router.getId() + ")" - + ", but there are already two redundant routers with IP " + router.getPublicIpAddress() - + ", they are " + rrouter.getInstanceName() + "(" + rrouter.getId() + ") and " - + routerToBeAvoid.getInstanceName() + "(" + routerToBeAvoid.getId() + ")", - DataCenter.class, rrouter.getDataCenterIdToDeployIn()); - } - routerToBeAvoid = rrouter; - } - } - if (routerToBeAvoid == null) { - return this.start(router, user, caller, params, null); - } - // We would try best to deploy the router to another place - int retryIndex = 5; - ExcludeList[] avoids = new ExcludeList[5]; - avoids[0] = new ExcludeList(); - avoids[0].addPod(routerToBeAvoid.getPodIdToDeployIn()); - avoids[1] = new ExcludeList(); - avoids[1].addCluster(_hostDao.findById(routerToBeAvoid.getHostId()).getClusterId()); - avoids[2] = new ExcludeList(); - List volumes = _volumeDao.findByInstanceAndType(routerToBeAvoid.getId(), Type.ROOT); - if (volumes != null && volumes.size() != 0) { - avoids[2].addPool(volumes.get(0).getPoolId()); - } - avoids[2].addHost(routerToBeAvoid.getHostId()); - avoids[3] = new ExcludeList(); - avoids[3].addHost(routerToBeAvoid.getHostId()); - avoids[4] = new ExcludeList(); - - for (int i = 0; i < retryIndex; i++) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Try to deploy redundant virtual router:" + router.getHostName() + ", for " + i + " time"); - } - plan.setAvoids(avoids[i]); - try { - result = this.start(router, user, caller, params, plan); - } catch (InsufficientServerCapacityException ex) { - result = null; - } - if (result != null) { - break; - } - } - return result; - } - - @Override - public List deployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, - Map params, boolean isRedundant) throws InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - - List routers = findOrDeployVirtualRouterInGuestNetwork - (guestNetwork, dest, owner, isRedundant, params); - - return startRouters(params, routers); - } - - protected List startRouters(Map params, List routers) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, - ResourceUnavailableException { - List runningRouters = null; - - if (routers != null) { - runningRouters = new ArrayList(); - } - - for (DomainRouterVO router : routers) { - boolean skip = false; - State state = router.getState(); - if (router.getHostId() != null && state != State.Running) { - HostVO host = _hostDao.findById(router.getHostId()); - if (host == null || host.getStatus() != Status.Up) { - skip = true; - } - } - if (!skip) { - if (state != State.Running) { - router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params); - } - if (router != null) { - runningRouters.add(router); - } - } - } - return runningRouters; - } - - @Override - public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, - ReservationContext context) { - - boolean dnsProvided = true; - boolean dhcpProvided = true; - boolean publicNetwork = false; - DataCenterVO dc = _dcDao.findById(dest.getDataCenter().getId()); - _dcDao.loadDetails(dc); - - //1) Set router details - DomainRouterVO router = profile.getVirtualMachine(); - Map details = _vmDetailsDao.findDetails(router.getId()); - router.setDetails(details); - - //2) Prepare boot loader elements related with Control network - - StringBuilder buf = profile.getBootArgsBuilder(); - buf.append(" template=domP"); - buf.append(" name=").append(profile.getHostName()); - - if (Boolean.valueOf(_configDao.getValue("system.vm.random.password"))) { - buf.append(" vmpassword=").append(_configDao.getValue("system.vm.password")); - } - - NicProfile controlNic = null; - String defaultDns1 = null; - String defaultDns2 = null; - for (NicProfile nic : profile.getNics()) { - int deviceId = nic.getDeviceId(); - buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); - buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); - - if (nic.isDefaultNic()) { - buf.append(" gateway=").append(nic.getGateway()); - defaultDns1 = nic.getDns1(); - defaultDns2 = nic.getDns2(); - } - - if (nic.getTrafficType() == TrafficType.Management) { - buf.append(" localgw=").append(dest.getPod().getGateway()); - } else if (nic.getTrafficType() == TrafficType.Control) { - controlNic = nic; - // DOMR control command is sent over management server in VMware - if (dest.getHost().getHypervisorType() == HypervisorType.VMware) { - if (s_logger.isInfoEnabled()) { - s_logger.info("Check if we need to add management server explicit route to DomR. pod cidr: " - + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize() - + ", pod gateway: " + dest.getPod().getGateway() + ", management host: " + _mgmt_host); - } - - if (s_logger.isInfoEnabled()) { - s_logger.info("Add management server explicit route to DomR."); - } - - // always add management explicit route, for basic networking setup, DomR may have two interfaces while both - // are on the same subnet - _mgmt_cidr = _configDao.getValue(Config.ManagementNetwork.key()); - if (NetUtils.isValidCIDR(_mgmt_cidr)) { - buf.append(" mgmtcidr=").append(_mgmt_cidr); - buf.append(" localgw=").append(dest.getPod().getGateway()); - } - - - if (dc.getNetworkType() == NetworkType.Basic) { - // ask domR to setup SSH on guest network - buf.append(" sshonguest=true"); - } - - } - } else if (nic.getTrafficType() == TrafficType.Guest) { - dnsProvided = _networkMgr.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dns, Provider.VirtualRouter); - dhcpProvided = _networkMgr.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dhcp, Provider.VirtualRouter); - //build bootloader parameter for the guest - buf.append(createGuestBootLoadArgs(nic, defaultDns1, defaultDns2, router)); - } else if (nic.getTrafficType() == TrafficType.Public) { - publicNetwork = true; - } - } - - if (controlNic == null) { - throw new CloudRuntimeException("Didn't start a control port"); - } - - String rpValue = _configDao.getValue(Config.NetworkRouterRpFilter.key()); - if (rpValue != null && rpValue.equalsIgnoreCase("true")) { - _disable_rp_filter = true; - }else { - _disable_rp_filter = false; - } - - String rpFilter = " "; - String type = null; - if (router.getVpcId() != null) { - type = "vpcrouter"; - if (_disable_rp_filter) { - rpFilter=" disable_rp_filter=true"; - } - } else if (!publicNetwork) { - type = "dhcpsrvr"; - } else { - type = "router"; - if (_disable_rp_filter) { - rpFilter=" disable_rp_filter=true"; - } - } - - if (_disable_rp_filter) { - rpFilter=" disable_rp_filter=true"; - } - - buf.append(" type=" + type + rpFilter); - - String domain_suffix = dc.getDetail(ZoneConfig.DnsSearchOrder.getName()); - if (domain_suffix != null) { - buf.append(" dnssearchorder=").append(domain_suffix); - } - - if (profile.getHypervisorType() == HypervisorType.VMware) { - buf.append(" extra_pubnics=" + _routerExtraPublicNics); - } - - /* If virtual router didn't provide DNS service but provide DHCP service, we need to override the DHCP response - * to return DNS server rather than - * virtual router itself. */ - if (dnsProvided || dhcpProvided) { - if (defaultDns1 != null) { - buf.append(" dns1=").append(defaultDns1); - } - if (defaultDns2 != null) { - buf.append(" dns2=").append(defaultDns2); - } - - boolean useExtDns = !dnsProvided; - /* For backward compatibility */ - String use_external_dns = _configDao.getValue(Config.UseExternalDnsServers.key()); - if (use_external_dns != null && use_external_dns.equals("true")) { - useExtDns = true; - } - - if (useExtDns) { - buf.append(" useextdns=true"); - } - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); - } - - return true; - } - - - protected StringBuilder createGuestBootLoadArgs(NicProfile guestNic, String defaultDns1, - String defaultDns2, DomainRouterVO router) { - long guestNetworkId = guestNic.getNetworkId(); - NetworkVO guestNetwork = _networkDao.findById(guestNetworkId); - String dhcpRange = null; - DataCenterVO dc = _dcDao.findById(guestNetwork.getDataCenterId()); - - StringBuilder buf = new StringBuilder(); - - boolean isRedundant = router.getIsRedundantRouter(); - if (isRedundant) { - buf.append(" redundant_router=1"); - List routers = _routerDao.listByNetworkAndRole(guestNetwork.getId(), Role.VIRTUAL_ROUTER); - try { - int priority = getUpdatedPriority(guestNetwork, routers, router); - router.setPriority(priority); - } catch (InsufficientVirtualNetworkCapcityException e) { - s_logger.error("Failed to get update priority!", e); - throw new CloudRuntimeException("Failed to get update priority!"); - } - Network net = _networkMgr.getNetwork(guestNic.getNetworkId()); - buf.append(" guestgw=").append(net.getGateway()); - String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) | ~NetUtils.ip2Long(guestNic.getNetmask())); - buf.append(" guestbrd=").append(brd); - buf.append(" guestcidrsize=").append(NetUtils.getCidrSize(guestNic.getNetmask())); - buf.append(" router_pr=").append(router.getPriority()); - } - - //setup network domain - String domain = guestNetwork.getNetworkDomain(); - if (domain != null) { - buf.append(" domain=" + domain); - } - - //setup dhcp range - if (dc.getNetworkType() == NetworkType.Basic) { - if (guestNic.isDefaultNic()) { - long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask()); - String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), cidrSize); - if (cidr != null) { - dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize); - } - } - } else if (dc.getNetworkType() == NetworkType.Advanced) { - String cidr = guestNetwork.getCidr(); - if (cidr != null) { - dhcpRange = NetUtils.getDhcpRange(cidr); - } - } - - if (dhcpRange != null) { - buf.append(" dhcprange=" + dhcpRange); - } - - return buf; - } - - - protected String getGuestDhcpRange(NicProfile guestNic, Network guestNetwork, DataCenter dc) { - String dhcpRange = null; - //setup dhcp range - if (dc.getNetworkType() == NetworkType.Basic) { - long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask()); - String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), cidrSize); - if (cidr != null) { - dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize); - } - } else if (dc.getNetworkType() == NetworkType.Advanced) { - String cidr = guestNetwork.getCidr(); - if (cidr != null) { - dhcpRange = NetUtils.getDhcpRange(cidr); - } - } - return dhcpRange; - } - - @Override - public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, - DeployDestination dest, ReservationContext context) throws ResourceUnavailableException { - DomainRouterVO router = profile.getVirtualMachine(); - - List nics = profile.getNics(); - for (NicProfile nic : nics) { - if (nic.getTrafficType() == TrafficType.Public) { - router.setPublicIpAddress(nic.getIp4Address()); - router.setPublicNetmask(nic.getNetmask()); - router.setPublicMacAddress(nic.getMacAddress()); - } else if (nic.getTrafficType() == TrafficType.Control) { - router.setPrivateIpAddress(nic.getIp4Address()); - router.setPrivateMacAddress(nic.getMacAddress()); - } - } - _routerDao.update(router.getId(), router); - - finalizeCommandsOnStart(cmds, profile); - return true; - } - - @Override - public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile profile) { - DomainRouterVO router = profile.getVirtualMachine(); - NicProfile controlNic = getControlNic(profile); - - if (controlNic == null) { - s_logger.error("Control network doesn't exist for the router " + router); - return false; - } - - finalizeSshAndVersionAndNetworkUsageOnStart(cmds, profile, router, controlNic); - - // restart network if restartNetwork = false is not specified in profile parameters - boolean reprogramGuestNtwks = true; - if (profile.getParameter(Param.ReProgramGuestNetworks) != null - && (Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) { - reprogramGuestNtwks = false; - } - - VirtualRouterProvider vrProvider = _vrProviderDao.findById(router.getElementId()); - if (vrProvider == null) { - throw new CloudRuntimeException("Cannot find related virtual router provider of router: " + router.getHostName()); - } - Provider provider = Network.Provider.getProvider(vrProvider.getType().toString()); - if (provider == null) { - throw new CloudRuntimeException("Cannot find related provider of virtual router provider: " + vrProvider.getType().toString()); - } - - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); - for (Long guestNetworkId : routerGuestNtwkIds) { - if (reprogramGuestNtwks) { - finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId); - finalizeNetworkRulesForNetwork(cmds, router, provider, guestNetworkId); - } - - finalizeUserDataAndDhcpOnStart(cmds, router, provider, guestNetworkId); - } - - return true; - } - - protected NicProfile getControlNic(VirtualMachineProfile profile) { - DomainRouterVO router = profile.getVirtualMachine(); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - NicProfile controlNic = null; - if (profile.getHypervisorType() == HypervisorType.VMware && dcVo.getNetworkType() == NetworkType.Basic) { - // TODO this is a ugly to test hypervisor type here - // for basic network mode, we will use the guest NIC for control NIC - for (NicProfile nic : profile.getNics()) { - if (nic.getTrafficType() == TrafficType.Guest && nic.getIp4Address() != null) { - controlNic = nic; - } - } - } else { - for (NicProfile nic : profile.getNics()) { - if (nic.getTrafficType() == TrafficType.Control && nic.getIp4Address() != null) { - controlNic = nic; - } - } - } - return controlNic; - } - - protected void finalizeSshAndVersionAndNetworkUsageOnStart(Commands cmds, VirtualMachineProfile profile, DomainRouterVO router, NicProfile controlNic) { - cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922)); - - // Update router template/scripts version - final GetDomRVersionCmd command = new GetDomRVersionCmd(); - command.setAccessDetail(NetworkElementCommand.ROUTER_IP, controlNic.getIp4Address()); - command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - cmds.addCommand("getDomRVersion", command); - - // Network usage command to create iptables rules - boolean forVpc = profile.getVirtualMachine().getVpcId() != null; - cmds.addCommand("networkUsage", new NetworkUsageCommand(controlNic.getIp4Address(), router.getHostName(), "create", forVpc)); - } - - protected void finalizeUserDataAndDhcpOnStart(Commands cmds, DomainRouterVO router, Provider provider, Long guestNetworkId) { - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Dhcp, provider)) { - // Resend dhcp - s_logger.debug("Reapplying dhcp entries as a part of domR " + router + " start..."); - createDhcpEntryCommandsForVMs(router, cmds, guestNetworkId); - } - - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.UserData, provider)) { - // Resend user data - s_logger.debug("Reapplying vm data (userData and metaData) entries as a part of domR " + router + " start..."); - createVmDataCommandForVMs(router, cmds, guestNetworkId); - } - } - - protected void finalizeNetworkRulesForNetwork(Commands cmds, DomainRouterVO router, Provider provider, Long guestNetworkId) { - s_logger.debug("Resending ipAssoc, port forwarding, load balancing rules as a part of Virtual router start"); - - ArrayList publicIps = getPublicIpsToApply(router, provider, guestNetworkId); - - if (publicIps != null && !publicIps.isEmpty()) { - List vpns = new ArrayList(); - List pfRules = new ArrayList(); - List staticNatFirewallRules = new ArrayList(); - List staticNats = new ArrayList(); - List firewallRules = new ArrayList(); - - //Get information about all the rules (StaticNats and StaticNatRules; PFVPN to reapply on domR start) - for (PublicIpAddress ip : publicIps) { - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.PortForwarding, provider)) { - pfRules.addAll(_pfRulesDao.listForApplication(ip.getId())); - } - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.StaticNat, provider)) { - staticNatFirewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(), Purpose.StaticNat)); - } - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Firewall, provider)) { - firewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(), Purpose.Firewall)); - } - - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Vpn, provider)) { - RemoteAccessVpn vpn = _vpnDao.findById(ip.getId()); - if (vpn != null) { - vpns.add(vpn); - } - } - - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.StaticNat, provider)) { - if (ip.isOneToOneNat()) { - String dstIp = _networkMgr.getIpInNetwork(ip.getAssociatedWithVmId(), guestNetworkId); - StaticNatImpl staticNat = new StaticNatImpl(ip.getAccountId(), ip.getDomainId(), guestNetworkId, ip.getId(), dstIp, false); - staticNats.add(staticNat); - } - } - } - - //Re-apply static nats - s_logger.debug("Found " + staticNats.size() + " static nat(s) to apply as a part of domR " + router + " start."); - if (!staticNats.isEmpty()) { - createApplyStaticNatCommands(staticNats, router, cmds, guestNetworkId); - } - - //Re-apply firewall rules - s_logger.debug("Found " + staticNats.size() + " firewall rule(s) to apply as a part of domR " + router + " start."); - if (!firewallRules.isEmpty()) { - createFirewallRulesCommands(firewallRules, router, cmds, guestNetworkId); - } - - // Re-apply port forwarding rules - s_logger.debug("Found " + pfRules.size() + " port forwarding rule(s) to apply as a part of domR " + router + " start."); - if (!pfRules.isEmpty()) { - createApplyPortForwardingRulesCommands(pfRules, router, cmds, guestNetworkId); - } - - // Re-apply static nat rules - s_logger.debug("Found " + staticNatFirewallRules.size() + " static nat rule(s) to apply as a part of domR " + router + " start."); - if (!staticNatFirewallRules.isEmpty()) { - List staticNatRules = new ArrayList(); - for (FirewallRule rule : staticNatFirewallRules) { - staticNatRules.add(_rulesMgr.buildStaticNatRule(rule, false)); - } - createApplyStaticNatRulesCommands(staticNatRules, router, cmds, guestNetworkId); - } - - // Re-apply vpn rules - s_logger.debug("Found " + vpns.size() + " vpn(s) to apply as a part of domR " + router + " start."); - if (!vpns.isEmpty()) { - for (RemoteAccessVpn vpn : vpns) { - createApplyVpnCommands(vpn, router, cmds); - } - } - - List lbs = _loadBalancerDao.listByNetworkId(guestNetworkId); - List lbRules = new ArrayList(); - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Lb, provider)) { - // Re-apply load balancing rules - for (LoadBalancerVO lb : lbs) { - List dstList = _lbMgr.getExistingDestinations(lb.getId()); - List policyList = _lbMgr.getStickinessPolicies(lb.getId()); - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); - lbRules.add(loadBalancing); - } - } - - s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of domR " + router + " start."); - if (!lbRules.isEmpty()) { - createApplyLoadBalancingRulesCommands(lbRules, router, cmds, guestNetworkId); - } - } - } - - protected void finalizeIpAssocForNetwork(Commands cmds, VirtualRouter router, Provider provider, - Long guestNetworkId) { - - ArrayList publicIps = getPublicIpsToApply(router, provider, guestNetworkId); - - if (publicIps != null && !publicIps.isEmpty()) { - s_logger.debug("Found " + publicIps.size() + " ip(s) to apply as a part of domR " + router + " start."); - // Re-apply public ip addresses - should come before PF/LB/VPN - if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Firewall, provider)) { - createAssociateIPCommands(router, publicIps, cmds, 0); - } - } - } - - protected ArrayList getPublicIpsToApply(VirtualRouter router, Provider provider, - Long guestNetworkId, com.cloud.network.IpAddress.State... skipInStates) { - long ownerId = router.getAccountId(); - final List userIps = _networkMgr.listPublicIpsAssignedToGuestNtwk(ownerId, guestNetworkId, null); - List allPublicIps = new ArrayList(); - if (userIps != null && !userIps.isEmpty()) { - boolean addIp = true; - for (IPAddressVO userIp : userIps) { - if (skipInStates != null) { - for (IpAddress.State stateToSkip : skipInStates) { - if (userIp.getState() == stateToSkip) { - s_logger.debug("Skipping ip address " + userIp + " in state " + userIp.getState()); - addIp = false; - break; - } - } - } - - if (addIp) { - PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), - NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress())); - allPublicIps.add(publicIp); - } - } - } - - //Get public Ips that should be handled by router - Network network = _networkDao.findById(guestNetworkId); - Map> ipToServices = _networkMgr.getIpToServices(allPublicIps, false, false); - Map> providerToIpList = _networkMgr.getProviderToIpList(network, ipToServices); - // Only cover virtual router for now, if ELB use it this need to be modified - - ArrayList publicIps = providerToIpList.get(provider); - return publicIps; - } - - @Override - public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, - ReservationContext context) { - DomainRouterVO router = profile.getVirtualMachine(); - - boolean result = true; - - Answer answer = cmds.getAnswer("checkSsh"); - if (answer != null && answer instanceof CheckSshAnswer) { - CheckSshAnswer sshAnswer = (CheckSshAnswer) answer; - if (sshAnswer == null || !sshAnswer.getResult()) { - s_logger.warn("Unable to ssh to the VM: " + sshAnswer.getDetails()); - result = false; - } - } else { - result = false; - } - if (result == false) { - return result; - } - - //Get guest networks info - List guestNetworks = new ArrayList(); - - List routerNics = _nicDao.listByVmId(profile.getId()); - for (Nic routerNic : routerNics) { - Network network = _networkMgr.getNetwork(routerNic.getNetworkId()); - if (network.getTrafficType() == TrafficType.Guest) { - guestNetworks.add(network); - } - } - - answer = cmds.getAnswer("getDomRVersion"); - if (answer != null && answer instanceof GetDomRVersionAnswer) { - GetDomRVersionAnswer versionAnswer = (GetDomRVersionAnswer)answer; - if (answer == null || !answer.getResult()) { - s_logger.warn("Unable to get the template/scripts version of router " + router.getInstanceName() + - " due to: " + versionAnswer.getDetails()); - result = false; - } else { - router.setTemplateVersion(versionAnswer.getTemplateVersion()); - router.setScriptsVersion(versionAnswer.getScriptsVersion()); - router = _routerDao.persist(router, guestNetworks); - } - } else { - result = false; - } - - return result; - } - - @Override - public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { - if (answer != null) { - VMInstanceVO vm = profile.getVirtualMachine(); - DomainRouterVO domR = _routerDao.findById(vm.getId()); - processStopOrRebootAnswer(domR, answer); - } - } - - @Override - public void finalizeExpunge(DomainRouterVO vm) { - } - - - @Override - public boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List routers) - throws ResourceUnavailableException { - if (routers == null || routers.isEmpty()) { - s_logger.warn("Failed to start remote access VPN: no router found for account and zone"); - throw new ResourceUnavailableException("Failed to start remote access VPN: no router found for account and zone", - DataCenter.class, network.getDataCenterId()); - } - - for (VirtualRouter router : routers) { - if (router.getState() != State.Running) { - s_logger.warn("Failed to start remote access VPN: router not in right state " + router.getState()); - throw new ResourceUnavailableException("Failed to start remote access VPN: router not in right state " - + router.getState(), DataCenter.class, network.getDataCenterId()); - } - - Commands cmds = new Commands(OnError.Stop); - createApplyVpnCommands(vpn, router, cmds); - - try { - _agentMgr.send(router.getHostId(), cmds); - } catch (OperationTimedoutException e) { - s_logger.debug("Failed to start remote access VPN: ", e); - throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e); - } - Answer answer = cmds.getAnswer("users"); - if (!answer.getResult()) { - s_logger.error("Unable to start vpn: unable add users to vpn in zone " + router.getDataCenterIdToDeployIn() - + " for account " + vpn.getAccountId() + " on domR: " + router.getInstanceName() - + " due to " + answer.getDetails()); - throw new ResourceUnavailableException("Unable to start vpn: Unable to add users to vpn in zone " + - router.getDataCenterIdToDeployIn() + " for account " + vpn.getAccountId() + " on domR: " - + router.getInstanceName() + " due to " + answer.getDetails(), DataCenter.class, router.getDataCenterIdToDeployIn()); - } - answer = cmds.getAnswer("startVpn"); - if (!answer.getResult()) { - s_logger.error("Unable to start vpn in zone " + router.getDataCenterIdToDeployIn() + " for account " + - vpn.getAccountId() + " on domR: " + router.getInstanceName() + " due to " - + answer.getDetails()); - throw new ResourceUnavailableException("Unable to start vpn in zone " + router.getDataCenterIdToDeployIn() - + " for account " + vpn.getAccountId() + " on domR: " + router.getInstanceName() - + " due to " + answer.getDetails(), DataCenter.class, router.getDataCenterIdToDeployIn()); - } - - } - return true; - } - - - @Override - public boolean deleteRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List routers) - throws ResourceUnavailableException { - if (routers == null || routers.isEmpty()) { - s_logger.warn("Failed to delete remote access VPN: no router found for account and zone"); - throw new ResourceUnavailableException("Failed to delete remote access VPN", DataCenter.class, network.getDataCenterId()); - } - - boolean result = true; - for (VirtualRouter router : routers) { - if (router.getState() == State.Running) { - Commands cmds = new Commands(OnError.Continue); - IpAddress ip = _networkMgr.getIp(vpn.getServerAddressId()); - - RemoteAccessVpnCfgCommand removeVpnCmd = new RemoteAccessVpnCfgCommand(false, ip.getAddress().addr(), - vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); - removeVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - removeVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(network.getId(), router.getId())); - removeVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - removeVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand(removeVpnCmd); - - result = result && sendCommandsToRouter(router, cmds); - } else if (router.getState() == State.Stopped) { - s_logger.debug("Router " + router + " is in Stopped state, not sending deleteRemoteAccessVpn command to it"); - continue; - } else { - s_logger.warn("Failed to delete remote access VPN: domR " + router + " is not in right state " + router.getState()); - throw new ResourceUnavailableException("Failed to delete remote access VPN: domR is not in right state " + - router.getState(), DataCenter.class, network.getDataCenterId()); - } - } - - return result; - } - - - private DomainRouterVO start(DomainRouterVO router, User user, Account caller, Map params, DeploymentPlan planToDeploy) - throws StorageUnavailableException, InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - s_logger.debug("Starting router " + router); - if (_itMgr.start(router, params, user, caller, planToDeploy) != null) { - return _routerDao.findById(router.getId()); - } else { - return null; - } - } - - @Override - public DomainRouterVO stop(VirtualRouter router, boolean forced, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { - s_logger.debug("Stopping router " + router); - try { - if (_itMgr.advanceStop((DomainRouterVO) router, forced, user, caller)) { - return _routerDao.findById(router.getId()); - } else { - return null; - } - } catch (OperationTimedoutException e) { - throw new CloudRuntimeException("Unable to stop " + router, e); - } - } - - @Override - public boolean applyDhcpEntry(Network network, final NicProfile nic, VirtualMachineProfile profile, - DeployDestination dest, List routers) - throws ResourceUnavailableException { - _userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine()); - - final VirtualMachineProfile updatedProfile = profile; - final boolean isZoneBasic = (dest.getDataCenter().getNetworkType() == NetworkType.Basic); - final Long podId = isZoneBasic ? dest.getPod().getId() : null; - - boolean podLevelException = false; - //for user vm in Basic zone we should try to re-deploy vm in a diff pod if it fails to deploy in original pod; so throwing exception with Pod scope - if (isZoneBasic && podId != null && updatedProfile.getVirtualMachine().getType() == VirtualMachine.Type.User - && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Shared) { - podLevelException = true; - } - - return applyRules(network, routers, "dhcp entry", podLevelException, podId, true, new RuleApplier() { - @Override - public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { - //for basic zone, send dhcp/dns information to all routers in the basic network only when _dnsBasicZoneUpdates is set to "all" value - Commands cmds = new Commands(OnError.Stop); - if (!(isZoneBasic && router.getPodIdToDeployIn().longValue() != podId.longValue() && _dnsBasicZoneUpdates.equalsIgnoreCase("pod"))) { - NicVO nicVo = _nicDao.findById(nic.getId()); - createDhcpEntryCommand(router, updatedProfile.getVirtualMachine(), nicVo, cmds); - return sendCommandsToRouter(router, cmds); - } - return true; - } - }); - } - - private String findDefaultDnsIp(long userVmId) { - NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId); - - //check if DNS provider is the domR - if (!_networkMgr.isProviderSupportServiceInNetwork(defaultNic.getNetworkId(), Service.Dns, Provider.VirtualRouter)) { - return null; - } - - NetworkOfferingVO offering = _networkOfferingDao.findById(_networkDao.findById(defaultNic.getNetworkId()).getNetworkOfferingId()); - if (offering.getRedundantRouter()) { - return findGatewayIp(userVmId); - } - - //find domR's nic in the network - NicVO domrDefaultNic = _nicDao.findByNetworkIdAndType(defaultNic.getNetworkId(), VirtualMachine.Type.DomainRouter); - return domrDefaultNic.getIp4Address(); - } - - private String findGatewayIp(long userVmId) { - NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId); - return defaultNic.getGateway(); - } - - @Override - public boolean applyUserData(Network network, final NicProfile nic, VirtualMachineProfile profile, DeployDestination dest, List routers) - throws ResourceUnavailableException { - _userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine()); - - final VirtualMachineProfile updatedProfile = profile; - final boolean isZoneBasic = (dest.getDataCenter().getNetworkType() == NetworkType.Basic); - final Long podId = isZoneBasic ? dest.getPod().getId() : null; - - boolean podLevelException = false; - //for user vm in Basic zone we should try to re-deploy vm in a diff pod if it fails to deploy in original pod; so throwing exception with Pod scope - if (isZoneBasic && podId != null && updatedProfile.getVirtualMachine().getType() == VirtualMachine.Type.User - && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Shared) { - podLevelException = true; - } - - return applyRules(network, routers, "userdata and password entry", podLevelException, podId, false, new RuleApplier() { - @Override - public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { - //for basic zone, send vm data/password information only to the router in the same pod - Commands cmds = new Commands(OnError.Stop); - if (!(isZoneBasic && router.getPodIdToDeployIn().longValue() != podId.longValue())) { - NicVO nicVo = _nicDao.findById(nic.getId()); - createPasswordCommand(router, updatedProfile, nicVo, cmds); - createVmDataCommand(router, updatedProfile.getVirtualMachine(), nicVo, updatedProfile.getVirtualMachine().getDetail("SSH.PublicKey"), cmds); - return sendCommandsToRouter(router, cmds); - } - return true; - } - }); - } - - @Override - public DomainRouterVO persist(DomainRouterVO router) { - DomainRouterVO virtualRouter = _routerDao.persist(router); - return virtualRouter; - } - - @Override - //FIXME add partial success and STOP state support - public String[] applyVpnUsers(Network network, List users, List routers) throws ResourceUnavailableException { - if (routers == null || routers.isEmpty()) { - s_logger.warn("Failed to add/remove VPN users: no router found for account and zone"); - throw new ResourceUnavailableException("Unable to assign ip addresses, domR doesn't exist for network " + - network.getId(), DataCenter.class, network.getDataCenterId()); - } - - boolean agentResults = true; - - for (DomainRouterVO router : routers) { - if (router.getState() != State.Running) { - s_logger.warn("Failed to add/remove VPN users: router not in running state"); - throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + - router.getState(), DataCenter.class, network.getDataCenterId()); - } - - Commands cmds = new Commands(OnError.Continue); - List addUsers = new ArrayList(); - List removeUsers = new ArrayList(); - for (VpnUser user : users) { - if (user.getState() == VpnUser.State.Add || user.getState() == VpnUser.State.Active) { - addUsers.add(user); - } else if (user.getState() == VpnUser.State.Revoke) { - removeUsers.add(user); - } - } - - VpnUsersCfgCommand cmd = new VpnUsersCfgCommand(addUsers, removeUsers); - cmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(router.getAccountId())); - cmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_CIDR, network.getCidr()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(network.getId(), router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand(cmd); - - - // Currently we receive just one answer from the agent. In the future we have to parse individual answers and set - // results accordingly - boolean agentResult = sendCommandsToRouter(router, cmds); - agentResults = agentResults && agentResult; - } - - String[] result = new String[users.size()]; - for (int i = 0; i < result.length; i++) { - if (agentResults) { - result[i] = null; - } else { - result[i] = String.valueOf(agentResults); - } - } - - return result; - } - - @Override - public DomainRouterVO findById(long id) { - return _routerDao.findById(id); - } - - @Override - public DomainRouterVO findByName(String name) { - if (!VirtualMachineName.isValidRouterName(name)) { - return null; - } - - return _routerDao.findById(VirtualMachineName.getRouterId(name)); - } - - @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_START, eventDescription = "starting router Vm", async = true) - public VirtualRouter startRouter(long id) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException{ - return startRouter(id, true); - } - - @Override - public VirtualRouter startRouter(long routerId, boolean reprogramNetwork) throws ResourceUnavailableException, - InsufficientCapacityException, ConcurrentOperationException { - Account caller = UserContext.current().getCaller(); - User callerUser = _accountMgr.getActiveUser(UserContext.current().getCallerUserId()); - - // verify parameters - DomainRouterVO router = _routerDao.findById(routerId); - if (router == null) { - throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); - } - _accountMgr.checkAccess(caller, null, true, router); - - Account owner = _accountMgr.getAccount(router.getAccountId()); - - // Check if all networks are implemented for the domR; if not - implement them - DataCenter dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); - HostPodVO pod = null; - if (router.getPodIdToDeployIn() != null) { - pod = _podDao.findById(router.getPodIdToDeployIn()); - } - DeployDestination dest = new DeployDestination(dc, pod, null, null); - - ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner); - - List nics = _nicDao.listByVmId(routerId); - - for (NicVO nic : nics) { - if (!_networkMgr.startNetwork(nic.getNetworkId(), dest, context)) { - s_logger.warn("Failed to start network id=" + nic.getNetworkId() + " as a part of domR start"); - throw new CloudRuntimeException("Failed to start network id=" + nic.getNetworkId() + " as a part of domR start"); - } - } - - UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); - Map params = new HashMap(); - if (reprogramNetwork) { - params.put(Param.ReProgramGuestNetworks, true); - } else { - params.put(Param.ReProgramGuestNetworks, false); - } - VirtualRouter virtualRouter = startVirtualRouter(router, user, caller, params); - if(virtualRouter == null){ - throw new CloudRuntimeException("Failed to start router with id " + routerId); - } - return virtualRouter; - } - - private void createAssociateIPCommands(final VirtualRouter router, final List ips, Commands cmds, long vmId) { - - // Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc.. - Map> vlanIpMap = new HashMap>(); - for (final PublicIpAddress ipAddress : ips) { - String vlanTag = ipAddress.getVlanTag(); - ArrayList ipList = vlanIpMap.get(vlanTag); - if (ipList == null) { - ipList = new ArrayList(); - } - //domR doesn't support release for sourceNat IP address; so reset the state - if (ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) { - ipAddress.setState(IpAddress.State.Allocated); - } - ipList.add(ipAddress); - vlanIpMap.put(vlanTag, ipList); - } - - for (Map.Entry> vlanAndIp : vlanIpMap.entrySet()) { - List ipAddrList = vlanAndIp.getValue(); - // Source nat ip address should always be sent first - Collections.sort(ipAddrList, new Comparator() { - @Override - public int compare(PublicIpAddress o1, PublicIpAddress o2) { - boolean s1 = o1.isSourceNat(); - boolean s2 = o2.isSourceNat(); - return (s1 ^ s2) ? ((s1 ^ true) ? 1 : -1) : 0; - } - }); - - // Get network rate - required for IpAssoc - Integer networkRate = _networkMgr.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId()); - Network network = _networkMgr.getNetwork(ipAddrList.get(0).getNetworkId()); - - IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()]; - int i = 0; - boolean firstIP = true; - - for (final PublicIpAddress ipAddr : ipAddrList) { - - boolean add = (ipAddr.getState() == IpAddress.State.Releasing ? false : true); - boolean sourceNat = ipAddr.isSourceNat(); - /* enable sourceNAT for the first ip of the public interface */ - if (firstIP) { - sourceNat = true; - } - String vlanId = ipAddr.getVlanTag(); - String vlanGateway = ipAddr.getGateway(); - String vlanNetmask = ipAddr.getNetmask(); - String vifMacAddress = ipAddr.getMacAddress(); - - String vmGuestAddress = null; - - IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, - sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress, networkRate, ipAddr.isOneToOneNat()); - - ip.setTrafficType(network.getTrafficType()); - ip.setNetworkName(_networkMgr.getNetworkTag(router.getHypervisorType(), network)); - ipsToSend[i++] = ip; - /* send the firstIP = true for the first Add, this is to create primary on interface*/ - if (!firstIP || add) { - firstIP = false; - } - } - IpAssocCommand cmd = new IpAssocCommand(ipsToSend); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand("IPAssocCommand", cmd); - } - } - - private void createApplyPortForwardingRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { - List rulesTO = null; - if (rules != null) { - rulesTO = new ArrayList(); - for (PortForwardingRule rule : rules) { - IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); - PortForwardingRuleTO ruleTO = new PortForwardingRuleTO(rule, null, sourceIp.getAddress().addr()); - rulesTO.add(ruleTO); - } - } - - SetPortForwardingRulesCommand cmd = null; - - if (router.getVpcId() != null) { - cmd = new SetPortForwardingRulesVpcCommand(rulesTO); - } else { - cmd = new SetPortForwardingRulesCommand(rulesTO); - } - - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand(cmd); - } - - private void createApplyStaticNatRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { - List rulesTO = null; - if (rules != null) { - rulesTO = new ArrayList(); - for (StaticNatRule rule : rules) { - IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); - StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, null, sourceIp.getAddress().addr(), rule.getDestIpAddress()); - rulesTO.add(ruleTO); - } - } - - SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, router.getVpcId()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - cmds.addCommand(cmd); - } - - private void createApplyLoadBalancingRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { - - LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; - int i = 0; - for (LoadBalancingRule rule : rules) { - boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); - String protocol = rule.getProtocol(); - String algorithm = rule.getAlgorithm(); - - String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr(); - int srcPort = rule.getSourcePortStart(); - List destinations = rule.getDestinations(); - List stickinessPolicies = rule.getStickinessPolicies(); - LoadBalancerTO lb = new LoadBalancerTO(srcIp, srcPort, protocol, algorithm, revoked, false, destinations, stickinessPolicies); - lbs[i++] = lb; - } - String routerPublicIp = null; - - if (router instanceof DomainRouterVO) { - DomainRouterVO domr = _routerDao.findById(router.getId()); - routerPublicIp = domr.getPublicIpAddress(); - } - - Network guestNetwork = _networkMgr.getNetwork(guestNetworkId); - Nic nic = _nicDao.findByInstanceIdAndNetworkId(guestNetwork.getId(), router.getId()); - NicProfile nicProfile = new NicProfile(nic, guestNetwork, nic.getBroadcastUri(), nic.getIsolationUri(), - _networkMgr.getNetworkRate(guestNetwork.getId(), router.getId()), - _networkMgr.isSecurityGroupSupportedInNetwork(guestNetwork), - _networkMgr.getNetworkTag(router.getHypervisorType(), guestNetwork)); - - LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs,routerPublicIp, - getRouterIpInNetwork(guestNetworkId, router.getId()),router.getPrivateIpAddress(), - _itMgr.toNicTO(nicProfile, router.getHypervisorType()), router.getVpcId()); - - cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key()); - cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key()); - cmd.lbStatsAuth = _configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key()); - cmd.lbStatsPort = _configDao.getValue(Config.NetworkLBHaproxyStatsPort.key()); - - - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - cmds.addCommand(cmd); - - } - - private void createApplyVpnCommands(RemoteAccessVpn vpn, VirtualRouter router, Commands cmds) { - List vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId()); - List addUsers = new ArrayList(); - List removeUsers = new ArrayList(); - for (VpnUser user : vpnUsers) { - if (user.getState() == VpnUser.State.Add) { - addUsers.add(user); - } else if (user.getState() == VpnUser.State.Revoke) { - removeUsers.add(user); - } - } - - VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(addUsers, removeUsers); - addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(vpn.getNetworkId(), router.getId())); - addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - - IpAddress ip = _networkMgr.getIp(vpn.getServerAddressId()); - - RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(true, ip.getAddress().addr(), - vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); - startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(vpn.getNetworkId(), router.getId())); - startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - startVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand("users", addUsersCmd); - cmds.addCommand("startVpn", startVpnCmd); - } - - private void createPasswordCommand(VirtualRouter router, VirtualMachineProfile profile, NicVO nic, Commands cmds) { - String password = (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - - // password should be set only on default network element - if (password != null && nic.isDefaultNic()) { - final String encodedPassword = PasswordGenerator.rot13(password); - SavePasswordCommand cmd = new SavePasswordCommand(encodedPassword, nic.getIp4Address(), profile.getVirtualMachine().getHostName()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(nic.getNetworkId(), router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand("password", cmd); - } - - } - - private void createVmDataCommand(VirtualRouter router, UserVm vm, NicVO nic, String publicKey, Commands cmds) { - String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId()).getDisplayText(); - String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName(); - cmds.addCommand("vmdata", - generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), - vm.getHostName(), vm.getInstanceName(), vm.getId(), publicKey, nic.getNetworkId())); - - } - - private void createVmDataCommandForVMs(DomainRouterVO router, Commands cmds, long guestNetworkId) { - List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, State.Migrating, State.Stopping); - DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); - for (UserVmVO vm : vms) { - boolean createVmData = true; - if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) { - createVmData = false; - } - - if (createVmData) { - NicVO nic = _nicDao.findByInstanceIdAndNetworkId(guestNetworkId, vm.getId()); - if (nic != null) { - s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router); - createVmDataCommand(router, vm, nic, null, cmds); - } - } - } - } - - private void createDhcpEntryCommand(VirtualRouter router, UserVm vm, NicVO nic, Commands cmds) { - DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - String gatewayIp = findGatewayIp(vm.getId()); - if (!gatewayIp.equals(nic.getGateway())) { - GuestOSVO guestOS = _guestOSDao.findById(vm.getGuestOSId()); - // Don't set dhcp:router option for non-default nic on CentOS/RHEL, because they would set routing on wrong interface - // This is tricky, we may need to update this when we have more information on various OS's behavior - if (guestOS.getDisplayName().startsWith("CentOS") || guestOS.getDisplayName().startsWith("Red Hat Enterprise")) { - gatewayIp = "0.0.0.0"; - } - } - dhcpCommand.setDefaultRouter(gatewayIp); - dhcpCommand.setDefaultDns(findDefaultDnsIp(vm.getId())); - - dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(nic.getNetworkId(), router.getId())); - dhcpCommand.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - - cmds.addCommand("dhcp", dhcpCommand); - } - - private void createDhcpEntryCommandsForVMs(DomainRouterVO router, Commands cmds, long guestNetworkId) { - List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, State.Migrating, State.Stopping); - DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); - for (UserVmVO vm : vms) { - boolean createDhcp = true; - if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue() - && _dnsBasicZoneUpdates.equalsIgnoreCase("pod")) { - createDhcp = false; - } - if (createDhcp) { - NicVO nic = _nicDao.findByInstanceIdAndNetworkId(guestNetworkId, vm.getId()); - if (nic != null) { - s_logger.debug("Creating dhcp entry for vm " + vm + " on domR " + router + "."); - createDhcpEntryCommand(router, vm, nic, cmds); - } - } - } - } - - protected boolean sendCommandsToRouter(final VirtualRouter router, Commands cmds) throws AgentUnavailableException { - Answer[] answers = null; - try { - answers = _agentMgr.send(router.getHostId(), cmds); - } catch (OperationTimedoutException e) { - s_logger.warn("Timed Out", e); - throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e); - } - - if (answers == null) { - return false; - } - - if (answers.length != cmds.size()) { - return false; - } - - // FIXME: Have to return state for individual command in the future - boolean result = true; - if (answers.length > 0) { - for (Answer answer : answers) { - if (!answer.getResult()) { - result = false; - break; - } - } - } - return result; - } - - protected void handleSingleWorkingRedundantRouter(List connectedRouters, List disconnectedRouters, String reason) throws ResourceUnavailableException - { - if (connectedRouters.isEmpty() || disconnectedRouters.isEmpty()) { - return; - } - if (connectedRouters.size() != 1 || disconnectedRouters.size() != 1) { - s_logger.warn("How many redundant routers do we have?? "); - return; - } - if (!connectedRouters.get(0).getIsRedundantRouter()) { - throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", - DataCenter.class, connectedRouters.get(0).getDataCenterIdToDeployIn()); - } - if (!disconnectedRouters.get(0).getIsRedundantRouter()) { - throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", - DataCenter.class, disconnectedRouters.get(0).getDataCenterIdToDeployIn()); - } - - DomainRouterVO connectedRouter = (DomainRouterVO)connectedRouters.get(0); - DomainRouterVO disconnectedRouter = (DomainRouterVO)disconnectedRouters.get(0); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("About to stop the router " + disconnectedRouter.getInstanceName() + " due to: " + reason); - } - String title = "Virtual router " + disconnectedRouter.getInstanceName() + " would be stopped after connecting back, due to " + reason; - String context = "Virtual router (name: " + disconnectedRouter.getInstanceName() + ", id: " + disconnectedRouter.getId() + ") would be stopped after connecting back, due to: " + reason; - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, - disconnectedRouter.getDataCenterIdToDeployIn(), disconnectedRouter.getPodIdToDeployIn(), title, context); - disconnectedRouter.setStopPending(true); - disconnectedRouter = _routerDao.persist(disconnectedRouter); - - int connRouterPR = getRealPriority(connectedRouter); - int disconnRouterPR = getRealPriority(disconnectedRouter); - if (connRouterPR < disconnRouterPR) { - //connRouterPR < disconnRouterPR, they won't equal at anytime - if (!connectedRouter.getIsPriorityBumpUp()) { - final BumpUpPriorityCommand command = new BumpUpPriorityCommand(); - command.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(connectedRouter.getId())); - command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, connectedRouter.getInstanceName()); - final Answer answer = _agentMgr.easySend(connectedRouter.getHostId(), command); - if (!answer.getResult()) { - s_logger.error("Failed to bump up " + connectedRouter.getInstanceName() + "'s priority! " + answer.getDetails()); - } - } else { - String t = "Can't bump up virtual router " + connectedRouter.getInstanceName() + "'s priority due to it's already bumped up!"; - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, - connectedRouter.getDataCenterIdToDeployIn(), connectedRouter.getPodIdToDeployIn(), t, t); - } - } - } - - @Override - public boolean associatePublicIP(Network network, final List ipAddress, List routers) - throws ResourceUnavailableException { - if (ipAddress == null || ipAddress.isEmpty()) { - s_logger.debug("No ip association rules to be applied for network " + network.getId()); - return true; - } - return applyRules(network, routers, "ip association", false, null, false, new RuleApplier() { - @Override - public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createAssociateIPCommands(router, ipAddress, cmds, 0); - return sendCommandsToRouter(router, cmds); - } - }); - } - - @Override - public boolean applyFirewallRules(Network network, final List rules, List routers) throws ResourceUnavailableException { - if (rules == null || rules.isEmpty()) { - s_logger.debug("No firewall rules to be applied for network " + network.getId()); - return true; - } - return applyRules(network, routers, "firewall rules", false, null, false, new RuleApplier() { - @Override - public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { - if (rules.get(0).getPurpose() == Purpose.LoadBalancing) { - // for load balancer we have to resend all lb rules for the network - List lbs = _loadBalancerDao.listByNetworkId(network.getId()); - List lbRules = new ArrayList(); - for (LoadBalancerVO lb : lbs) { - List dstList = _lbMgr.getExistingDestinations(lb.getId()); - List policyList = _lbMgr.getStickinessPolicies(lb.getId()); - LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList,policyList); - lbRules.add(loadBalancing); - } - return sendLBRules(router, lbRules, network.getId()); - } else if (rules.get(0).getPurpose() == Purpose.PortForwarding) { - return sendPortForwardingRules(router, (List) rules, network.getId()); - } else if (rules.get(0).getPurpose() == Purpose.StaticNat) { - return sendStaticNatRules(router, (List) rules, network.getId()); - } else if (rules.get(0).getPurpose() == Purpose.Firewall) { - return sendFirewallRules(router, (List) rules, network.getId()); - } else { - s_logger.warn("Unable to apply rules of purpose: " + rules.get(0).getPurpose()); - return false; - } - } - }); - } - - protected boolean sendLBRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createApplyLoadBalancingRulesCommands(rules, router, cmds, guestNetworkId); - return sendCommandsToRouter(router, cmds); - } - - protected boolean sendPortForwardingRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createApplyPortForwardingRulesCommands(rules, router, cmds, guestNetworkId); - return sendCommandsToRouter(router, cmds); - } - - protected boolean sendStaticNatRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createApplyStaticNatRulesCommands(rules, router, cmds, guestNetworkId); - return sendCommandsToRouter(router, cmds); - } - - @Override - public List getRoutersForNetwork(long networkId) { - List routers = _routerDao.findByNetwork(networkId); - List vrs = new ArrayList(routers.size()); - for (DomainRouterVO router : routers) { - vrs.add(router); - } - return vrs; - } - - private void createFirewallRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { - List rulesTO = null; - if (rules != null) { - rulesTO = new ArrayList(); - for (FirewallRule rule : rules) { - IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); - FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, sourceIp.getAddress().addr()); - rulesTO.add(ruleTO); - } - } - - SetFirewallRulesCommand cmd = new SetFirewallRulesCommand(rulesTO); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - cmds.addCommand(cmd); - } - - - protected boolean sendFirewallRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createFirewallRulesCommands(rules, router, cmds, guestNetworkId); - return sendCommandsToRouter(router, cmds); - } - - @Override - public String getDnsBasicZoneUpdate() { - return _dnsBasicZoneUpdates; - } - - protected interface RuleApplier { - boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException; - } - - protected boolean applyRules(Network network, List routers, String typeString, - boolean isPodLevelException, Long podId, boolean failWhenDisconnect, RuleApplier applier) throws ResourceUnavailableException { - if (routers == null || routers.isEmpty()) { - s_logger.warn("Unable to apply " + typeString + ", virtual router doesn't exist in the network " + network.getId()); - throw new ResourceUnavailableException("Unable to apply " + typeString , DataCenter.class, network.getDataCenterId()); - } - - DataCenter dc = _dcDao.findById(network.getDataCenterId()); - boolean isZoneBasic = (dc.getNetworkType() == NetworkType.Basic); - - // isPodLevelException and podId is only used for basic zone - assert !((!isZoneBasic && isPodLevelException) || (isZoneBasic && isPodLevelException && podId == null)); - - List connectedRouters = new ArrayList(); - List disconnectedRouters = new ArrayList(); - boolean result = true; - String msg = "Unable to apply " + typeString + " on disconnected router "; - for (VirtualRouter router : routers) { - if (router.getState() == State.Running) { - s_logger.debug("Applying " + typeString + " in network " + network); - - if (router.isStopPending()) { - if (_hostDao.findById(router.getHostId()).getStatus() == Status.Up) { - throw new ResourceUnavailableException("Unable to process due to the stop pending router " + - router.getInstanceName() + " haven't been stopped after it's host coming back!", - DataCenter.class, router.getDataCenterIdToDeployIn()); - } - s_logger.debug("Router " + router.getInstanceName() + " is stop pending, so not sending apply " + - typeString + " commands to the backend"); - continue; - } - try { - result = applier.execute(network, router); - connectedRouters.add(router); - } catch (AgentUnavailableException e) { - s_logger.warn(msg + router.getInstanceName(), e); - disconnectedRouters.add(router); - } - - //If rules fail to apply on one domR and not due to disconnection, no need to proceed with the rest - if (!result) { - if (isZoneBasic && isPodLevelException) { - throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", Pod.class, podId); - } - throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", DataCenter.class, - router.getDataCenterIdToDeployIn()); - } - - } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { - s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + - ", so not sending apply " + typeString + " commands to the backend"); - } else { - s_logger.warn("Unable to apply " + typeString +", virtual router is not in the right state " + router.getState()); - if (isZoneBasic && isPodLevelException) { - throw new ResourceUnavailableException("Unable to apply " + typeString + - ", virtual router is not in the right state", Pod.class, podId); - } - throw new ResourceUnavailableException("Unable to apply " + typeString + - ", virtual router is not in the right state", DataCenter.class, router.getDataCenterIdToDeployIn()); - } - } - - if (!connectedRouters.isEmpty()) { - if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) { - // These disconnected redundant virtual routers are out of sync now, stop them for synchronization - handleSingleWorkingRedundantRouter(connectedRouters, disconnectedRouters, msg); - } - } else if (!disconnectedRouters.isEmpty()) { - for (VirtualRouter router : disconnectedRouters) { - if (s_logger.isDebugEnabled()) { - s_logger.debug(msg + router.getInstanceName() + "(" + router.getId() + ")"); - } - } - if (isZoneBasic && isPodLevelException) { - throw new ResourceUnavailableException(msg, Pod.class, podId); - } - throw new ResourceUnavailableException(msg, DataCenter.class, disconnectedRouters.get(0).getDataCenterIdToDeployIn()); - } - - result = true; - if (failWhenDisconnect) { - result = !connectedRouters.isEmpty(); - } - return result; - } - - @Override - public boolean applyStaticNats(Network network, final List rules, List routers) throws ResourceUnavailableException { - if (rules == null || rules.isEmpty()) { - s_logger.debug("No static nat rules to be applied for network " + network.getId()); - return true; - } - return applyRules(network, routers, "static nat rules", false, null, false, new RuleApplier() { - @Override - public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { - return applyStaticNat(router, rules, network.getId()); - } - }); - } - - - protected boolean applyStaticNat(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { - Commands cmds = new Commands(OnError.Continue); - createApplyStaticNatCommands(rules, router, cmds, guestNetworkId); - return sendCommandsToRouter(router, cmds); - } - - private void createApplyStaticNatCommands(List rules, VirtualRouter router, Commands cmds, - long guestNetworkId) { - List rulesTO = null; - if (rules != null) { - rulesTO = new ArrayList(); - for (StaticNat rule : rules) { - IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); - StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, - null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), false); - rulesTO.add(ruleTO); - } - } - - SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, router.getVpcId()); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); - cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); - cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); - cmds.addCommand(cmd); - } - - @Override - public int getTimeout() { - return -1; - } - - @Override - public boolean isRecurring() { - return false; - } - - @Override - public boolean processAnswers(long agentId, long seq, Answer[] answers) { - return false; - } - - @Override - public boolean processCommands(long agentId, long seq, Command[] commands) { - return false; - } - - @Override - public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { - UserContext context = UserContext.current(); - context.setAccountId(1); - List routers = _routerDao.listIsolatedByHostId(host.getId()); - for (DomainRouterVO router : routers) { - if (router.isStopPending()) { - State state = router.getState(); - if (state != State.Stopped && state != State.Destroyed) { - try { - stopRouter(router.getId(), false); - } catch (ResourceUnavailableException e) { - s_logger.warn("Fail to stop router " + router.getInstanceName(), e); - throw new ConnectionException(false, "Fail to stop router " + router.getInstanceName()); - } catch (ConcurrentOperationException e) { - s_logger.warn("Fail to stop router " + router.getInstanceName(), e); - throw new ConnectionException(false, "Fail to stop router " + router.getInstanceName()); - } - } - router.setStopPending(false); - router = _routerDao.persist(router); - } - } - } - - @Override - public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { - return null; - } - - @Override - - public boolean processDisconnect(long agentId, Status state) { - return false; - } - - @Override - public boolean processTimeout(long agentId, long seq) { - return false; - } - - protected String getRouterControlIp(long routerId) { - String routerControlIpAddress = null; - List nics = _nicDao.listByVmId(routerId); - for (NicVO n : nics) { - NetworkVO nc = _networkDao.findById(n.getNetworkId()); - if (nc.getTrafficType() == TrafficType.Control) { - routerControlIpAddress = n.getIp4Address(); - } - } - - if(routerControlIpAddress == null) { - s_logger.warn("Unable to find router's control ip in its attached NICs!. routerId: " + routerId); - DomainRouterVO router = _routerDao.findById(routerId); - return router.getPrivateIpAddress(); - } - - return routerControlIpAddress; - } - - - protected String getRouterIpInNetwork(long networkId, long instanceId) { - return _nicDao.getIpAddress(networkId, instanceId); - } - - - @Override - public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) - throws ConcurrentOperationException, ResourceUnavailableException, - InsufficientCapacityException { - //not supported - throw new UnsupportedOperationException("Plug nic is not supported for vm of type " + vm.getType()); - } - - @Override - public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) - throws ConcurrentOperationException, ResourceUnavailableException { - //not supported - throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); - } - - @Override - public void prepareStop(VirtualMachineProfile profile){ - //Collect network usage before stopping Vm - VMInstanceVO vm = profile.getVirtualMachine(); - DomainRouterVO router = _routerDao.findById(vm.getId()); - if(router == null){ - return; - } - String privateIP = router.getPrivateIpAddress(); - - if (privateIP != null) { - List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); - - for (Long guestNtwkId : routerGuestNtwkIds) { - boolean forVpc = router.getVpcId() != null; - Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); - Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); - NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), - guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), - _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), - _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); - final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), - forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); - UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - NetworkUsageAnswer answer = null; - try { - answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); - } catch (Exception e) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); - continue; - } - - if (answer != null) { - if (!answer.getResult()) { - s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); - continue; - } - Transaction txn = Transaction.open(Transaction.CLOUD_DB); - try { - if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { - s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); - continue; - } - txn.start(); - UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), - router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); - if (stats == null) { - s_logger.warn("unable to find stats for account: " + router.getAccountId()); - continue; - } - - if(previousStats != null - && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) - || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ - s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + - "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + - answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); - continue; - } - - if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesReceived() - + " Stored: " + stats.getCurrentBytesReceived()); - } - stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); - } - stats.setCurrentBytesReceived(answer.getBytesReceived()); - if (stats.getCurrentBytesSent() > answer.getBytesSent()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received # of bytes that's less than the last one. " + - "Assuming something went wrong and persisting it. Router: " + - answer.getRouterName()+" Reported: " + answer.getBytesSent() - + " Stored: " + stats.getCurrentBytesSent()); - } - stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); - } - stats.setCurrentBytesSent(answer.getBytesSent()); - _statsDao.update(stats.getId(), stats); - txn.commit(); - } catch (Exception e) { - txn.rollback(); - s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() - + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); - } finally { - txn.close(); - } - } - } - } - } - - @Override - public boolean recreateNeeded( - VirtualMachineProfile profile, long hostId, - Commands cmds, ReservationContext context) { - //asssume that if failed to ssh into router, meaning router is crashed - CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh"); - if (answer == null || !answer.getResult()) { - return true; - } - - return false; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.network.router; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TimeZone; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.AgentManager.OnError; +import com.cloud.agent.Listener; +import com.cloud.agent.api.AgentControlAnswer; +import com.cloud.agent.api.AgentControlCommand; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.BumpUpPriorityCommand; +import com.cloud.agent.api.CheckRouterAnswer; +import com.cloud.agent.api.CheckRouterCommand; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.GetDomRVersionAnswer; +import com.cloud.agent.api.GetDomRVersionCmd; +import com.cloud.agent.api.ModifySshKeysCommand; +import com.cloud.agent.api.NetworkUsageAnswer; +import com.cloud.agent.api.NetworkUsageCommand; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.StopAnswer; +import com.cloud.agent.api.check.CheckSshAnswer; +import com.cloud.agent.api.check.CheckSshCommand; +import com.cloud.agent.api.routing.DhcpEntryCommand; +import com.cloud.agent.api.routing.IpAssocCommand; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; +import com.cloud.agent.api.routing.RemoteAccessVpnCfgCommand; +import com.cloud.agent.api.routing.SavePasswordCommand; +import com.cloud.agent.api.routing.SetFirewallRulesCommand; +import com.cloud.agent.api.routing.SetPortForwardingRulesCommand; +import com.cloud.agent.api.routing.SetPortForwardingRulesVpcCommand; +import com.cloud.agent.api.routing.SetStaticNatRulesCommand; +import com.cloud.agent.api.routing.VmDataCommand; +import com.cloud.agent.api.routing.VpnUsersCfgCommand; +import com.cloud.agent.api.to.FirewallRuleTO; +import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.agent.api.to.NicTO; +import com.cloud.agent.api.to.PortForwardingRuleTO; +import com.cloud.agent.api.to.StaticNatRuleTO; +import com.cloud.agent.api.to.VirtualMachineTO; +import com.cloud.agent.manager.Commands; +import com.cloud.alert.AlertManager; +import com.cloud.api.commands.UpgradeRouterCmd; +import com.cloud.cluster.ManagementServerHostVO; +import com.cloud.cluster.ManagementServerNode; +import com.cloud.cluster.dao.ManagementServerHostDao; +import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.configuration.ZoneConfig; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.ClusterVO; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenter.NetworkType; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Pod; +import com.cloud.dc.dao.ClusterDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DataCenterDeployment; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.event.ActionEvent; +import com.cloud.event.EventTypes; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ConnectionException; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientServerCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.StorageUnavailableException; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.network.IPAddressVO; +import com.cloud.network.IpAddress; +import com.cloud.network.LoadBalancerVO; +import com.cloud.network.Network; +import com.cloud.network.Network.GuestType; +import com.cloud.network.Network.Provider; +import com.cloud.network.Network.Service; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; +import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.network.Networks.IsolationType; +import com.cloud.network.Networks.TrafficType; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.RemoteAccessVpn; +import com.cloud.network.SshKeysDistriMonitor; +import com.cloud.network.VirtualNetworkApplianceService; +import com.cloud.network.VirtualRouterProvider; +import com.cloud.network.VirtualRouterProvider.VirtualRouterProviderType; +import com.cloud.network.VpnUser; +import com.cloud.network.VpnUserVO; +import com.cloud.network.addr.PublicIp; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.LoadBalancerVMMapDao; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.RemoteAccessVpnDao; +import com.cloud.network.dao.Site2SiteCustomerGatewayDao; +import com.cloud.network.dao.Site2SiteVpnConnectionDao; +import com.cloud.network.dao.Site2SiteVpnGatewayDao; +import com.cloud.network.dao.VirtualRouterProviderDao; +import com.cloud.network.dao.VpnUserDao; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRule.LbDestination; +import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy; +import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.router.VirtualRouter.RedundantState; +import com.cloud.network.router.VirtualRouter.Role; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRule.Purpose; +import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.RulesManager; +import com.cloud.network.rules.StaticNat; +import com.cloud.network.rules.StaticNatImpl; +import com.cloud.network.rules.StaticNatRule; +import com.cloud.network.rules.dao.PortForwardingRulesDao; +import com.cloud.offering.ServiceOffering; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.resource.ResourceManager; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.GuestOSVO; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume.Type; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.User; +import com.cloud.user.UserContext; +import com.cloud.user.UserStatisticsVO; +import com.cloud.user.UserStatsLogVO; +import com.cloud.user.UserVO; +import com.cloud.user.dao.UserDao; +import com.cloud.user.dao.UserStatisticsDao; +import com.cloud.user.dao.UserStatsLogDao; +import com.cloud.uservm.UserVm; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.PasswordGenerator; +import com.cloud.utils.StringUtils; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.Inject; +import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.MacAddress; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.ReservationContextImpl; +import com.cloud.vm.UserVmVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.VirtualMachineGuru; +import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.VirtualMachineProfile.Param; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.UserVmDao; +import com.cloud.vm.dao.UserVmDetailsDao; + +/** + * VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances available in the Cloud Stack. + */ +@Local(value = { VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class }) +public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService, + VirtualMachineGuru, Listener { + private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class); + + String _name; + @Inject + DataCenterDao _dcDao = null; + @Inject + VlanDao _vlanDao = null; + @Inject + FirewallRulesDao _rulesDao = null; + @Inject + LoadBalancerDao _loadBalancerDao = null; + @Inject + LoadBalancerVMMapDao _loadBalancerVMMapDao = null; + @Inject + IPAddressDao _ipAddressDao = null; + @Inject + VMTemplateDao _templateDao = null; + @Inject + DomainRouterDao _routerDao = null; + @Inject + UserDao _userDao = null; + @Inject + UserStatisticsDao _userStatsDao = null; + @Inject + HostDao _hostDao = null; + @Inject + ConfigurationDao _configDao; + @Inject + HostPodDao _podDao = null; + @Inject + UserStatsLogDao _userStatsLogDao = null; + @Inject + AgentManager _agentMgr; + @Inject + AlertManager _alertMgr; + @Inject + AccountManager _accountMgr; + @Inject + ConfigurationManager _configMgr; + @Inject + ServiceOfferingDao _serviceOfferingDao = null; + @Inject + UserVmDao _userVmDao; + @Inject + UserStatisticsDao _statsDao = null; + @Inject + NetworkOfferingDao _networkOfferingDao = null; + @Inject + GuestOSDao _guestOSDao = null; + @Inject + NetworkManager _networkMgr; + @Inject + VirtualMachineManager _itMgr; + @Inject + VpnUserDao _vpnUsersDao; + @Inject + RemoteAccessVpnDao _remoteAccessVpnDao; + @Inject + RulesManager _rulesMgr; + @Inject + NetworkDao _networkDao; + @Inject + LoadBalancingRulesManager _lbMgr; + @Inject + PortForwardingRulesDao _pfRulesDao; + @Inject + RemoteAccessVpnDao _vpnDao; + @Inject + NicDao _nicDao; + @Inject + VolumeDao _volumeDao = null; + @Inject + UserVmDetailsDao _vmDetailsDao; + @Inject + ClusterDao _clusterDao; + @Inject + ResourceManager _resourceMgr; + @Inject + PhysicalNetworkServiceProviderDao _physicalProviderDao; + @Inject + VirtualRouterProviderDao _vrProviderDao; + @Inject + ManagementServerHostDao _msHostDao; + @Inject + Site2SiteCustomerGatewayDao _s2sCustomerGatewayDao; + @Inject + Site2SiteVpnGatewayDao _s2sVpnGatewayDao; + @Inject + Site2SiteVpnConnectionDao _s2sVpnConnectionDao; + + int _routerRamSize; + int _routerCpuMHz; + int _retry = 2; + String _instance; + String _mgmt_host; + String _mgmt_cidr; + + int _routerStatsInterval = 300; + int _routerCheckInterval = 30; + protected ServiceOfferingVO _offering; + private String _dnsBasicZoneUpdates = "all"; + + private boolean _disable_rp_filter = false; + int _routerExtraPublicNics = 2; + private int _usageAggregationRange = 1440; + private String _usageTimeZone = "GMT"; + private final long mgmtSrvrId = MacAddress.getMacAddress().toLong(); + private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds + + ScheduledExecutorService _executor; + ScheduledExecutorService _checkExecutor; + ScheduledExecutorService _networkStatsUpdateExecutor; + + Account _systemAcct; + + @Override + public boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey) { + ModifySshKeysCommand cmd = new ModifySshKeysCommand(pubKey, prvKey); + final Answer answer = _agentMgr.easySend(hostId, cmd); + + if (answer != null) { + return true; + } else { + return false; + } + } + + @Override + public VirtualRouter destroyRouter(final long routerId) throws ResourceUnavailableException, ConcurrentOperationException { + UserContext context = UserContext.current(); + User user = _accountMgr.getActiveUser(context.getCallerUserId()); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Attempting to destroy router " + routerId); + } + + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + return null; + } + + _accountMgr.checkAccess(context.getCaller(), null, true, router); + + boolean result = _itMgr.expunge(router, user, _accountMgr.getAccount(router.getAccountId())); + + if (result) { + return router; + } + return null; + } + + @Override + @DB + public VirtualRouter upgradeRouter(UpgradeRouterCmd cmd) { + Long routerId = cmd.getId(); + Long serviceOfferingId = cmd.getServiceOfferingId(); + Account caller = UserContext.current().getCaller(); + + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + throw new InvalidParameterValueException("Unable to find router with id " + routerId); + } + + _accountMgr.checkAccess(caller, null, true, router); + + if (router.getServiceOfferingId() == serviceOfferingId) { + s_logger.debug("Router: " + routerId + "already has service offering: " + serviceOfferingId); + return _routerDao.findById(routerId); + } + + ServiceOffering newServiceOffering = _configMgr.getServiceOffering(serviceOfferingId); + if (newServiceOffering == null) { + throw new InvalidParameterValueException("Unable to find service offering with id " + serviceOfferingId); + } + + // check if it is a system service offering, if yes return with error as it cannot be used for user vms + if (!newServiceOffering.getSystemUse()) { + throw new InvalidParameterValueException("Cannot upgrade router vm to a non system service offering " + serviceOfferingId); + } + + // Check that the router is stopped + if (!router.getState().equals(State.Stopped)) { + s_logger.warn("Unable to upgrade router " + router.toString() + " in state " + router.getState()); + throw new InvalidParameterValueException("Unable to upgrade router " + router.toString() + " in state " + router.getState() + + "; make sure the router is stopped and not in an error state before upgrading."); + } + + ServiceOfferingVO currentServiceOffering = _serviceOfferingDao.findById(router.getServiceOfferingId()); + + // Check that the service offering being upgraded to has the same storage pool preference as the VM's current service + // offering + if (currentServiceOffering.getUseLocalStorage() != newServiceOffering.getUseLocalStorage()) { + throw new InvalidParameterValueException("Can't upgrade, due to new local storage status : " + + newServiceOffering.getUseLocalStorage() + " is different from " + + "curruent local storage status: " + currentServiceOffering.getUseLocalStorage()); + } + + router.setServiceOfferingId(serviceOfferingId); + if (_routerDao.update(routerId, router)) { + return _routerDao.findById(routerId); + } else { + throw new CloudRuntimeException("Unable to upgrade router " + routerId); + } + + } + + @Override + public boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List routers) throws ResourceUnavailableException { + if (routers == null || routers.isEmpty()) { + s_logger.warn("Unable save password, router doesn't exist in network " + network.getId()); + throw new CloudRuntimeException("Unable to save password to router"); + } + + UserVm userVm = profile.getVirtualMachine(); + String password = (String) profile.getParameter(Param.VmPassword); + String encodedPassword = PasswordGenerator.rot13(password); + DataCenter dc = _dcDao.findById(userVm.getDataCenterIdToDeployIn()); + + boolean result = true; + for (VirtualRouter router : routers) { + boolean sendPassword = true; + if (dc.getNetworkType() == NetworkType.Basic && userVm.getPodIdToDeployIn().longValue() != router.getPodIdToDeployIn().longValue()) { + sendPassword = false; + } + + if (sendPassword) { + Commands cmds = new Commands(OnError.Continue); + SavePasswordCommand cmd = new SavePasswordCommand(encodedPassword, nic.getIp4Address(), userVm.getHostName()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + cmds.addCommand("password", cmd); + + result = result && sendCommandsToRouter(router, cmds); + } + } + return result; + } + + @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_STOP, eventDescription = "stopping router Vm", async = true) + public VirtualRouter stopRouter(long routerId, boolean forced) throws ResourceUnavailableException, ConcurrentOperationException { + UserContext context = UserContext.current(); + Account account = context.getCaller(); + + // verify parameters + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); + } + + _accountMgr.checkAccess(account, null, true, router); + + UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); + + VirtualRouter virtualRouter = stop(router, forced, user, account); + if(virtualRouter == null){ + throw new CloudRuntimeException("Failed to stop router with id " + routerId); + } + return virtualRouter; + } + + @DB + public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) { + final Transaction txn = Transaction.currentTxn(); + try { + txn.start(); + //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + for (Long guestNtwkId : routerGuestNtwkIds) { + final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterIdToDeployIn(), + guestNtwkId, null, router.getId(), router.getType().toString()); + if (userStats != null) { + final long currentBytesRcvd = userStats.getCurrentBytesReceived(); + userStats.setCurrentBytesReceived(0); + userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd); + + final long currentBytesSent = userStats.getCurrentBytesSent(); + userStats.setCurrentBytesSent(0); + userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent); + _userStatsDao.update(userStats.getId(), userStats); + s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop"); + } else { + s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterIdToDeployIn()); + } + } + + txn.commit(); + } catch (final Exception e) { + txn.rollback(); + throw new CloudRuntimeException("Problem updating stats after reboot/stop ", e); + } + } + + @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_REBOOT, eventDescription = "rebooting router Vm", async = true) + public VirtualRouter rebootRouter(long routerId, boolean reprogramNetwork) throws ConcurrentOperationException, + ResourceUnavailableException, InsufficientCapacityException { + Account caller = UserContext.current().getCaller(); + + // verify parameters + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + throw new InvalidParameterValueException("Unable to find domain router with id " + routerId + "."); + } + + _accountMgr.checkAccess(caller, null, true, router); + + // Can reboot domain router only in Running state + if (router == null || router.getState() != State.Running) { + s_logger.warn("Unable to reboot, virtual router is not in the right state " + router.getState()); + throw new ResourceUnavailableException("Unable to reboot domR, it is not in right state " + router.getState(), + DataCenter.class, router.getDataCenterIdToDeployIn()); + } + + UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); + s_logger.debug("Stopping and starting router " + router + " as a part of router reboot"); + + if (stop(router, false, user, caller) != null) { + return startRouter(routerId, reprogramNetwork); + } else { + throw new CloudRuntimeException("Failed to reboot router " + router); + } + } + + @Override + public boolean configure(final String name, final Map params) throws ConfigurationException { + _name = name; + + _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor")); + _checkExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterStatusMonitor")); + _networkStatsUpdateExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NetworkStatsUpdater")); + + final ComponentLocator locator = ComponentLocator.getCurrentLocator(); + + final Map configs = _configDao.getConfiguration("AgentManager", params); + + _mgmt_host = configs.get("host"); + _routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE); + _routerCpuMHz = NumbersUtil.parseInt(configs.get("router.cpu.mhz"), DEFAULT_ROUTER_CPU_MHZ); + + _routerExtraPublicNics = NumbersUtil.parseInt(_configDao.getValue(Config.RouterExtraPublicNics.key()), 2); + + String value = configs.get("start.retry"); + _retry = NumbersUtil.parseInt(value, 2); + + value = configs.get("router.stats.interval"); + _routerStatsInterval = NumbersUtil.parseInt(value, 300); + + value = configs.get("router.check.interval"); + _routerCheckInterval = NumbersUtil.parseInt(value, 30); + + _instance = configs.get("instance.name"); + if (_instance == null) { + _instance = "DEFAULT"; + } + + String rpValue = configs.get("network.disable.rpfilter"); + if (rpValue != null && rpValue.equalsIgnoreCase("true")) { + _disable_rp_filter = true; + } + + _dnsBasicZoneUpdates = String.valueOf(_configDao.getValue(Config.DnsBasicZoneUpdates.key())); + + s_logger.info("Router configurations: " + "ramsize=" + _routerRamSize); + + final UserStatisticsDao statsDao = locator.getDao(UserStatisticsDao.class); + if (statsDao == null) { + throw new ConfigurationException("Unable to get " + UserStatisticsDao.class.getName()); + } + + _agentMgr.registerForHostEvents(new SshKeysDistriMonitor(_agentMgr, _hostDao, _configDao), true, false, false); + _itMgr.registerGuru(VirtualMachine.Type.DomainRouter, this); + + boolean useLocalStorage = Boolean.parseBoolean(configs.get(Config.SystemVMUseLocalStorage.key())); + _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, _routerCpuMHz, null, + null, true, null, useLocalStorage, true, null, true, VirtualMachine.Type.DomainRouter, true); + _offering.setUniqueName(ServiceOffering.routerDefaultOffUniqueName); + _offering = _serviceOfferingDao.persistSystemServiceOffering(_offering); + + // this can sometimes happen, if DB is manually or programmatically manipulated + if(_offering == null) { + String msg = "Data integrity problem : System Offering For Software router VM has been removed?"; + s_logger.error(msg); + throw new ConfigurationException(msg); + } + + _systemAcct = _accountMgr.getSystemAccount(); + + String aggregationRange = configs.get("usage.stats.job.aggregation.range"); + _usageAggregationRange = NumbersUtil.parseInt(aggregationRange, 1440); + _usageTimeZone = configs.get("usage.aggregation.timezone"); + if(_usageTimeZone == null){ + _usageTimeZone = "GMT"; + } + + _agentMgr.registerForHostEvents(this, true, false, false); + + s_logger.info("DomainRouterManager is configured."); + + return true; + } + + @Override + public String getName() { + return _name; + } + + @Override + public boolean start() { + if (_routerStatsInterval > 0){ + _executor.scheduleAtFixedRate(new NetworkUsageTask(), _routerStatsInterval, _routerStatsInterval, TimeUnit.SECONDS); + }else{ + s_logger.debug("router.stats.interval - " + _routerStatsInterval+ " so not scheduling the router stats thread"); + } + + //Schedule Network stats update task + TimeZone usageTimezone = TimeZone.getTimeZone(_usageTimeZone); + Calendar cal = Calendar.getInstance(usageTimezone); + cal.setTime(new Date()); + long endDate = 0; + int HOURLY_TIME = 60; + final int DAILY_TIME = 60 * 24; + if (_usageAggregationRange == DAILY_TIME) { + cal.roll(Calendar.DAY_OF_YEAR, false); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.roll(Calendar.DAY_OF_YEAR, true); + cal.add(Calendar.MILLISECOND, -1); + endDate = cal.getTime().getTime(); + } else if (_usageAggregationRange == HOURLY_TIME) { + cal.roll(Calendar.HOUR_OF_DAY, false); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.roll(Calendar.HOUR_OF_DAY, true); + cal.add(Calendar.MILLISECOND, -1); + endDate = cal.getTime().getTime(); + } else { + endDate = cal.getTime().getTime(); + } + + _networkStatsUpdateExecutor.scheduleAtFixedRate(new NetworkStatsUpdateTask(), (endDate - System.currentTimeMillis()), + (_usageAggregationRange * 60 * 1000), TimeUnit.MILLISECONDS); + + if (_routerCheckInterval > 0) { + _checkExecutor.scheduleAtFixedRate(new CheckRouterTask(), _routerCheckInterval, _routerCheckInterval, TimeUnit.SECONDS); + } else { + s_logger.debug("router.check.interval - " + _routerCheckInterval+ " so not scheduling the redundant router checking thread"); + } + + return true; + } + + @Override + public boolean stop() { + return true; + } + + protected VirtualNetworkApplianceManagerImpl() { + } + + @Override + public Long convertToId(final String vmName) { + if (!VirtualMachineName.isValidRouterName(vmName, _instance)) { + return null; + } + + return VirtualMachineName.getRouterId(vmName); + } + + private VmDataCommand generateVmDataCommand(VirtualRouter router, String vmPrivateIpAddress, String userData, + String serviceOffering, String zoneName, String guestIpAddress, String vmName, + String vmInstanceName, long vmId, String publicKey, long guestNetworkId) { + VmDataCommand cmd = new VmDataCommand(vmPrivateIpAddress, vmName); + + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmd.addVmData("userdata", "user-data", userData); + cmd.addVmData("metadata", "service-offering", StringUtils.unicodeEscape(serviceOffering)); + cmd.addVmData("metadata", "availability-zone", StringUtils.unicodeEscape(zoneName)); + cmd.addVmData("metadata", "local-ipv4", guestIpAddress); + cmd.addVmData("metadata", "local-hostname", StringUtils.unicodeEscape(vmName)); + if (dcVo.getNetworkType() == NetworkType.Basic) { + cmd.addVmData("metadata", "public-ipv4", guestIpAddress); + cmd.addVmData("metadata", "public-hostname", StringUtils.unicodeEscape(vmName)); + } else + { + if (router.getPublicIpAddress() == null) { + cmd.addVmData("metadata", "public-ipv4", guestIpAddress); + } else { + cmd.addVmData("metadata", "public-ipv4", router.getPublicIpAddress()); + } + cmd.addVmData("metadata", "public-hostname", router.getPublicIpAddress()); + } + cmd.addVmData("metadata", "instance-id", vmInstanceName); + cmd.addVmData("metadata", "vm-id", String.valueOf(vmId)); + cmd.addVmData("metadata", "public-keys", publicKey); + + String cloudIdentifier = _configDao.getValue("cloud.identifier"); + if (cloudIdentifier == null) { + cloudIdentifier = ""; + } else { + cloudIdentifier = "CloudStack-{" + cloudIdentifier + "}"; + } + cmd.addVmData("metadata", "cloud-identifier", cloudIdentifier); + + return cmd; + } + + protected class NetworkUsageTask implements Runnable { + + public NetworkUsageTask() { + } + + @Override + public void run() { + try{ + final List routers = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId); + s_logger.debug("Found " + routers.size() + " running routers. "); + + for (DomainRouterVO router : routers) { + String privateIP = router.getPrivateIpAddress(); + + if (privateIP != null) { + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + + for (Long guestNtwkId : routerGuestNtwkIds) { + boolean forVpc = router.getVpcId() != null; + Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); + Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); + NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), + guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), + _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), + _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); + final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), + forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); + UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), + router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); + NetworkUsageAnswer answer = null; + try { + answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); + } catch (Exception e) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); + continue; + } + + if (answer != null) { + if (!answer.getResult()) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); + continue; + } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { + s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); + continue; + } + txn.start(); + UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), + router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); + if (stats == null) { + s_logger.warn("unable to find stats for account: " + router.getAccountId()); + continue; + } + + if(previousStats != null + && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) + || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ + s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + + "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + + answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); + continue; + } + + if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesReceived() + + " Stored: " + stats.getCurrentBytesReceived()); + } + stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } + stats.setCurrentBytesReceived(answer.getBytesReceived()); + if (stats.getCurrentBytesSent() > answer.getBytesSent()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesSent() + + " Stored: " + stats.getCurrentBytesSent()); + } + stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + } + stats.setCurrentBytesSent(answer.getBytesSent()); + _statsDao.update(stats.getId(), stats); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); + } finally { + txn.close(); + } + } + } + } + } + } catch (Exception e) { + s_logger.warn("Error while collecting network stats", e); + } + } + } + + protected class NetworkStatsUpdateTask implements Runnable { + + public NetworkStatsUpdateTask() { + } + + @Override + public void run() { + GlobalLock scanLock = GlobalLock.getInternLock("network.stats"); + try { + if(scanLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION)) { + //Check for ownership + //msHost in UP state with min id should run the job + ManagementServerHostVO msHost = _msHostDao.findOneInUpState(new Filter(ManagementServerHostVO.class, "id", true, 0L, 1L)); + if(msHost == null || (msHost.getMsid() != mgmtSrvrId)){ + s_logger.debug("Skipping aggregate network stats update"); + scanLock.unlock(); + return; + } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + txn.start(); + //get all stats with delta > 0 + List updatedStats = _statsDao.listUpdatedStats(); + Date updatedTime = new Date(); + for(UserStatisticsVO stat : updatedStats){ + //update agg bytes + stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived()); + stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent()); + _userStatsDao.update(stat.getId(), stat); + //insert into op_user_stats_log + UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(), + stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime); + _userStatsLogDao.persist(statsLog); + } + s_logger.debug("Successfully updated aggregate network stats"); + txn.commit(); + } catch (Exception e){ + txn.rollback(); + s_logger.debug("Failed to update aggregate network stats", e); + } finally { + scanLock.unlock(); + txn.close(); + } + } + } catch (Exception e){ + s_logger.debug("Exception while trying to acquire network stats lock", e); + } finally { + scanLock.releaseRef(); + } + } + } + + + protected void updateRoutersRedundantState(List routers) { + boolean updated = false; + for (DomainRouterVO router : routers) { + updated = false; + if (!router.getIsRedundantRouter()) { + continue; + } + RedundantState prevState = router.getRedundantState(); + if (router.getState() != State.Running) { + router.setRedundantState(RedundantState.UNKNOWN); + router.setIsPriorityBumpUp(false); + updated = true; + } else { + String privateIP = router.getPrivateIpAddress(); + HostVO host = _hostDao.findById(router.getHostId()); + if (host == null || host.getStatus() != Status.Up) { + router.setRedundantState(RedundantState.UNKNOWN); + updated = true; + } else if (host.getManagementServerId() != ManagementServerNode.getManagementServerId()) { + /* Only cover hosts managed by this management server */ + continue; + } else if (privateIP != null) { + final CheckRouterCommand command = new CheckRouterCommand(); + command.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + command.setWait(60); + final Answer origAnswer = _agentMgr.easySend(router.getHostId(), command); + CheckRouterAnswer answer = null; + if (origAnswer instanceof CheckRouterAnswer) { + answer = (CheckRouterAnswer)origAnswer; + } else { + s_logger.warn("Unable to update router " + router.getHostName() + "'s status"); + } + RedundantState state = RedundantState.UNKNOWN; + boolean isBumped = router.getIsPriorityBumpUp(); + if (answer != null && answer.getResult()) { + state = answer.getState(); + isBumped = answer.isBumped(); + } + router.setRedundantState(state); + router.setIsPriorityBumpUp(isBumped); + updated = true; + } + } + if (updated) { + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + txn.start(); + _routerDao.update(router.getId(), router); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Unable to update router status for account: " + router.getAccountId()); + } finally { + txn.close(); + } + } + RedundantState currState = router.getRedundantState(); + if (prevState != currState) { + String title = "Redundant virtual router " + router.getInstanceName() + + " just switch from " + prevState + " to " + currState; + String context = "Redundant virtual router (name: " + router.getHostName() + ", id: " + router.getId() + ") " + + " just switch from " + prevState + " to " + currState; + s_logger.info(context); + if (currState == RedundantState.MASTER) { + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, + router.getDataCenterIdToDeployIn(), router.getPodIdToDeployIn(), title, context); + } + } + } + } + + //Ensure router status is update to date before execute this function. The function would try best to recover all routers except MASTER + protected void recoverRedundantNetwork(DomainRouterVO masterRouter, DomainRouterVO backupRouter) { + UserContext context = UserContext.current(); + context.setAccountId(1); + if (masterRouter.getState() == State.Running && backupRouter.getState() == State.Running) { + HostVO masterHost = _hostDao.findById(masterRouter.getHostId()); + HostVO backupHost = _hostDao.findById(backupRouter.getHostId()); + if (masterHost.getStatus() == Status.Up && backupHost.getStatus() == Status.Up) { + String title = "Reboot " + backupRouter.getInstanceName() + " to ensure redundant virtual routers work"; + if (s_logger.isDebugEnabled()) { + s_logger.debug(title); + } + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, + backupRouter.getDataCenterIdToDeployIn(), backupRouter.getPodIdToDeployIn(), title, title); + try { + rebootRouter(backupRouter.getId(), false); + } catch (ConcurrentOperationException e) { + s_logger.warn("Fail to reboot " + backupRouter.getInstanceName(), e); + } catch (ResourceUnavailableException e) { + s_logger.warn("Fail to reboot " + backupRouter.getInstanceName(), e); + } catch (InsufficientCapacityException e) { + s_logger.warn("Fail to reboot " + backupRouter.getInstanceName(), e); + } + } + } + } + + private int getRealPriority(DomainRouterVO router) { + int priority = router.getPriority(); + if (router.getIsPriorityBumpUp()) { + priority += DEFAULT_DELTA; + } + return priority; + } + + protected class CheckRouterTask implements Runnable { + + public CheckRouterTask() { + } + + /* + * In order to make fail-over works well at any time, we have to ensure: + * 1. Backup router's priority = Master's priority - DELTA + 1 + * 2. Backup router's priority hasn't been bumped up. + */ + private void checkSanity(List routers) { + Set checkedNetwork = new HashSet(); + for (DomainRouterVO router : routers) { + if (!router.getIsRedundantRouter()) { + continue; + } + + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + + for (Long routerGuestNtwkId : routerGuestNtwkIds) { + if (checkedNetwork.contains(routerGuestNtwkId)) { + continue; + } + checkedNetwork.add(routerGuestNtwkId); + List checkingRouters = _routerDao.listByNetworkAndRole(routerGuestNtwkId, Role.VIRTUAL_ROUTER); + if (checkingRouters.size() != 2) { + continue; + } + DomainRouterVO masterRouter = null; + DomainRouterVO backupRouter = null; + for (DomainRouterVO r : checkingRouters) { + if (r.getRedundantState() == RedundantState.MASTER) { + if (masterRouter == null) { + masterRouter = r; + } else { + //Duplicate master! We give up, until the admin fix duplicate MASTER issue + break; + } + } else if (r.getRedundantState() == RedundantState.BACKUP) { + if (backupRouter == null) { + backupRouter = r; + } else { + break; + } + } + } + if (masterRouter != null && backupRouter != null) { + if (getRealPriority(masterRouter) - DEFAULT_DELTA + 1 != getRealPriority(backupRouter) || backupRouter.getIsPriorityBumpUp()) { + recoverRedundantNetwork(masterRouter, backupRouter); + } + } + } + } + } + + private void checkDuplicateMaster(List routers) { + Map networkRouterMaps = new HashMap(); + for (DomainRouterVO router : routers) { + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + + for (Long routerGuestNtwkId : routerGuestNtwkIds) { + if (router.getRedundantState() == RedundantState.MASTER) { + if (networkRouterMaps.containsKey(routerGuestNtwkId)) { + DomainRouterVO dupRouter = networkRouterMaps.get(routerGuestNtwkId); + String title = "More than one redundant virtual router is in MASTER state! Router " + router.getHostName() + " and router " + dupRouter.getHostName(); + String context = "Virtual router (name: " + router.getHostName() + ", id: " + router.getId() + " and router (name: " + + dupRouter.getHostName() + ", id: " + router.getId() + ") are both in MASTER state! If the problem persist, restart both of routers. "; + + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, router.getDataCenterIdToDeployIn(), router.getPodIdToDeployIn(), title, context); + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, dupRouter.getDataCenterIdToDeployIn(), dupRouter.getPodIdToDeployIn(), title, context); + } else { + networkRouterMaps.put(routerGuestNtwkId, router); + } + } + } + } + } + + @Override + public void run() { + try { + final List routers = _routerDao.listIsolatedByHostId(null); + s_logger.debug("Found " + routers.size() + " routers. "); + + updateRoutersRedundantState(routers); + + /* FIXME assumed the a pair of redundant routers managed by same mgmt server, + * then the update above can get the latest status */ + checkDuplicateMaster(routers); + checkSanity(routers); + } catch (Exception ex) { + s_logger.error("Fail to complete the CheckRouterTask! ", ex); + } + } + } + + + private final int DEFAULT_PRIORITY = 100; + private final int DEFAULT_DELTA = 2; + + protected int getUpdatedPriority(Network guestNetwork, List routers, DomainRouterVO exclude) throws InsufficientVirtualNetworkCapcityException { + int priority; + if (routers.size() == 0) { + priority = DEFAULT_PRIORITY; + } else { + int maxPriority = 0; + for (DomainRouterVO r : routers) { + if (!r.getIsRedundantRouter()) { + throw new CloudRuntimeException("Redundant router is mixed with single router in one network!"); + } + //FIXME Assume the maxPriority one should be running or just created. + if (r.getId() != exclude.getId() && getRealPriority(r) > maxPriority) { + maxPriority = getRealPriority(r); + } + } + if (maxPriority == 0) { + return DEFAULT_PRIORITY; + } + if (maxPriority < 20) { + s_logger.error("Current maximum priority is too low!"); + throw new InsufficientVirtualNetworkCapcityException("Current maximum priority is too low as " + maxPriority + "!", + guestNetwork.getId()); + } else if (maxPriority > 200) { + s_logger.error("Too many times fail-over happened! Current maximum priority is too high as " + maxPriority + "!"); + throw new InsufficientVirtualNetworkCapcityException("Too many times fail-over happened! Current maximum priority is too high as " + + maxPriority + "!", guestNetwork.getId()); + } + priority = maxPriority - DEFAULT_DELTA + 1; + } + return priority; + } + + /* + * Ovm won't support any system. So we have to choose a partner cluster in the same pod to start domain router for us + */ + private HypervisorType getClusterToStartDomainRouterForOvm(long podId) { + List clusters = _clusterDao.listByPodId(podId); + for (ClusterVO cv : clusters) { + if (cv.getHypervisorType() == HypervisorType.Ovm || cv.getHypervisorType() == HypervisorType.BareMetal) { + continue; + } + + List hosts = _resourceMgr.listAllHostsInCluster(cv.getId()); + if (hosts == null || hosts.isEmpty()) { + continue; + } + + for (HostVO h : hosts) { + if (h.getStatus() == Status.Up) { + s_logger.debug("Pick up host that has hypervisor type " + h.getHypervisorType() + " in cluster " + + cv.getId() + " to start domain router for OVM"); + return h.getHypervisorType(); + } + } + } + + String errMsg = "Cannot find an available cluster in Pod " + + podId + + " to start domain router for Ovm. \n Ovm won't support any system vm including domain router, " + + "please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod" + + " with Ovm cluster. And there is at least one host in UP status in that cluster."; + throw new CloudRuntimeException(errMsg); + } + + @DB + protected List findOrDeployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, + boolean isRedundant, Map params) throws ConcurrentOperationException, + InsufficientCapacityException, ResourceUnavailableException { + + assert guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup || + guestNetwork.getState() == Network.State.Implementing : "Network is not yet fully implemented: " + + guestNetwork; + assert guestNetwork.getTrafficType() == TrafficType.Guest; + + + + //1) Get deployment plan and find out the list of routers + boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || + _networkMgr.areServicesSupportedInNetwork(guestNetwork.getId(), Service.SecurityGroup)) + && guestNetwork.getTrafficType() == TrafficType.Guest; + + Pair> planAndRouters = getDeploymentPlanAndRouters(isPodBased, dest, guestNetwork.getId()); + DeploymentPlan plan = planAndRouters.first(); + List routers = planAndRouters.second(); + + //2) Figure out required routers count + int routerCount = 1; + if (isRedundant) { + routerCount = 2; + } + + /* If it is the single router network, then keep it untouched */ + for (DomainRouterVO router : routers) { + if (!router.getIsRedundantRouter() || isPodBased) { + routerCount = 1; + break; + } + } + + /* If old network is redundant but new is single router, then routers.size() = 2 but routerCount = 1 */ + if (routers.size() >= routerCount) { + return routers; + } + + if (routers.size() >= 5) { + s_logger.error("Too much redundant routers!"); + } + + Network network = _networkDao.acquireInLockTable(guestNetwork.getId()); + if (network == null) { + throw new ConcurrentOperationException("Unable to lock network " + guestNetwork.getId()); + } + + try { + //Check if providers are supported in the physical networks + VirtualRouterProviderType type = VirtualRouterProviderType.VirtualRouter; + Long physicalNetworkId = _networkMgr.getPhysicalNetworkId(network); + PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(physicalNetworkId, type.toString()); + if (provider == null) { + throw new CloudRuntimeException("Cannot find service provider " + type.toString() + " in physical network " + physicalNetworkId); + } + VirtualRouterProvider vrProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), type); + if (vrProvider == null) { + throw new CloudRuntimeException("Cannot find virtual router provider " + type.toString()+ " as service provider " + provider.getId()); + } + + if (_networkMgr.isNetworkSystem(guestNetwork) || guestNetwork.getGuestType() == Network.GuestType.Shared) { + owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM); + } + + //Check if public network has to be set on VR + boolean publicNetwork = false; + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetwork.getId(), Service.SourceNat, Provider.VirtualRouter)) { + publicNetwork = true; + } + if (isRedundant && !publicNetwork) { + s_logger.error("Didn't support redundant virtual router without public network!"); + return null; + } + + Long offeringId = _networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId(); + if (offeringId == null) { + offeringId = _offering.getId(); + } + + PublicIp sourceNatIp = null; + if (publicNetwork) { + sourceNatIp = _networkMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork); + } + + //3) deploy virtual router(s) + int count = routerCount - routers.size(); + for (int i = 0; i < count; i++) { + List> networks = createRouterNetworks(owner, isRedundant, plan, guestNetwork, + new Pair(publicNetwork, sourceNatIp)); + DomainRouterVO router = deployRouter(owner, dest, plan, params, isRedundant, vrProvider, offeringId, + null, networks); + + _routerDao.addRouterToGuestNetwork(router, network); + + routers.add(router); + } + } finally { + if (network != null) { + _networkDao.releaseFromLockTable(network.getId()); + } + } + return routers; + } + + protected DomainRouterVO deployRouter(Account owner, DeployDestination dest, DeploymentPlan plan, Map params, + boolean isRedundant, VirtualRouterProvider vrProvider, long svcOffId, + Long vpcId, List> networks) throws ConcurrentOperationException, + InsufficientAddressCapacityException, InsufficientServerCapacityException, InsufficientCapacityException, + StorageUnavailableException, ResourceUnavailableException { + + long id = _routerDao.getNextInSequence(Long.class, "id"); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating the router " + id + " in datacenter " + dest.getDataCenter()); + } + + ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(svcOffId); + + // Router is the network element, we don't know the hypervisor type yet. + //Try to allocate the domR twice using diff hypervisors, and when failed both times, throw the exception up + List supportedHypervisors = new ArrayList(); + HypervisorType defaults = _resourceMgr.getDefaultHypervisor(dest.getDataCenter().getId()); + if (defaults != HypervisorType.None) { + supportedHypervisors.add(defaults); + } + + if (dest.getCluster() != null) { + if (dest.getCluster().getHypervisorType() == HypervisorType.Ovm) { + supportedHypervisors.add(getClusterToStartDomainRouterForOvm(dest.getCluster().getPodId())); + } else { + supportedHypervisors.add(dest.getCluster().getHypervisorType()); + } + } else { + supportedHypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true, + plan.getPodId()); + } + + if (supportedHypervisors.isEmpty()) { + if (plan.getPodId() != null) { + throw new InsufficientServerCapacityException("Unable to create virtual router, " + + "there are no clusters in the pod ", Pod.class, plan.getPodId()); + } + throw new InsufficientServerCapacityException("Unable to create virtual router, " + + "there are no clusters in the zone ", DataCenter.class, dest.getDataCenter().getId()); + } + + int allocateRetry = 0; + int startRetry = 0; + DomainRouterVO router = null; + for (Iterator iter = supportedHypervisors.iterator();iter.hasNext();) { + HypervisorType hType = iter.next(); + try { + s_logger.debug("Allocating the domR with the hypervisor type " + hType); + VMTemplateVO template = _templateDao.findRoutingTemplate(hType); + + if (template == null) { + s_logger.debug(hType + " won't support system vm, skip it"); + continue; + } + + boolean offerHA = routerOffering.getOfferHA(); + /* We don't provide HA to redundant router VMs, admin should own it all, and redundant router themselves are HA */ + if (isRedundant) { + offerHA = false; + } + + router = new DomainRouterVO(id, routerOffering.getId(), vrProvider.getId(), + VirtualMachineName.getRouterName(id, _instance), template.getId(), template.getHypervisorType(), + template.getGuestOSId(), owner.getDomainId(), owner.getId(), isRedundant, 0, false, + RedundantState.UNKNOWN, offerHA, false, vpcId); + router.setRole(Role.VIRTUAL_ROUTER); + router = _itMgr.allocate(router, template, routerOffering, networks, plan, null, owner); + } catch (InsufficientCapacityException ex) { + if (allocateRetry < 2 && iter.hasNext()) { + s_logger.debug("Failed to allocate the domR with hypervisor type " + hType + ", retrying one more time"); + continue; + } else { + throw ex; + } + } finally { + allocateRetry++; + } + + try { + router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params); + break; + } catch (InsufficientCapacityException ex) { + if (startRetry < 2 && iter.hasNext()) { + s_logger.debug("Failed to start the domR " + router + " with hypervisor type " + hType + ", " + + "destroying it and recreating one more time"); + //destroy the router + destroyRouter(router.getId()); + continue; + } else { + throw ex; + } + } finally { + startRetry++; + } + } + + return router; + } + + protected List> createRouterNetworks(Account owner, boolean isRedundant, + DeploymentPlan plan, Network guestNetwork, Pair publicNetwork) throws ConcurrentOperationException, + InsufficientAddressCapacityException { + + + boolean setupPublicNetwork = false; + if (publicNetwork != null) { + setupPublicNetwork = publicNetwork.first(); + } + + //Form networks + List> networks = new ArrayList>(3); + + //1) Guest network + boolean hasGuestNetwork = false; + if (guestNetwork != null) { + s_logger.debug("Adding nic for Virtual Router in Guest network " + guestNetwork); + String defaultNetworkStartIp = null; + if (guestNetwork.getCidr() != null && !setupPublicNetwork) { + String startIp = _networkMgr.getStartIpAddress(guestNetwork.getId()); + if (startIp != null && _ipAddressDao.findByIpAndSourceNetworkId(guestNetwork.getId(), startIp).getAllocatedTime() == null) { + defaultNetworkStartIp = startIp; + } else if (s_logger.isDebugEnabled()){ + s_logger.debug("First ip " + startIp + " in network id=" + guestNetwork.getId() + + " is already allocated, can't use it for domain router; will get random ip address from the range"); + } + } + + NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp); + if (setupPublicNetwork) { + if (isRedundant) { + gatewayNic.setIp4Address(_networkMgr.acquireGuestIpAddress(guestNetwork, null)); + } else { + gatewayNic.setIp4Address(guestNetwork.getGateway()); + } + gatewayNic.setBroadcastUri(guestNetwork.getBroadcastUri()); + gatewayNic.setBroadcastType(guestNetwork.getBroadcastDomainType()); + gatewayNic.setIsolationUri(guestNetwork.getBroadcastUri()); + gatewayNic.setMode(guestNetwork.getMode()); + String gatewayCidr = guestNetwork.getCidr(); + gatewayNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr)); + } else { + gatewayNic.setDefaultNic(true); + } + + networks.add(new Pair((NetworkVO) guestNetwork, gatewayNic)); + hasGuestNetwork = true; + } + + //2) Control network + s_logger.debug("Adding nic for Virtual Router in Control network "); + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemControlNetwork); + NetworkOfferingVO controlOffering = offerings.get(0); + NetworkVO controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0); + networks.add(new Pair(controlConfig, null)); + + + //3) Public network + if (setupPublicNetwork) { + PublicIp sourceNatIp = publicNetwork.second(); + s_logger.debug("Adding nic for Virtual Router in Public network "); + //if source nat service is supported by the network, get the source nat ip address + NicProfile defaultNic = new NicProfile(); + defaultNic.setDefaultNic(true); + defaultNic.setIp4Address(sourceNatIp.getAddress().addr()); + defaultNic.setGateway(sourceNatIp.getGateway()); + defaultNic.setNetmask(sourceNatIp.getNetmask()); + defaultNic.setMacAddress(sourceNatIp.getMacAddress()); + defaultNic.setBroadcastType(BroadcastDomainType.Vlan); + defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag())); + defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag())); + if (hasGuestNetwork) { + defaultNic.setDeviceId(2); + } + NetworkOfferingVO publicOffering = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemPublicNetwork).get(0); + List publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false); + networks.add(new Pair(publicNetworks.get(0), defaultNic)); + } + + return networks; + } + + + protected Pair> getDeploymentPlanAndRouters(boolean isPodBased, + DeployDestination dest, long guestNetworkId) { + long dcId = dest.getDataCenter().getId(); + List routers = null; + DeploymentPlan plan = new DataCenterDeployment(dcId); + if (isPodBased) { + Pod pod = dest.getPod(); + Long podId = null; + if (pod != null) { + podId = pod.getId(); + } else { + throw new CloudRuntimeException("Pod id is expected in deployment destination"); + } + routers = _routerDao.listByNetworkAndPodAndRole(guestNetworkId, podId, Role.VIRTUAL_ROUTER); + plan = new DataCenterDeployment(dcId, podId, null, null, null, null); + } else { + routers = _routerDao.listByNetworkAndRole(guestNetworkId, Role.VIRTUAL_ROUTER); + } + + return new Pair>(plan, routers); + } + + + private DomainRouterVO startVirtualRouter(DomainRouterVO router, User user, Account caller, Map params) + throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + + if (router.getRole() != Role.VIRTUAL_ROUTER || !router.getIsRedundantRouter()) { + return this.start(router, user, caller, params, null); + } + + if (router.getState() == State.Running) { + s_logger.debug("Redundant router " + router.getInstanceName() + " is already running!"); + return router; + } + + DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null); + DomainRouterVO result = null; + assert router.getIsRedundantRouter(); + List routerList = _routerDao.findBy(router.getAccountId(), router.getDataCenterIdToDeployIn()); + DomainRouterVO routerToBeAvoid = null; + for (DomainRouterVO rrouter : routerList) { + if (rrouter.getHostId() != null && rrouter.getIsRedundantRouter() && rrouter.getState() == State.Running) { + if (routerToBeAvoid != null) { + throw new ResourceUnavailableException("Try to start router " + router.getInstanceName() + "(" + router.getId() + ")" + + ", but there are already two redundant routers with IP " + router.getPublicIpAddress() + + ", they are " + rrouter.getInstanceName() + "(" + rrouter.getId() + ") and " + + routerToBeAvoid.getInstanceName() + "(" + routerToBeAvoid.getId() + ")", + DataCenter.class, rrouter.getDataCenterIdToDeployIn()); + } + routerToBeAvoid = rrouter; + } + } + if (routerToBeAvoid == null) { + return this.start(router, user, caller, params, null); + } + // We would try best to deploy the router to another place + int retryIndex = 5; + ExcludeList[] avoids = new ExcludeList[5]; + avoids[0] = new ExcludeList(); + avoids[0].addPod(routerToBeAvoid.getPodIdToDeployIn()); + avoids[1] = new ExcludeList(); + avoids[1].addCluster(_hostDao.findById(routerToBeAvoid.getHostId()).getClusterId()); + avoids[2] = new ExcludeList(); + List volumes = _volumeDao.findByInstanceAndType(routerToBeAvoid.getId(), Type.ROOT); + if (volumes != null && volumes.size() != 0) { + avoids[2].addPool(volumes.get(0).getPoolId()); + } + avoids[2].addHost(routerToBeAvoid.getHostId()); + avoids[3] = new ExcludeList(); + avoids[3].addHost(routerToBeAvoid.getHostId()); + avoids[4] = new ExcludeList(); + + for (int i = 0; i < retryIndex; i++) { + if (s_logger.isTraceEnabled()) { + s_logger.trace("Try to deploy redundant virtual router:" + router.getHostName() + ", for " + i + " time"); + } + plan.setAvoids(avoids[i]); + try { + result = this.start(router, user, caller, params, plan); + } catch (InsufficientServerCapacityException ex) { + result = null; + } + if (result != null) { + break; + } + } + return result; + } + + @Override + public List deployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, + Map params, boolean isRedundant) throws InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + + List routers = findOrDeployVirtualRouterInGuestNetwork + (guestNetwork, dest, owner, isRedundant, params); + + return startRouters(params, routers); + } + + protected List startRouters(Map params, List routers) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, + ResourceUnavailableException { + List runningRouters = null; + + if (routers != null) { + runningRouters = new ArrayList(); + } + + for (DomainRouterVO router : routers) { + boolean skip = false; + State state = router.getState(); + if (router.getHostId() != null && state != State.Running) { + HostVO host = _hostDao.findById(router.getHostId()); + if (host == null || host.getStatus() != Status.Up) { + skip = true; + } + } + if (!skip) { + if (state != State.Running) { + router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params); + } + if (router != null) { + runningRouters.add(router); + } + } + } + return runningRouters; + } + + @Override + public boolean finalizeVirtualMachineProfile(VirtualMachineProfile profile, DeployDestination dest, + ReservationContext context) { + + boolean dnsProvided = true; + boolean dhcpProvided = true; + boolean publicNetwork = false; + DataCenterVO dc = _dcDao.findById(dest.getDataCenter().getId()); + _dcDao.loadDetails(dc); + + //1) Set router details + DomainRouterVO router = profile.getVirtualMachine(); + Map details = _vmDetailsDao.findDetails(router.getId()); + router.setDetails(details); + + //2) Prepare boot loader elements related with Control network + + StringBuilder buf = profile.getBootArgsBuilder(); + buf.append(" template=domP"); + buf.append(" name=").append(profile.getHostName()); + + if (Boolean.valueOf(_configDao.getValue("system.vm.random.password"))) { + buf.append(" vmpassword=").append(_configDao.getValue("system.vm.password")); + } + + NicProfile controlNic = null; + String defaultDns1 = null; + String defaultDns2 = null; + for (NicProfile nic : profile.getNics()) { + int deviceId = nic.getDeviceId(); + buf.append(" eth").append(deviceId).append("ip=").append(nic.getIp4Address()); + buf.append(" eth").append(deviceId).append("mask=").append(nic.getNetmask()); + + if (nic.isDefaultNic()) { + buf.append(" gateway=").append(nic.getGateway()); + defaultDns1 = nic.getDns1(); + defaultDns2 = nic.getDns2(); + } + + if (nic.getTrafficType() == TrafficType.Management) { + buf.append(" localgw=").append(dest.getPod().getGateway()); + } else if (nic.getTrafficType() == TrafficType.Control) { + controlNic = nic; + // DOMR control command is sent over management server in VMware + if (dest.getHost().getHypervisorType() == HypervisorType.VMware) { + if (s_logger.isInfoEnabled()) { + s_logger.info("Check if we need to add management server explicit route to DomR. pod cidr: " + + dest.getPod().getCidrAddress() + "/" + dest.getPod().getCidrSize() + + ", pod gateway: " + dest.getPod().getGateway() + ", management host: " + _mgmt_host); + } + + if (s_logger.isInfoEnabled()) { + s_logger.info("Add management server explicit route to DomR."); + } + + // always add management explicit route, for basic networking setup, DomR may have two interfaces while both + // are on the same subnet + _mgmt_cidr = _configDao.getValue(Config.ManagementNetwork.key()); + if (NetUtils.isValidCIDR(_mgmt_cidr)) { + buf.append(" mgmtcidr=").append(_mgmt_cidr); + buf.append(" localgw=").append(dest.getPod().getGateway()); + } + + + if (dc.getNetworkType() == NetworkType.Basic) { + // ask domR to setup SSH on guest network + buf.append(" sshonguest=true"); + } + + } + } else if (nic.getTrafficType() == TrafficType.Guest) { + dnsProvided = _networkMgr.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dns, Provider.VirtualRouter); + dhcpProvided = _networkMgr.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dhcp, Provider.VirtualRouter); + //build bootloader parameter for the guest + buf.append(createGuestBootLoadArgs(nic, defaultDns1, defaultDns2, router)); + } else if (nic.getTrafficType() == TrafficType.Public) { + publicNetwork = true; + } + } + + if (controlNic == null) { + throw new CloudRuntimeException("Didn't start a control port"); + } + + String rpValue = _configDao.getValue(Config.NetworkRouterRpFilter.key()); + if (rpValue != null && rpValue.equalsIgnoreCase("true")) { + _disable_rp_filter = true; + }else { + _disable_rp_filter = false; + } + + String rpFilter = " "; + String type = null; + if (router.getVpcId() != null) { + type = "vpcrouter"; + if (_disable_rp_filter) { + rpFilter=" disable_rp_filter=true"; + } + } else if (!publicNetwork) { + type = "dhcpsrvr"; + } else { + type = "router"; + if (_disable_rp_filter) { + rpFilter=" disable_rp_filter=true"; + } + } + + if (_disable_rp_filter) { + rpFilter=" disable_rp_filter=true"; + } + + buf.append(" type=" + type + rpFilter); + + String domain_suffix = dc.getDetail(ZoneConfig.DnsSearchOrder.getName()); + if (domain_suffix != null) { + buf.append(" dnssearchorder=").append(domain_suffix); + } + + if (profile.getHypervisorType() == HypervisorType.VMware) { + buf.append(" extra_pubnics=" + _routerExtraPublicNics); + } + + /* If virtual router didn't provide DNS service but provide DHCP service, we need to override the DHCP response + * to return DNS server rather than + * virtual router itself. */ + if (dnsProvided || dhcpProvided) { + if (defaultDns1 != null) { + buf.append(" dns1=").append(defaultDns1); + } + if (defaultDns2 != null) { + buf.append(" dns2=").append(defaultDns2); + } + + boolean useExtDns = !dnsProvided; + /* For backward compatibility */ + String use_external_dns = _configDao.getValue(Config.UseExternalDnsServers.key()); + if (use_external_dns != null && use_external_dns.equals("true")) { + useExtDns = true; + } + + if (useExtDns) { + buf.append(" useextdns=true"); + } + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); + } + + return true; + } + + + protected StringBuilder createGuestBootLoadArgs(NicProfile guestNic, String defaultDns1, + String defaultDns2, DomainRouterVO router) { + long guestNetworkId = guestNic.getNetworkId(); + NetworkVO guestNetwork = _networkDao.findById(guestNetworkId); + String dhcpRange = null; + DataCenterVO dc = _dcDao.findById(guestNetwork.getDataCenterId()); + + StringBuilder buf = new StringBuilder(); + + boolean isRedundant = router.getIsRedundantRouter(); + if (isRedundant) { + buf.append(" redundant_router=1"); + List routers = _routerDao.listByNetworkAndRole(guestNetwork.getId(), Role.VIRTUAL_ROUTER); + try { + int priority = getUpdatedPriority(guestNetwork, routers, router); + router.setPriority(priority); + } catch (InsufficientVirtualNetworkCapcityException e) { + s_logger.error("Failed to get update priority!", e); + throw new CloudRuntimeException("Failed to get update priority!"); + } + Network net = _networkMgr.getNetwork(guestNic.getNetworkId()); + buf.append(" guestgw=").append(net.getGateway()); + String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIp4Address()) | ~NetUtils.ip2Long(guestNic.getNetmask())); + buf.append(" guestbrd=").append(brd); + buf.append(" guestcidrsize=").append(NetUtils.getCidrSize(guestNic.getNetmask())); + buf.append(" router_pr=").append(router.getPriority()); + } + + //setup network domain + String domain = guestNetwork.getNetworkDomain(); + if (domain != null) { + buf.append(" domain=" + domain); + } + + //setup dhcp range + if (dc.getNetworkType() == NetworkType.Basic) { + if (guestNic.isDefaultNic()) { + long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask()); + String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), cidrSize); + if (cidr != null) { + dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize); + } + } + } else if (dc.getNetworkType() == NetworkType.Advanced) { + String cidr = guestNetwork.getCidr(); + if (cidr != null) { + dhcpRange = NetUtils.getDhcpRange(cidr); + } + } + + if (dhcpRange != null) { + buf.append(" dhcprange=" + dhcpRange); + } + + return buf; + } + + + protected String getGuestDhcpRange(NicProfile guestNic, Network guestNetwork, DataCenter dc) { + String dhcpRange = null; + //setup dhcp range + if (dc.getNetworkType() == NetworkType.Basic) { + long cidrSize = NetUtils.getCidrSize(guestNic.getNetmask()); + String cidr = NetUtils.getCidrSubNet(guestNic.getGateway(), cidrSize); + if (cidr != null) { + dhcpRange = NetUtils.getIpRangeStartIpFromCidr(cidr, cidrSize); + } + } else if (dc.getNetworkType() == NetworkType.Advanced) { + String cidr = guestNetwork.getCidr(); + if (cidr != null) { + dhcpRange = NetUtils.getDhcpRange(cidr); + } + } + return dhcpRange; + } + + @Override + public boolean finalizeDeployment(Commands cmds, VirtualMachineProfile profile, + DeployDestination dest, ReservationContext context) throws ResourceUnavailableException { + DomainRouterVO router = profile.getVirtualMachine(); + + List nics = profile.getNics(); + for (NicProfile nic : nics) { + if (nic.getTrafficType() == TrafficType.Public) { + router.setPublicIpAddress(nic.getIp4Address()); + router.setPublicNetmask(nic.getNetmask()); + router.setPublicMacAddress(nic.getMacAddress()); + } else if (nic.getTrafficType() == TrafficType.Control) { + router.setPrivateIpAddress(nic.getIp4Address()); + router.setPrivateMacAddress(nic.getMacAddress()); + } + } + _routerDao.update(router.getId(), router); + + finalizeCommandsOnStart(cmds, profile); + return true; + } + + @Override + public boolean finalizeCommandsOnStart(Commands cmds, VirtualMachineProfile profile) { + DomainRouterVO router = profile.getVirtualMachine(); + NicProfile controlNic = getControlNic(profile); + + if (controlNic == null) { + s_logger.error("Control network doesn't exist for the router " + router); + return false; + } + + finalizeSshAndVersionAndNetworkUsageOnStart(cmds, profile, router, controlNic); + + // restart network if restartNetwork = false is not specified in profile parameters + boolean reprogramGuestNtwks = true; + if (profile.getParameter(Param.ReProgramGuestNetworks) != null + && (Boolean) profile.getParameter(Param.ReProgramGuestNetworks) == false) { + reprogramGuestNtwks = false; + } + + VirtualRouterProvider vrProvider = _vrProviderDao.findById(router.getElementId()); + if (vrProvider == null) { + throw new CloudRuntimeException("Cannot find related virtual router provider of router: " + router.getHostName()); + } + Provider provider = Network.Provider.getProvider(vrProvider.getType().toString()); + if (provider == null) { + throw new CloudRuntimeException("Cannot find related provider of virtual router provider: " + vrProvider.getType().toString()); + } + + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + for (Long guestNetworkId : routerGuestNtwkIds) { + if (reprogramGuestNtwks) { + finalizeIpAssocForNetwork(cmds, router, provider, guestNetworkId); + finalizeNetworkRulesForNetwork(cmds, router, provider, guestNetworkId); + } + + finalizeUserDataAndDhcpOnStart(cmds, router, provider, guestNetworkId); + } + + return true; + } + + protected NicProfile getControlNic(VirtualMachineProfile profile) { + DomainRouterVO router = profile.getVirtualMachine(); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + NicProfile controlNic = null; + if (profile.getHypervisorType() == HypervisorType.VMware && dcVo.getNetworkType() == NetworkType.Basic) { + // TODO this is a ugly to test hypervisor type here + // for basic network mode, we will use the guest NIC for control NIC + for (NicProfile nic : profile.getNics()) { + if (nic.getTrafficType() == TrafficType.Guest && nic.getIp4Address() != null) { + controlNic = nic; + } + } + } else { + for (NicProfile nic : profile.getNics()) { + if (nic.getTrafficType() == TrafficType.Control && nic.getIp4Address() != null) { + controlNic = nic; + } + } + } + return controlNic; + } + + protected void finalizeSshAndVersionAndNetworkUsageOnStart(Commands cmds, VirtualMachineProfile profile, DomainRouterVO router, NicProfile controlNic) { + cmds.addCommand("checkSsh", new CheckSshCommand(profile.getInstanceName(), controlNic.getIp4Address(), 3922)); + + // Update router template/scripts version + final GetDomRVersionCmd command = new GetDomRVersionCmd(); + command.setAccessDetail(NetworkElementCommand.ROUTER_IP, controlNic.getIp4Address()); + command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmds.addCommand("getDomRVersion", command); + + // Network usage command to create iptables rules + boolean forVpc = profile.getVirtualMachine().getVpcId() != null; + cmds.addCommand("networkUsage", new NetworkUsageCommand(controlNic.getIp4Address(), router.getHostName(), "create", forVpc)); + } + + protected void finalizeUserDataAndDhcpOnStart(Commands cmds, DomainRouterVO router, Provider provider, Long guestNetworkId) { + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Dhcp, provider)) { + // Resend dhcp + s_logger.debug("Reapplying dhcp entries as a part of domR " + router + " start..."); + createDhcpEntryCommandsForVMs(router, cmds, guestNetworkId); + } + + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.UserData, provider)) { + // Resend user data + s_logger.debug("Reapplying vm data (userData and metaData) entries as a part of domR " + router + " start..."); + createVmDataCommandForVMs(router, cmds, guestNetworkId); + } + } + + protected void finalizeNetworkRulesForNetwork(Commands cmds, DomainRouterVO router, Provider provider, Long guestNetworkId) { + s_logger.debug("Resending ipAssoc, port forwarding, load balancing rules as a part of Virtual router start"); + + ArrayList publicIps = getPublicIpsToApply(router, provider, guestNetworkId); + + if (publicIps != null && !publicIps.isEmpty()) { + List vpns = new ArrayList(); + List pfRules = new ArrayList(); + List staticNatFirewallRules = new ArrayList(); + List staticNats = new ArrayList(); + List firewallRules = new ArrayList(); + + //Get information about all the rules (StaticNats and StaticNatRules; PFVPN to reapply on domR start) + for (PublicIpAddress ip : publicIps) { + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.PortForwarding, provider)) { + pfRules.addAll(_pfRulesDao.listForApplication(ip.getId())); + } + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.StaticNat, provider)) { + staticNatFirewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(), Purpose.StaticNat)); + } + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Firewall, provider)) { + firewallRules.addAll(_rulesDao.listByIpAndPurpose(ip.getId(), Purpose.Firewall)); + } + + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Vpn, provider)) { + RemoteAccessVpn vpn = _vpnDao.findById(ip.getId()); + if (vpn != null) { + vpns.add(vpn); + } + } + + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.StaticNat, provider)) { + if (ip.isOneToOneNat()) { + String dstIp = _networkMgr.getIpInNetwork(ip.getAssociatedWithVmId(), guestNetworkId); + StaticNatImpl staticNat = new StaticNatImpl(ip.getAccountId(), ip.getDomainId(), guestNetworkId, ip.getId(), dstIp, false); + staticNats.add(staticNat); + } + } + } + + //Re-apply static nats + s_logger.debug("Found " + staticNats.size() + " static nat(s) to apply as a part of domR " + router + " start."); + if (!staticNats.isEmpty()) { + createApplyStaticNatCommands(staticNats, router, cmds, guestNetworkId); + } + + //Re-apply firewall rules + s_logger.debug("Found " + staticNats.size() + " firewall rule(s) to apply as a part of domR " + router + " start."); + if (!firewallRules.isEmpty()) { + createFirewallRulesCommands(firewallRules, router, cmds, guestNetworkId); + } + + // Re-apply port forwarding rules + s_logger.debug("Found " + pfRules.size() + " port forwarding rule(s) to apply as a part of domR " + router + " start."); + if (!pfRules.isEmpty()) { + createApplyPortForwardingRulesCommands(pfRules, router, cmds, guestNetworkId); + } + + // Re-apply static nat rules + s_logger.debug("Found " + staticNatFirewallRules.size() + " static nat rule(s) to apply as a part of domR " + router + " start."); + if (!staticNatFirewallRules.isEmpty()) { + List staticNatRules = new ArrayList(); + for (FirewallRule rule : staticNatFirewallRules) { + staticNatRules.add(_rulesMgr.buildStaticNatRule(rule, false)); + } + createApplyStaticNatRulesCommands(staticNatRules, router, cmds, guestNetworkId); + } + + // Re-apply vpn rules + s_logger.debug("Found " + vpns.size() + " vpn(s) to apply as a part of domR " + router + " start."); + if (!vpns.isEmpty()) { + for (RemoteAccessVpn vpn : vpns) { + createApplyVpnCommands(vpn, router, cmds); + } + } + + List lbs = _loadBalancerDao.listByNetworkId(guestNetworkId); + List lbRules = new ArrayList(); + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Lb, provider)) { + // Re-apply load balancing rules + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + List policyList = _lbMgr.getStickinessPolicies(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList); + lbRules.add(loadBalancing); + } + } + + s_logger.debug("Found " + lbRules.size() + " load balancing rule(s) to apply as a part of domR " + router + " start."); + if (!lbRules.isEmpty()) { + createApplyLoadBalancingRulesCommands(lbRules, router, cmds, guestNetworkId); + } + } + } + + protected void finalizeIpAssocForNetwork(Commands cmds, VirtualRouter router, Provider provider, + Long guestNetworkId) { + + ArrayList publicIps = getPublicIpsToApply(router, provider, guestNetworkId); + + if (publicIps != null && !publicIps.isEmpty()) { + s_logger.debug("Found " + publicIps.size() + " ip(s) to apply as a part of domR " + router + " start."); + // Re-apply public ip addresses - should come before PF/LB/VPN + if (_networkMgr.isProviderSupportServiceInNetwork(guestNetworkId, Service.Firewall, provider)) { + createAssociateIPCommands(router, publicIps, cmds, 0); + } + } + } + + protected ArrayList getPublicIpsToApply(VirtualRouter router, Provider provider, + Long guestNetworkId, com.cloud.network.IpAddress.State... skipInStates) { + long ownerId = router.getAccountId(); + final List userIps = _networkMgr.listPublicIpsAssignedToGuestNtwk(ownerId, guestNetworkId, null); + List allPublicIps = new ArrayList(); + if (userIps != null && !userIps.isEmpty()) { + boolean addIp = true; + for (IPAddressVO userIp : userIps) { + if (skipInStates != null) { + for (IpAddress.State stateToSkip : skipInStates) { + if (userIp.getState() == stateToSkip) { + s_logger.debug("Skipping ip address " + userIp + " in state " + userIp.getState()); + addIp = false; + break; + } + } + } + + if (addIp) { + PublicIp publicIp = new PublicIp(userIp, _vlanDao.findById(userIp.getVlanId()), + NetUtils.createSequenceBasedMacAddress(userIp.getMacAddress())); + allPublicIps.add(publicIp); + } + } + } + + //Get public Ips that should be handled by router + Network network = _networkDao.findById(guestNetworkId); + Map> ipToServices = _networkMgr.getIpToServices(allPublicIps, false, false); + Map> providerToIpList = _networkMgr.getProviderToIpList(network, ipToServices); + // Only cover virtual router for now, if ELB use it this need to be modified + + ArrayList publicIps = providerToIpList.get(provider); + return publicIps; + } + + @Override + public boolean finalizeStart(VirtualMachineProfile profile, long hostId, Commands cmds, + ReservationContext context) { + DomainRouterVO router = profile.getVirtualMachine(); + + boolean result = true; + + Answer answer = cmds.getAnswer("checkSsh"); + if (answer != null && answer instanceof CheckSshAnswer) { + CheckSshAnswer sshAnswer = (CheckSshAnswer) answer; + if (sshAnswer == null || !sshAnswer.getResult()) { + s_logger.warn("Unable to ssh to the VM: " + sshAnswer.getDetails()); + result = false; + } + } else { + result = false; + } + if (result == false) { + return result; + } + + //Get guest networks info + List guestNetworks = new ArrayList(); + + List routerNics = _nicDao.listByVmId(profile.getId()); + for (Nic routerNic : routerNics) { + Network network = _networkMgr.getNetwork(routerNic.getNetworkId()); + if (network.getTrafficType() == TrafficType.Guest) { + guestNetworks.add(network); + } + } + + answer = cmds.getAnswer("getDomRVersion"); + if (answer != null && answer instanceof GetDomRVersionAnswer) { + GetDomRVersionAnswer versionAnswer = (GetDomRVersionAnswer)answer; + if (answer == null || !answer.getResult()) { + s_logger.warn("Unable to get the template/scripts version of router " + router.getInstanceName() + + " due to: " + versionAnswer.getDetails()); + result = false; + } else { + router.setTemplateVersion(versionAnswer.getTemplateVersion()); + router.setScriptsVersion(versionAnswer.getScriptsVersion()); + router = _routerDao.persist(router, guestNetworks); + } + } else { + result = false; + } + + return result; + } + + @Override + public void finalizeStop(VirtualMachineProfile profile, StopAnswer answer) { + if (answer != null) { + VMInstanceVO vm = profile.getVirtualMachine(); + DomainRouterVO domR = _routerDao.findById(vm.getId()); + processStopOrRebootAnswer(domR, answer); + } + } + + @Override + public void finalizeExpunge(DomainRouterVO vm) { + } + + + @Override + public boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List routers) + throws ResourceUnavailableException { + if (routers == null || routers.isEmpty()) { + s_logger.warn("Failed to start remote access VPN: no router found for account and zone"); + throw new ResourceUnavailableException("Failed to start remote access VPN: no router found for account and zone", + DataCenter.class, network.getDataCenterId()); + } + + for (VirtualRouter router : routers) { + if (router.getState() != State.Running) { + s_logger.warn("Failed to start remote access VPN: router not in right state " + router.getState()); + throw new ResourceUnavailableException("Failed to start remote access VPN: router not in right state " + + router.getState(), DataCenter.class, network.getDataCenterId()); + } + + Commands cmds = new Commands(OnError.Stop); + createApplyVpnCommands(vpn, router, cmds); + + try { + _agentMgr.send(router.getHostId(), cmds); + } catch (OperationTimedoutException e) { + s_logger.debug("Failed to start remote access VPN: ", e); + throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e); + } + Answer answer = cmds.getAnswer("users"); + if (!answer.getResult()) { + s_logger.error("Unable to start vpn: unable add users to vpn in zone " + router.getDataCenterIdToDeployIn() + + " for account " + vpn.getAccountId() + " on domR: " + router.getInstanceName() + + " due to " + answer.getDetails()); + throw new ResourceUnavailableException("Unable to start vpn: Unable to add users to vpn in zone " + + router.getDataCenterIdToDeployIn() + " for account " + vpn.getAccountId() + " on domR: " + + router.getInstanceName() + " due to " + answer.getDetails(), DataCenter.class, router.getDataCenterIdToDeployIn()); + } + answer = cmds.getAnswer("startVpn"); + if (!answer.getResult()) { + s_logger.error("Unable to start vpn in zone " + router.getDataCenterIdToDeployIn() + " for account " + + vpn.getAccountId() + " on domR: " + router.getInstanceName() + " due to " + + answer.getDetails()); + throw new ResourceUnavailableException("Unable to start vpn in zone " + router.getDataCenterIdToDeployIn() + + " for account " + vpn.getAccountId() + " on domR: " + router.getInstanceName() + + " due to " + answer.getDetails(), DataCenter.class, router.getDataCenterIdToDeployIn()); + } + + } + return true; + } + + + @Override + public boolean deleteRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List routers) + throws ResourceUnavailableException { + if (routers == null || routers.isEmpty()) { + s_logger.warn("Failed to delete remote access VPN: no router found for account and zone"); + throw new ResourceUnavailableException("Failed to delete remote access VPN", DataCenter.class, network.getDataCenterId()); + } + + boolean result = true; + for (VirtualRouter router : routers) { + if (router.getState() == State.Running) { + Commands cmds = new Commands(OnError.Continue); + IpAddress ip = _networkMgr.getIp(vpn.getServerAddressId()); + + RemoteAccessVpnCfgCommand removeVpnCmd = new RemoteAccessVpnCfgCommand(false, ip.getAddress().addr(), + vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); + removeVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + removeVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(network.getId(), router.getId())); + removeVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + removeVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand(removeVpnCmd); + + result = result && sendCommandsToRouter(router, cmds); + } else if (router.getState() == State.Stopped) { + s_logger.debug("Router " + router + " is in Stopped state, not sending deleteRemoteAccessVpn command to it"); + continue; + } else { + s_logger.warn("Failed to delete remote access VPN: domR " + router + " is not in right state " + router.getState()); + throw new ResourceUnavailableException("Failed to delete remote access VPN: domR is not in right state " + + router.getState(), DataCenter.class, network.getDataCenterId()); + } + } + + return result; + } + + + private DomainRouterVO start(DomainRouterVO router, User user, Account caller, Map params, DeploymentPlan planToDeploy) + throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Starting router " + router); + if (_itMgr.start(router, params, user, caller, planToDeploy) != null) { + return _routerDao.findById(router.getId()); + } else { + return null; + } + } + + @Override + public DomainRouterVO stop(VirtualRouter router, boolean forced, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { + s_logger.debug("Stopping router " + router); + try { + if (_itMgr.advanceStop((DomainRouterVO) router, forced, user, caller)) { + return _routerDao.findById(router.getId()); + } else { + return null; + } + } catch (OperationTimedoutException e) { + throw new CloudRuntimeException("Unable to stop " + router, e); + } + } + + @Override + public boolean applyDhcpEntry(Network network, final NicProfile nic, VirtualMachineProfile profile, + DeployDestination dest, List routers) + throws ResourceUnavailableException { + _userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine()); + + final VirtualMachineProfile updatedProfile = profile; + final boolean isZoneBasic = (dest.getDataCenter().getNetworkType() == NetworkType.Basic); + final Long podId = isZoneBasic ? dest.getPod().getId() : null; + + boolean podLevelException = false; + //for user vm in Basic zone we should try to re-deploy vm in a diff pod if it fails to deploy in original pod; so throwing exception with Pod scope + if (isZoneBasic && podId != null && updatedProfile.getVirtualMachine().getType() == VirtualMachine.Type.User + && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Shared) { + podLevelException = true; + } + + return applyRules(network, routers, "dhcp entry", podLevelException, podId, true, new RuleApplier() { + @Override + public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { + //for basic zone, send dhcp/dns information to all routers in the basic network only when _dnsBasicZoneUpdates is set to "all" value + Commands cmds = new Commands(OnError.Stop); + if (!(isZoneBasic && router.getPodIdToDeployIn().longValue() != podId.longValue() && _dnsBasicZoneUpdates.equalsIgnoreCase("pod"))) { + NicVO nicVo = _nicDao.findById(nic.getId()); + createDhcpEntryCommand(router, updatedProfile.getVirtualMachine(), nicVo, cmds); + return sendCommandsToRouter(router, cmds); + } + return true; + } + }); + } + + private String findDefaultDnsIp(long userVmId) { + NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId); + + //check if DNS provider is the domR + if (!_networkMgr.isProviderSupportServiceInNetwork(defaultNic.getNetworkId(), Service.Dns, Provider.VirtualRouter)) { + return null; + } + + NetworkOfferingVO offering = _networkOfferingDao.findById(_networkDao.findById(defaultNic.getNetworkId()).getNetworkOfferingId()); + if (offering.getRedundantRouter()) { + return findGatewayIp(userVmId); + } + + //find domR's nic in the network + NicVO domrDefaultNic = _nicDao.findByNetworkIdAndType(defaultNic.getNetworkId(), VirtualMachine.Type.DomainRouter); + return domrDefaultNic.getIp4Address(); + } + + private String findGatewayIp(long userVmId) { + NicVO defaultNic = _nicDao.findDefaultNicForVM(userVmId); + return defaultNic.getGateway(); + } + + @Override + public boolean applyUserData(Network network, final NicProfile nic, VirtualMachineProfile profile, DeployDestination dest, List routers) + throws ResourceUnavailableException { + _userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine()); + + final VirtualMachineProfile updatedProfile = profile; + final boolean isZoneBasic = (dest.getDataCenter().getNetworkType() == NetworkType.Basic); + final Long podId = isZoneBasic ? dest.getPod().getId() : null; + + boolean podLevelException = false; + //for user vm in Basic zone we should try to re-deploy vm in a diff pod if it fails to deploy in original pod; so throwing exception with Pod scope + if (isZoneBasic && podId != null && updatedProfile.getVirtualMachine().getType() == VirtualMachine.Type.User + && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Shared) { + podLevelException = true; + } + + return applyRules(network, routers, "userdata and password entry", podLevelException, podId, false, new RuleApplier() { + @Override + public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { + //for basic zone, send vm data/password information only to the router in the same pod + Commands cmds = new Commands(OnError.Stop); + if (!(isZoneBasic && router.getPodIdToDeployIn().longValue() != podId.longValue())) { + NicVO nicVo = _nicDao.findById(nic.getId()); + createPasswordCommand(router, updatedProfile, nicVo, cmds); + createVmDataCommand(router, updatedProfile.getVirtualMachine(), nicVo, updatedProfile.getVirtualMachine().getDetail("SSH.PublicKey"), cmds); + return sendCommandsToRouter(router, cmds); + } + return true; + } + }); + } + + @Override + public DomainRouterVO persist(DomainRouterVO router) { + DomainRouterVO virtualRouter = _routerDao.persist(router); + return virtualRouter; + } + + @Override + //FIXME add partial success and STOP state support + public String[] applyVpnUsers(Network network, List users, List routers) throws ResourceUnavailableException { + if (routers == null || routers.isEmpty()) { + s_logger.warn("Failed to add/remove VPN users: no router found for account and zone"); + throw new ResourceUnavailableException("Unable to assign ip addresses, domR doesn't exist for network " + + network.getId(), DataCenter.class, network.getDataCenterId()); + } + + boolean agentResults = true; + + for (DomainRouterVO router : routers) { + if (router.getState() != State.Running) { + s_logger.warn("Failed to add/remove VPN users: router not in running state"); + throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + + router.getState(), DataCenter.class, network.getDataCenterId()); + } + + Commands cmds = new Commands(OnError.Continue); + List addUsers = new ArrayList(); + List removeUsers = new ArrayList(); + for (VpnUser user : users) { + if (user.getState() == VpnUser.State.Add || user.getState() == VpnUser.State.Active) { + addUsers.add(user); + } else if (user.getState() == VpnUser.State.Revoke) { + removeUsers.add(user); + } + } + + VpnUsersCfgCommand cmd = new VpnUsersCfgCommand(addUsers, removeUsers); + cmd.setAccessDetail(NetworkElementCommand.ACCOUNT_ID, String.valueOf(router.getAccountId())); + cmd.setAccessDetail(NetworkElementCommand.GUEST_NETWORK_CIDR, network.getCidr()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(network.getId(), router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand(cmd); + + + // Currently we receive just one answer from the agent. In the future we have to parse individual answers and set + // results accordingly + boolean agentResult = sendCommandsToRouter(router, cmds); + agentResults = agentResults && agentResult; + } + + String[] result = new String[users.size()]; + for (int i = 0; i < result.length; i++) { + if (agentResults) { + result[i] = null; + } else { + result[i] = String.valueOf(agentResults); + } + } + + return result; + } + + @Override + public DomainRouterVO findById(long id) { + return _routerDao.findById(id); + } + + @Override + public DomainRouterVO findByName(String name) { + if (!VirtualMachineName.isValidRouterName(name)) { + return null; + } + + return _routerDao.findById(VirtualMachineName.getRouterId(name)); + } + + @Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_START, eventDescription = "starting router Vm", async = true) + public VirtualRouter startRouter(long id) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException{ + return startRouter(id, true); + } + + @Override + public VirtualRouter startRouter(long routerId, boolean reprogramNetwork) throws ResourceUnavailableException, + InsufficientCapacityException, ConcurrentOperationException { + Account caller = UserContext.current().getCaller(); + User callerUser = _accountMgr.getActiveUser(UserContext.current().getCallerUserId()); + + // verify parameters + DomainRouterVO router = _routerDao.findById(routerId); + if (router == null) { + throw new InvalidParameterValueException("Unable to find router by id " + routerId + "."); + } + _accountMgr.checkAccess(caller, null, true, router); + + Account owner = _accountMgr.getAccount(router.getAccountId()); + + // Check if all networks are implemented for the domR; if not - implement them + DataCenter dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); + HostPodVO pod = null; + if (router.getPodIdToDeployIn() != null) { + pod = _podDao.findById(router.getPodIdToDeployIn()); + } + DeployDestination dest = new DeployDestination(dc, pod, null, null); + + ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner); + + List nics = _nicDao.listByVmId(routerId); + + for (NicVO nic : nics) { + if (!_networkMgr.startNetwork(nic.getNetworkId(), dest, context)) { + s_logger.warn("Failed to start network id=" + nic.getNetworkId() + " as a part of domR start"); + throw new CloudRuntimeException("Failed to start network id=" + nic.getNetworkId() + " as a part of domR start"); + } + } + + UserVO user = _userDao.findById(UserContext.current().getCallerUserId()); + Map params = new HashMap(); + if (reprogramNetwork) { + params.put(Param.ReProgramGuestNetworks, true); + } else { + params.put(Param.ReProgramGuestNetworks, false); + } + VirtualRouter virtualRouter = startVirtualRouter(router, user, caller, params); + if(virtualRouter == null){ + throw new CloudRuntimeException("Failed to start router with id " + routerId); + } + return virtualRouter; + } + + private void createAssociateIPCommands(final VirtualRouter router, final List ips, Commands cmds, long vmId) { + + // Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc.. + Map> vlanIpMap = new HashMap>(); + for (final PublicIpAddress ipAddress : ips) { + String vlanTag = ipAddress.getVlanTag(); + ArrayList ipList = vlanIpMap.get(vlanTag); + if (ipList == null) { + ipList = new ArrayList(); + } + //domR doesn't support release for sourceNat IP address; so reset the state + if (ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) { + ipAddress.setState(IpAddress.State.Allocated); + } + ipList.add(ipAddress); + vlanIpMap.put(vlanTag, ipList); + } + + for (Map.Entry> vlanAndIp : vlanIpMap.entrySet()) { + List ipAddrList = vlanAndIp.getValue(); + // Source nat ip address should always be sent first + Collections.sort(ipAddrList, new Comparator() { + @Override + public int compare(PublicIpAddress o1, PublicIpAddress o2) { + boolean s1 = o1.isSourceNat(); + boolean s2 = o2.isSourceNat(); + return (s1 ^ s2) ? ((s1 ^ true) ? 1 : -1) : 0; + } + }); + + // Get network rate - required for IpAssoc + Integer networkRate = _networkMgr.getNetworkRate(ipAddrList.get(0).getNetworkId(), router.getId()); + Network network = _networkMgr.getNetwork(ipAddrList.get(0).getNetworkId()); + + IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()]; + int i = 0; + boolean firstIP = true; + + for (final PublicIpAddress ipAddr : ipAddrList) { + + boolean add = (ipAddr.getState() == IpAddress.State.Releasing ? false : true); + boolean sourceNat = ipAddr.isSourceNat(); + /* enable sourceNAT for the first ip of the public interface */ + if (firstIP) { + sourceNat = true; + } + String vlanId = ipAddr.getVlanTag(); + String vlanGateway = ipAddr.getGateway(); + String vlanNetmask = ipAddr.getNetmask(); + String vifMacAddress = ipAddr.getMacAddress(); + + String vmGuestAddress = null; + + IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, + sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress, networkRate, ipAddr.isOneToOneNat()); + + ip.setTrafficType(network.getTrafficType()); + ip.setNetworkName(_networkMgr.getNetworkTag(router.getHypervisorType(), network)); + ipsToSend[i++] = ip; + /* send the firstIP = true for the first Add, this is to create primary on interface*/ + if (!firstIP || add) { + firstIP = false; + } + } + IpAssocCommand cmd = new IpAssocCommand(ipsToSend); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("IPAssocCommand", cmd); + } + } + + private void createApplyPortForwardingRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { + List rulesTO = null; + if (rules != null) { + rulesTO = new ArrayList(); + for (PortForwardingRule rule : rules) { + IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); + PortForwardingRuleTO ruleTO = new PortForwardingRuleTO(rule, null, sourceIp.getAddress().addr()); + rulesTO.add(ruleTO); + } + } + + SetPortForwardingRulesCommand cmd = null; + + if (router.getVpcId() != null) { + cmd = new SetPortForwardingRulesVpcCommand(rulesTO); + } else { + cmd = new SetPortForwardingRulesCommand(rulesTO); + } + + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand(cmd); + } + + private void createApplyStaticNatRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { + List rulesTO = null; + if (rules != null) { + rulesTO = new ArrayList(); + for (StaticNatRule rule : rules) { + IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); + StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, null, sourceIp.getAddress().addr(), rule.getDestIpAddress()); + rulesTO.add(ruleTO); + } + } + + SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, router.getVpcId()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + cmds.addCommand(cmd); + } + + private void createApplyLoadBalancingRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { + + LoadBalancerTO[] lbs = new LoadBalancerTO[rules.size()]; + int i = 0; + for (LoadBalancingRule rule : rules) { + boolean revoked = (rule.getState().equals(FirewallRule.State.Revoke)); + String protocol = rule.getProtocol(); + String algorithm = rule.getAlgorithm(); + + String srcIp = _networkMgr.getIp(rule.getSourceIpAddressId()).getAddress().addr(); + int srcPort = rule.getSourcePortStart(); + List destinations = rule.getDestinations(); + List stickinessPolicies = rule.getStickinessPolicies(); + LoadBalancerTO lb = new LoadBalancerTO(rule.getId(), srcIp, srcPort, protocol, algorithm, revoked, false, destinations, stickinessPolicies); + lbs[i++] = lb; + } + String routerPublicIp = null; + + if (router instanceof DomainRouterVO) { + DomainRouterVO domr = _routerDao.findById(router.getId()); + routerPublicIp = domr.getPublicIpAddress(); + } + + Network guestNetwork = _networkMgr.getNetwork(guestNetworkId); + Nic nic = _nicDao.findByInstanceIdAndNetworkId(guestNetwork.getId(), router.getId()); + NicProfile nicProfile = new NicProfile(nic, guestNetwork, nic.getBroadcastUri(), nic.getIsolationUri(), + _networkMgr.getNetworkRate(guestNetwork.getId(), router.getId()), + _networkMgr.isSecurityGroupSupportedInNetwork(guestNetwork), + _networkMgr.getNetworkTag(router.getHypervisorType(), guestNetwork)); + + LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs,routerPublicIp, + getRouterIpInNetwork(guestNetworkId, router.getId()),router.getPrivateIpAddress(), + _itMgr.toNicTO(nicProfile, router.getHypervisorType()), router.getVpcId()); + + cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key()); + cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key()); + cmd.lbStatsAuth = _configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key()); + cmd.lbStatsPort = _configDao.getValue(Config.NetworkLBHaproxyStatsPort.key()); + + + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + cmds.addCommand(cmd); + + } + + private void createApplyVpnCommands(RemoteAccessVpn vpn, VirtualRouter router, Commands cmds) { + List vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId()); + List addUsers = new ArrayList(); + List removeUsers = new ArrayList(); + for (VpnUser user : vpnUsers) { + if (user.getState() == VpnUser.State.Add) { + addUsers.add(user); + } else if (user.getState() == VpnUser.State.Revoke) { + removeUsers.add(user); + } + } + + VpnUsersCfgCommand addUsersCmd = new VpnUsersCfgCommand(addUsers, removeUsers); + addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(vpn.getNetworkId(), router.getId())); + addUsersCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + + IpAddress ip = _networkMgr.getIp(vpn.getServerAddressId()); + + RemoteAccessVpnCfgCommand startVpnCmd = new RemoteAccessVpnCfgCommand(true, ip.getAddress().addr(), + vpn.getLocalIp(), vpn.getIpRange(), vpn.getIpsecPresharedKey()); + startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(vpn.getNetworkId(), router.getId())); + startVpnCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + startVpnCmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("users", addUsersCmd); + cmds.addCommand("startVpn", startVpnCmd); + } + + private void createPasswordCommand(VirtualRouter router, VirtualMachineProfile profile, NicVO nic, Commands cmds) { + String password = (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + + // password should be set only on default network element + if (password != null && nic.isDefaultNic()) { + final String encodedPassword = PasswordGenerator.rot13(password); + SavePasswordCommand cmd = new SavePasswordCommand(encodedPassword, nic.getIp4Address(), profile.getVirtualMachine().getHostName()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(nic.getNetworkId(), router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("password", cmd); + } + + } + + private void createVmDataCommand(VirtualRouter router, UserVm vm, NicVO nic, String publicKey, Commands cmds) { + String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId()).getDisplayText(); + String zoneName = _dcDao.findById(router.getDataCenterIdToDeployIn()).getName(); + cmds.addCommand("vmdata", + generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), + vm.getHostName(), vm.getInstanceName(), vm.getId(), publicKey, nic.getNetworkId())); + + } + + private void createVmDataCommandForVMs(DomainRouterVO router, Commands cmds, long guestNetworkId) { + List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, State.Migrating, State.Stopping); + DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); + for (UserVmVO vm : vms) { + boolean createVmData = true; + if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue()) { + createVmData = false; + } + + if (createVmData) { + NicVO nic = _nicDao.findByInstanceIdAndNetworkId(guestNetworkId, vm.getId()); + if (nic != null) { + s_logger.debug("Creating user data entry for vm " + vm + " on domR " + router); + createVmDataCommand(router, vm, nic, null, cmds); + } + } + } + } + + private void createDhcpEntryCommand(VirtualRouter router, UserVm vm, NicVO nic, Commands cmds) { + DhcpEntryCommand dhcpCommand = new DhcpEntryCommand(nic.getMacAddress(), nic.getIp4Address(), vm.getHostName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + String gatewayIp = findGatewayIp(vm.getId()); + if (!gatewayIp.equals(nic.getGateway())) { + GuestOSVO guestOS = _guestOSDao.findById(vm.getGuestOSId()); + // Don't set dhcp:router option for non-default nic on CentOS/RHEL, because they would set routing on wrong interface + // This is tricky, we may need to update this when we have more information on various OS's behavior + if (guestOS.getDisplayName().startsWith("CentOS") || guestOS.getDisplayName().startsWith("Red Hat Enterprise")) { + gatewayIp = "0.0.0.0"; + } + } + dhcpCommand.setDefaultRouter(gatewayIp); + dhcpCommand.setDefaultDns(findDefaultDnsIp(vm.getId())); + + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + dhcpCommand.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(nic.getNetworkId(), router.getId())); + dhcpCommand.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + + cmds.addCommand("dhcp", dhcpCommand); + } + + private void createDhcpEntryCommandsForVMs(DomainRouterVO router, Commands cmds, long guestNetworkId) { + List vms = _userVmDao.listByNetworkIdAndStates(guestNetworkId, State.Running, State.Migrating, State.Stopping); + DataCenterVO dc = _dcDao.findById(router.getDataCenterIdToDeployIn()); + for (UserVmVO vm : vms) { + boolean createDhcp = true; + if (dc.getNetworkType() == NetworkType.Basic && router.getPodIdToDeployIn().longValue() != vm.getPodIdToDeployIn().longValue() + && _dnsBasicZoneUpdates.equalsIgnoreCase("pod")) { + createDhcp = false; + } + if (createDhcp) { + NicVO nic = _nicDao.findByInstanceIdAndNetworkId(guestNetworkId, vm.getId()); + if (nic != null) { + s_logger.debug("Creating dhcp entry for vm " + vm + " on domR " + router + "."); + createDhcpEntryCommand(router, vm, nic, cmds); + } + } + } + } + + protected boolean sendCommandsToRouter(final VirtualRouter router, Commands cmds) throws AgentUnavailableException { + Answer[] answers = null; + try { + answers = _agentMgr.send(router.getHostId(), cmds); + } catch (OperationTimedoutException e) { + s_logger.warn("Timed Out", e); + throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e); + } + + if (answers == null) { + return false; + } + + if (answers.length != cmds.size()) { + return false; + } + + // FIXME: Have to return state for individual command in the future + boolean result = true; + if (answers.length > 0) { + for (Answer answer : answers) { + if (!answer.getResult()) { + result = false; + break; + } + } + } + return result; + } + + protected void handleSingleWorkingRedundantRouter(List connectedRouters, List disconnectedRouters, String reason) throws ResourceUnavailableException + { + if (connectedRouters.isEmpty() || disconnectedRouters.isEmpty()) { + return; + } + if (connectedRouters.size() != 1 || disconnectedRouters.size() != 1) { + s_logger.warn("How many redundant routers do we have?? "); + return; + } + if (!connectedRouters.get(0).getIsRedundantRouter()) { + throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", + DataCenter.class, connectedRouters.get(0).getDataCenterIdToDeployIn()); + } + if (!disconnectedRouters.get(0).getIsRedundantRouter()) { + throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", + DataCenter.class, disconnectedRouters.get(0).getDataCenterIdToDeployIn()); + } + + DomainRouterVO connectedRouter = (DomainRouterVO)connectedRouters.get(0); + DomainRouterVO disconnectedRouter = (DomainRouterVO)disconnectedRouters.get(0); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("About to stop the router " + disconnectedRouter.getInstanceName() + " due to: " + reason); + } + String title = "Virtual router " + disconnectedRouter.getInstanceName() + " would be stopped after connecting back, due to " + reason; + String context = "Virtual router (name: " + disconnectedRouter.getInstanceName() + ", id: " + disconnectedRouter.getId() + ") would be stopped after connecting back, due to: " + reason; + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, + disconnectedRouter.getDataCenterIdToDeployIn(), disconnectedRouter.getPodIdToDeployIn(), title, context); + disconnectedRouter.setStopPending(true); + disconnectedRouter = _routerDao.persist(disconnectedRouter); + + int connRouterPR = getRealPriority(connectedRouter); + int disconnRouterPR = getRealPriority(disconnectedRouter); + if (connRouterPR < disconnRouterPR) { + //connRouterPR < disconnRouterPR, they won't equal at anytime + if (!connectedRouter.getIsPriorityBumpUp()) { + final BumpUpPriorityCommand command = new BumpUpPriorityCommand(); + command.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(connectedRouter.getId())); + command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, connectedRouter.getInstanceName()); + final Answer answer = _agentMgr.easySend(connectedRouter.getHostId(), command); + if (!answer.getResult()) { + s_logger.error("Failed to bump up " + connectedRouter.getInstanceName() + "'s priority! " + answer.getDetails()); + } + } else { + String t = "Can't bump up virtual router " + connectedRouter.getInstanceName() + "'s priority due to it's already bumped up!"; + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_DOMAIN_ROUTER, + connectedRouter.getDataCenterIdToDeployIn(), connectedRouter.getPodIdToDeployIn(), t, t); + } + } + } + + @Override + public boolean associatePublicIP(Network network, final List ipAddress, List routers) + throws ResourceUnavailableException { + if (ipAddress == null || ipAddress.isEmpty()) { + s_logger.debug("No ip association rules to be applied for network " + network.getId()); + return true; + } + return applyRules(network, routers, "ip association", false, null, false, new RuleApplier() { + @Override + public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createAssociateIPCommands(router, ipAddress, cmds, 0); + return sendCommandsToRouter(router, cmds); + } + }); + } + + @Override + public boolean applyFirewallRules(Network network, final List rules, List routers) throws ResourceUnavailableException { + if (rules == null || rules.isEmpty()) { + s_logger.debug("No firewall rules to be applied for network " + network.getId()); + return true; + } + return applyRules(network, routers, "firewall rules", false, null, false, new RuleApplier() { + @Override + public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { + if (rules.get(0).getPurpose() == Purpose.LoadBalancing) { + // for load balancer we have to resend all lb rules for the network + List lbs = _loadBalancerDao.listByNetworkId(network.getId()); + List lbRules = new ArrayList(); + for (LoadBalancerVO lb : lbs) { + List dstList = _lbMgr.getExistingDestinations(lb.getId()); + List policyList = _lbMgr.getStickinessPolicies(lb.getId()); + LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList,policyList); + lbRules.add(loadBalancing); + } + return sendLBRules(router, lbRules, network.getId()); + } else if (rules.get(0).getPurpose() == Purpose.PortForwarding) { + return sendPortForwardingRules(router, (List) rules, network.getId()); + } else if (rules.get(0).getPurpose() == Purpose.StaticNat) { + return sendStaticNatRules(router, (List) rules, network.getId()); + } else if (rules.get(0).getPurpose() == Purpose.Firewall) { + return sendFirewallRules(router, (List) rules, network.getId()); + } else { + s_logger.warn("Unable to apply rules of purpose: " + rules.get(0).getPurpose()); + return false; + } + } + }); + } + + protected boolean sendLBRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createApplyLoadBalancingRulesCommands(rules, router, cmds, guestNetworkId); + return sendCommandsToRouter(router, cmds); + } + + protected boolean sendPortForwardingRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createApplyPortForwardingRulesCommands(rules, router, cmds, guestNetworkId); + return sendCommandsToRouter(router, cmds); + } + + protected boolean sendStaticNatRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createApplyStaticNatRulesCommands(rules, router, cmds, guestNetworkId); + return sendCommandsToRouter(router, cmds); + } + + @Override + public List getRoutersForNetwork(long networkId) { + List routers = _routerDao.findByNetwork(networkId); + List vrs = new ArrayList(routers.size()); + for (DomainRouterVO router : routers) { + vrs.add(router); + } + return vrs; + } + + private void createFirewallRulesCommands(List rules, VirtualRouter router, Commands cmds, long guestNetworkId) { + List rulesTO = null; + if (rules != null) { + rulesTO = new ArrayList(); + for (FirewallRule rule : rules) { + IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); + FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, sourceIp.getAddress().addr()); + rulesTO.add(ruleTO); + } + } + + SetFirewallRulesCommand cmd = new SetFirewallRulesCommand(rulesTO); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + cmds.addCommand(cmd); + } + + + protected boolean sendFirewallRules(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createFirewallRulesCommands(rules, router, cmds, guestNetworkId); + return sendCommandsToRouter(router, cmds); + } + + @Override + public String getDnsBasicZoneUpdate() { + return _dnsBasicZoneUpdates; + } + + protected interface RuleApplier { + boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException; + } + + protected boolean applyRules(Network network, List routers, String typeString, + boolean isPodLevelException, Long podId, boolean failWhenDisconnect, RuleApplier applier) throws ResourceUnavailableException { + if (routers == null || routers.isEmpty()) { + s_logger.warn("Unable to apply " + typeString + ", virtual router doesn't exist in the network " + network.getId()); + throw new ResourceUnavailableException("Unable to apply " + typeString , DataCenter.class, network.getDataCenterId()); + } + + DataCenter dc = _dcDao.findById(network.getDataCenterId()); + boolean isZoneBasic = (dc.getNetworkType() == NetworkType.Basic); + + // isPodLevelException and podId is only used for basic zone + assert !((!isZoneBasic && isPodLevelException) || (isZoneBasic && isPodLevelException && podId == null)); + + List connectedRouters = new ArrayList(); + List disconnectedRouters = new ArrayList(); + boolean result = true; + String msg = "Unable to apply " + typeString + " on disconnected router "; + for (VirtualRouter router : routers) { + if (router.getState() == State.Running) { + s_logger.debug("Applying " + typeString + " in network " + network); + + if (router.isStopPending()) { + if (_hostDao.findById(router.getHostId()).getStatus() == Status.Up) { + throw new ResourceUnavailableException("Unable to process due to the stop pending router " + + router.getInstanceName() + " haven't been stopped after it's host coming back!", + DataCenter.class, router.getDataCenterIdToDeployIn()); + } + s_logger.debug("Router " + router.getInstanceName() + " is stop pending, so not sending apply " + + typeString + " commands to the backend"); + continue; + } + try { + result = applier.execute(network, router); + connectedRouters.add(router); + } catch (AgentUnavailableException e) { + s_logger.warn(msg + router.getInstanceName(), e); + disconnectedRouters.add(router); + } + + //If rules fail to apply on one domR and not due to disconnection, no need to proceed with the rest + if (!result) { + if (isZoneBasic && isPodLevelException) { + throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", Pod.class, podId); + } + throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", DataCenter.class, + router.getDataCenterIdToDeployIn()); + } + + } else if (router.getState() == State.Stopped || router.getState() == State.Stopping) { + s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + + ", so not sending apply " + typeString + " commands to the backend"); + } else { + s_logger.warn("Unable to apply " + typeString +", virtual router is not in the right state " + router.getState()); + if (isZoneBasic && isPodLevelException) { + throw new ResourceUnavailableException("Unable to apply " + typeString + + ", virtual router is not in the right state", Pod.class, podId); + } + throw new ResourceUnavailableException("Unable to apply " + typeString + + ", virtual router is not in the right state", DataCenter.class, router.getDataCenterIdToDeployIn()); + } + } + + if (!connectedRouters.isEmpty()) { + if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) { + // These disconnected redundant virtual routers are out of sync now, stop them for synchronization + handleSingleWorkingRedundantRouter(connectedRouters, disconnectedRouters, msg); + } + } else if (!disconnectedRouters.isEmpty()) { + for (VirtualRouter router : disconnectedRouters) { + if (s_logger.isDebugEnabled()) { + s_logger.debug(msg + router.getInstanceName() + "(" + router.getId() + ")"); + } + } + if (isZoneBasic && isPodLevelException) { + throw new ResourceUnavailableException(msg, Pod.class, podId); + } + throw new ResourceUnavailableException(msg, DataCenter.class, disconnectedRouters.get(0).getDataCenterIdToDeployIn()); + } + + result = true; + if (failWhenDisconnect) { + result = !connectedRouters.isEmpty(); + } + return result; + } + + @Override + public boolean applyStaticNats(Network network, final List rules, List routers) throws ResourceUnavailableException { + if (rules == null || rules.isEmpty()) { + s_logger.debug("No static nat rules to be applied for network " + network.getId()); + return true; + } + return applyRules(network, routers, "static nat rules", false, null, false, new RuleApplier() { + @Override + public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { + return applyStaticNat(router, rules, network.getId()); + } + }); + } + + + protected boolean applyStaticNat(VirtualRouter router, List rules, long guestNetworkId) throws ResourceUnavailableException { + Commands cmds = new Commands(OnError.Continue); + createApplyStaticNatCommands(rules, router, cmds, guestNetworkId); + return sendCommandsToRouter(router, cmds); + } + + private void createApplyStaticNatCommands(List rules, VirtualRouter router, Commands cmds, + long guestNetworkId) { + List rulesTO = null; + if (rules != null) { + rulesTO = new ArrayList(); + for (StaticNat rule : rules) { + IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId()); + StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, + null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(), false); + rulesTO.add(ruleTO); + } + } + + SetStaticNatRulesCommand cmd = new SetStaticNatRulesCommand(rulesTO, router.getVpcId()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, getRouterControlIp(router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, getRouterIpInNetwork(guestNetworkId, router.getId())); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + DataCenterVO dcVo = _dcDao.findById(router.getDataCenterIdToDeployIn()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + cmds.addCommand(cmd); + } + + @Override + public int getTimeout() { + return -1; + } + + @Override + public boolean isRecurring() { + return false; + } + + @Override + public boolean processAnswers(long agentId, long seq, Answer[] answers) { + return false; + } + + @Override + public boolean processCommands(long agentId, long seq, Command[] commands) { + return false; + } + + @Override + public void processConnect(HostVO host, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + UserContext context = UserContext.current(); + context.setAccountId(1); + List routers = _routerDao.listIsolatedByHostId(host.getId()); + for (DomainRouterVO router : routers) { + if (router.isStopPending()) { + State state = router.getState(); + if (state != State.Stopped && state != State.Destroyed) { + try { + stopRouter(router.getId(), false); + } catch (ResourceUnavailableException e) { + s_logger.warn("Fail to stop router " + router.getInstanceName(), e); + throw new ConnectionException(false, "Fail to stop router " + router.getInstanceName()); + } catch (ConcurrentOperationException e) { + s_logger.warn("Fail to stop router " + router.getInstanceName(), e); + throw new ConnectionException(false, "Fail to stop router " + router.getInstanceName()); + } + } + router.setStopPending(false); + router = _routerDao.persist(router); + } + } + } + + @Override + public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { + return null; + } + + @Override + + public boolean processDisconnect(long agentId, Status state) { + return false; + } + + @Override + public boolean processTimeout(long agentId, long seq) { + return false; + } + + protected String getRouterControlIp(long routerId) { + String routerControlIpAddress = null; + List nics = _nicDao.listByVmId(routerId); + for (NicVO n : nics) { + NetworkVO nc = _networkDao.findById(n.getNetworkId()); + if (nc.getTrafficType() == TrafficType.Control) { + routerControlIpAddress = n.getIp4Address(); + } + } + + if(routerControlIpAddress == null) { + s_logger.warn("Unable to find router's control ip in its attached NICs!. routerId: " + routerId); + DomainRouterVO router = _routerDao.findById(routerId); + return router.getPrivateIpAddress(); + } + + return routerControlIpAddress; + } + + + protected String getRouterIpInNetwork(long networkId, long instanceId) { + return _nicDao.getIpAddress(networkId, instanceId); + } + + + @Override + public boolean plugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) + throws ConcurrentOperationException, ResourceUnavailableException, + InsufficientCapacityException { + //not supported + throw new UnsupportedOperationException("Plug nic is not supported for vm of type " + vm.getType()); + } + + @Override + public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) + throws ConcurrentOperationException, ResourceUnavailableException { + //not supported + throw new UnsupportedOperationException("Unplug nic is not supported for vm of type " + vm.getType()); + } + + @Override + public void prepareStop(VirtualMachineProfile profile){ + //Collect network usage before stopping Vm + VMInstanceVO vm = profile.getVirtualMachine(); + DomainRouterVO router = _routerDao.findById(vm.getId()); + if(router == null){ + return; + } + String privateIP = router.getPrivateIpAddress(); + + if (privateIP != null) { + List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); + + for (Long guestNtwkId : routerGuestNtwkIds) { + boolean forVpc = router.getVpcId() != null; + Network guestNtwk = _networkMgr.getNetwork(guestNtwkId); + Nic guestNic = _nicDao.findByInstanceIdAndNetworkId(guestNtwk.getId(), router.getId()); + NicProfile guestNicProfile = new NicProfile(guestNic, guestNtwk, guestNic.getBroadcastUri(), + guestNic.getIsolationUri(), _networkMgr.getNetworkRate(guestNtwk.getId(), router.getId()), + _networkMgr.isSecurityGroupSupportedInNetwork(guestNtwk), + _networkMgr.getNetworkTag(router.getHypervisorType(), guestNtwk)); + final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(), + forVpc, _itMgr.toNicTO(guestNicProfile, router.getHypervisorType())); + UserStatisticsVO previousStats = _statsDao.findBy(router.getAccountId(), + router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); + NetworkUsageAnswer answer = null; + try { + answer = (NetworkUsageAnswer) _agentMgr.easySend(router.getHostId(), usageCmd); + } catch (Exception e) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId(), e); + continue; + } + + if (answer != null) { + if (!answer.getResult()) { + s_logger.warn("Error while collecting network stats from router: "+router.getInstanceName()+" from host: "+router.getHostId() + "; details: " + answer.getDetails()); + continue; + } + Transaction txn = Transaction.open(Transaction.CLOUD_DB); + try { + if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) { + s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics"); + continue; + } + txn.start(); + UserStatisticsVO stats = _statsDao.lock(router.getAccountId(), + router.getDataCenterIdToDeployIn(), guestNtwkId, null, router.getId(), router.getType().toString()); + if (stats == null) { + s_logger.warn("unable to find stats for account: " + router.getAccountId()); + continue; + } + + if(previousStats != null + && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived()) + || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){ + s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " + + "Ignoring current answer. Router: "+answer.getRouterName()+" Rcvd: " + + answer.getBytesReceived()+ "Sent: " +answer.getBytesSent()); + continue; + } + + if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesReceived() + + " Stored: " + stats.getCurrentBytesReceived()); + } + stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived()); + } + stats.setCurrentBytesReceived(answer.getBytesReceived()); + if (stats.getCurrentBytesSent() > answer.getBytesSent()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Received # of bytes that's less than the last one. " + + "Assuming something went wrong and persisting it. Router: " + + answer.getRouterName()+" Reported: " + answer.getBytesSent() + + " Stored: " + stats.getCurrentBytesSent()); + } + stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent()); + } + stats.setCurrentBytesSent(answer.getBytesSent()); + _statsDao.update(stats.getId(), stats); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Unable to update user statistics for account: " + router.getAccountId() + + " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent()); + } finally { + txn.close(); + } + } + } + } + } + + @Override + public boolean recreateNeeded( + VirtualMachineProfile profile, long hostId, + Commands cmds, ReservationContext context) { + //asssume that if failed to ssh into router, meaning router is crashed + CheckSshAnswer answer = (CheckSshAnswer) cmds.getAnswer("checkSsh"); + if (answer == null || !answer.getResult()) { + return true; + } + + return false; + } +} diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index ac496027f51..edf45bcfeb8 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1,2560 +1,2560 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.vm; - -import java.net.URI; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; - -import com.cloud.agent.AgentManager; -import com.cloud.agent.AgentManager.OnError; -import com.cloud.agent.Listener; -import com.cloud.agent.api.AgentControlAnswer; -import com.cloud.agent.api.AgentControlCommand; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.CheckVirtualMachineAnswer; -import com.cloud.agent.api.CheckVirtualMachineCommand; -import com.cloud.agent.api.ClusterSyncAnswer; -import com.cloud.agent.api.ClusterSyncCommand; -import com.cloud.agent.api.Command; -import com.cloud.agent.api.MigrateAnswer; -import com.cloud.agent.api.MigrateCommand; -import com.cloud.agent.api.PingRoutingCommand; -import com.cloud.agent.api.PrepareForMigrationAnswer; -import com.cloud.agent.api.PrepareForMigrationCommand; -import com.cloud.agent.api.RebootAnswer; -import com.cloud.agent.api.RebootCommand; -import com.cloud.agent.api.StartAnswer; -import com.cloud.agent.api.StartCommand; -import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.api.StartupRoutingCommand; -import com.cloud.agent.api.StartupRoutingCommand.VmState; -import com.cloud.agent.api.StopAnswer; -import com.cloud.agent.api.StopCommand; -import com.cloud.agent.api.to.NicTO; -import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.agent.manager.Commands; -import com.cloud.agent.manager.allocator.HostAllocator; -import com.cloud.alert.AlertManager; -import com.cloud.capacity.CapacityManager; -import com.cloud.cluster.ClusterManager; -import com.cloud.cluster.StackMaid; -import com.cloud.configuration.Config; -import com.cloud.configuration.ConfigurationManager; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.consoleproxy.ConsoleProxyManager; -import com.cloud.dc.DataCenter; -import com.cloud.dc.DataCenterVO; -import com.cloud.dc.HostPodVO; -import com.cloud.dc.dao.DataCenterDao; -import com.cloud.dc.dao.HostPodDao; -import com.cloud.deploy.DataCenterDeployment; -import com.cloud.deploy.DeployDestination; -import com.cloud.deploy.DeploymentPlan; -import com.cloud.deploy.DeploymentPlanner; -import com.cloud.deploy.DeploymentPlanner.ExcludeList; -import com.cloud.domain.dao.DomainDao; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.ConnectionException; -import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.InsufficientServerCapacityException; -import com.cloud.exception.InsufficientVirtualNetworkCapcityException; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.ManagementServerException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.VirtualMachineMigrationException; -import com.cloud.ha.HighAvailabilityManager; -import com.cloud.ha.HighAvailabilityManager.WorkType; -import com.cloud.host.Host; -import com.cloud.host.HostVO; -import com.cloud.host.Status; -import com.cloud.host.dao.HostDao; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.hypervisor.HypervisorGuru; -import com.cloud.hypervisor.HypervisorGuruManager; -import com.cloud.network.Network; -import com.cloud.network.NetworkManager; -import com.cloud.network.NetworkVO; -import com.cloud.network.dao.NetworkDao; -import com.cloud.offering.ServiceOffering; -import com.cloud.org.Cluster; -import com.cloud.resource.ResourceManager; -import com.cloud.service.ServiceOfferingVO; -import com.cloud.service.dao.ServiceOfferingDao; -import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.StorageManager; -import com.cloud.storage.StoragePool; -import com.cloud.storage.StoragePoolVO; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.Volume; -import com.cloud.storage.Volume.Type; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.GuestOSCategoryDao; -import com.cloud.storage.dao.GuestOSDao; -import com.cloud.storage.dao.StoragePoolDao; -import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VolumeDao; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.User; -import com.cloud.user.dao.AccountDao; -import com.cloud.user.dao.UserDao; -import com.cloud.utils.Journal; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; -import com.cloud.utils.Ternary; -import com.cloud.utils.component.Adapters; -import com.cloud.utils.component.ComponentLocator; -import com.cloud.utils.component.Inject; -import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.db.DB; -import com.cloud.utils.db.GlobalLock; -import com.cloud.utils.db.Transaction; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.exception.ExecutionException; -import com.cloud.utils.fsm.NoTransitionException; -import com.cloud.utils.fsm.StateMachine2; -import com.cloud.vm.ItWorkVO.Step; -import com.cloud.vm.VirtualMachine.Event; -import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.dao.ConsoleProxyDao; -import com.cloud.vm.dao.DomainRouterDao; -import com.cloud.vm.dao.NicDao; -import com.cloud.vm.dao.SecondaryStorageVmDao; -import com.cloud.vm.dao.UserVmDao; -import com.cloud.vm.dao.VMInstanceDao; - -@Local(value = VirtualMachineManager.class) -public class VirtualMachineManagerImpl implements VirtualMachineManager, Listener { - private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class); - - String _name; - @Inject - protected StorageManager _storageMgr; - @Inject - protected NetworkManager _networkMgr; - @Inject - protected AgentManager _agentMgr; - @Inject - protected VMInstanceDao _vmDao; - @Inject - protected ServiceOfferingDao _offeringDao; - @Inject - protected VMTemplateDao _templateDao; - @Inject - protected UserDao _userDao; - @Inject - protected AccountDao _accountDao; - @Inject - protected DomainDao _domainDao; - @Inject - protected ClusterManager _clusterMgr; - @Inject - protected ItWorkDao _workDao; - @Inject - protected UserVmDao _userVmDao; - @Inject - protected DomainRouterDao _routerDao; - @Inject - protected ConsoleProxyDao _consoleDao; - @Inject - protected SecondaryStorageVmDao _secondaryDao; - @Inject - protected NicDao _nicsDao; - @Inject - protected AccountManager _accountMgr; - @Inject - protected HostDao _hostDao; - @Inject - protected AlertManager _alertMgr; - @Inject - protected GuestOSCategoryDao _guestOsCategoryDao; - @Inject - protected GuestOSDao _guestOsDao; - @Inject - protected VolumeDao _volsDao; - @Inject - protected ConsoleProxyManager _consoleProxyMgr; - @Inject - protected ConfigurationManager _configMgr; - @Inject - protected CapacityManager _capacityMgr; - @Inject - protected HighAvailabilityManager _haMgr; - @Inject - protected HostPodDao _podDao; - @Inject - protected DataCenterDao _dcDao; - @Inject - protected StoragePoolDao _storagePoolDao; - @Inject - protected HypervisorGuruManager _hvGuruMgr; - @Inject - protected NetworkDao _networkDao; - - @Inject(adapter = DeploymentPlanner.class) - protected Adapters _planners; - - @Inject(adapter = HostAllocator.class) - protected Adapters _hostAllocators; - - @Inject - protected ResourceManager _resourceMgr; - - Map> _vmGurus = new HashMap>(); - protected StateMachine2 _stateMachine; - - ScheduledExecutorService _executor = null; - protected int _operationTimeout; - - protected int _retry; - protected long _nodeId; - protected long _cleanupWait; - protected long _cleanupInterval; - protected long _cancelWait; - protected long _opWaitInterval; - protected int _lockStateRetry; - protected boolean _forceStop; - - @Override - public void registerGuru(VirtualMachine.Type type, VirtualMachineGuru guru) { - synchronized (_vmGurus) { - _vmGurus.put(type, guru); - } - } - - @Override - @DB - public T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Pair rootDiskOffering, - List> dataDiskOfferings, List> networks, Map params, DeploymentPlan plan, - HypervisorType hyperType, Account owner) throws InsufficientCapacityException { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Allocating entries for VM: " + vm); - } - - VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, serviceOffering, owner, params); - - vm.setDataCenterId(plan.getDataCenterId()); - if (plan.getPodId() != null) { - vm.setPodId(plan.getPodId()); - } - assert (plan.getClusterId() == null && plan.getPoolId() == null) : "We currently don't support cluster and pool preset yet"; - - @SuppressWarnings("unchecked") - VirtualMachineGuru guru = (VirtualMachineGuru) _vmGurus.get(vm.getType()); - - Transaction txn = Transaction.currentTxn(); - txn.start(); - vm = guru.persist(vm); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Allocating nics for " + vm); - } - - try { - _networkMgr.allocate(vmProfile, networks); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e); - } - - if (dataDiskOfferings == null) { - dataDiskOfferings = new ArrayList>(0); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Allocaing disks for " + vm); - } - - if (template.getFormat() == ImageFormat.ISO) { - _storageMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner); - } else if (template.getFormat() == ImageFormat.BAREMETAL) { - // Do nothing - } else { - _storageMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner); - } - - for (Pair offering : dataDiskOfferings) { - _storageMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner); - } - - txn.commit(); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Allocation completed for VM: " + vm); - } - - return vm; - } - - @Override - public T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Long rootSize, Pair dataDiskOffering, - List> networks, DeploymentPlan plan, HypervisorType hyperType, Account owner) throws InsufficientCapacityException { - List> diskOfferings = new ArrayList>(1); - if (dataDiskOffering != null) { - diskOfferings.add(dataDiskOffering); - } - return allocate(vm, template, serviceOffering, new Pair(serviceOffering, rootSize), diskOfferings, networks, null, plan, hyperType, owner); - } - - @Override - public T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, List> networks, DeploymentPlan plan, - HypervisorType hyperType, Account owner) throws InsufficientCapacityException { - return allocate(vm, template, serviceOffering, new Pair(serviceOffering, null), null, networks, null, plan, hyperType, owner); - } - - @SuppressWarnings("unchecked") - private VirtualMachineGuru getVmGuru(T vm) { - return (VirtualMachineGuru) _vmGurus.get(vm.getType()); - } - - @SuppressWarnings("unchecked") - private VirtualMachineGuru getBareMetalVmGuru(T vm) { - return (VirtualMachineGuru) _vmGurus.get(VirtualMachine.Type.UserBareMetal); - } - - @Override - public boolean expunge(T vm, User caller, Account account) throws ResourceUnavailableException { - try { - if (advanceExpunge(vm, caller, account)) { - // Mark vms as removed - remove(vm, caller, account); - return true; - } else { - s_logger.info("Did not expunge " + vm); - return false; - } - } catch (OperationTimedoutException e) { - throw new CloudRuntimeException("Operation timed out", e); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException("Concurrent operation ", e); - } - } - - @Override - public boolean advanceExpunge(T vm, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException { - if (vm == null || vm.getRemoved() != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find vm or vm is destroyed: " + vm); - } - return true; - } - - if (!this.advanceStop(vm, false, caller, account)) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to stop the VM so we can't expunge it."); - } - } - - try { - if (!stateTransitTo(vm, VirtualMachine.Event.ExpungeOperation, vm.getHostId())) { - s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); - return false; - } - } catch (NoTransitionException e) { - s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); - return false; - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Destroying vm " + vm); - } - - VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - s_logger.debug("Cleaning up NICS"); - _networkMgr.cleanupNics(profile); - // Clean up volumes based on the vm's instance id - _storageMgr.cleanupVolumes(vm.getId()); - - VirtualMachineGuru guru = getVmGuru(vm); - guru.finalizeExpunge(vm); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Expunged " + vm); - } - - return true; - } - - @Override - public boolean start() { - _executor.scheduleAtFixedRate(new CleanupTask(), _cleanupInterval, _cleanupInterval, TimeUnit.SECONDS); - cancelWorkItems(_nodeId); - return true; - } - - @Override - public boolean stop() { - return true; - } - - @Override - public boolean configure(String name, Map xmlParams) throws ConfigurationException { - _name = name; - - ComponentLocator locator = ComponentLocator.getCurrentLocator(); - ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); - Map params = configDao.getConfiguration(xmlParams); - - _retry = NumbersUtil.parseInt(params.get(Config.StartRetry.key()), 10); - - ReservationContextImpl.setComponents(_userDao, _domainDao, _accountDao); - VirtualMachineProfileImpl.setComponents(_offeringDao, _templateDao, _accountDao); - - _cancelWait = NumbersUtil.parseLong(params.get(Config.VmOpCancelInterval.key()), 3600); - _cleanupWait = NumbersUtil.parseLong(params.get(Config.VmOpCleanupWait.key()), 3600); - _cleanupInterval = NumbersUtil.parseLong(params.get(Config.VmOpCleanupInterval.key()), 86400) * 1000; - _opWaitInterval = NumbersUtil.parseLong(params.get(Config.VmOpWaitInterval.key()), 120) * 1000; - _lockStateRetry = NumbersUtil.parseInt(params.get(Config.VmOpLockStateRetry.key()), 5); - _operationTimeout = NumbersUtil.parseInt(params.get(Config.Wait.key()), 1800) * 2; - _forceStop = Boolean.parseBoolean(params.get(Config.VmDestroyForcestop.key())); - - _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vm-Operations-Cleanup")); - _nodeId = _clusterMgr.getManagementNodeId(); - - _agentMgr.registerForHostEvents(this, true, true, true); - - return true; - } - - @Override - public String getName() { - return _name; - } - - protected VirtualMachineManagerImpl() { - setStateMachine(); - } - - @Override - public T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { - return start(vm, params, caller, account, null); - } - - @Override - public T start(T vm, Map params, User caller, Account account, DeploymentPlan planToDeploy) throws InsufficientCapacityException, - ResourceUnavailableException { - try { - return advanceStart(vm, params, caller, account, planToDeploy); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e); - } - } - - protected boolean checkWorkItems(VMInstanceVO vm, State state) throws ConcurrentOperationException { - while (true) { - ItWorkVO vo = _workDao.findByOutstandingWork(vm.getId(), state); - if (vo == null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find work for VM: " + vm + " and state: " + state); - } - return true; - } - - if (vo.getStep() == Step.Done) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Work for " + vm + " is " + vo.getStep()); - } - return true; - } - - if (vo.getSecondsTaskIsInactive() > _cancelWait) { - s_logger.warn("The task item for vm " + vm + " has been inactive for " + vo.getSecondsTaskIsInactive()); - return false; - } - - try { - Thread.sleep(_opWaitInterval); - } catch (InterruptedException e) { - s_logger.info("Waiting for " + vm + " but is interrupted"); - throw new ConcurrentOperationException("Waiting for " + vm + " but is interrupted"); - } - s_logger.debug("Waiting some more to make sure there's no activity on " + vm); - } - - } - - @DB - protected Ternary changeToStartState(VirtualMachineGuru vmGuru, T vm, User caller, Account account) - throws ConcurrentOperationException { - long vmId = vm.getId(); - - ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId()); - int retry = _lockStateRetry; - while (retry-- != 0) { - Transaction txn = Transaction.currentTxn(); - Ternary result = null; - txn.start(); - try { - Journal journal = new Journal.LogJournal("Creating " + vm, s_logger); - work = _workDao.persist(work); - ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account); - - if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId()); - } - result = new Ternary(vmGuru.findById(vmId), context, work); - txn.commit(); - return result; - } - } catch (NoTransitionException e) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to transition into Starting state due to " + e.getMessage()); - } - } finally { - if (result == null) { - txn.rollback(); - } - } - - VMInstanceVO instance = _vmDao.findById(vmId); - if (instance == null) { - throw new ConcurrentOperationException("Unable to acquire lock on " + vm); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Determining why we're unable to update the state to Starting for " + instance + ". Retry=" + retry); - } - - State state = instance.getState(); - if (state == State.Running) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("VM is already started: " + vm); - } - return null; - } - - if (state.isTransitional()) { - if (!checkWorkItems(vm, state)) { - throw new ConcurrentOperationException("There are concurrent operations on " + vm); - } else { - continue; - } - } - - if (state != State.Stopped) { - s_logger.debug("VM " + vm + " is not in a state to be started: " + state); - return null; - } - } - - throw new ConcurrentOperationException("Unable to change the state of " + vm); - } - - protected boolean changeState(T vm, Event event, Long hostId, ItWorkVO work, Step step) throws NoTransitionException { - // FIXME: We should do this better. - Step previousStep = work.getStep(); - _workDao.updateStep(work, step); - boolean result = false; - try { - result = stateTransitTo(vm, event, hostId); - return result; - } finally { - if (!result) { - _workDao.updateStep(work, previousStep); - } - } - } - - @Override - public T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - return advanceStart(vm, params, caller, account, null); - } - - @Override - public T advanceStart(T vm, Map params, User caller, Account account, DeploymentPlan planToDeploy) - throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { - long vmId = vm.getId(); - VirtualMachineGuru vmGuru; - if (vm.getHypervisorType() == HypervisorType.BareMetal) { - vmGuru = getBareMetalVmGuru(vm); - } else { - vmGuru = getVmGuru(vm); - } - - vm = vmGuru.findById(vm.getId()); - Ternary start = changeToStartState(vmGuru, vm, caller, account); - if (start == null) { - return vmGuru.findById(vmId); - } - - vm = start.first(); - ReservationContext ctx = start.second(); - ItWorkVO work = start.third(); - - T startedVm = null; - ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId()); - VMTemplateVO template = _templateDao.findById(vm.getTemplateId()); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Trying to deploy VM, vm has dcId: " + vm.getDataCenterIdToDeployIn() + " and podId: " + vm.getPodIdToDeployIn()); - } - DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterIdToDeployIn(), vm.getPodIdToDeployIn(), null, null, null, null, ctx); - if(planToDeploy != null && planToDeploy.getDataCenterId() != 0){ - if (s_logger.isDebugEnabled()) { - s_logger.debug("advanceStart: DeploymentPlan is provided, using dcId:" + planToDeploy.getDataCenterId() + ", podId: " + planToDeploy.getPodId() + ", clusterId: " - + planToDeploy.getClusterId() + ", hostId: " + planToDeploy.getHostId() + ", poolId: " + planToDeploy.getPoolId()); - } - plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId(), ctx); - } - - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); - - boolean canRetry = true; - try { - Journal journal = start.second().getJournal(); - - ExcludeList avoids = null; - if (planToDeploy != null) { - avoids = planToDeploy.getAvoids(); - } - if (avoids == null) { - avoids = new ExcludeList(); - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid()); - } - - - boolean planChangedByVolume = false; - boolean reuseVolume = true; - DataCenterDeployment originalPlan = plan; - - int retry = _retry; - boolean recreate = false; - while (retry-- != 0) { // It's != so that it can match -1. - - if(reuseVolume){ - // edit plan if this vm's ROOT volume is in READY state already - List vols = _volsDao.findReadyRootVolumesByInstance(vm.getId()); - for (VolumeVO vol : vols) { - // make sure if the templateId is unchanged. If it is changed, - // let planner - // reassign pool for the volume even if it ready. - Long volTemplateId = vol.getTemplateId(); - if (volTemplateId != null && volTemplateId.longValue() != template.getId()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug(vol + " of " + vm + " is READY, but template ids don't match, let the planner reassign a new pool"); - } - continue; - } - - StoragePoolVO pool = _storagePoolDao.findById(vol.getPoolId()); - if (!pool.isInMaintenance()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Root volume is ready, need to place VM in volume's cluster"); - } - long rootVolDcId = pool.getDataCenterId(); - Long rootVolPodId = pool.getPodId(); - Long rootVolClusterId = pool.getClusterId(); - if (planToDeploy != null && planToDeploy.getDataCenterId() != 0) { - Long clusterIdSpecified = planToDeploy.getClusterId(); - if (clusterIdSpecified != null && rootVolClusterId != null) { - if (rootVolClusterId.longValue() != clusterIdSpecified.longValue()) { - // cannot satisfy the plan passed in to the - // planner - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: " + rootVolClusterId - + ", cluster specified: " + clusterIdSpecified); - } - throw new ResourceUnavailableException("Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for " - + vm, Cluster.class, clusterIdSpecified); - } - } - plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null, ctx); - }else{ - plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null, ctx); - if (s_logger.isDebugEnabled()) { - s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId); - } - planChangedByVolume = true; - } - } - } - } - - VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, account, params); - DeployDestination dest = null; - for (DeploymentPlanner planner : _planners) { - if (planner.canHandle(vmProfile, plan, avoids)) { - dest = planner.plan(vmProfile, plan, avoids); - } else { - continue; - } - if (dest != null) { - avoids.addHost(dest.getHost().getId()); - journal.record("Deployment found ", vmProfile, dest); - break; - } - } - - if (dest == null) { - if (planChangedByVolume) { - plan = originalPlan; - planChangedByVolume = false; - //do not enter volume reuse for next retry, since we want to look for resorces outside the volume's cluster - reuseVolume = false; - continue; - } - throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId()); - } - - long destHostId = dest.getHost().getId(); - vm.setPodId(dest.getPod().getId()); - - try { - if (!changeState(vm, Event.OperationRetry, destHostId, work, Step.Prepare)) { - throw new ConcurrentOperationException("Unable to update the state of the Virtual Machine"); - } - } catch (NoTransitionException e1) { - throw new ConcurrentOperationException(e1.getMessage()); - } - - try { - if (s_logger.isDebugEnabled()) { - s_logger.debug("VM is being created in podId: " + vm.getPodIdToDeployIn()); - } - _networkMgr.prepare(vmProfile, dest, ctx); - if (vm.getHypervisorType() != HypervisorType.BareMetal) { - _storageMgr.prepare(vmProfile, dest, recreate); - recreate = false; - } - //since StorageMgr succeeded in volume creation, reuse Volume for further tries until current cluster has capacity - if(!reuseVolume){ - reuseVolume = true; - } - - Commands cmds = null; - vmGuru.finalizeVirtualMachineProfile(vmProfile, dest, ctx); - - VirtualMachineTO vmTO = hvGuru.implement(vmProfile); - - cmds = new Commands(OnError.Stop); - cmds.addCommand(new StartCommand(vmTO)); - - vmGuru.finalizeDeployment(cmds, vmProfile, dest, ctx); - - - work = _workDao.findById(work.getId()); - if (work == null || work.getStep() != Step.Prepare) { - throw new ConcurrentOperationException("Work steps have been changed: " + work); - } - _workDao.updateStep(work, Step.Starting); - - _agentMgr.send(destHostId, cmds); - - _workDao.updateStep(work, Step.Started); - - - StartAnswer startAnswer = cmds.getAnswer(StartAnswer.class); - if (startAnswer != null && startAnswer.getResult()) { - String host_guid = startAnswer.getHost_guid(); - if( host_guid != null ) { - HostVO finalHost = _resourceMgr.findHostByGuid(host_guid); - if (finalHost == null ) { - throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here"); - } - destHostId = finalHost.getId(); - } - if (vmGuru.finalizeStart(vmProfile, destHostId, cmds, ctx)) { - if (!changeState(vm, Event.OperationSucceeded, destHostId, work, Step.Done)) { - throw new ConcurrentOperationException("Unable to transition to a new state."); - } - startedVm = vm; - if (s_logger.isDebugEnabled()) { - s_logger.debug("Start completed for VM " + vm); - } - return startedVm; - } else { - if (s_logger.isDebugEnabled()) { - s_logger.info("The guru did not like the answers so stopping " + vm); - } - - StopCommand cmd = new StopCommand(vm.getInstanceName()); - StopAnswer answer = (StopAnswer) _agentMgr.easySend(destHostId, cmd); - if (answer == null || !answer.getResult()) { - s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers")); - _haMgr.scheduleStop(vm, destHostId, WorkType.ForceStop); - throw new ExecutionException("Unable to stop " + vm + " so we are unable to retry the start operation"); - } - if (vmGuru.recreateNeeded(vmProfile, destHostId, cmds, ctx)) { - recreate = true; - } else { - throw new ExecutionException("Unable to start " + vm + " due to error in finalizeStart, not retrying"); - } - } - } - s_logger.info("Unable to start VM on " + dest.getHost() + " due to " + (startAnswer == null ? " no start answer" : startAnswer.getDetails())); - - } catch (OperationTimedoutException e) { - s_logger.debug("Unable to send the start command to host " + dest.getHost()); - if (e.isActive()) { - _haMgr.scheduleStop(vm, destHostId, WorkType.CheckStop); - } - canRetry = false; - throw new AgentUnavailableException("Unable to start " + vm.getHostName(), destHostId, e); - } catch (ResourceUnavailableException e) { - s_logger.info("Unable to contact resource.", e); - if (!avoids.add(e)) { - if (e.getScope() == Volume.class || e.getScope() == Nic.class) { - throw e; - } else { - s_logger.warn("unexpected ResourceUnavailableException : " + e.getScope().getName(), e); - throw e; - } - } - } catch (InsufficientCapacityException e) { - s_logger.info("Insufficient capacity ", e); - if (!avoids.add(e)) { - if (e.getScope() == Volume.class || e.getScope() == Nic.class) { - throw e; - } else { - s_logger.warn("unexpected InsufficientCapacityException : " + e.getScope().getName(), e); - } - } - } catch (Exception e) { - s_logger.error("Failed to start instance " + vm, e); - throw new AgentUnavailableException("Unable to start instance due to " + e.getMessage(), destHostId, e); - } finally { - if (startedVm == null && canRetry) { - Step prevStep = work.getStep(); - _workDao.updateStep(work, Step.Release); - if (prevStep == Step.Started || prevStep == Step.Starting) { - cleanup(vmGuru, vmProfile, work, Event.OperationFailed, false, caller, account); - } else { - //if step is not starting/started, send cleanup command with force=true - cleanup(vmGuru, vmProfile, work, Event.OperationFailed, true, caller, account); - } - } - } - } - } finally { - if (startedVm == null) { - if (canRetry) { - try { - changeState(vm, Event.OperationFailed, null, work, Step.Done); - } catch (NoTransitionException e) { - throw new ConcurrentOperationException(e.getMessage()); - } - } - } - } - - return startedVm; - } - - @Override - public boolean stop(T vm, User user, Account account) throws ResourceUnavailableException { - try { - return advanceStop(vm, false, user, account); - } catch (OperationTimedoutException e) { - throw new AgentUnavailableException("Unable to stop vm because the operation to stop timed out", vm.getHostId(), e); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException("Unable to stop vm because of a concurrent operation", e); - } - } - - protected boolean sendStop(VirtualMachineGuru guru, VirtualMachineProfile profile, boolean force) { - VMInstanceVO vm = profile.getVirtualMachine(); - StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null); - try { - Answer answer = _agentMgr.send(vm.getHostId(), stop); - if (!answer.getResult()) { - s_logger.debug("Unable to stop VM due to " + answer.getDetails()); - return false; - } - - guru.finalizeStop(profile, (StopAnswer) answer); - } catch (AgentUnavailableException e) { - if (!force) { - return false; - } - } catch (OperationTimedoutException e) { - if (!force) { - return false; - } - } - - return true; - } - - protected boolean cleanup(VirtualMachineGuru guru, VirtualMachineProfile profile, ItWorkVO work, Event event, boolean force, User user, Account account) { - T vm = profile.getVirtualMachine(); - State state = vm.getState(); - s_logger.debug("Cleaning up resources for the vm " + vm + " in " + state + " state"); - if (state == State.Starting) { - Step step = work.getStep(); - if (step == Step.Starting && !force) { - s_logger.warn("Unable to cleanup vm " + vm + "; work state is incorrect: " + step); - return false; - } - - if (step == Step.Started || step == Step.Starting || step == Step.Release) { - if (vm.getHostId() != null) { - if (!sendStop(guru, profile, force)) { - s_logger.warn("Failed to stop vm " + vm + " in " + State.Starting + " state as a part of cleanup process"); - return false; - } - } - } - - if (step != Step.Release && step != Step.Prepare && step != Step.Started && step != Step.Starting) { - s_logger.debug("Cleanup is not needed for vm " + vm + "; work state is incorrect: " + step); - return true; - } - } else if (state == State.Stopping) { - if (vm.getHostId() != null) { - if (!sendStop(guru, profile, force)) { - s_logger.warn("Failed to stop vm " + vm + " in " + State.Stopping + " state as a part of cleanup process"); - return false; - } - } - } else if (state == State.Migrating) { - if (vm.getHostId() != null) { - if (!sendStop(guru, profile, force)) { - s_logger.warn("Failed to stop vm " + vm + " in " + State.Migrating + " state as a part of cleanup process"); - return false; - } - } - if (vm.getLastHostId() != null) { - if (!sendStop(guru, profile, force)) { - s_logger.warn("Failed to stop vm " + vm + " in " + State.Migrating + " state as a part of cleanup process"); - return false; - } - } - } else if (state == State.Running) { - if (!sendStop(guru, profile, force)) { - s_logger.warn("Failed to stop vm " + vm + " in " + State.Running + " state as a part of cleanup process"); - return false; - } - } - - try { - _networkMgr.release(profile, force); - s_logger.debug("Successfully released network resources for the vm " + vm); - } catch (Exception e) { - s_logger.warn("Unable to release some network resources.", e); - } - - _storageMgr.release(profile); - s_logger.debug("Successfully cleanued up resources for the vm " + vm + " in " + state + " state"); - return true; - } - - @Override - public boolean advanceStop(T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { - State state = vm.getState(); - if (state == State.Stopped) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("VM is already stopped: " + vm); - } - return true; - } - - if (state == State.Destroyed || state == State.Expunging || state == State.Error) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Stopped called on " + vm + " but the state is " + state); - } - return true; - } - // grab outstanding work item if any - ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Found an outstanding work item for this vm " + vm + " with state:" + vm.getState() + ", work id:" + work.getId()); - } - } - Long hostId = vm.getHostId(); - if (hostId == null) { - if (!forced) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("HostId is null but this is not a forced stop, cannot stop vm " + vm + " with state:" + vm.getState()); - } - return false; - } - try { - stateTransitTo(vm, Event.AgentReportStopped, null, null); - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } - // mark outstanding work item if any as done - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Updating work item to Done, id:" + work.getId()); - } - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - return true; - } - - VirtualMachineGuru vmGuru = getVmGuru(vm); - VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - - try { - if (!stateTransitTo(vm, Event.StopRequested, vm.getHostId())) { - throw new ConcurrentOperationException("VM is being operated on."); - } - } catch (NoTransitionException e1) { - if (!forced) { - throw new CloudRuntimeException("We cannot stop " + vm + " when it is in state " + vm.getState()); - } - boolean doCleanup = false; - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to transition the state but we're moving on because it's forced stop"); - } - if (state == State.Starting || state == State.Migrating) { - if (work != null) { - doCleanup = true; - } else { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to cleanup VM: " + vm + " ,since outstanding work item is not found"); - } - throw new CloudRuntimeException("Work item not found, We cannot stop " + vm + " when it is in state " + vm.getState()); - } - } else if (state == State.Stopping) { - doCleanup = true; - } - - if (doCleanup) { - if (cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.StopRequested, forced, user, account)) { - try { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Updating work item to Done, id:" + work.getId()); - } - return changeState(vm, Event.AgentReportStopped, null, work, Step.Done); - } catch (NoTransitionException e) { - s_logger.warn("Unable to cleanup " + vm); - return false; - } - } else { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Failed to cleanup VM: " + vm); - } - throw new CloudRuntimeException("Failed to cleanup " + vm + " , current state " + vm.getState()); - } - } - } - - if (vm.getState() != State.Stopping) { - throw new CloudRuntimeException("We cannot proceed with stop VM " + vm + " since it is not in 'Stopping' state, current state: " + vm.getState()); - } - - vmGuru.prepareStop(profile); - - StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null); - boolean stopped = false; - StopAnswer answer = null; - try { - answer = (StopAnswer) _agentMgr.send(vm.getHostId(), stop); - stopped = answer.getResult(); - if (!stopped) { - throw new CloudRuntimeException("Unable to stop the virtual machine due to " + answer.getDetails()); - } - vmGuru.finalizeStop(profile, answer); - - } catch (AgentUnavailableException e) { - } catch (OperationTimedoutException e) { - } finally { - if (!stopped) { - if (!forced) { - s_logger.warn("Unable to stop vm " + vm); - try { - stateTransitTo(vm, Event.OperationFailed, vm.getHostId()); - } catch (NoTransitionException e) { - s_logger.warn("Unable to transition the state " + vm); - } - return false; - } else { - s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop"); - vmGuru.finalizeStop(profile, answer); - } - } - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug(vm + " is stopped on the host. Proceeding to release resource held."); - } - - try { - _networkMgr.release(profile, forced); - s_logger.debug("Successfully released network resources for the vm " + vm); - } catch (Exception e) { - s_logger.warn("Unable to release some network resources.", e); - } - - try { - if (vm.getHypervisorType() != HypervisorType.BareMetal) { - _storageMgr.release(profile); - s_logger.debug("Successfully released storage resources for the vm " + vm); - } - } catch (Exception e) { - s_logger.warn("Unable to release storage resources.", e); - } - - try { - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Updating the outstanding work item to Done, id:" + work.getId()); - } - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - - return stateTransitTo(vm, Event.OperationSucceeded, null, null); - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - return false; - } - } - - private void setStateMachine() { - _stateMachine = VirtualMachine.State.getStateMachine(); - } - - protected boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId, String reservationId) throws NoTransitionException { - vm.setReservationId(reservationId); - return _stateMachine.transitTo(vm, e, new Pair(vm.getHostId(), hostId), _vmDao); - } - - @Override - public boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId) throws NoTransitionException { - State oldState = vm.getState(); - if (oldState == State.Starting) { - if (e == Event.OperationSucceeded) { - vm.setLastHostId(hostId); - } - } else if (oldState == State.Stopping) { - if (e == Event.OperationSucceeded) { - vm.setLastHostId(vm.getHostId()); - } - } - return _stateMachine.transitTo(vm, e, new Pair(vm.getHostId(), hostId), _vmDao); - } - - @Override - public boolean remove(T vm, User user, Account caller) { - return _vmDao.remove(vm.getId()); - } - - @Override - public boolean destroy(T vm, User user, Account caller) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Destroying vm " + vm); - } - if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find vm or vm is destroyed: " + vm); - } - return true; - } - - if (!advanceStop(vm, _forceStop, user, caller)) { - s_logger.debug("Unable to stop " + vm); - return false; - } - - try { - if (!stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { - s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); - return false; - } - } catch (NoTransitionException e) { - s_logger.debug(e.getMessage()); - return false; - } - - return true; - } - - protected boolean checkVmOnHost(VirtualMachine vm, long hostId) throws AgentUnavailableException, OperationTimedoutException { - CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(hostId, new CheckVirtualMachineCommand(vm.getInstanceName())); - if (!answer.getResult() || answer.getState() == State.Stopped) { - return false; - } - - return true; - } - - @Override - public T storageMigration(T vm, StoragePool destPool) { - VirtualMachineGuru vmGuru = getVmGuru(vm); - - long vmId = vm.getId(); - vm = vmGuru.findById(vmId); - - try { - stateTransitTo(vm, VirtualMachine.Event.StorageMigrationRequested, null); - } catch (NoTransitionException e) { - s_logger.debug("Unable to migrate vm: " + e.toString()); - throw new CloudRuntimeException("Unable to migrate vm: " + e.toString()); - } - - VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - boolean migrationResult = false; - try { - migrationResult = _storageMgr.StorageMigration(profile, destPool); - - if (migrationResult) { - //if the vm is migrated to different pod in basic mode, need to reallocate ip - - if (vm.getPodIdToDeployIn() != destPool.getPodId()) { - DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterIdToDeployIn(), destPool.getPodId(), null, null, null, null); - VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, null, null, null, null); - _networkMgr.reallocate(vmProfile, plan); - } - - //when start the vm next time, don;'t look at last_host_id, only choose the host based on volume/storage pool - vm.setLastHostId(null); - vm.setPodId(destPool.getPodId()); - } else { - s_logger.debug("Storage migration failed"); - } - } catch (ConcurrentOperationException e) { - s_logger.debug("Failed to migration: " + e.toString()); - throw new CloudRuntimeException("Failed to migration: " + e.toString()); - } catch (InsufficientVirtualNetworkCapcityException e) { - s_logger.debug("Failed to migration: " + e.toString()); - throw new CloudRuntimeException("Failed to migration: " + e.toString()); - } catch (InsufficientAddressCapacityException e) { - s_logger.debug("Failed to migration: " + e.toString()); - throw new CloudRuntimeException("Failed to migration: " + e.toString()); - } catch (InsufficientCapacityException e) { - s_logger.debug("Failed to migration: " + e.toString()); - throw new CloudRuntimeException("Failed to migration: " + e.toString()); - } finally { - try { - stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped, null); - } catch (NoTransitionException e) { - s_logger.debug("Failed to change vm state: " + e.toString()); - throw new CloudRuntimeException("Failed to change vm state: " + e.toString()); - } - } - - return vm; - } - - @Override - public T migrate(T vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, - VirtualMachineMigrationException { - s_logger.info("Migrating " + vm + " to " + dest); - - long dstHostId = dest.getHost().getId(); - Host fromHost = _hostDao.findById(srcHostId); - if (fromHost == null) { - s_logger.info("Unable to find the host to migrate from: " + srcHostId); - throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId); - } - - if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) { - s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId()); - throw new CloudRuntimeException("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId()); - } - - VirtualMachineGuru vmGuru = getVmGuru(vm); - - long vmId = vm.getId(); - vm = vmGuru.findById(vmId); - if (vm == null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find the vm " + vm); - } - throw new ManagementServerException("Unable to find a virtual machine with id " + vmId); - } - - if (vm.getState() != State.Running) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("VM is not Running, unable to migrate the vm " + vm); - } - throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString()); - } - - short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE; - if (VirtualMachine.Type.DomainRouter.equals(vm.getType())) { - alertType = AlertManager.ALERT_TYPE_DOMAIN_ROUTER_MIGRATE; - } else if (VirtualMachine.Type.ConsoleProxy.equals(vm.getType())) { - alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY_MIGRATE; - } - - VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - _networkMgr.prepareNicForMigration(profile, dest); - _storageMgr.prepareForMigration(profile, dest); - - VirtualMachineTO to = toVmTO(profile); - PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(to); - - ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId()); - work.setStep(Step.Prepare); - work.setResourceType(ItWorkVO.ResourceType.Host); - work.setResourceId(dstHostId); - work = _workDao.persist(work); - - PrepareForMigrationAnswer pfma = null; - try { - pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc); - if (!pfma.getResult()) { - String msg = "Unable to prepare for migration due to " + pfma.getDetails(); - pfma = null; - throw new AgentUnavailableException(msg, dstHostId); - } - } catch (OperationTimedoutException e1) { - throw new AgentUnavailableException("Operation timed out", dstHostId); - } finally { - if (pfma == null) { - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - } - - vm.setLastHostId(srcHostId); - try { - if (vm == null || vm.getHostId() == null || vm.getHostId() != srcHostId || !changeState(vm, Event.MigrationRequested, dstHostId, work, Step.Migrating)) { - s_logger.info("Migration cancelled because state has changed: " + vm); - throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm); - } - } catch (NoTransitionException e1) { - s_logger.info("Migration cancelled because " + e1.getMessage()); - throw new ConcurrentOperationException("Migration cancelled because " + e1.getMessage()); - } - - boolean migrated = false; - try { - boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); - MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows); - mc.setHostGuid(dest.getHost().getGuid()); - - try { - MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc); - if (!ma.getResult()) { - s_logger.error("Unable to migrate due to " + ma.getDetails()); - return null; - } - } catch (OperationTimedoutException e) { - if (e.isActive()) { - s_logger.warn("Active migration command so scheduling a restart for " + vm); - _haMgr.scheduleRestart(vm, true); - } - throw new AgentUnavailableException("Operation timed out on migrating " + vm, dstHostId); - } - - try { - if (!changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Started)) { - throw new ConcurrentOperationException("Unable to change the state for " + vm); - } - } catch (NoTransitionException e1) { - throw new ConcurrentOperationException("Unable to change state due to " + e1.getMessage()); - } - - try { - if (!checkVmOnHost(vm, dstHostId)) { - s_logger.error("Unable to complete migration for " + vm); - try { - _agentMgr.send(srcHostId, new Commands(cleanup(vm.getInstanceName())), null); - } catch (AgentUnavailableException e) { - s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId); - } - cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.AgentReportStopped, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); - return null; - } - } catch (OperationTimedoutException e) { - } - - migrated = true; - return vm; - } finally { - if (!migrated) { - s_logger.info("Migration was unsuccessful. Cleaning up: " + vm); - - _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone " - + dest.getDataCenter().getName() + " and pod " + dest.getPod().getName(), "Migrate Command failed. Please check logs."); - try { - _agentMgr.send(dstHostId, new Commands(cleanup(vm.getInstanceName())), null); - } catch (AgentUnavailableException ae) { - s_logger.info("Looks like the destination Host is unavailable for cleanup"); - } - - try { - stateTransitTo(vm, Event.OperationFailed, srcHostId); - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } - } - - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - } - - @Override - public VirtualMachineTO toVmTO(VirtualMachineProfile profile) { - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(profile.getVirtualMachine().getHypervisorType()); - VirtualMachineTO to = hvGuru.implement(profile); - return to; - } - - protected void cancelWorkItems(long nodeId) { - GlobalLock scanLock = GlobalLock.getInternLock("vmmgr.cancel.workitem"); - - try { - if (scanLock.lock(3)) { - try { - List works = _workDao.listWorkInProgressFor(nodeId); - for (ItWorkVO work : works) { - s_logger.info("Handling unfinished work item: " + work); - try { - VMInstanceVO vm = _vmDao.findById(work.getInstanceId()); - if (vm != null) { - if (work.getType() == State.Starting) { - _haMgr.scheduleRestart(vm, true); - work.setManagementServerId(_nodeId); - _workDao.update(work.getId(), work); - } else if (work.getType() == State.Stopping) { - _haMgr.scheduleStop(vm, vm.getHostId(), WorkType.CheckStop); - work.setManagementServerId(_nodeId); - _workDao.update(work.getId(), work); - } else if (work.getType() == State.Migrating) { - _haMgr.scheduleMigration(vm); - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - } - } catch (Exception e) { - s_logger.error("Error while handling " + work, e); - } - } - } finally { - scanLock.unlock(); - } - } - } finally { - scanLock.releaseRef(); - } - } - - @Override - public boolean migrateAway(VirtualMachine.Type vmType, long vmId, long srcHostId) throws InsufficientServerCapacityException, VirtualMachineMigrationException { - VirtualMachineGuru vmGuru = _vmGurus.get(vmType); - VMInstanceVO vm = vmGuru.findById(vmId); - if (vm == null) { - s_logger.debug("Unable to find a VM for " + vmId); - return true; - } - - VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - - Long hostId = vm.getHostId(); - if (hostId == null) { - s_logger.debug("Unable to migrate because the VM doesn't have a host id: " + vm); - return true; - } - - Host host = _hostDao.findById(hostId); - - DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), null, null, null); - ExcludeList excludes = new ExcludeList(); - excludes.addHost(hostId); - - DeployDestination dest = null; - while (true) { - for (DeploymentPlanner planner : _planners) { - if (planner.canHandle(profile, plan, excludes)) { - dest = planner.plan(profile, plan, excludes); - } else { - continue; - } - - if (dest != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Planner " + planner + " found " + dest + " for migrating to."); - } - break; - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Planner " + planner + " was unable to find anything."); - } - } - - if (dest == null) { - throw new InsufficientServerCapacityException("Unable to find a server to migrate to.", host.getClusterId()); - } - - excludes.addHost(dest.getHost().getId()); - VMInstanceVO vmInstance = null; - try { - vmInstance = migrate(vm, srcHostId, dest); - } catch (ResourceUnavailableException e) { - s_logger.debug("Unable to migrate to unavailable " + dest); - } catch (ConcurrentOperationException e) { - s_logger.debug("Unable to migrate VM due to: " + e.getMessage()); - } catch (ManagementServerException e) { - s_logger.debug("Unable to migrate VM: " + e.getMessage()); - } catch (VirtualMachineMigrationException e) { - s_logger.debug("Got VirtualMachineMigrationException, Unable to migrate: " + e.getMessage()); - if (vm.getState() == State.Starting) { - s_logger.debug("VM seems to be still Starting, we should retry migration later"); - throw e; - } else { - s_logger.debug("Unable to migrate VM, VM is not in Running or even Starting state, current state: " + vm.getState().toString()); - } - } - if (vmInstance != null) { - return true; - } - try { - boolean result = advanceStop(vm, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); - return result; - } catch (ResourceUnavailableException e) { - s_logger.debug("Unable to stop VM due to " + e.getMessage()); - } catch (ConcurrentOperationException e) { - s_logger.debug("Unable to stop VM due to " + e.getMessage()); - } catch (OperationTimedoutException e) { - s_logger.debug("Unable to stop VM due to " + e.getMessage()); - } - return false; - } - } - - protected class CleanupTask implements Runnable { - @Override - public void run() { - s_logger.trace("VM Operation Thread Running"); - try { - _workDao.cleanup(_cleanupWait); - } catch (Exception e) { - s_logger.error("VM Operations failed due to ", e); - } - } - } - - @Override - public boolean isVirtualMachineUpgradable(VirtualMachine vm, ServiceOffering offering) { - Enumeration en = _hostAllocators.enumeration(); - boolean isMachineUpgradable = true; - while (isMachineUpgradable && en.hasMoreElements()) { - final HostAllocator allocator = en.nextElement(); - isMachineUpgradable = allocator.isVirtualMachineUpgradable(vm, offering); - } - - return isMachineUpgradable; - } - - @Override - public T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { - try { - return advanceReboot(vm, params, caller, account); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException("Unable to reboot a VM due to concurrent operation", e); - } - } - - @Override - public T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { - T rebootedVm = null; - - DataCenter dc = _configMgr.getZone(vm.getDataCenterIdToDeployIn()); - Host host = _hostDao.findById(vm.getHostId()); - Cluster cluster = null; - if (host != null) { - cluster = _configMgr.getCluster(host.getClusterId()); - } - HostPodVO pod = _configMgr.getPod(host.getPodId()); - DeployDestination dest = new DeployDestination(dc, pod, cluster, host); - - try { - - Commands cmds = new Commands(OnError.Stop); - cmds.addCommand(new RebootCommand(vm.getInstanceName())); - _agentMgr.send(host.getId(), cmds); - - Answer rebootAnswer = cmds.getAnswer(RebootAnswer.class); - if (rebootAnswer != null && rebootAnswer.getResult()) { - rebootedVm = vm; - return rebootedVm; - } - s_logger.info("Unable to reboot VM " + vm + " on " + dest.getHost() + " due to " + (rebootAnswer == null ? " no reboot answer" : rebootAnswer.getDetails())); - } catch (OperationTimedoutException e) { - s_logger.warn("Unable to send the reboot command to host " + dest.getHost() + " for the vm " + vm + " due to operation timeout", e); - throw new CloudRuntimeException("Failed to reboot the vm on host " + dest.getHost()); - } - - return rebootedVm; - } - - @Override - public VMInstanceVO findByIdAndType(VirtualMachine.Type type, long vmId) { - VirtualMachineGuru guru = _vmGurus.get(type); - return guru.findById(vmId); - } - - public Command cleanup(String vmName) { - return new StopCommand(vmName); - } - - public Commands fullHostSync(final long hostId, StartupRoutingCommand startup) { - Commands commands = new Commands(OnError.Continue); - - Map infos = convertToInfos(startup); - - final List vms = _vmDao.listByHostId(hostId); - s_logger.debug("Found " + vms.size() + " VMs for host " + hostId); - for (VMInstanceVO vm : vms) { - AgentVmInfo info = infos.remove(vm.getId()); - VMInstanceVO castedVm = null; - if (info == null) { - info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped); - } - castedVm = info.guru.findById(vm.getId()); - - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(castedVm.getHypervisorType()); - Command command = compareState(hostId, castedVm, info, true, hvGuru.trackVmHostChange()); - if (command != null) { - commands.addCommand(command); - } - } - - for (final AgentVmInfo left : infos.values()) { - boolean found = false; - for (VirtualMachineGuru vmGuru : _vmGurus.values()) { - VMInstanceVO vm = vmGuru.findByName(left.name); - if (vm != null) { - found = true; - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); - if(hvGuru.trackVmHostChange()) { - Command command = compareState(hostId, vm, left, true, true); - if (command != null) { - commands.addCommand(command); - } - } else { - s_logger.warn("Stopping a VM, VM " + left.name + " migrate from Host " + vm.getHostId() + " to Host " + hostId ); - commands.addCommand(cleanup(left.name)); - } - break; - } - } - if ( ! found ) { - s_logger.warn("Stopping a VM that we have no record of : " + left.name); - commands.addCommand(cleanup(left.name)); - } - } - - return commands; - } - - public Commands deltaHostSync(long hostId, Map newStates) { - Map states = convertDeltaToInfos(newStates); - Commands commands = new Commands(OnError.Continue); - - for (Map.Entry entry : states.entrySet()) { - AgentVmInfo info = entry.getValue(); - - VMInstanceVO vm = info.vm; - - Command command = null; - if (vm != null) { - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); - command = compareState(hostId, vm, info, false, hvGuru.trackVmHostChange()); - } else { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cleaning up a VM that is no longer found: " + info.name); - } - command = cleanup(info.name); - } - - if (command != null) { - commands.addCommand(command); - } - } - - return commands; - } - - - - public void deltaSync(Map> newStates) { - Map states = convertToInfos(newStates); - - for (Map.Entry entry : states.entrySet()) { - AgentVmInfo info = entry.getValue(); - VMInstanceVO vm = info.vm; - Command command = null; - if (vm != null) { - Host host = _resourceMgr.findHostByGuid(info.getHostUuid()); - long hId = host.getId(); - - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); - command = compareState(hId, vm, info, false, hvGuru.trackVmHostChange()); - } else { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Cleaning up a VM that is no longer found : " + info.name); - } - command = cleanup(info.name); - } - if (command != null){ - try { - Host host = _resourceMgr.findHostByGuid(info.getHostUuid()); - if (host != null){ - Answer answer = _agentMgr.send(host.getId(), cleanup(info.name)); - if (!answer.getResult()) { - s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); - } - } - } catch (Exception e) { - s_logger.warn("Unable to stop a VM due to " + e.getMessage()); - } - } - } - } - - - public void fullSync(final long clusterId, Map> newStates) { - if (newStates==null)return; - Map infos = convertToInfos(newStates); - Set set_vms = Collections.synchronizedSet(new HashSet()); - set_vms.addAll(_vmDao.listByClusterId(clusterId)); - set_vms.addAll(_vmDao.listLHByClusterId(clusterId)); - - for (VMInstanceVO vm : set_vms) { - if (vm.isRemoved() || vm.getState() == State.Destroyed || vm.getState() == State.Expunging) continue; - AgentVmInfo info = infos.remove(vm.getId()); - VMInstanceVO castedVm = null; - if ((info == null && (vm.getState() == State.Running || vm.getState() == State.Starting)) - || (info != null && (info.state == State.Running && vm.getState() == State.Starting))) - { - s_logger.info("Found vm " + vm.getInstanceName() + " in inconsistent state. " + vm.getState() + " on CS while " + (info == null ? "Stopped" : "Running") + " on agent"); - info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped); - - // Bug 13850- grab outstanding work item if any for this VM state so that we mark it as DONE after we change VM state, else it will remain pending - ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Found an outstanding work item for this vm " + vm + " in state:" + vm.getState() + ", work id:" + work.getId()); - } - } - vm.setState(State.Running); // set it as running and let HA take care of it - _vmDao.persist(vm); - - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Updating outstanding work item to Done, id:" + work.getId()); - } - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - - castedVm = info.guru.findById(vm.getId()); - try { - Host host = _hostDao.findByGuid(info.getHostUuid()); - long hostId = host == null ? (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()) : host.getId(); - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(castedVm.getHypervisorType()); - Command command = compareState(hostId, castedVm, info, true, hvGuru.trackVmHostChange()); - if (command != null){ - Answer answer = _agentMgr.send(hostId, command); - if (!answer.getResult()) { - s_logger.warn("Failed to update state of the VM due to " + answer.getDetails()); - } - } - } catch (Exception e) { - s_logger.warn("Unable to update state of the VM due to exception " + e.getMessage()); - e.printStackTrace(); - } - } - else if (info != null && (vm.getState() == State.Stopped || vm.getState() == State.Stopping)) { - Host host = _hostDao.findByGuid(info.getHostUuid()); - if (host != null){ - s_logger.warn("Stopping a VM which is stopped/stopping " + info.name); - vm.setState(State.Stopped); // set it as stop and clear it from host - vm.setHostId(null); - _vmDao.persist(vm); - try { - Answer answer = _agentMgr.send(host.getId(), cleanup(info.name)); - if (!answer.getResult()) { - s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); - } - } - catch (Exception e) { - s_logger.warn("Unable to stop a VM due to " + e.getMessage()); - } - } - } - else - // host id can change - if (info != null && vm.getState() == State.Running){ - // check for host id changes - Host host = _hostDao.findByGuid(info.getHostUuid()); - if (host != null && (vm.getHostId() == null || host.getId() != vm.getHostId())){ - s_logger.info("Found vm " + vm.getInstanceName() + " with inconsistent host in db, new host is " + host.getId()); - try { - stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, host.getId()); - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } - } - } - /* else if(info == null && vm.getState() == State.Stopping) { //Handling CS-13376 - s_logger.warn("Marking the VM as Stopped as it was still stopping on the CS" +vm.getName()); - vm.setState(State.Stopped); // Setting the VM as stopped on the DB and clearing it from the host - vm.setLastHostId(vm.getHostId()); - vm.setHostId(null); - _vmDao.persist(vm); - }*/ - } - - for (final AgentVmInfo left : infos.values()) { - if (VirtualMachineName.isValidVmName(left.name)) continue; // if the vm follows cloudstack naming ignore it for stopping - try { - Host host = _hostDao.findByGuid(left.getHostUuid()); - if (host != null){ - s_logger.warn("Stopping a VM which we do not have any record of " + left.name); - Answer answer = _agentMgr.send(host.getId(), cleanup(left.name)); - if (!answer.getResult()) { - s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); - } - } - } catch (Exception e) { - s_logger.warn("Unable to stop a VM due to " + e.getMessage()); - } - } - - } - - - - protected Map convertToInfos(final Map> newStates) { - final HashMap map = new HashMap(); - if (newStates == null) { - return map; - } - Collection> vmGurus = _vmGurus.values(); - boolean is_alien_vm = true; - long alien_vm_count = -1; - for (Map.Entry> entry : newStates.entrySet()) { - is_alien_vm = true; - for (VirtualMachineGuru vmGuru : vmGurus) { - String name = entry.getKey(); - VMInstanceVO vm = vmGuru.findByName(name); - if (vm != null) { - map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue().second(), entry.getValue().first())); - is_alien_vm = false; - break; - } - Long id = vmGuru.convertToId(name); - if (id != null) { - map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null, entry.getValue().second(), entry.getValue().first())); - is_alien_vm = false; - break; - } - } - // alien VMs - if (is_alien_vm){ - map.put(alien_vm_count--, new AgentVmInfo(entry.getKey(), null, null, entry.getValue().second(), entry.getValue().first())); - s_logger.warn("Found an alien VM " + entry.getKey()); - } - } - return map; - } - - protected Map convertToInfos(StartupRoutingCommand cmd) { - final Map states = cmd.getVmStates(); - final HashMap map = new HashMap(); - if (states == null) { - return map; - } - Collection> vmGurus = _vmGurus.values(); - - for (Map.Entry entry : states.entrySet()) { - for (VirtualMachineGuru vmGuru : vmGurus) { - String name = entry.getKey(); - VMInstanceVO vm = vmGuru.findByName(name); - if (vm != null) { - map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue().getState(), entry.getValue().getHost() )); - break; - } - Long id = vmGuru.convertToId(name); - if (id != null) { - map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null,entry.getValue().getState(), entry.getValue().getHost() )); - break; - } - } - } - - return map; - } - - protected Map convertDeltaToInfos(final Map states) { - final HashMap map = new HashMap(); - - if (states == null) { - return map; - } - - Collection> vmGurus = _vmGurus.values(); - - for (Map.Entry entry : states.entrySet()) { - for (VirtualMachineGuru vmGuru : vmGurus) { - String name = entry.getKey(); - - VMInstanceVO vm = vmGuru.findByName(name); - - if (vm != null) { - map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue())); - break; - } - - Long id = vmGuru.convertToId(name); - if (id != null) { - map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null,entry.getValue())); - break; - } - } - } - - return map; - } - - - - /** - * compareState does as its name suggests and compares the states between - * management server and agent. It returns whether something should be - * cleaned up - * - */ - protected Command compareState(long hostId, VMInstanceVO vm, final AgentVmInfo info, final boolean fullSync, boolean trackExternalChange) { - State agentState = info.state; - final String agentName = info.name; - final State serverState = vm.getState(); - final String serverName = vm.getInstanceName(); - - Command command = null; - s_logger.debug("VM " + serverName + ": cs state = " + serverState + " and realState = " + agentState); - if (s_logger.isDebugEnabled()) { - s_logger.debug("VM " + serverName + ": cs state = " + serverState + " and realState = " + agentState); - } - - if (agentState == State.Error) { - agentState = State.Stopped; - - short alertType = AlertManager.ALERT_TYPE_USERVM; - if (VirtualMachine.Type.DomainRouter.equals(vm.getType())) { - alertType = AlertManager.ALERT_TYPE_DOMAIN_ROUTER; - } else if (VirtualMachine.Type.ConsoleProxy.equals(vm.getType())) { - alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY; - } else if (VirtualMachine.Type.SecondaryStorageVm.equals(vm.getType())) { - alertType = AlertManager.ALERT_TYPE_SSVM; - } - - HostPodVO podVO = _podDao.findById(vm.getPodIdToDeployIn()); - DataCenterVO dcVO = _dcDao.findById(vm.getDataCenterIdToDeployIn()); - HostVO hostVO = _hostDao.findById(vm.getHostId()); - - String hostDesc = "name: " + hostVO.getName() + " (id:" + hostVO.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName(); - _alertMgr.sendAlert(alertType, vm.getDataCenterIdToDeployIn(), vm.getPodIdToDeployIn(), "VM (name: " + vm.getInstanceName() + ", id: " + vm.getId() + ") stopped on host " + hostDesc - + " due to storage failure", "Virtual Machine " + vm.getInstanceName() + " (id: " + vm.getId() + ") running on host [" + vm.getHostId() + "] stopped due to storage failure."); - } - - if (trackExternalChange) { - if (serverState == State.Starting) { - if (vm.getHostId() != null && vm.getHostId() != hostId) { - s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " - + vm.getInstanceName()); - return null; - } - } - if (vm.getHostId() == null || hostId != vm.getHostId()) { - try { - stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); - } catch (NoTransitionException e) { - } - } - } - - // during VM migration time, don't sync state will agent status update - if (serverState == State.Migrating) { - s_logger.debug("Skipping vm in migrating state: " + vm); - return null; - } - - if (trackExternalChange) { - if (serverState == State.Starting) { - if (vm.getHostId() != null && vm.getHostId() != hostId) { - s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " - + vm.getInstanceName()); - return null; - } - } - - if (serverState == State.Running) { - try { - // - // we had a bug that sometimes VM may be at Running State - // but host_id is null, we will cover it here. - // means that when CloudStack DB lost of host information, - // we will heal it with the info reported from host - // - if (vm.getHostId() == null || hostId != vm.getHostId()) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("detected host change when VM " + vm + " is at running state, VM could be live-migrated externally from host " + vm.getHostId() + " to host " + hostId); - } - - stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); - } - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } - } - } - - if (agentState == serverState) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Both states are " + agentState + " for " + vm); - } - assert (agentState == State.Stopped || agentState == State.Running) : "If the states we send up is changed, this must be changed."; - if (agentState == State.Running) { - try { - stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, hostId); - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } - // FIXME: What if someone comes in and sets it to stopping? Then - // what? - return null; - } - - s_logger.debug("State matches but the agent said stopped so let's send a cleanup command anyways."); - return cleanup(agentName); - } - - if (agentState == State.Shutdowned) { - if (serverState == State.Running || serverState == State.Starting || serverState == State.Stopping) { - try { - advanceStop(vm, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); - } catch (AgentUnavailableException e) { - assert (false) : "How do we hit this with forced on?"; - return null; - } catch (OperationTimedoutException e) { - assert (false) : "How do we hit this with forced on?"; - return null; - } catch (ConcurrentOperationException e) { - assert (false) : "How do we hit this with forced on?"; - return null; - } - } else { - s_logger.debug("Sending cleanup to a shutdowned vm: " + agentName); - command = cleanup(agentName); - } - } else if (agentState == State.Stopped) { - // This state means the VM on the agent was detected previously - // and now is gone. This is slightly different than if the VM - // was never completed but we still send down a Stop Command - // to ensure there's cleanup. - if (serverState == State.Running) { - // Our records showed that it should be running so let's restart - // it. - _haMgr.scheduleRestart(vm, false); - } else if (serverState == State.Stopping) { - _haMgr.scheduleStop(vm, hostId, WorkType.ForceStop); - s_logger.debug("Scheduling a check stop for VM in stopping mode: " + vm); - } else if (serverState == State.Starting) { - s_logger.debug("Ignoring VM in starting mode: " + vm.getInstanceName()); - _haMgr.scheduleRestart(vm, false); - } - command = cleanup(agentName); - } else if (agentState == State.Running) { - if (serverState == State.Starting) { - if (fullSync) { - try { - ensureVmRunningContext(hostId, vm, Event.AgentReportRunning); - } catch (OperationTimedoutException e) { - s_logger.error("Exception during update for running vm: " + vm, e); - return null; - } catch (ResourceUnavailableException e) { - s_logger.error("Exception during update for running vm: " + vm, e); - return null; - }catch (InsufficientAddressCapacityException e) { - s_logger.error("Exception during update for running vm: " + vm, e); - return null; - }catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } - } - } else if (serverState == State.Stopping) { - s_logger.debug("Scheduling a stop command for " + vm); - _haMgr.scheduleStop(vm, hostId, WorkType.Stop); - } else { - s_logger.debug("server VM state " + serverState + " does not meet expectation of a running VM report from agent"); - - // just be careful not to stop VM for things we don't handle - // command = cleanup(agentName); - } - } - return command; - } - - private void ensureVmRunningContext(long hostId, VMInstanceVO vm, Event cause) throws OperationTimedoutException, ResourceUnavailableException, NoTransitionException, InsufficientAddressCapacityException { - VirtualMachineGuru vmGuru = getVmGuru(vm); - - s_logger.debug("VM state is starting on full sync so updating it to running"); - vm = findByIdAndType(vm.getType(), vm.getId()); - - // grab outstanding work item if any - ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Found an outstanding work item for this vm " + vm + " in state:" + vm.getState() + ", work id:" + work.getId()); - } - } - - try { - stateTransitTo(vm, cause, hostId); - } catch (NoTransitionException e1) { - s_logger.warn(e1.getMessage()); - } - - s_logger.debug("VM's " + vm + " state is starting on full sync so updating it to Running"); - vm = vmGuru.findById(vm.getId()); // this should ensure vm has the most - // up to date info - - VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - List nics = _nicsDao.listByVmId(profile.getId()); - for (NicVO nic : nics) { - Network network = _networkMgr.getNetwork(nic.getNetworkId()); - NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, - _networkMgr.isSecurityGroupSupportedInNetwork(network), _networkMgr.getNetworkTag(profile.getHypervisorType(), network)); - profile.addNic(nicProfile); - } - - Commands cmds = new Commands(OnError.Stop); - s_logger.debug("Finalizing commands that need to be send to complete Start process for the vm " + vm); - - if (vmGuru.finalizeCommandsOnStart(cmds, profile)) { - if (cmds.size() != 0) { - _agentMgr.send(vm.getHostId(), cmds); - } - - if (vmGuru.finalizeStart(profile, vm.getHostId(), cmds, null)) { - stateTransitTo(vm, cause, vm.getHostId()); - } else { - s_logger.error("Unable to finish finialization for running vm: " + vm); - } - } else { - s_logger.error("Unable to finalize commands on start for vm: " + vm); - } - - if (work != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Updating outstanding work item to Done, id:" + work.getId()); - } - work.setStep(Step.Done); - _workDao.update(work.getId(), work); - } - } - - @Override - public boolean isRecurring() { - return true; - } - - @Override - public boolean processAnswers(long agentId, long seq, Answer[] answers) { - for (final Answer answer : answers) { - if (answer instanceof ClusterSyncAnswer) { - ClusterSyncAnswer hs = (ClusterSyncAnswer) answer; - if (!hs.isExceuted()){ - deltaSync(hs.getNewStates()); - hs.setExecuted(); - } - } - } - return true; - } - - @Override - public boolean processTimeout(long agentId, long seq) { - return true; - } - - @Override - public int getTimeout() { - return -1; - } - - @Override - public boolean processCommands(long agentId, long seq, Command[] cmds) { - boolean processed = false; - for (Command cmd : cmds) { - if (cmd instanceof PingRoutingCommand) { - PingRoutingCommand ping = (PingRoutingCommand) cmd; - if (ping.getNewStates() != null && ping.getNewStates().size() > 0) { - Commands commands = deltaHostSync(agentId, ping.getNewStates()); - if (commands.size() > 0) { - try { - _agentMgr.send(agentId, commands, this); - } catch (final AgentUnavailableException e) { - s_logger.warn("Agent is now unavailable", e); - } - } - } - processed = true; - } - } - return processed; - } - - @Override - public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { - return null; - } - - @Override - public boolean processDisconnect(long agentId, Status state) { - return true; - } - - @Override - public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) throws ConnectionException { - if (!(cmd instanceof StartupRoutingCommand)) { - return; - } - - if (forRebalance) { - s_logger.debug("Not processing listener " + this + " as connect happens on rebalance process"); - return; - } - - if (forRebalance) { - s_logger.debug("Not processing listener " + this + " as connect happens on rebalance process"); - return; - } - - Long clusterId = agent.getClusterId(); - long agentId = agent.getId(); - if (agent.getHypervisorType() == HypervisorType.XenServer) { // only for Xen - StartupRoutingCommand startup = (StartupRoutingCommand) cmd; - HashMap> allStates = startup.getClusterVMStateChanges(); - if (allStates != null){ - this.fullSync(clusterId, allStates); - } - - // initiate the cron job - ClusterSyncCommand syncCmd = new ClusterSyncCommand(Integer.parseInt(Config.ClusterDeltaSyncInterval.getDefaultValue()), clusterId); - try { - long seq_no = _agentMgr.send(agentId, new Commands(syncCmd), this); - s_logger.debug("Cluster VM sync started with jobid " + seq_no); - } catch (AgentUnavailableException e) { - s_logger.fatal("The Cluster VM sync process failed for cluster id " + clusterId + " with ", e); - } - } - else { // for others KVM and VMWare - StartupRoutingCommand startup = (StartupRoutingCommand) cmd; - Commands commands = fullHostSync(agentId, startup); - - if (commands.size() > 0) { - s_logger.debug("Sending clean commands to the agent"); - - try { - boolean error = false; - Answer[] answers = _agentMgr.send(agentId, commands); - for (Answer answer : answers) { - if (!answer.getResult()) { - s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); - error = true; - } - } - if (error) { - throw new ConnectionException(true, "Unable to stop VMs"); - } - } catch (final AgentUnavailableException e) { - s_logger.warn("Agent is unavailable now", e); - throw new ConnectionException(true, "Unable to sync", e); - } catch (final OperationTimedoutException e) { - s_logger.warn("Agent is unavailable now", e); - throw new ConnectionException(true, "Unable to sync", e); - } - } - - } - } - - protected class TransitionTask implements Runnable { - @Override - public void run() { - GlobalLock lock = GlobalLock.getInternLock("TransitionChecking"); - if (lock == null) { - s_logger.debug("Couldn't get the global lock"); - return; - } - - if (!lock.lock(30)) { - s_logger.debug("Couldn't lock the db"); - return; - } - try { - lock.addRef(); - List instances = _vmDao.findVMInTransition(new Date(new Date().getTime() - (_operationTimeout * 1000)), State.Starting, State.Stopping); - for (VMInstanceVO instance : instances) { - State state = instance.getState(); - if (state == State.Stopping) { - _haMgr.scheduleStop(instance, instance.getHostId(), WorkType.CheckStop); - } else if (state == State.Starting) { - _haMgr.scheduleRestart(instance, true); - } - } - } catch (Exception e) { - s_logger.warn("Caught the following exception on transition checking", e); - } finally { - StackMaid.current().exitCleanup(); - lock.unlock(); - } - } - } - - protected class AgentVmInfo { - public String name; - public State state; - public String hostUuid; - public VMInstanceVO vm; - public VirtualMachineGuru guru; - - @SuppressWarnings("unchecked") - public AgentVmInfo(String name, VirtualMachineGuru guru, VMInstanceVO vm, State state, String host) { - this.name = name; - this.state = state; - this.vm = vm; - this.guru = (VirtualMachineGuru) guru; - this.hostUuid = host; - } - - public AgentVmInfo(String name, VirtualMachineGuru guru, VMInstanceVO vm, State state) { - this(name, guru, vm, state, null); - } - - public String getHostUuid() { - return hostUuid; - } - } - - @Override - public VMInstanceVO findById(long vmId) { - return _vmDao.findById(vmId); - } - - @Override - public void checkIfCanUpgrade(VirtualMachine vmInstance, long newServiceOfferingId) { - ServiceOfferingVO newServiceOffering = _offeringDao.findById(newServiceOfferingId); - if (newServiceOffering == null) { - throw new InvalidParameterValueException("Unable to find a service offering with id " + newServiceOfferingId); - } - - // Check that the VM is stopped - if (!vmInstance.getState().equals(State.Stopped)) { - s_logger.warn("Unable to upgrade virtual machine " + vmInstance.toString() + " in state " + vmInstance.getState()); - throw new InvalidParameterValueException("Unable to upgrade virtual machine " + vmInstance.toString() + " " + - "in state " + vmInstance.getState() - + "; make sure the virtual machine is stopped and not in an error state before upgrading."); - } - - // Check if the service offering being upgraded to is what the VM is already running with - if (vmInstance.getServiceOfferingId() == newServiceOffering.getId()) { - if (s_logger.isInfoEnabled()) { - s_logger.info("Not upgrading vm " + vmInstance.toString() + " since it already has the requested " + - "service offering (" + newServiceOffering.getName() + ")"); - } - - throw new InvalidParameterValueException("Not upgrading vm " + vmInstance.toString() + " since it already " + - "has the requested service offering (" + newServiceOffering.getName() + ")"); - } - - ServiceOfferingVO currentServiceOffering = _offeringDao.findByIdIncludingRemoved(vmInstance.getServiceOfferingId()); - - // Check that the service offering being upgraded to has the same Guest IP type as the VM's current service offering - // NOTE: With the new network refactoring in 2.2, we shouldn't need the check for same guest IP type anymore. - /* - * if (!currentServiceOffering.getGuestIpType().equals(newServiceOffering.getGuestIpType())) { String errorMsg = - * "The service offering being upgraded to has a guest IP type: " + newServiceOffering.getGuestIpType(); errorMsg += - * ". Please select a service offering with the same guest IP type as the VM's current service offering (" + - * currentServiceOffering.getGuestIpType() + ")."; throw new InvalidParameterValueException(errorMsg); } - */ - - // Check that the service offering being upgraded to has the same storage pool preference as the VM's current service - // offering - if (currentServiceOffering.getUseLocalStorage() != newServiceOffering.getUseLocalStorage()) { - throw new InvalidParameterValueException("Unable to upgrade virtual machine " + vmInstance.toString() - + ", cannot switch between local storage and shared storage service offerings. Current offering " + - "useLocalStorage=" + currentServiceOffering.getUseLocalStorage() - + ", target offering useLocalStorage=" + newServiceOffering.getUseLocalStorage()); - } - - // if vm is a system vm, check if it is a system service offering, if yes return with error as it cannot be used for user vms - if (currentServiceOffering.getSystemUse() != newServiceOffering.getSystemUse()) { - throw new InvalidParameterValueException("isSystem property is different for current service offering and new service offering"); - } - - // Check that there are enough resources to upgrade the service offering - if (!isVirtualMachineUpgradable(vmInstance, newServiceOffering)) { - throw new InvalidParameterValueException("Unable to upgrade virtual machine, not enough resources available " + - "for an offering of " + newServiceOffering.getCpu() + " cpu(s) at " - + newServiceOffering.getSpeed() + " Mhz, and " + newServiceOffering.getRamSize() + " MB of memory"); - } - - // Check that the service offering being upgraded to has all the tags of the current service offering - List currentTags = _configMgr.csvTagsToList(currentServiceOffering.getTags()); - List newTags = _configMgr.csvTagsToList(newServiceOffering.getTags()); - if (!newTags.containsAll(currentTags)) { - throw new InvalidParameterValueException("Unable to upgrade virtual machine; the new service offering " + - "does not have all the tags of the " - + "current service offering. Current service offering tags: " + currentTags + "; " + "new service " + - "offering tags: " + newTags); - } - } - - @Override - public boolean upgradeVmDb(long vmId, long serviceOfferingId) { - VMInstanceVO vmForUpdate = _vmDao.createForUpdate(); - vmForUpdate.setServiceOfferingId(serviceOfferingId); - ServiceOffering newSvcOff = _configMgr.getServiceOffering(serviceOfferingId); - vmForUpdate.setHaEnabled(newSvcOff.getOfferHA()); - vmForUpdate.setLimitCpuUse(newSvcOff.getLimitCpuUse()); - vmForUpdate.setServiceOfferingId(newSvcOff.getId()); - return _vmDao.update(vmId, vmForUpdate); - } - - @Override - public NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, - ResourceUnavailableException, InsufficientCapacityException { - - s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested); - VMInstanceVO vmVO = _vmDao.findById(vm.getId()); - ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), - _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)); - - VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmVO, null, - null, null, null); - - DataCenter dc = _configMgr.getZone(network.getDataCenterId()); - Host host = _hostDao.findById(vm.getHostId()); - DeployDestination dest = new DeployDestination(dc, null, null, host); - - //check vm state - if (vm.getState() == State.Running) { - //1) allocate and prepare nic - NicProfile nic = _networkMgr.createNicForVm(network, requested, context, vmProfile, true); - - //2) Convert vmProfile to vmTO - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); - VirtualMachineTO vmTO = hvGuru.implement(vmProfile); - - //3) Convert nicProfile to NicTO - NicTO nicTO = toNicTO(nic, vmProfile.getVirtualMachine().getHypervisorType()); - - //4) plug the nic to the vm - VirtualMachineGuru vmGuru = getVmGuru(vmVO); - - s_logger.debug("Plugging nic for vm " + vm + " in network " + network); - if (vmGuru.plugNic(network, nicTO, vmTO, context, dest)) { - s_logger.debug("Nic is plugged successfully for vm " + vm + " in network " + network + ". Vm is a part of network now"); - return nic; - } else { - s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network); - return null; - } - } else if (vm.getState() == State.Stopped) { - //1) allocate nic - return _networkMgr.createNicForVm(network, requested, context, vmProfile, false); - } else { - s_logger.warn("Unable to add vm " + vm + " to network " + network); - throw new ResourceUnavailableException("Unable to add vm " + vm + " to network, is not in the right state", - DataCenter.class, vm.getDataCenterIdToDeployIn()); - } - } - - - @Override - public NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType) { - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(hypervisorType); - - NicTO nicTO = hvGuru.toNicTO(nic); - return nicTO; - } - - @Override - public boolean removeVmFromNetwork(VirtualMachine vm, Network network, URI broadcastUri) throws ConcurrentOperationException, ResourceUnavailableException { - VMInstanceVO vmVO = _vmDao.findById(vm.getId()); - ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), - _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)); - - VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmVO, null, - null, null, null); - - DataCenter dc = _configMgr.getZone(network.getDataCenterId()); - Host host = _hostDao.findById(vm.getHostId()); - DeployDestination dest = new DeployDestination(dc, null, null, host); - VirtualMachineGuru vmGuru = getVmGuru(vmVO); - HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); - VirtualMachineTO vmTO = hvGuru.implement(vmProfile); - - Nic nic = null; - - if (broadcastUri != null) { - nic = _nicsDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri.toString()); - } else { - nic = _networkMgr.getNicInNetwork(vm.getId(), network.getId()); - } - - NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), - _networkMgr.getNetworkRate(network.getId(), vm.getId()), - _networkMgr.isSecurityGroupSupportedInNetwork(network), - _networkMgr.getNetworkTag(vmProfile.getVirtualMachine().getHypervisorType(), network)); - - //1) Unplug the nic - NicTO nicTO = toNicTO(nicProfile, vmProfile.getVirtualMachine().getHypervisorType()); - s_logger.debug("Un-plugging nic for vm " + vm + " from network " + network); - boolean result = vmGuru.unplugNic(network, nicTO, vmTO, context, dest); - if (result) { - s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network ); - } else { - s_logger.warn("Failed to unplug nic for the vm " + vm + " from network " + network); - return false; - } - - //2) Release the nic - _networkMgr.releaseNic(vmProfile, nic); - s_logger.debug("Successfully released nic " + nic + "for vm " + vm); - - //3) Remove the nic - _networkMgr.removeNic(vmProfile, nic); - return result; - } - -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.vm; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.AgentManager.OnError; +import com.cloud.agent.Listener; +import com.cloud.agent.api.AgentControlAnswer; +import com.cloud.agent.api.AgentControlCommand; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.CheckVirtualMachineAnswer; +import com.cloud.agent.api.CheckVirtualMachineCommand; +import com.cloud.agent.api.ClusterSyncAnswer; +import com.cloud.agent.api.ClusterSyncCommand; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.MigrateAnswer; +import com.cloud.agent.api.MigrateCommand; +import com.cloud.agent.api.PingRoutingCommand; +import com.cloud.agent.api.PrepareForMigrationAnswer; +import com.cloud.agent.api.PrepareForMigrationCommand; +import com.cloud.agent.api.RebootAnswer; +import com.cloud.agent.api.RebootCommand; +import com.cloud.agent.api.StartAnswer; +import com.cloud.agent.api.StartCommand; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.StartupRoutingCommand; +import com.cloud.agent.api.StartupRoutingCommand.VmState; +import com.cloud.agent.api.StopAnswer; +import com.cloud.agent.api.StopCommand; +import com.cloud.agent.api.to.NicTO; +import com.cloud.agent.api.to.VirtualMachineTO; +import com.cloud.agent.manager.Commands; +import com.cloud.agent.manager.allocator.HostAllocator; +import com.cloud.alert.AlertManager; +import com.cloud.capacity.CapacityManager; +import com.cloud.cluster.ClusterManager; +import com.cloud.cluster.StackMaid; +import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.consoleproxy.ConsoleProxyManager; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.deploy.DataCenterDeployment; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.deploy.DeploymentPlanner; +import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ConnectionException; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientServerCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.ManagementServerException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.VirtualMachineMigrationException; +import com.cloud.ha.HighAvailabilityManager; +import com.cloud.ha.HighAvailabilityManager.WorkType; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.hypervisor.HypervisorGuru; +import com.cloud.hypervisor.HypervisorGuruManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkManager; +import com.cloud.network.NetworkVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.offering.ServiceOffering; +import com.cloud.org.Cluster; +import com.cloud.resource.ResourceManager; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageManager; +import com.cloud.storage.StoragePool; +import com.cloud.storage.StoragePoolVO; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume; +import com.cloud.storage.Volume.Type; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.GuestOSCategoryDao; +import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.StoragePoolDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.User; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; +import com.cloud.utils.Journal; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.Ternary; +import com.cloud.utils.component.Adapters; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.Inject; +import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.exception.ExecutionException; +import com.cloud.utils.fsm.NoTransitionException; +import com.cloud.utils.fsm.StateMachine2; +import com.cloud.vm.ItWorkVO.Step; +import com.cloud.vm.VirtualMachine.Event; +import com.cloud.vm.VirtualMachine.State; +import com.cloud.vm.dao.ConsoleProxyDao; +import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.SecondaryStorageVmDao; +import com.cloud.vm.dao.UserVmDao; +import com.cloud.vm.dao.VMInstanceDao; + +@Local(value = VirtualMachineManager.class) +public class VirtualMachineManagerImpl implements VirtualMachineManager, Listener { + private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class); + + String _name; + @Inject + protected StorageManager _storageMgr; + @Inject + protected NetworkManager _networkMgr; + @Inject + protected AgentManager _agentMgr; + @Inject + protected VMInstanceDao _vmDao; + @Inject + protected ServiceOfferingDao _offeringDao; + @Inject + protected VMTemplateDao _templateDao; + @Inject + protected UserDao _userDao; + @Inject + protected AccountDao _accountDao; + @Inject + protected DomainDao _domainDao; + @Inject + protected ClusterManager _clusterMgr; + @Inject + protected ItWorkDao _workDao; + @Inject + protected UserVmDao _userVmDao; + @Inject + protected DomainRouterDao _routerDao; + @Inject + protected ConsoleProxyDao _consoleDao; + @Inject + protected SecondaryStorageVmDao _secondaryDao; + @Inject + protected NicDao _nicsDao; + @Inject + protected AccountManager _accountMgr; + @Inject + protected HostDao _hostDao; + @Inject + protected AlertManager _alertMgr; + @Inject + protected GuestOSCategoryDao _guestOsCategoryDao; + @Inject + protected GuestOSDao _guestOsDao; + @Inject + protected VolumeDao _volsDao; + @Inject + protected ConsoleProxyManager _consoleProxyMgr; + @Inject + protected ConfigurationManager _configMgr; + @Inject + protected CapacityManager _capacityMgr; + @Inject + protected HighAvailabilityManager _haMgr; + @Inject + protected HostPodDao _podDao; + @Inject + protected DataCenterDao _dcDao; + @Inject + protected StoragePoolDao _storagePoolDao; + @Inject + protected HypervisorGuruManager _hvGuruMgr; + @Inject + protected NetworkDao _networkDao; + + @Inject(adapter = DeploymentPlanner.class) + protected Adapters _planners; + + @Inject(adapter = HostAllocator.class) + protected Adapters _hostAllocators; + + @Inject + protected ResourceManager _resourceMgr; + + Map> _vmGurus = new HashMap>(); + protected StateMachine2 _stateMachine; + + ScheduledExecutorService _executor = null; + protected int _operationTimeout; + + protected int _retry; + protected long _nodeId; + protected long _cleanupWait; + protected long _cleanupInterval; + protected long _cancelWait; + protected long _opWaitInterval; + protected int _lockStateRetry; + protected boolean _forceStop; + + @Override + public void registerGuru(VirtualMachine.Type type, VirtualMachineGuru guru) { + synchronized (_vmGurus) { + _vmGurus.put(type, guru); + } + } + + @Override + @DB + public T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Pair rootDiskOffering, + List> dataDiskOfferings, List> networks, Map params, DeploymentPlan plan, + HypervisorType hyperType, Account owner) throws InsufficientCapacityException { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocating entries for VM: " + vm); + } + + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, serviceOffering, owner, params); + + vm.setDataCenterId(plan.getDataCenterId()); + if (plan.getPodId() != null) { + vm.setPodId(plan.getPodId()); + } + assert (plan.getClusterId() == null && plan.getPoolId() == null) : "We currently don't support cluster and pool preset yet"; + + @SuppressWarnings("unchecked") + VirtualMachineGuru guru = (VirtualMachineGuru) _vmGurus.get(vm.getType()); + + Transaction txn = Transaction.currentTxn(); + txn.start(); + vm = guru.persist(vm); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocating nics for " + vm); + } + + try { + _networkMgr.allocate(vmProfile, networks); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e); + } + + if (dataDiskOfferings == null) { + dataDiskOfferings = new ArrayList>(0); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocaing disks for " + vm); + } + + if (template.getFormat() == ImageFormat.ISO) { + _storageMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner); + } else if (template.getFormat() == ImageFormat.BAREMETAL) { + // Do nothing + } else { + _storageMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner); + } + + for (Pair offering : dataDiskOfferings) { + _storageMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner); + } + + txn.commit(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocation completed for VM: " + vm); + } + + return vm; + } + + @Override + public T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Long rootSize, Pair dataDiskOffering, + List> networks, DeploymentPlan plan, HypervisorType hyperType, Account owner) throws InsufficientCapacityException { + List> diskOfferings = new ArrayList>(1); + if (dataDiskOffering != null) { + diskOfferings.add(dataDiskOffering); + } + return allocate(vm, template, serviceOffering, new Pair(serviceOffering, rootSize), diskOfferings, networks, null, plan, hyperType, owner); + } + + @Override + public T allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, List> networks, DeploymentPlan plan, + HypervisorType hyperType, Account owner) throws InsufficientCapacityException { + return allocate(vm, template, serviceOffering, new Pair(serviceOffering, null), null, networks, null, plan, hyperType, owner); + } + + @SuppressWarnings("unchecked") + private VirtualMachineGuru getVmGuru(T vm) { + return (VirtualMachineGuru) _vmGurus.get(vm.getType()); + } + + @SuppressWarnings("unchecked") + private VirtualMachineGuru getBareMetalVmGuru(T vm) { + return (VirtualMachineGuru) _vmGurus.get(VirtualMachine.Type.UserBareMetal); + } + + @Override + public boolean expunge(T vm, User caller, Account account) throws ResourceUnavailableException { + try { + if (advanceExpunge(vm, caller, account)) { + // Mark vms as removed + remove(vm, caller, account); + return true; + } else { + s_logger.info("Did not expunge " + vm); + return false; + } + } catch (OperationTimedoutException e) { + throw new CloudRuntimeException("Operation timed out", e); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Concurrent operation ", e); + } + } + + @Override + public boolean advanceExpunge(T vm, User caller, Account account) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException { + if (vm == null || vm.getRemoved() != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to find vm or vm is destroyed: " + vm); + } + return true; + } + + if (!this.advanceStop(vm, false, caller, account)) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to stop the VM so we can't expunge it."); + } + } + + try { + if (!stateTransitTo(vm, VirtualMachine.Event.ExpungeOperation, vm.getHostId())) { + s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); + return false; + } + } catch (NoTransitionException e) { + s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); + return false; + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Destroying vm " + vm); + } + + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + s_logger.debug("Cleaning up NICS"); + _networkMgr.cleanupNics(profile); + // Clean up volumes based on the vm's instance id + _storageMgr.cleanupVolumes(vm.getId()); + + VirtualMachineGuru guru = getVmGuru(vm); + guru.finalizeExpunge(vm); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Expunged " + vm); + } + + return true; + } + + @Override + public boolean start() { + _executor.scheduleAtFixedRate(new CleanupTask(), _cleanupInterval, _cleanupInterval, TimeUnit.SECONDS); + cancelWorkItems(_nodeId); + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public boolean configure(String name, Map xmlParams) throws ConfigurationException { + _name = name; + + ComponentLocator locator = ComponentLocator.getCurrentLocator(); + ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); + Map params = configDao.getConfiguration(xmlParams); + + _retry = NumbersUtil.parseInt(params.get(Config.StartRetry.key()), 10); + + ReservationContextImpl.setComponents(_userDao, _domainDao, _accountDao); + VirtualMachineProfileImpl.setComponents(_offeringDao, _templateDao, _accountDao); + + _cancelWait = NumbersUtil.parseLong(params.get(Config.VmOpCancelInterval.key()), 3600); + _cleanupWait = NumbersUtil.parseLong(params.get(Config.VmOpCleanupWait.key()), 3600); + _cleanupInterval = NumbersUtil.parseLong(params.get(Config.VmOpCleanupInterval.key()), 86400) * 1000; + _opWaitInterval = NumbersUtil.parseLong(params.get(Config.VmOpWaitInterval.key()), 120) * 1000; + _lockStateRetry = NumbersUtil.parseInt(params.get(Config.VmOpLockStateRetry.key()), 5); + _operationTimeout = NumbersUtil.parseInt(params.get(Config.Wait.key()), 1800) * 2; + _forceStop = Boolean.parseBoolean(params.get(Config.VmDestroyForcestop.key())); + + _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vm-Operations-Cleanup")); + _nodeId = _clusterMgr.getManagementNodeId(); + + _agentMgr.registerForHostEvents(this, true, true, true); + + return true; + } + + @Override + public String getName() { + return _name; + } + + protected VirtualMachineManagerImpl() { + setStateMachine(); + } + + @Override + public T start(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { + return start(vm, params, caller, account, null); + } + + @Override + public T start(T vm, Map params, User caller, Account account, DeploymentPlan planToDeploy) throws InsufficientCapacityException, + ResourceUnavailableException { + try { + return advanceStart(vm, params, caller, account, planToDeploy); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e); + } + } + + protected boolean checkWorkItems(VMInstanceVO vm, State state) throws ConcurrentOperationException { + while (true) { + ItWorkVO vo = _workDao.findByOutstandingWork(vm.getId(), state); + if (vo == null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to find work for VM: " + vm + " and state: " + state); + } + return true; + } + + if (vo.getStep() == Step.Done) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Work for " + vm + " is " + vo.getStep()); + } + return true; + } + + if (vo.getSecondsTaskIsInactive() > _cancelWait) { + s_logger.warn("The task item for vm " + vm + " has been inactive for " + vo.getSecondsTaskIsInactive()); + return false; + } + + try { + Thread.sleep(_opWaitInterval); + } catch (InterruptedException e) { + s_logger.info("Waiting for " + vm + " but is interrupted"); + throw new ConcurrentOperationException("Waiting for " + vm + " but is interrupted"); + } + s_logger.debug("Waiting some more to make sure there's no activity on " + vm); + } + + } + + @DB + protected Ternary changeToStartState(VirtualMachineGuru vmGuru, T vm, User caller, Account account) + throws ConcurrentOperationException { + long vmId = vm.getId(); + + ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId()); + int retry = _lockStateRetry; + while (retry-- != 0) { + Transaction txn = Transaction.currentTxn(); + Ternary result = null; + txn.start(); + try { + Journal journal = new Journal.LogJournal("Creating " + vm, s_logger); + work = _workDao.persist(work); + ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account); + + if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId()); + } + result = new Ternary(vmGuru.findById(vmId), context, work); + txn.commit(); + return result; + } + } catch (NoTransitionException e) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to transition into Starting state due to " + e.getMessage()); + } + } finally { + if (result == null) { + txn.rollback(); + } + } + + VMInstanceVO instance = _vmDao.findById(vmId); + if (instance == null) { + throw new ConcurrentOperationException("Unable to acquire lock on " + vm); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Determining why we're unable to update the state to Starting for " + instance + ". Retry=" + retry); + } + + State state = instance.getState(); + if (state == State.Running) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("VM is already started: " + vm); + } + return null; + } + + if (state.isTransitional()) { + if (!checkWorkItems(vm, state)) { + throw new ConcurrentOperationException("There are concurrent operations on " + vm); + } else { + continue; + } + } + + if (state != State.Stopped) { + s_logger.debug("VM " + vm + " is not in a state to be started: " + state); + return null; + } + } + + throw new ConcurrentOperationException("Unable to change the state of " + vm); + } + + protected boolean changeState(T vm, Event event, Long hostId, ItWorkVO work, Step step) throws NoTransitionException { + // FIXME: We should do this better. + Step previousStep = work.getStep(); + _workDao.updateStep(work, step); + boolean result = false; + try { + result = stateTransitTo(vm, event, hostId); + return result; + } finally { + if (!result) { + _workDao.updateStep(work, previousStep); + } + } + } + + @Override + public T advanceStart(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + return advanceStart(vm, params, caller, account, null); + } + + @Override + public T advanceStart(T vm, Map params, User caller, Account account, DeploymentPlan planToDeploy) + throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + long vmId = vm.getId(); + VirtualMachineGuru vmGuru; + if (vm.getHypervisorType() == HypervisorType.BareMetal) { + vmGuru = getBareMetalVmGuru(vm); + } else { + vmGuru = getVmGuru(vm); + } + + vm = vmGuru.findById(vm.getId()); + Ternary start = changeToStartState(vmGuru, vm, caller, account); + if (start == null) { + return vmGuru.findById(vmId); + } + + vm = start.first(); + ReservationContext ctx = start.second(); + ItWorkVO work = start.third(); + + T startedVm = null; + ServiceOfferingVO offering = _offeringDao.findById(vm.getServiceOfferingId()); + VMTemplateVO template = _templateDao.findById(vm.getTemplateId()); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Trying to deploy VM, vm has dcId: " + vm.getDataCenterIdToDeployIn() + " and podId: " + vm.getPodIdToDeployIn()); + } + DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterIdToDeployIn(), vm.getPodIdToDeployIn(), null, null, null, null, ctx); + if(planToDeploy != null && planToDeploy.getDataCenterId() != 0){ + if (s_logger.isDebugEnabled()) { + s_logger.debug("advanceStart: DeploymentPlan is provided, using dcId:" + planToDeploy.getDataCenterId() + ", podId: " + planToDeploy.getPodId() + ", clusterId: " + + planToDeploy.getClusterId() + ", hostId: " + planToDeploy.getHostId() + ", poolId: " + planToDeploy.getPoolId()); + } + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId(), ctx); + } + + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); + + boolean canRetry = true; + try { + Journal journal = start.second().getJournal(); + + ExcludeList avoids = null; + if (planToDeploy != null) { + avoids = planToDeploy.getAvoids(); + } + if (avoids == null) { + avoids = new ExcludeList(); + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid()); + } + + + boolean planChangedByVolume = false; + boolean reuseVolume = true; + DataCenterDeployment originalPlan = plan; + + int retry = _retry; + boolean recreate = false; + while (retry-- != 0) { // It's != so that it can match -1. + + if(reuseVolume){ + // edit plan if this vm's ROOT volume is in READY state already + List vols = _volsDao.findReadyRootVolumesByInstance(vm.getId()); + for (VolumeVO vol : vols) { + // make sure if the templateId is unchanged. If it is changed, + // let planner + // reassign pool for the volume even if it ready. + Long volTemplateId = vol.getTemplateId(); + if (volTemplateId != null && volTemplateId.longValue() != template.getId()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug(vol + " of " + vm + " is READY, but template ids don't match, let the planner reassign a new pool"); + } + continue; + } + + StoragePoolVO pool = _storagePoolDao.findById(vol.getPoolId()); + if (!pool.isInMaintenance()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Root volume is ready, need to place VM in volume's cluster"); + } + long rootVolDcId = pool.getDataCenterId(); + Long rootVolPodId = pool.getPodId(); + Long rootVolClusterId = pool.getClusterId(); + if (planToDeploy != null && planToDeploy.getDataCenterId() != 0) { + Long clusterIdSpecified = planToDeploy.getClusterId(); + if (clusterIdSpecified != null && rootVolClusterId != null) { + if (rootVolClusterId.longValue() != clusterIdSpecified.longValue()) { + // cannot satisfy the plan passed in to the + // planner + if (s_logger.isDebugEnabled()) { + s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: " + rootVolClusterId + + ", cluster specified: " + clusterIdSpecified); + } + throw new ResourceUnavailableException("Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for " + + vm, Cluster.class, clusterIdSpecified); + } + } + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null, ctx); + }else{ + plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null, ctx); + if (s_logger.isDebugEnabled()) { + s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId); + } + planChangedByVolume = true; + } + } + } + } + + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, account, params); + DeployDestination dest = null; + for (DeploymentPlanner planner : _planners) { + if (planner.canHandle(vmProfile, plan, avoids)) { + dest = planner.plan(vmProfile, plan, avoids); + } else { + continue; + } + if (dest != null) { + avoids.addHost(dest.getHost().getId()); + journal.record("Deployment found ", vmProfile, dest); + break; + } + } + + if (dest == null) { + if (planChangedByVolume) { + plan = originalPlan; + planChangedByVolume = false; + //do not enter volume reuse for next retry, since we want to look for resorces outside the volume's cluster + reuseVolume = false; + continue; + } + throw new InsufficientServerCapacityException("Unable to create a deployment for " + vmProfile, DataCenter.class, plan.getDataCenterId()); + } + + long destHostId = dest.getHost().getId(); + vm.setPodId(dest.getPod().getId()); + + try { + if (!changeState(vm, Event.OperationRetry, destHostId, work, Step.Prepare)) { + throw new ConcurrentOperationException("Unable to update the state of the Virtual Machine"); + } + } catch (NoTransitionException e1) { + throw new ConcurrentOperationException(e1.getMessage()); + } + + try { + if (s_logger.isDebugEnabled()) { + s_logger.debug("VM is being created in podId: " + vm.getPodIdToDeployIn()); + } + _networkMgr.prepare(vmProfile, dest, ctx); + if (vm.getHypervisorType() != HypervisorType.BareMetal) { + _storageMgr.prepare(vmProfile, dest, recreate); + recreate = false; + } + //since StorageMgr succeeded in volume creation, reuse Volume for further tries until current cluster has capacity + if(!reuseVolume){ + reuseVolume = true; + } + + Commands cmds = null; + vmGuru.finalizeVirtualMachineProfile(vmProfile, dest, ctx); + + VirtualMachineTO vmTO = hvGuru.implement(vmProfile); + + cmds = new Commands(OnError.Stop); + cmds.addCommand(new StartCommand(vmTO)); + + vmGuru.finalizeDeployment(cmds, vmProfile, dest, ctx); + + + work = _workDao.findById(work.getId()); + if (work == null || work.getStep() != Step.Prepare) { + throw new ConcurrentOperationException("Work steps have been changed: " + work); + } + _workDao.updateStep(work, Step.Starting); + + _agentMgr.send(destHostId, cmds); + + _workDao.updateStep(work, Step.Started); + + + StartAnswer startAnswer = cmds.getAnswer(StartAnswer.class); + if (startAnswer != null && startAnswer.getResult()) { + String host_guid = startAnswer.getHost_guid(); + if( host_guid != null ) { + HostVO finalHost = _resourceMgr.findHostByGuid(host_guid); + if (finalHost == null ) { + throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here"); + } + destHostId = finalHost.getId(); + } + if (vmGuru.finalizeStart(vmProfile, destHostId, cmds, ctx)) { + if (!changeState(vm, Event.OperationSucceeded, destHostId, work, Step.Done)) { + throw new ConcurrentOperationException("Unable to transition to a new state."); + } + startedVm = vm; + if (s_logger.isDebugEnabled()) { + s_logger.debug("Start completed for VM " + vm); + } + return startedVm; + } else { + if (s_logger.isDebugEnabled()) { + s_logger.info("The guru did not like the answers so stopping " + vm); + } + + StopCommand cmd = new StopCommand(vm.getInstanceName()); + StopAnswer answer = (StopAnswer) _agentMgr.easySend(destHostId, cmd); + if (answer == null || !answer.getResult()) { + s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers")); + _haMgr.scheduleStop(vm, destHostId, WorkType.ForceStop); + throw new ExecutionException("Unable to stop " + vm + " so we are unable to retry the start operation"); + } + if (vmGuru.recreateNeeded(vmProfile, destHostId, cmds, ctx)) { + recreate = true; + } else { + throw new ExecutionException("Unable to start " + vm + " due to error in finalizeStart, not retrying"); + } + } + } + s_logger.info("Unable to start VM on " + dest.getHost() + " due to " + (startAnswer == null ? " no start answer" : startAnswer.getDetails())); + + } catch (OperationTimedoutException e) { + s_logger.debug("Unable to send the start command to host " + dest.getHost()); + if (e.isActive()) { + _haMgr.scheduleStop(vm, destHostId, WorkType.CheckStop); + } + canRetry = false; + throw new AgentUnavailableException("Unable to start " + vm.getHostName(), destHostId, e); + } catch (ResourceUnavailableException e) { + s_logger.info("Unable to contact resource.", e); + if (!avoids.add(e)) { + if (e.getScope() == Volume.class || e.getScope() == Nic.class) { + throw e; + } else { + s_logger.warn("unexpected ResourceUnavailableException : " + e.getScope().getName(), e); + throw e; + } + } + } catch (InsufficientCapacityException e) { + s_logger.info("Insufficient capacity ", e); + if (!avoids.add(e)) { + if (e.getScope() == Volume.class || e.getScope() == Nic.class) { + throw e; + } else { + s_logger.warn("unexpected InsufficientCapacityException : " + e.getScope().getName(), e); + } + } + } catch (Exception e) { + s_logger.error("Failed to start instance " + vm, e); + throw new AgentUnavailableException("Unable to start instance due to " + e.getMessage(), destHostId, e); + } finally { + if (startedVm == null && canRetry) { + Step prevStep = work.getStep(); + _workDao.updateStep(work, Step.Release); + if (prevStep == Step.Started || prevStep == Step.Starting) { + cleanup(vmGuru, vmProfile, work, Event.OperationFailed, false, caller, account); + } else { + //if step is not starting/started, send cleanup command with force=true + cleanup(vmGuru, vmProfile, work, Event.OperationFailed, true, caller, account); + } + } + } + } + } finally { + if (startedVm == null) { + if (canRetry) { + try { + changeState(vm, Event.OperationFailed, null, work, Step.Done); + } catch (NoTransitionException e) { + throw new ConcurrentOperationException(e.getMessage()); + } + } + } + } + + return startedVm; + } + + @Override + public boolean stop(T vm, User user, Account account) throws ResourceUnavailableException { + try { + return advanceStop(vm, false, user, account); + } catch (OperationTimedoutException e) { + throw new AgentUnavailableException("Unable to stop vm because the operation to stop timed out", vm.getHostId(), e); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Unable to stop vm because of a concurrent operation", e); + } + } + + protected boolean sendStop(VirtualMachineGuru guru, VirtualMachineProfile profile, boolean force) { + VMInstanceVO vm = profile.getVirtualMachine(); + StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null); + try { + Answer answer = _agentMgr.send(vm.getHostId(), stop); + if (!answer.getResult()) { + s_logger.debug("Unable to stop VM due to " + answer.getDetails()); + return false; + } + + guru.finalizeStop(profile, (StopAnswer) answer); + } catch (AgentUnavailableException e) { + if (!force) { + return false; + } + } catch (OperationTimedoutException e) { + if (!force) { + return false; + } + } + + return true; + } + + protected boolean cleanup(VirtualMachineGuru guru, VirtualMachineProfile profile, ItWorkVO work, Event event, boolean force, User user, Account account) { + T vm = profile.getVirtualMachine(); + State state = vm.getState(); + s_logger.debug("Cleaning up resources for the vm " + vm + " in " + state + " state"); + if (state == State.Starting) { + Step step = work.getStep(); + if (step == Step.Starting && !force) { + s_logger.warn("Unable to cleanup vm " + vm + "; work state is incorrect: " + step); + return false; + } + + if (step == Step.Started || step == Step.Starting || step == Step.Release) { + if (vm.getHostId() != null) { + if (!sendStop(guru, profile, force)) { + s_logger.warn("Failed to stop vm " + vm + " in " + State.Starting + " state as a part of cleanup process"); + return false; + } + } + } + + if (step != Step.Release && step != Step.Prepare && step != Step.Started && step != Step.Starting) { + s_logger.debug("Cleanup is not needed for vm " + vm + "; work state is incorrect: " + step); + return true; + } + } else if (state == State.Stopping) { + if (vm.getHostId() != null) { + if (!sendStop(guru, profile, force)) { + s_logger.warn("Failed to stop vm " + vm + " in " + State.Stopping + " state as a part of cleanup process"); + return false; + } + } + } else if (state == State.Migrating) { + if (vm.getHostId() != null) { + if (!sendStop(guru, profile, force)) { + s_logger.warn("Failed to stop vm " + vm + " in " + State.Migrating + " state as a part of cleanup process"); + return false; + } + } + if (vm.getLastHostId() != null) { + if (!sendStop(guru, profile, force)) { + s_logger.warn("Failed to stop vm " + vm + " in " + State.Migrating + " state as a part of cleanup process"); + return false; + } + } + } else if (state == State.Running) { + if (!sendStop(guru, profile, force)) { + s_logger.warn("Failed to stop vm " + vm + " in " + State.Running + " state as a part of cleanup process"); + return false; + } + } + + try { + _networkMgr.release(profile, force); + s_logger.debug("Successfully released network resources for the vm " + vm); + } catch (Exception e) { + s_logger.warn("Unable to release some network resources.", e); + } + + _storageMgr.release(profile); + s_logger.debug("Successfully cleanued up resources for the vm " + vm + " in " + state + " state"); + return true; + } + + @Override + public boolean advanceStop(T vm, boolean forced, User user, Account account) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { + State state = vm.getState(); + if (state == State.Stopped) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("VM is already stopped: " + vm); + } + return true; + } + + if (state == State.Destroyed || state == State.Expunging || state == State.Error) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Stopped called on " + vm + " but the state is " + state); + } + return true; + } + // grab outstanding work item if any + ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Found an outstanding work item for this vm " + vm + " with state:" + vm.getState() + ", work id:" + work.getId()); + } + } + Long hostId = vm.getHostId(); + if (hostId == null) { + if (!forced) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("HostId is null but this is not a forced stop, cannot stop vm " + vm + " with state:" + vm.getState()); + } + return false; + } + try { + stateTransitTo(vm, Event.AgentReportStopped, null, null); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + // mark outstanding work item if any as done + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating work item to Done, id:" + work.getId()); + } + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + return true; + } + + VirtualMachineGuru vmGuru = getVmGuru(vm); + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + + try { + if (!stateTransitTo(vm, Event.StopRequested, vm.getHostId())) { + throw new ConcurrentOperationException("VM is being operated on."); + } + } catch (NoTransitionException e1) { + if (!forced) { + throw new CloudRuntimeException("We cannot stop " + vm + " when it is in state " + vm.getState()); + } + boolean doCleanup = false; + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to transition the state but we're moving on because it's forced stop"); + } + if (state == State.Starting || state == State.Migrating) { + if (work != null) { + doCleanup = true; + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to cleanup VM: " + vm + " ,since outstanding work item is not found"); + } + throw new CloudRuntimeException("Work item not found, We cannot stop " + vm + " when it is in state " + vm.getState()); + } + } else if (state == State.Stopping) { + doCleanup = true; + } + + if (doCleanup) { + if (cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.StopRequested, forced, user, account)) { + try { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating work item to Done, id:" + work.getId()); + } + return changeState(vm, Event.AgentReportStopped, null, work, Step.Done); + } catch (NoTransitionException e) { + s_logger.warn("Unable to cleanup " + vm); + return false; + } + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Failed to cleanup VM: " + vm); + } + throw new CloudRuntimeException("Failed to cleanup " + vm + " , current state " + vm.getState()); + } + } + } + + if (vm.getState() != State.Stopping) { + throw new CloudRuntimeException("We cannot proceed with stop VM " + vm + " since it is not in 'Stopping' state, current state: " + vm.getState()); + } + + vmGuru.prepareStop(profile); + + StopCommand stop = new StopCommand(vm, vm.getInstanceName(), null); + boolean stopped = false; + StopAnswer answer = null; + try { + answer = (StopAnswer) _agentMgr.send(vm.getHostId(), stop); + stopped = answer.getResult(); + if (!stopped) { + throw new CloudRuntimeException("Unable to stop the virtual machine due to " + answer.getDetails()); + } + vmGuru.finalizeStop(profile, answer); + + } catch (AgentUnavailableException e) { + } catch (OperationTimedoutException e) { + } finally { + if (!stopped) { + if (!forced) { + s_logger.warn("Unable to stop vm " + vm); + try { + stateTransitTo(vm, Event.OperationFailed, vm.getHostId()); + } catch (NoTransitionException e) { + s_logger.warn("Unable to transition the state " + vm); + } + return false; + } else { + s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop"); + vmGuru.finalizeStop(profile, answer); + } + } + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug(vm + " is stopped on the host. Proceeding to release resource held."); + } + + try { + _networkMgr.release(profile, forced); + s_logger.debug("Successfully released network resources for the vm " + vm); + } catch (Exception e) { + s_logger.warn("Unable to release some network resources.", e); + } + + try { + if (vm.getHypervisorType() != HypervisorType.BareMetal) { + _storageMgr.release(profile); + s_logger.debug("Successfully released storage resources for the vm " + vm); + } + } catch (Exception e) { + s_logger.warn("Unable to release storage resources.", e); + } + + try { + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating the outstanding work item to Done, id:" + work.getId()); + } + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + + return stateTransitTo(vm, Event.OperationSucceeded, null, null); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + return false; + } + } + + private void setStateMachine() { + _stateMachine = VirtualMachine.State.getStateMachine(); + } + + protected boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId, String reservationId) throws NoTransitionException { + vm.setReservationId(reservationId); + return _stateMachine.transitTo(vm, e, new Pair(vm.getHostId(), hostId), _vmDao); + } + + @Override + public boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId) throws NoTransitionException { + State oldState = vm.getState(); + if (oldState == State.Starting) { + if (e == Event.OperationSucceeded) { + vm.setLastHostId(hostId); + } + } else if (oldState == State.Stopping) { + if (e == Event.OperationSucceeded) { + vm.setLastHostId(vm.getHostId()); + } + } + return _stateMachine.transitTo(vm, e, new Pair(vm.getHostId(), hostId), _vmDao); + } + + @Override + public boolean remove(T vm, User user, Account caller) { + return _vmDao.remove(vm.getId()); + } + + @Override + public boolean destroy(T vm, User user, Account caller) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Destroying vm " + vm); + } + if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to find vm or vm is destroyed: " + vm); + } + return true; + } + + if (!advanceStop(vm, _forceStop, user, caller)) { + s_logger.debug("Unable to stop " + vm); + return false; + } + + try { + if (!stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { + s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); + return false; + } + } catch (NoTransitionException e) { + s_logger.debug(e.getMessage()); + return false; + } + + return true; + } + + protected boolean checkVmOnHost(VirtualMachine vm, long hostId) throws AgentUnavailableException, OperationTimedoutException { + CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(hostId, new CheckVirtualMachineCommand(vm.getInstanceName())); + if (!answer.getResult() || answer.getState() == State.Stopped) { + return false; + } + + return true; + } + + @Override + public T storageMigration(T vm, StoragePool destPool) { + VirtualMachineGuru vmGuru = getVmGuru(vm); + + long vmId = vm.getId(); + vm = vmGuru.findById(vmId); + + try { + stateTransitTo(vm, VirtualMachine.Event.StorageMigrationRequested, null); + } catch (NoTransitionException e) { + s_logger.debug("Unable to migrate vm: " + e.toString()); + throw new CloudRuntimeException("Unable to migrate vm: " + e.toString()); + } + + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + boolean migrationResult = false; + try { + migrationResult = _storageMgr.StorageMigration(profile, destPool); + + if (migrationResult) { + //if the vm is migrated to different pod in basic mode, need to reallocate ip + + if (vm.getPodIdToDeployIn() != destPool.getPodId()) { + DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterIdToDeployIn(), destPool.getPodId(), null, null, null, null); + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, null, null, null, null); + _networkMgr.reallocate(vmProfile, plan); + } + + //when start the vm next time, don;'t look at last_host_id, only choose the host based on volume/storage pool + vm.setLastHostId(null); + vm.setPodId(destPool.getPodId()); + } else { + s_logger.debug("Storage migration failed"); + } + } catch (ConcurrentOperationException e) { + s_logger.debug("Failed to migration: " + e.toString()); + throw new CloudRuntimeException("Failed to migration: " + e.toString()); + } catch (InsufficientVirtualNetworkCapcityException e) { + s_logger.debug("Failed to migration: " + e.toString()); + throw new CloudRuntimeException("Failed to migration: " + e.toString()); + } catch (InsufficientAddressCapacityException e) { + s_logger.debug("Failed to migration: " + e.toString()); + throw new CloudRuntimeException("Failed to migration: " + e.toString()); + } catch (InsufficientCapacityException e) { + s_logger.debug("Failed to migration: " + e.toString()); + throw new CloudRuntimeException("Failed to migration: " + e.toString()); + } finally { + try { + stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped, null); + } catch (NoTransitionException e) { + s_logger.debug("Failed to change vm state: " + e.toString()); + throw new CloudRuntimeException("Failed to change vm state: " + e.toString()); + } + } + + return vm; + } + + @Override + public T migrate(T vm, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException, ManagementServerException, + VirtualMachineMigrationException { + s_logger.info("Migrating " + vm + " to " + dest); + + long dstHostId = dest.getHost().getId(); + Host fromHost = _hostDao.findById(srcHostId); + if (fromHost == null) { + s_logger.info("Unable to find the host to migrate from: " + srcHostId); + throw new CloudRuntimeException("Unable to find the host to migrate from: " + srcHostId); + } + + if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) { + s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId()); + throw new CloudRuntimeException("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId()); + } + + VirtualMachineGuru vmGuru = getVmGuru(vm); + + long vmId = vm.getId(); + vm = vmGuru.findById(vmId); + if (vm == null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Unable to find the vm " + vm); + } + throw new ManagementServerException("Unable to find a virtual machine with id " + vmId); + } + + if (vm.getState() != State.Running) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("VM is not Running, unable to migrate the vm " + vm); + } + throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString()); + } + + short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE; + if (VirtualMachine.Type.DomainRouter.equals(vm.getType())) { + alertType = AlertManager.ALERT_TYPE_DOMAIN_ROUTER_MIGRATE; + } else if (VirtualMachine.Type.ConsoleProxy.equals(vm.getType())) { + alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY_MIGRATE; + } + + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + _networkMgr.prepareNicForMigration(profile, dest); + _storageMgr.prepareForMigration(profile, dest); + + VirtualMachineTO to = toVmTO(profile); + PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(to); + + ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Migrating, vm.getType(), vm.getId()); + work.setStep(Step.Prepare); + work.setResourceType(ItWorkVO.ResourceType.Host); + work.setResourceId(dstHostId); + work = _workDao.persist(work); + + PrepareForMigrationAnswer pfma = null; + try { + pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc); + if (!pfma.getResult()) { + String msg = "Unable to prepare for migration due to " + pfma.getDetails(); + pfma = null; + throw new AgentUnavailableException(msg, dstHostId); + } + } catch (OperationTimedoutException e1) { + throw new AgentUnavailableException("Operation timed out", dstHostId); + } finally { + if (pfma == null) { + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + } + + vm.setLastHostId(srcHostId); + try { + if (vm == null || vm.getHostId() == null || vm.getHostId() != srcHostId || !changeState(vm, Event.MigrationRequested, dstHostId, work, Step.Migrating)) { + s_logger.info("Migration cancelled because state has changed: " + vm); + throw new ConcurrentOperationException("Migration cancelled because state has changed: " + vm); + } + } catch (NoTransitionException e1) { + s_logger.info("Migration cancelled because " + e1.getMessage()); + throw new ConcurrentOperationException("Migration cancelled because " + e1.getMessage()); + } + + boolean migrated = false; + try { + boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); + MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows); + mc.setHostGuid(dest.getHost().getGuid()); + + try { + MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc); + if (!ma.getResult()) { + s_logger.error("Unable to migrate due to " + ma.getDetails()); + return null; + } + } catch (OperationTimedoutException e) { + if (e.isActive()) { + s_logger.warn("Active migration command so scheduling a restart for " + vm); + _haMgr.scheduleRestart(vm, true); + } + throw new AgentUnavailableException("Operation timed out on migrating " + vm, dstHostId); + } + + try { + if (!changeState(vm, VirtualMachine.Event.OperationSucceeded, dstHostId, work, Step.Started)) { + throw new ConcurrentOperationException("Unable to change the state for " + vm); + } + } catch (NoTransitionException e1) { + throw new ConcurrentOperationException("Unable to change state due to " + e1.getMessage()); + } + + try { + if (!checkVmOnHost(vm, dstHostId)) { + s_logger.error("Unable to complete migration for " + vm); + try { + _agentMgr.send(srcHostId, new Commands(cleanup(vm.getInstanceName())), null); + } catch (AgentUnavailableException e) { + s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId); + } + cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.AgentReportStopped, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); + return null; + } + } catch (OperationTimedoutException e) { + } + + migrated = true; + return vm; + } finally { + if (!migrated) { + s_logger.info("Migration was unsuccessful. Cleaning up: " + vm); + + _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone " + + dest.getDataCenter().getName() + " and pod " + dest.getPod().getName(), "Migrate Command failed. Please check logs."); + try { + _agentMgr.send(dstHostId, new Commands(cleanup(vm.getInstanceName())), null); + } catch (AgentUnavailableException ae) { + s_logger.info("Looks like the destination Host is unavailable for cleanup"); + } + + try { + stateTransitTo(vm, Event.OperationFailed, srcHostId); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + } + + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + } + + @Override + public VirtualMachineTO toVmTO(VirtualMachineProfile profile) { + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(profile.getVirtualMachine().getHypervisorType()); + VirtualMachineTO to = hvGuru.implement(profile); + return to; + } + + protected void cancelWorkItems(long nodeId) { + GlobalLock scanLock = GlobalLock.getInternLock("vmmgr.cancel.workitem"); + + try { + if (scanLock.lock(3)) { + try { + List works = _workDao.listWorkInProgressFor(nodeId); + for (ItWorkVO work : works) { + s_logger.info("Handling unfinished work item: " + work); + try { + VMInstanceVO vm = _vmDao.findById(work.getInstanceId()); + if (vm != null) { + if (work.getType() == State.Starting) { + _haMgr.scheduleRestart(vm, true); + work.setManagementServerId(_nodeId); + _workDao.update(work.getId(), work); + } else if (work.getType() == State.Stopping) { + _haMgr.scheduleStop(vm, vm.getHostId(), WorkType.CheckStop); + work.setManagementServerId(_nodeId); + _workDao.update(work.getId(), work); + } else if (work.getType() == State.Migrating) { + _haMgr.scheduleMigration(vm); + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + } + } catch (Exception e) { + s_logger.error("Error while handling " + work, e); + } + } + } finally { + scanLock.unlock(); + } + } + } finally { + scanLock.releaseRef(); + } + } + + @Override + public boolean migrateAway(VirtualMachine.Type vmType, long vmId, long srcHostId) throws InsufficientServerCapacityException, VirtualMachineMigrationException { + VirtualMachineGuru vmGuru = _vmGurus.get(vmType); + VMInstanceVO vm = vmGuru.findById(vmId); + if (vm == null) { + s_logger.debug("Unable to find a VM for " + vmId); + return true; + } + + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + + Long hostId = vm.getHostId(); + if (hostId == null) { + s_logger.debug("Unable to migrate because the VM doesn't have a host id: " + vm); + return true; + } + + Host host = _hostDao.findById(hostId); + + DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), null, null, null); + ExcludeList excludes = new ExcludeList(); + excludes.addHost(hostId); + + DeployDestination dest = null; + while (true) { + for (DeploymentPlanner planner : _planners) { + if (planner.canHandle(profile, plan, excludes)) { + dest = planner.plan(profile, plan, excludes); + } else { + continue; + } + + if (dest != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Planner " + planner + " found " + dest + " for migrating to."); + } + break; + } + if (s_logger.isDebugEnabled()) { + s_logger.debug("Planner " + planner + " was unable to find anything."); + } + } + + if (dest == null) { + throw new InsufficientServerCapacityException("Unable to find a server to migrate to.", host.getClusterId()); + } + + excludes.addHost(dest.getHost().getId()); + VMInstanceVO vmInstance = null; + try { + vmInstance = migrate(vm, srcHostId, dest); + } catch (ResourceUnavailableException e) { + s_logger.debug("Unable to migrate to unavailable " + dest); + } catch (ConcurrentOperationException e) { + s_logger.debug("Unable to migrate VM due to: " + e.getMessage()); + } catch (ManagementServerException e) { + s_logger.debug("Unable to migrate VM: " + e.getMessage()); + } catch (VirtualMachineMigrationException e) { + s_logger.debug("Got VirtualMachineMigrationException, Unable to migrate: " + e.getMessage()); + if (vm.getState() == State.Starting) { + s_logger.debug("VM seems to be still Starting, we should retry migration later"); + throw e; + } else { + s_logger.debug("Unable to migrate VM, VM is not in Running or even Starting state, current state: " + vm.getState().toString()); + } + } + if (vmInstance != null) { + return true; + } + try { + boolean result = advanceStop(vm, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); + return result; + } catch (ResourceUnavailableException e) { + s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } catch (ConcurrentOperationException e) { + s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } catch (OperationTimedoutException e) { + s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } + return false; + } + } + + protected class CleanupTask implements Runnable { + @Override + public void run() { + s_logger.trace("VM Operation Thread Running"); + try { + _workDao.cleanup(_cleanupWait); + } catch (Exception e) { + s_logger.error("VM Operations failed due to ", e); + } + } + } + + @Override + public boolean isVirtualMachineUpgradable(VirtualMachine vm, ServiceOffering offering) { + Enumeration en = _hostAllocators.enumeration(); + boolean isMachineUpgradable = true; + while (isMachineUpgradable && en.hasMoreElements()) { + final HostAllocator allocator = en.nextElement(); + isMachineUpgradable = allocator.isVirtualMachineUpgradable(vm, offering); + } + + return isMachineUpgradable; + } + + @Override + public T reboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, ResourceUnavailableException { + try { + return advanceReboot(vm, params, caller, account); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Unable to reboot a VM due to concurrent operation", e); + } + } + + @Override + public T advanceReboot(T vm, Map params, User caller, Account account) throws InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + T rebootedVm = null; + + DataCenter dc = _configMgr.getZone(vm.getDataCenterIdToDeployIn()); + Host host = _hostDao.findById(vm.getHostId()); + Cluster cluster = null; + if (host != null) { + cluster = _configMgr.getCluster(host.getClusterId()); + } + HostPodVO pod = _configMgr.getPod(host.getPodId()); + DeployDestination dest = new DeployDestination(dc, pod, cluster, host); + + try { + + Commands cmds = new Commands(OnError.Stop); + cmds.addCommand(new RebootCommand(vm.getInstanceName())); + _agentMgr.send(host.getId(), cmds); + + Answer rebootAnswer = cmds.getAnswer(RebootAnswer.class); + if (rebootAnswer != null && rebootAnswer.getResult()) { + rebootedVm = vm; + return rebootedVm; + } + s_logger.info("Unable to reboot VM " + vm + " on " + dest.getHost() + " due to " + (rebootAnswer == null ? " no reboot answer" : rebootAnswer.getDetails())); + } catch (OperationTimedoutException e) { + s_logger.warn("Unable to send the reboot command to host " + dest.getHost() + " for the vm " + vm + " due to operation timeout", e); + throw new CloudRuntimeException("Failed to reboot the vm on host " + dest.getHost()); + } + + return rebootedVm; + } + + @Override + public VMInstanceVO findByIdAndType(VirtualMachine.Type type, long vmId) { + VirtualMachineGuru guru = _vmGurus.get(type); + return guru.findById(vmId); + } + + public Command cleanup(String vmName) { + return new StopCommand(vmName); + } + + public Commands fullHostSync(final long hostId, StartupRoutingCommand startup) { + Commands commands = new Commands(OnError.Continue); + + Map infos = convertToInfos(startup); + + final List vms = _vmDao.listByHostId(hostId); + s_logger.debug("Found " + vms.size() + " VMs for host " + hostId); + for (VMInstanceVO vm : vms) { + AgentVmInfo info = infos.remove(vm.getId()); + VMInstanceVO castedVm = null; + if (info == null) { + info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped); + } + castedVm = info.guru.findById(vm.getId()); + + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(castedVm.getHypervisorType()); + Command command = compareState(hostId, castedVm, info, true, hvGuru.trackVmHostChange()); + if (command != null) { + commands.addCommand(command); + } + } + + for (final AgentVmInfo left : infos.values()) { + boolean found = false; + for (VirtualMachineGuru vmGuru : _vmGurus.values()) { + VMInstanceVO vm = vmGuru.findByName(left.name); + if (vm != null) { + found = true; + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); + if(hvGuru.trackVmHostChange()) { + Command command = compareState(hostId, vm, left, true, true); + if (command != null) { + commands.addCommand(command); + } + } else { + s_logger.warn("Stopping a VM, VM " + left.name + " migrate from Host " + vm.getHostId() + " to Host " + hostId ); + commands.addCommand(cleanup(left.name)); + } + break; + } + } + if ( ! found ) { + s_logger.warn("Stopping a VM that we have no record of : " + left.name); + commands.addCommand(cleanup(left.name)); + } + } + + return commands; + } + + public Commands deltaHostSync(long hostId, Map newStates) { + Map states = convertDeltaToInfos(newStates); + Commands commands = new Commands(OnError.Continue); + + for (Map.Entry entry : states.entrySet()) { + AgentVmInfo info = entry.getValue(); + + VMInstanceVO vm = info.vm; + + Command command = null; + if (vm != null) { + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); + command = compareState(hostId, vm, info, false, hvGuru.trackVmHostChange()); + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Cleaning up a VM that is no longer found: " + info.name); + } + command = cleanup(info.name); + } + + if (command != null) { + commands.addCommand(command); + } + } + + return commands; + } + + + + public void deltaSync(Map> newStates) { + Map states = convertToInfos(newStates); + + for (Map.Entry entry : states.entrySet()) { + AgentVmInfo info = entry.getValue(); + VMInstanceVO vm = info.vm; + Command command = null; + if (vm != null) { + Host host = _resourceMgr.findHostByGuid(info.getHostUuid()); + long hId = host.getId(); + + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); + command = compareState(hId, vm, info, false, hvGuru.trackVmHostChange()); + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Cleaning up a VM that is no longer found : " + info.name); + } + command = cleanup(info.name); + } + if (command != null){ + try { + Host host = _resourceMgr.findHostByGuid(info.getHostUuid()); + if (host != null){ + Answer answer = _agentMgr.send(host.getId(), cleanup(info.name)); + if (!answer.getResult()) { + s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); + } + } + } catch (Exception e) { + s_logger.warn("Unable to stop a VM due to " + e.getMessage()); + } + } + } + } + + + public void fullSync(final long clusterId, Map> newStates) { + if (newStates==null)return; + Map infos = convertToInfos(newStates); + Set set_vms = Collections.synchronizedSet(new HashSet()); + set_vms.addAll(_vmDao.listByClusterId(clusterId)); + set_vms.addAll(_vmDao.listLHByClusterId(clusterId)); + + for (VMInstanceVO vm : set_vms) { + if (vm.isRemoved() || vm.getState() == State.Destroyed || vm.getState() == State.Expunging) continue; + AgentVmInfo info = infos.remove(vm.getId()); + VMInstanceVO castedVm = null; + if ((info == null && (vm.getState() == State.Running || vm.getState() == State.Starting)) + || (info != null && (info.state == State.Running && vm.getState() == State.Starting))) + { + s_logger.info("Found vm " + vm.getInstanceName() + " in inconsistent state. " + vm.getState() + " on CS while " + (info == null ? "Stopped" : "Running") + " on agent"); + info = new AgentVmInfo(vm.getInstanceName(), getVmGuru(vm), vm, State.Stopped); + + // Bug 13850- grab outstanding work item if any for this VM state so that we mark it as DONE after we change VM state, else it will remain pending + ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Found an outstanding work item for this vm " + vm + " in state:" + vm.getState() + ", work id:" + work.getId()); + } + } + vm.setState(State.Running); // set it as running and let HA take care of it + _vmDao.persist(vm); + + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating outstanding work item to Done, id:" + work.getId()); + } + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + + castedVm = info.guru.findById(vm.getId()); + try { + Host host = _hostDao.findByGuid(info.getHostUuid()); + long hostId = host == null ? (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()) : host.getId(); + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(castedVm.getHypervisorType()); + Command command = compareState(hostId, castedVm, info, true, hvGuru.trackVmHostChange()); + if (command != null){ + Answer answer = _agentMgr.send(hostId, command); + if (!answer.getResult()) { + s_logger.warn("Failed to update state of the VM due to " + answer.getDetails()); + } + } + } catch (Exception e) { + s_logger.warn("Unable to update state of the VM due to exception " + e.getMessage()); + e.printStackTrace(); + } + } + else if (info != null && (vm.getState() == State.Stopped || vm.getState() == State.Stopping)) { + Host host = _hostDao.findByGuid(info.getHostUuid()); + if (host != null){ + s_logger.warn("Stopping a VM which is stopped/stopping " + info.name); + vm.setState(State.Stopped); // set it as stop and clear it from host + vm.setHostId(null); + _vmDao.persist(vm); + try { + Answer answer = _agentMgr.send(host.getId(), cleanup(info.name)); + if (!answer.getResult()) { + s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); + } + } + catch (Exception e) { + s_logger.warn("Unable to stop a VM due to " + e.getMessage()); + } + } + } + else + // host id can change + if (info != null && vm.getState() == State.Running){ + // check for host id changes + Host host = _hostDao.findByGuid(info.getHostUuid()); + if (host != null && (vm.getHostId() == null || host.getId() != vm.getHostId())){ + s_logger.info("Found vm " + vm.getInstanceName() + " with inconsistent host in db, new host is " + host.getId()); + try { + stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, host.getId()); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + } + } + /* else if(info == null && vm.getState() == State.Stopping) { //Handling CS-13376 + s_logger.warn("Marking the VM as Stopped as it was still stopping on the CS" +vm.getName()); + vm.setState(State.Stopped); // Setting the VM as stopped on the DB and clearing it from the host + vm.setLastHostId(vm.getHostId()); + vm.setHostId(null); + _vmDao.persist(vm); + }*/ + } + + for (final AgentVmInfo left : infos.values()) { + if (VirtualMachineName.isValidVmName(left.name)) continue; // if the vm follows cloudstack naming ignore it for stopping + try { + Host host = _hostDao.findByGuid(left.getHostUuid()); + if (host != null){ + s_logger.warn("Stopping a VM which we do not have any record of " + left.name); + Answer answer = _agentMgr.send(host.getId(), cleanup(left.name)); + if (!answer.getResult()) { + s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); + } + } + } catch (Exception e) { + s_logger.warn("Unable to stop a VM due to " + e.getMessage()); + } + } + + } + + + + protected Map convertToInfos(final Map> newStates) { + final HashMap map = new HashMap(); + if (newStates == null) { + return map; + } + Collection> vmGurus = _vmGurus.values(); + boolean is_alien_vm = true; + long alien_vm_count = -1; + for (Map.Entry> entry : newStates.entrySet()) { + is_alien_vm = true; + for (VirtualMachineGuru vmGuru : vmGurus) { + String name = entry.getKey(); + VMInstanceVO vm = vmGuru.findByName(name); + if (vm != null) { + map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue().second(), entry.getValue().first())); + is_alien_vm = false; + break; + } + Long id = vmGuru.convertToId(name); + if (id != null) { + map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null, entry.getValue().second(), entry.getValue().first())); + is_alien_vm = false; + break; + } + } + // alien VMs + if (is_alien_vm){ + map.put(alien_vm_count--, new AgentVmInfo(entry.getKey(), null, null, entry.getValue().second(), entry.getValue().first())); + s_logger.warn("Found an alien VM " + entry.getKey()); + } + } + return map; + } + + protected Map convertToInfos(StartupRoutingCommand cmd) { + final Map states = cmd.getVmStates(); + final HashMap map = new HashMap(); + if (states == null) { + return map; + } + Collection> vmGurus = _vmGurus.values(); + + for (Map.Entry entry : states.entrySet()) { + for (VirtualMachineGuru vmGuru : vmGurus) { + String name = entry.getKey(); + VMInstanceVO vm = vmGuru.findByName(name); + if (vm != null) { + map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue().getState(), entry.getValue().getHost() )); + break; + } + Long id = vmGuru.convertToId(name); + if (id != null) { + map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null,entry.getValue().getState(), entry.getValue().getHost() )); + break; + } + } + } + + return map; + } + + protected Map convertDeltaToInfos(final Map states) { + final HashMap map = new HashMap(); + + if (states == null) { + return map; + } + + Collection> vmGurus = _vmGurus.values(); + + for (Map.Entry entry : states.entrySet()) { + for (VirtualMachineGuru vmGuru : vmGurus) { + String name = entry.getKey(); + + VMInstanceVO vm = vmGuru.findByName(name); + + if (vm != null) { + map.put(vm.getId(), new AgentVmInfo(entry.getKey(), vmGuru, vm, entry.getValue())); + break; + } + + Long id = vmGuru.convertToId(name); + if (id != null) { + map.put(id, new AgentVmInfo(entry.getKey(), vmGuru, null,entry.getValue())); + break; + } + } + } + + return map; + } + + + + /** + * compareState does as its name suggests and compares the states between + * management server and agent. It returns whether something should be + * cleaned up + * + */ + protected Command compareState(long hostId, VMInstanceVO vm, final AgentVmInfo info, final boolean fullSync, boolean trackExternalChange) { + State agentState = info.state; + final String agentName = info.name; + final State serverState = vm.getState(); + final String serverName = vm.getInstanceName(); + + Command command = null; + s_logger.debug("VM " + serverName + ": cs state = " + serverState + " and realState = " + agentState); + if (s_logger.isDebugEnabled()) { + s_logger.debug("VM " + serverName + ": cs state = " + serverState + " and realState = " + agentState); + } + + if (agentState == State.Error) { + agentState = State.Stopped; + + short alertType = AlertManager.ALERT_TYPE_USERVM; + if (VirtualMachine.Type.DomainRouter.equals(vm.getType())) { + alertType = AlertManager.ALERT_TYPE_DOMAIN_ROUTER; + } else if (VirtualMachine.Type.ConsoleProxy.equals(vm.getType())) { + alertType = AlertManager.ALERT_TYPE_CONSOLE_PROXY; + } else if (VirtualMachine.Type.SecondaryStorageVm.equals(vm.getType())) { + alertType = AlertManager.ALERT_TYPE_SSVM; + } + + HostPodVO podVO = _podDao.findById(vm.getPodIdToDeployIn()); + DataCenterVO dcVO = _dcDao.findById(vm.getDataCenterIdToDeployIn()); + HostVO hostVO = _hostDao.findById(vm.getHostId()); + + String hostDesc = "name: " + hostVO.getName() + " (id:" + hostVO.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName(); + _alertMgr.sendAlert(alertType, vm.getDataCenterIdToDeployIn(), vm.getPodIdToDeployIn(), "VM (name: " + vm.getInstanceName() + ", id: " + vm.getId() + ") stopped on host " + hostDesc + + " due to storage failure", "Virtual Machine " + vm.getInstanceName() + " (id: " + vm.getId() + ") running on host [" + vm.getHostId() + "] stopped due to storage failure."); + } + + if (trackExternalChange) { + if (serverState == State.Starting) { + if (vm.getHostId() != null && vm.getHostId() != hostId) { + s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " + + vm.getInstanceName()); + return null; + } + } + if (vm.getHostId() == null || hostId != vm.getHostId()) { + try { + stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); + } catch (NoTransitionException e) { + } + } + } + + // during VM migration time, don't sync state will agent status update + if (serverState == State.Migrating) { + s_logger.debug("Skipping vm in migrating state: " + vm); + return null; + } + + if (trackExternalChange) { + if (serverState == State.Starting) { + if (vm.getHostId() != null && vm.getHostId() != hostId) { + s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " + + vm.getInstanceName()); + return null; + } + } + + if (serverState == State.Running) { + try { + // + // we had a bug that sometimes VM may be at Running State + // but host_id is null, we will cover it here. + // means that when CloudStack DB lost of host information, + // we will heal it with the info reported from host + // + if (vm.getHostId() == null || hostId != vm.getHostId()) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("detected host change when VM " + vm + " is at running state, VM could be live-migrated externally from host " + vm.getHostId() + " to host " + hostId); + } + + stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); + } + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + } + } + + if (agentState == serverState) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Both states are " + agentState + " for " + vm); + } + assert (agentState == State.Stopped || agentState == State.Running) : "If the states we send up is changed, this must be changed."; + if (agentState == State.Running) { + try { + stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, hostId); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + // FIXME: What if someone comes in and sets it to stopping? Then + // what? + return null; + } + + s_logger.debug("State matches but the agent said stopped so let's send a cleanup command anyways."); + return cleanup(agentName); + } + + if (agentState == State.Shutdowned) { + if (serverState == State.Running || serverState == State.Starting || serverState == State.Stopping) { + try { + advanceStop(vm, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); + } catch (AgentUnavailableException e) { + assert (false) : "How do we hit this with forced on?"; + return null; + } catch (OperationTimedoutException e) { + assert (false) : "How do we hit this with forced on?"; + return null; + } catch (ConcurrentOperationException e) { + assert (false) : "How do we hit this with forced on?"; + return null; + } + } else { + s_logger.debug("Sending cleanup to a shutdowned vm: " + agentName); + command = cleanup(agentName); + } + } else if (agentState == State.Stopped) { + // This state means the VM on the agent was detected previously + // and now is gone. This is slightly different than if the VM + // was never completed but we still send down a Stop Command + // to ensure there's cleanup. + if (serverState == State.Running) { + // Our records showed that it should be running so let's restart + // it. + _haMgr.scheduleRestart(vm, false); + } else if (serverState == State.Stopping) { + _haMgr.scheduleStop(vm, hostId, WorkType.ForceStop); + s_logger.debug("Scheduling a check stop for VM in stopping mode: " + vm); + } else if (serverState == State.Starting) { + s_logger.debug("Ignoring VM in starting mode: " + vm.getInstanceName()); + _haMgr.scheduleRestart(vm, false); + } + command = cleanup(agentName); + } else if (agentState == State.Running) { + if (serverState == State.Starting) { + if (fullSync) { + try { + ensureVmRunningContext(hostId, vm, Event.AgentReportRunning); + } catch (OperationTimedoutException e) { + s_logger.error("Exception during update for running vm: " + vm, e); + return null; + } catch (ResourceUnavailableException e) { + s_logger.error("Exception during update for running vm: " + vm, e); + return null; + }catch (InsufficientAddressCapacityException e) { + s_logger.error("Exception during update for running vm: " + vm, e); + return null; + }catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); + } + } + } else if (serverState == State.Stopping) { + s_logger.debug("Scheduling a stop command for " + vm); + _haMgr.scheduleStop(vm, hostId, WorkType.Stop); + } else { + s_logger.debug("server VM state " + serverState + " does not meet expectation of a running VM report from agent"); + + // just be careful not to stop VM for things we don't handle + // command = cleanup(agentName); + } + } + return command; + } + + private void ensureVmRunningContext(long hostId, VMInstanceVO vm, Event cause) throws OperationTimedoutException, ResourceUnavailableException, NoTransitionException, InsufficientAddressCapacityException { + VirtualMachineGuru vmGuru = getVmGuru(vm); + + s_logger.debug("VM state is starting on full sync so updating it to running"); + vm = findByIdAndType(vm.getType(), vm.getId()); + + // grab outstanding work item if any + ItWorkVO work = _workDao.findByOutstandingWork(vm.getId(), vm.getState()); + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Found an outstanding work item for this vm " + vm + " in state:" + vm.getState() + ", work id:" + work.getId()); + } + } + + try { + stateTransitTo(vm, cause, hostId); + } catch (NoTransitionException e1) { + s_logger.warn(e1.getMessage()); + } + + s_logger.debug("VM's " + vm + " state is starting on full sync so updating it to Running"); + vm = vmGuru.findById(vm.getId()); // this should ensure vm has the most + // up to date info + + VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); + List nics = _nicsDao.listByVmId(profile.getId()); + for (NicVO nic : nics) { + Network network = _networkMgr.getNetwork(nic.getNetworkId()); + NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, + _networkMgr.isSecurityGroupSupportedInNetwork(network), _networkMgr.getNetworkTag(profile.getHypervisorType(), network)); + profile.addNic(nicProfile); + } + + Commands cmds = new Commands(OnError.Stop); + s_logger.debug("Finalizing commands that need to be send to complete Start process for the vm " + vm); + + if (vmGuru.finalizeCommandsOnStart(cmds, profile)) { + if (cmds.size() != 0) { + _agentMgr.send(vm.getHostId(), cmds); + } + + if (vmGuru.finalizeStart(profile, vm.getHostId(), cmds, null)) { + stateTransitTo(vm, cause, vm.getHostId()); + } else { + s_logger.error("Unable to finish finialization for running vm: " + vm); + } + } else { + s_logger.error("Unable to finalize commands on start for vm: " + vm); + } + + if (work != null) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Updating outstanding work item to Done, id:" + work.getId()); + } + work.setStep(Step.Done); + _workDao.update(work.getId(), work); + } + } + + @Override + public boolean isRecurring() { + return true; + } + + @Override + public boolean processAnswers(long agentId, long seq, Answer[] answers) { + for (final Answer answer : answers) { + if (answer instanceof ClusterSyncAnswer) { + ClusterSyncAnswer hs = (ClusterSyncAnswer) answer; + if (!hs.isExceuted()){ + deltaSync(hs.getNewStates()); + hs.setExecuted(); + } + } + } + return true; + } + + @Override + public boolean processTimeout(long agentId, long seq) { + return true; + } + + @Override + public int getTimeout() { + return -1; + } + + @Override + public boolean processCommands(long agentId, long seq, Command[] cmds) { + boolean processed = false; + for (Command cmd : cmds) { + if (cmd instanceof PingRoutingCommand) { + PingRoutingCommand ping = (PingRoutingCommand) cmd; + if (ping.getNewStates() != null && ping.getNewStates().size() > 0) { + Commands commands = deltaHostSync(agentId, ping.getNewStates()); + if (commands.size() > 0) { + try { + _agentMgr.send(agentId, commands, this); + } catch (final AgentUnavailableException e) { + s_logger.warn("Agent is now unavailable", e); + } + } + } + processed = true; + } + } + return processed; + } + + @Override + public AgentControlAnswer processControlCommand(long agentId, AgentControlCommand cmd) { + return null; + } + + @Override + public boolean processDisconnect(long agentId, Status state) { + return true; + } + + @Override + public void processConnect(HostVO agent, StartupCommand cmd, boolean forRebalance) throws ConnectionException { + if (!(cmd instanceof StartupRoutingCommand)) { + return; + } + + if (forRebalance) { + s_logger.debug("Not processing listener " + this + " as connect happens on rebalance process"); + return; + } + + if (forRebalance) { + s_logger.debug("Not processing listener " + this + " as connect happens on rebalance process"); + return; + } + + Long clusterId = agent.getClusterId(); + long agentId = agent.getId(); + if (agent.getHypervisorType() == HypervisorType.XenServer) { // only for Xen + StartupRoutingCommand startup = (StartupRoutingCommand) cmd; + HashMap> allStates = startup.getClusterVMStateChanges(); + if (allStates != null){ + this.fullSync(clusterId, allStates); + } + + // initiate the cron job + ClusterSyncCommand syncCmd = new ClusterSyncCommand(Integer.parseInt(Config.ClusterDeltaSyncInterval.getDefaultValue()), clusterId); + try { + long seq_no = _agentMgr.send(agentId, new Commands(syncCmd), this); + s_logger.debug("Cluster VM sync started with jobid " + seq_no); + } catch (AgentUnavailableException e) { + s_logger.fatal("The Cluster VM sync process failed for cluster id " + clusterId + " with ", e); + } + } + else { // for others KVM and VMWare + StartupRoutingCommand startup = (StartupRoutingCommand) cmd; + Commands commands = fullHostSync(agentId, startup); + + if (commands.size() > 0) { + s_logger.debug("Sending clean commands to the agent"); + + try { + boolean error = false; + Answer[] answers = _agentMgr.send(agentId, commands); + for (Answer answer : answers) { + if (!answer.getResult()) { + s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); + error = true; + } + } + if (error) { + throw new ConnectionException(true, "Unable to stop VMs"); + } + } catch (final AgentUnavailableException e) { + s_logger.warn("Agent is unavailable now", e); + throw new ConnectionException(true, "Unable to sync", e); + } catch (final OperationTimedoutException e) { + s_logger.warn("Agent is unavailable now", e); + throw new ConnectionException(true, "Unable to sync", e); + } + } + + } + } + + protected class TransitionTask implements Runnable { + @Override + public void run() { + GlobalLock lock = GlobalLock.getInternLock("TransitionChecking"); + if (lock == null) { + s_logger.debug("Couldn't get the global lock"); + return; + } + + if (!lock.lock(30)) { + s_logger.debug("Couldn't lock the db"); + return; + } + try { + lock.addRef(); + List instances = _vmDao.findVMInTransition(new Date(new Date().getTime() - (_operationTimeout * 1000)), State.Starting, State.Stopping); + for (VMInstanceVO instance : instances) { + State state = instance.getState(); + if (state == State.Stopping) { + _haMgr.scheduleStop(instance, instance.getHostId(), WorkType.CheckStop); + } else if (state == State.Starting) { + _haMgr.scheduleRestart(instance, true); + } + } + } catch (Exception e) { + s_logger.warn("Caught the following exception on transition checking", e); + } finally { + StackMaid.current().exitCleanup(); + lock.unlock(); + } + } + } + + protected class AgentVmInfo { + public String name; + public State state; + public String hostUuid; + public VMInstanceVO vm; + public VirtualMachineGuru guru; + + @SuppressWarnings("unchecked") + public AgentVmInfo(String name, VirtualMachineGuru guru, VMInstanceVO vm, State state, String host) { + this.name = name; + this.state = state; + this.vm = vm; + this.guru = (VirtualMachineGuru) guru; + this.hostUuid = host; + } + + public AgentVmInfo(String name, VirtualMachineGuru guru, VMInstanceVO vm, State state) { + this(name, guru, vm, state, null); + } + + public String getHostUuid() { + return hostUuid; + } + } + + @Override + public VMInstanceVO findById(long vmId) { + return _vmDao.findById(vmId); + } + + @Override + public void checkIfCanUpgrade(VirtualMachine vmInstance, long newServiceOfferingId) { + ServiceOfferingVO newServiceOffering = _offeringDao.findById(newServiceOfferingId); + if (newServiceOffering == null) { + throw new InvalidParameterValueException("Unable to find a service offering with id " + newServiceOfferingId); + } + + // Check that the VM is stopped + if (!vmInstance.getState().equals(State.Stopped)) { + s_logger.warn("Unable to upgrade virtual machine " + vmInstance.toString() + " in state " + vmInstance.getState()); + throw new InvalidParameterValueException("Unable to upgrade virtual machine " + vmInstance.toString() + " " + + "in state " + vmInstance.getState() + + "; make sure the virtual machine is stopped and not in an error state before upgrading."); + } + + // Check if the service offering being upgraded to is what the VM is already running with + if (vmInstance.getServiceOfferingId() == newServiceOffering.getId()) { + if (s_logger.isInfoEnabled()) { + s_logger.info("Not upgrading vm " + vmInstance.toString() + " since it already has the requested " + + "service offering (" + newServiceOffering.getName() + ")"); + } + + throw new InvalidParameterValueException("Not upgrading vm " + vmInstance.toString() + " since it already " + + "has the requested service offering (" + newServiceOffering.getName() + ")"); + } + + ServiceOfferingVO currentServiceOffering = _offeringDao.findByIdIncludingRemoved(vmInstance.getServiceOfferingId()); + + // Check that the service offering being upgraded to has the same Guest IP type as the VM's current service offering + // NOTE: With the new network refactoring in 2.2, we shouldn't need the check for same guest IP type anymore. + /* + * if (!currentServiceOffering.getGuestIpType().equals(newServiceOffering.getGuestIpType())) { String errorMsg = + * "The service offering being upgraded to has a guest IP type: " + newServiceOffering.getGuestIpType(); errorMsg += + * ". Please select a service offering with the same guest IP type as the VM's current service offering (" + + * currentServiceOffering.getGuestIpType() + ")."; throw new InvalidParameterValueException(errorMsg); } + */ + + // Check that the service offering being upgraded to has the same storage pool preference as the VM's current service + // offering + if (currentServiceOffering.getUseLocalStorage() != newServiceOffering.getUseLocalStorage()) { + throw new InvalidParameterValueException("Unable to upgrade virtual machine " + vmInstance.toString() + + ", cannot switch between local storage and shared storage service offerings. Current offering " + + "useLocalStorage=" + currentServiceOffering.getUseLocalStorage() + + ", target offering useLocalStorage=" + newServiceOffering.getUseLocalStorage()); + } + + // if vm is a system vm, check if it is a system service offering, if yes return with error as it cannot be used for user vms + if (currentServiceOffering.getSystemUse() != newServiceOffering.getSystemUse()) { + throw new InvalidParameterValueException("isSystem property is different for current service offering and new service offering"); + } + + // Check that there are enough resources to upgrade the service offering + if (!isVirtualMachineUpgradable(vmInstance, newServiceOffering)) { + throw new InvalidParameterValueException("Unable to upgrade virtual machine, not enough resources available " + + "for an offering of " + newServiceOffering.getCpu() + " cpu(s) at " + + newServiceOffering.getSpeed() + " Mhz, and " + newServiceOffering.getRamSize() + " MB of memory"); + } + + // Check that the service offering being upgraded to has all the tags of the current service offering + List currentTags = _configMgr.csvTagsToList(currentServiceOffering.getTags()); + List newTags = _configMgr.csvTagsToList(newServiceOffering.getTags()); + if (!newTags.containsAll(currentTags)) { + throw new InvalidParameterValueException("Unable to upgrade virtual machine; the new service offering " + + "does not have all the tags of the " + + "current service offering. Current service offering tags: " + currentTags + "; " + "new service " + + "offering tags: " + newTags); + } + } + + @Override + public boolean upgradeVmDb(long vmId, long serviceOfferingId) { + VMInstanceVO vmForUpdate = _vmDao.createForUpdate(); + vmForUpdate.setServiceOfferingId(serviceOfferingId); + ServiceOffering newSvcOff = _configMgr.getServiceOffering(serviceOfferingId); + vmForUpdate.setHaEnabled(newSvcOff.getOfferHA()); + vmForUpdate.setLimitCpuUse(newSvcOff.getLimitCpuUse()); + vmForUpdate.setServiceOfferingId(newSvcOff.getId()); + return _vmDao.update(vmId, vmForUpdate); + } + + @Override + public NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, + ResourceUnavailableException, InsufficientCapacityException { + + s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested); + VMInstanceVO vmVO = _vmDao.findById(vm.getId()); + ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), + _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)); + + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmVO, null, + null, null, null); + + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); + Host host = _hostDao.findById(vm.getHostId()); + DeployDestination dest = new DeployDestination(dc, null, null, host); + + //check vm state + if (vm.getState() == State.Running) { + //1) allocate and prepare nic + NicProfile nic = _networkMgr.createNicForVm(network, requested, context, vmProfile, true); + + //2) Convert vmProfile to vmTO + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); + VirtualMachineTO vmTO = hvGuru.implement(vmProfile); + + //3) Convert nicProfile to NicTO + NicTO nicTO = toNicTO(nic, vmProfile.getVirtualMachine().getHypervisorType()); + + //4) plug the nic to the vm + VirtualMachineGuru vmGuru = getVmGuru(vmVO); + + s_logger.debug("Plugging nic for vm " + vm + " in network " + network); + if (vmGuru.plugNic(network, nicTO, vmTO, context, dest)) { + s_logger.debug("Nic is plugged successfully for vm " + vm + " in network " + network + ". Vm is a part of network now"); + return nic; + } else { + s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network); + return null; + } + } else if (vm.getState() == State.Stopped) { + //1) allocate nic + return _networkMgr.createNicForVm(network, requested, context, vmProfile, false); + } else { + s_logger.warn("Unable to add vm " + vm + " to network " + network); + throw new ResourceUnavailableException("Unable to add vm " + vm + " to network, is not in the right state", + DataCenter.class, vm.getDataCenterIdToDeployIn()); + } + } + + + @Override + public NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType) { + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(hypervisorType); + + NicTO nicTO = hvGuru.toNicTO(nic); + return nicTO; + } + + @Override + public boolean removeVmFromNetwork(VirtualMachine vm, Network network, URI broadcastUri) throws ConcurrentOperationException, ResourceUnavailableException { + VMInstanceVO vmVO = _vmDao.findById(vm.getId()); + ReservationContext context = new ReservationContextImpl(null, null, _accountMgr.getActiveUser(User.UID_SYSTEM), + _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)); + + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmVO, null, + null, null, null); + + DataCenter dc = _configMgr.getZone(network.getDataCenterId()); + Host host = _hostDao.findById(vm.getHostId()); + DeployDestination dest = new DeployDestination(dc, null, null, host); + VirtualMachineGuru vmGuru = getVmGuru(vmVO); + HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vmProfile.getVirtualMachine().getHypervisorType()); + VirtualMachineTO vmTO = hvGuru.implement(vmProfile); + + Nic nic = null; + + if (broadcastUri != null) { + nic = _nicsDao.findByInstanceIdNetworkIdAndBroadcastUri(network.getId(), vm.getId(), broadcastUri.toString()); + } else { + nic = _networkMgr.getNicInNetwork(vm.getId(), network.getId()); + } + + NicProfile nicProfile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), + _networkMgr.getNetworkRate(network.getId(), vm.getId()), + _networkMgr.isSecurityGroupSupportedInNetwork(network), + _networkMgr.getNetworkTag(vmProfile.getVirtualMachine().getHypervisorType(), network)); + + //1) Unplug the nic + NicTO nicTO = toNicTO(nicProfile, vmProfile.getVirtualMachine().getHypervisorType()); + s_logger.debug("Un-plugging nic for vm " + vm + " from network " + network); + boolean result = vmGuru.unplugNic(network, nicTO, vmTO, context, dest); + if (result) { + s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network ); + } else { + s_logger.warn("Failed to unplug nic for the vm " + vm + " from network " + network); + return false; + } + + //2) Release the nic + _networkMgr.releaseNic(vmProfile, nic); + s_logger.debug("Successfully released nic " + nic + "for vm " + vm); + + //3) Remove the nic + _networkMgr.removeNic(vmProfile, nic); + return result; + } + +} diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 7e3a1ee9f5b..abd62f46320 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -1,2330 +1,2448 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# -# Automatically generated by addcopyright.py at 04/03/2012 -SET foreign_key_checks = 0; -use cloud; - -DROP VIEW IF EXISTS `cloud`.`port_forwarding_rules_view`; -DROP TABLE IF EXISTS `cloud`.`configuration`; -DROP TABLE IF EXISTS `cloud`.`ip_forwarding`; -DROP TABLE IF EXISTS `cloud`.`management_agent`; -DROP TABLE IF EXISTS `cloud`.`host`; -DROP TABLE IF EXISTS `cloud`.`mshost`; -DROP TABLE IF EXISTS `cloud`.`service_offering`; -DROP TABLE IF EXISTS `cloud`.`user`; -DROP TABLE IF EXISTS `cloud`.`user_ip_address`; -DROP TABLE IF EXISTS `cloud`.`user_statistics`; -DROP TABLE IF EXISTS `cloud`.`vm_template`; -DROP TABLE IF EXISTS `cloud`.`vm_instance`; -DROP TABLE IF EXISTS `cloud`.`domain_router`; -DROP TABLE IF EXISTS `cloud`.`event`; -DROP TABLE IF EXISTS `cloud`.`host_details`; -DROP TABLE IF EXISTS `cloud`.`host_pod_ref`; -DROP TABLE IF EXISTS `cloud`.`host_zone_ref`; -DROP TABLE IF EXISTS `cloud`.`data_ceneter`; -DROP TABLE IF EXISTS `cloud`.`volumes`; -DROP TABLE IF EXISTS `cloud`.`storage`; -DROP TABLE IF EXISTS `cloud`.`data_center`; -DROP TABLE IF EXISTS `cloud`.`pricing`; -DROP TABLE IF EXISTS `cloud`.`sequence`; -DROP TABLE IF EXISTS `cloud`.`user_vm`; -DROP TABLE IF EXISTS `cloud`.`template_host_ref`; -DROP TABLE IF EXISTS `cloud`.`volume_host_ref`; -DROP TABLE IF EXISTS `cloud`.`upload`; -DROP TABLE IF EXISTS `cloud`.`template_zone_ref`; -DROP TABLE IF EXISTS `cloud`.`dc_vnet_alloc`; -DROP TABLE IF EXISTS `cloud`.`dc_ip_address_alloc`; -DROP TABLE IF EXISTS `cloud`.`vlan`; -DROP TABLE IF EXISTS `cloud`.`host_vlan_map`; -DROP TABLE IF EXISTS `cloud`.`pod_vlan_map`; -DROP TABLE IF EXISTS `cloud`.`vm_host`; -DROP TABLE IF EXISTS `cloud`.`op_ha_work`; -DROP TABLE IF EXISTS `cloud`.`op_dc_vnet_alloc`; -DROP TABLE IF EXISTS `cloud`.`op_dc_ip_address_alloc`; -DROP TABLE IF EXISTS `cloud`.`op_vm_host`; -DROP TABLE IF EXISTS `cloud`.`op_host_queue`; -DROP TABLE IF EXISTS `cloud`.`console_proxy`; -DROP TABLE IF EXISTS `cloud`.`secondary_storage_vm`; -DROP TABLE IF EXISTS `cloud`.`domain`; -DROP TABLE IF EXISTS `cloud`.`account`; -DROP TABLE IF EXISTS `cloud`.`limit`; -DROP TABLE IF EXISTS `cloud`.`op_host_capacity`; -DROP TABLE IF EXISTS `cloud`.`alert`; -DROP TABLE IF EXISTS `cloud`.`op_lock`; -DROP TABLE IF EXISTS `cloud`.`op_host_upgrade`; -DROP TABLE IF EXISTS `cloud`.`snapshots`; -DROP TABLE IF EXISTS `cloud`.`scheduled_volume_backups`; -DROP TABLE IF EXISTS `cloud`.`disk_offering`; -DROP TABLE IF EXISTS `cloud`.`security_group`; -DROP TABLE IF EXISTS `cloud`.`network_rule_config`; -DROP TABLE IF EXISTS `cloud`.`host_details`; -DROP TABLE IF EXISTS `cloud`.`launch_permission`; -DROP TABLE IF EXISTS `cloud`.`resource_limit`; -DROP TABLE IF EXISTS `cloud`.`async_job`; -DROP TABLE IF EXISTS `cloud`.`sync_queue`; -DROP TABLE IF EXISTS `cloud`.`sync_queue_item`; -DROP TABLE IF EXISTS `cloud`.`security_group_vm_map`; -DROP TABLE IF EXISTS `cloud`.`load_balancer_vm_map`; -DROP TABLE IF EXISTS `cloud`.`load_balancer_stickiness_policies`; -DROP TABLE IF EXISTS `cloud`.`load_balancer_inline_ip_map`; -DROP TABLE IF EXISTS `cloud`.`storage_pool`; -DROP TABLE IF EXISTS `cloud`.`storage_pool_host_ref`; -DROP TABLE IF EXISTS `cloud`.`template_spool_ref`; -DROP TABLE IF EXISTS `cloud`.`guest_os`; -DROP TABLE IF EXISTS `cloud`.`snapshot_policy`; -DROP TABLE IF EXISTS `cloud`.`snapshot_policy_ref`; -DROP TABLE IF EXISTS `cloud`.`snapshot_schedule`; -DROP TABLE IF EXISTS `cloud`.`op_pod_vlan_alloc`; -DROP TABLE IF EXISTS `cloud`.`storage_pool_details`; -DROP TABLE IF EXISTS `cloud`.`cluster`; -DROP TABLE IF EXISTS `cloud`.`nics`; -DROP TABLE IF EXISTS `cloud`.`networks`; -DROP TABLE IF EXISTS `cloud`.`op_networks`; -DROP TABLE IF EXISTS `cloud`.`network_offerings`; -DROP TABLE IF EXISTS `cloud`.`account_network_ref`; -DROP TABLE IF EXISTS `cloud`.`domain_network_ref`; -DROP TABLE IF EXISTS `cloud`.`instance_group`; -DROP TABLE IF EXISTS `cloud`.`instance_group_vm_map`; -DROP TABLE IF EXISTS `cloud`.`op_it_work`; -DROP TABLE IF EXISTS `cloud`.`load_balancing_ip_map`; -DROP TABLE IF EXISTS `cloud`.`load_balancing_rules`; -DROP TABLE IF EXISTS `cloud`.`port_forwarding_rules`; -DROP TABLE IF EXISTS `cloud`.`firewall_rules`; -DROP TABLE IF EXISTS `cloud`.`firewall_rules_cidrs`; -DROP TABLE IF EXISTS `cloud`.`ssh_keypairs`; -DROP TABLE IF EXISTS `cloud`.`usage_event`; -DROP TABLE IF EXISTS `cloud`.`host_tags`; -DROP TABLE IF EXISTS `cloud`.`version`; -DROP TABLE IF EXISTS `cloud`.`account_vlan_map`; -DROP TABLE IF EXISTS `cloud`.`cluster_details`; -DROP TABLE IF EXISTS `cloud`.`guest_os_category`; -DROP TABLE IF EXISTS `cloud`.`guest_os_hypervisor`; -DROP TABLE IF EXISTS `cloud`.`op_dc_link_local_ip_address_alloc`; -DROP TABLE IF EXISTS `cloud`.`op_host`; -DROP TABLE IF EXISTS `cloud`.`op_nwgrp_work`; -DROP TABLE IF EXISTS `cloud`.`op_vm_ruleset_log`; -DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_network`; -DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_interface`; -DROP TABLE IF EXISTS `cloud`.`remote_access_vpn`; -DROP TABLE IF EXISTS `cloud`.`resource_count`; -DROP TABLE IF EXISTS `cloud`.`security_ingress_rule`; -DROP TABLE IF EXISTS `cloud`.`security_group_rule`; -DROP TABLE IF EXISTS `cloud`.`stack_maid`; -DROP TABLE IF EXISTS `cloud`.`storage_pool_work`; -DROP TABLE IF EXISTS `cloud`.`user_vm_details`; -DROP TABLE IF EXISTS `cloud`.`vpn_users`; -DROP TABLE IF EXISTS `cloud`.`data_center_details`; -DROP TABLE IF EXISTS `cloud`.`network_tags`; -DROP TABLE IF EXISTS `cloud`.`op_host_transfer`; -DROP TABLE IF EXISTS `cloud`.`projects`; -DROP TABLE IF EXISTS `cloud`.`physical_network`; -DROP TABLE IF EXISTS `cloud`.`physical_network_tags`; -DROP TABLE IF EXISTS `cloud`.`physical_network_isolation_methods`; -DROP TABLE IF EXISTS `cloud`.`physical_network_traffic_types`; -DROP TABLE IF EXISTS `cloud`.`physical_network_service_providers`; -DROP TABLE IF EXISTS `cloud`.`virtual_router_elements`; -DROP TABLE IF EXISTS `cloud`.`dc_storage_network_ip_range`; -DROP TABLE IF EXISTS `cloud`.`op_dc_storage_network_ip_address`; -DROP TABLE IF EXISTS `cloud`.`cluster_vsm_map`; -DROP TABLE IF EXISTS `cloud`.`virtual_supervisor_module`; -DROP TABLE IF EXISTS `cloud`.`port_profile`; -DROP TABLE IF EXISTS `cloud`.`s2s_customer_gateway`; -DROP TABLE IF EXISTS `cloud`.`s2s_vpn_gateway`; -DROP TABLE IF EXISTS `cloud`.`s2s_vpn_connection`; - -CREATE TABLE `cloud`.`version` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `version` char(40) NOT NULL UNIQUE COMMENT 'version', - `updated` datetime NOT NULL COMMENT 'Date this version table was updated', - `step` char(32) NOT NULL COMMENT 'Step in the upgrade to this version', - PRIMARY KEY (`id`), - INDEX `i_version__version`(`version`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO `version` (`version`, `updated`, `step`) VALUES('@VERSION@', now(), 'Complete'); - -CREATE TABLE `cloud`.`op_it_work` ( - `id` char(40) COMMENT 'reservation id', - `mgmt_server_id` bigint unsigned COMMENT 'management server id', - `created_at` bigint unsigned NOT NULL COMMENT 'when was this work detail created', - `thread` varchar(255) NOT NULL COMMENT 'thread name', - `type` char(32) NOT NULL COMMENT 'type of work', - `vm_type` char(32) NOT NULL COMMENT 'type of vm', - `step` char(32) NOT NULL COMMENT 'state', - `updated_at` bigint unsigned NOT NULL COMMENT 'time it was taken over', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance', - `resource_type` char(32) COMMENT 'type of resource being worked on', - `resource_id` bigint unsigned COMMENT 'resource id being worked on', - PRIMARY KEY (`id`), - CONSTRAINT `fk_op_it_work__mgmt_server_id` FOREIGN KEY (`mgmt_server_id`) REFERENCES `mshost`(`msid`), - CONSTRAINT `fk_op_it_work__instance_id` FOREIGN KEY (`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE, - INDEX `i_op_it_work__step`(`step`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_networks`( - `id` bigint unsigned NOT NULL UNIQUE KEY, - `mac_address_seq` bigint unsigned NOT NULL DEFAULT 1 COMMENT 'mac address', - `nics_count` int unsigned NOT NULL DEFAULT 0 COMMENT '# of nics', - `gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'gc this network or not', - `check_for_gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'check this network for gc or not', - PRIMARY KEY(`id`), - CONSTRAINT `fk_op_networks__id` FOREIGN KEY (`id`) REFERENCES `networks`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`networks` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(255) COMMENT 'name for this network', - `uuid` varchar(40), - `display_text` varchar(255) COMMENT 'display text for this network', - `traffic_type` varchar(32) NOT NULL COMMENT 'type of traffic going through this network', - `broadcast_domain_type` varchar(32) NOT NULL COMMENT 'type of broadcast domain used', - `broadcast_uri` varchar(255) COMMENT 'broadcast domain specifier', - `gateway` varchar(15) COMMENT 'gateway for this network configuration', - `cidr` varchar(18) COMMENT 'network cidr', - `mode` varchar(32) COMMENT 'How to retrieve ip address in this network', - `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id that this configuration is created from', - `physical_network_id` bigint unsigned COMMENT 'physical network id that this configuration is based on', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this configuration is used in', - `guru_name` varchar(255) NOT NULL COMMENT 'who is responsible for this type of network configuration', - `state` varchar(32) NOT NULL COMMENT 'what state is this configuration in', - `related` bigint unsigned NOT NULL COMMENT 'related to what other network configuration', - `domain_id` bigint unsigned NOT NULL COMMENT 'foreign key to domain id', - `account_id` bigint unsigned NOT NULL COMMENT 'owner of this network', - `dns1` varchar(255) COMMENT 'comma separated DNS list', - `dns2` varchar(255) COMMENT 'comma separated DNS list', - `guru_data` varchar(1024) COMMENT 'data stored by the network guru that setup this network', - `set_fields` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'which fields are set already', - `acl_type` varchar(15) COMMENT 'ACL access type. Null for system networks, can be Account/Domain for Guest networks', - `network_domain` varchar(255) COMMENT 'domain', - `reservation_id` char(40) COMMENT 'reservation id', - `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', - `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the network', - `created` datetime NOT NULL COMMENT 'date created', - `removed` datetime COMMENT 'date removed if not null', - `specify_ip_ranges` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network provides an ability to define ip ranges', - `vpc_id` bigint unsigned COMMENT 'vpc this network belongs to', - PRIMARY KEY (`id`), - CONSTRAINT `fk_networks__network_offering_id` FOREIGN KEY (`network_offering_id`) REFERENCES `network_offerings`(`id`), - CONSTRAINT `fk_networks__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_networks__related` FOREIGN KEY(`related`) REFERENCES `networks`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_networks__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), - CONSTRAINT `fk_networks__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), - CONSTRAINT `fk_networks__vpc_id` FOREIGN KEY(`vpc_id`) REFERENCES `vpc`(`id`), - CONSTRAINT `uc_networks__uuid` UNIQUE (`uuid`), - INDEX `i_networks__removed`(`removed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`account_network_ref` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `account_id` bigint unsigned NOT NULL COMMENT 'account id', - `network_id` bigint unsigned NOT NULL COMMENT 'network id', - `is_owner` smallint(1) NOT NULL COMMENT 'is the owner of the network', - PRIMARY KEY (`id`), - CONSTRAINT `fk_account_network_ref__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_account_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`nics` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(40), - `instance_id` bigint unsigned COMMENT 'vm instance id', - `mac_address` varchar(17) COMMENT 'mac address', - `ip4_address` char(40) COMMENT 'ip4 address', - `netmask` varchar(15) COMMENT 'netmask for ip4 address', - `gateway` varchar(15) COMMENT 'gateway', - `ip_type` varchar(32) COMMENT 'type of ip', - `broadcast_uri` varchar(255) COMMENT 'broadcast uri', - `network_id` bigint unsigned NOT NULL COMMENT 'network configuration id', - `mode` varchar(32) COMMENT 'mode of getting ip address', - `state` varchar(32) NOT NULL COMMENT 'state of the creation', - `strategy` varchar(32) NOT NULL COMMENT 'reservation strategy', - `reserver_name` varchar(255) COMMENT 'Name of the component that reserved the ip address', - `reservation_id` varchar(64) COMMENT 'id for the reservation', - `device_id` int(10) COMMENT 'device id for the network when plugged into the virtual machine', - `update_time` timestamp NOT NULL COMMENT 'time the state was changed', - `isolation_uri` varchar(255) COMMENT 'id for isolation', - `ip6_address` char(40) COMMENT 'ip6 address', - `default_nic` tinyint NOT NULL COMMENT "None", - `vm_type` varchar(32) COMMENT 'type of vm: System or User vm', - `created` datetime NOT NULL COMMENT 'date created', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_nics__instance_id` FOREIGN KEY `fk_nics__instance_id`(`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_nics__networks_id` FOREIGN KEY `fk_nics__networks_id`(`network_id`) REFERENCES `networks`(`id`), - CONSTRAINT `uc_nics__uuid` UNIQUE (`uuid`), - INDEX `i_nics__removed`(`removed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`network_offerings` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `name` varchar(64) COMMENT 'name of the network offering', - `uuid` varchar(40), - `unique_name` varchar(64) UNIQUE COMMENT 'unique name of the network offering', - `display_text` varchar(255) NOT NULL COMMENT 'text to display to users', - `nw_rate` smallint unsigned COMMENT 'network rate throttle mbits/s', - `mc_rate` smallint unsigned COMMENT 'mcast rate throttle mbits/s', - `traffic_type` varchar(32) NOT NULL COMMENT 'traffic type carried on this network', - `tags` varchar(4096) COMMENT 'tags supported by this offering', - `system_only` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this network offering for system use only', - `specify_vlan` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Should the user specify vlan', - `service_offering_id` bigint unsigned COMMENT 'service offering id that virtual router is tied to', - `conserve_mode` int(1) unsigned NOT NULL DEFAULT 1 COMMENT 'Is this network offering is IP conserve mode enabled', - `created` datetime NOT NULL COMMENT 'time the entry was created', - `removed` datetime DEFAULT NULL COMMENT 'time the entry was removed', - `default` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if network offering is default', - `availability` varchar(255) NOT NULL COMMENT 'availability of the network', - `dedicated_lb_service` int(1) unsigned NOT NULL DEFAULT 1 COMMENT 'true if the network offering provides a dedicated load balancer for each network', - `shared_source_nat_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides the shared source nat service', - `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', - `redundant_router_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides the redundant router service', - `state` char(32) COMMENT 'state of the network offering that has Disabled value by default', - `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', - `elastic_ip_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides elastic ip service', - `elastic_lb_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides elastic lb service', - `specify_ip_ranges` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides an ability to define ip ranges', - PRIMARY KEY (`id`), - INDEX `i_network_offerings__system_only`(`system_only`), - INDEX `i_network_offerings__removed`(`removed`), - CONSTRAINT `uc_network_offerings__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`cluster` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `name` varchar(255) COMMENT 'name for the cluster', - `uuid` varchar(40) COMMENT 'uuid is different with following guid, while the later one is generated by hypervisor resource', - `guid` varchar(255) UNIQUE DEFAULT NULL COMMENT 'guid for the cluster', - `pod_id` bigint unsigned NOT NULL COMMENT 'pod id', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id', - `hypervisor_type` varchar(32), - `cluster_type` varchar(64) DEFAULT 'CloudManaged', - `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this cluster enabled for allocation for new resources', - `managed_state` varchar(32) NOT NULL DEFAULT 'Managed' COMMENT 'Is this cluster managed by cloudstack', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_cluster__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `cloud`.`data_center`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_cluster__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `cloud`.`host_pod_ref`(`id`), - UNIQUE `i_cluster__pod_id__name`(`pod_id`, `name`), - INDEX `i_cluster__allocation_state`(`allocation_state`), - INDEX `i_cluster__removed`(`removed`), - CONSTRAINT `uc_cluster__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`cluster_details` ( - `id` bigint unsigned NOT NULL auto_increment, - `cluster_id` bigint unsigned NOT NULL COMMENT 'cluster id', - `name` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_cluster_details__cluster_id` FOREIGN KEY (`cluster_id`) REFERENCES `cluster`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_host_upgrade` ( - `host_id` bigint unsigned NOT NULL UNIQUE COMMENT 'host id', - `version` varchar(20) NOT NULL COMMENT 'version', - `state` varchar(20) NOT NULL COMMENT 'state', - PRIMARY KEY (`host_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_lock` ( - `key` varchar(128) NOT NULL UNIQUE COMMENT 'primary key of the table', - `mac` varchar(17) NOT NULL COMMENT 'management server id of the server that holds this lock', - `ip` char(40) NOT NULL COMMENT 'name of the thread that holds this lock', - `thread` varchar(255) NOT NULL COMMENT 'Thread id that acquired this lock', - `acquired_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Time acquired', - `waiters` int NOT NULL DEFAULT 0 COMMENT 'How many have the thread acquired this lock (reentrant)', - PRIMARY KEY (`key`), - INDEX `i_op_lock__mac_ip_thread`(`mac`, `ip`, `thread`) -) ENGINE=Memory DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`configuration` ( - `category` varchar(255) NOT NULL DEFAULT 'Advanced', - `instance` varchar(255) NOT NULL, - `component` varchar(255) NOT NULL DEFAULT 'management-server', - `name` varchar(255) NOT NULL, - `value` varchar(4095), - `description` varchar(1024), - PRIMARY KEY (`name`), - INDEX `i_configuration__instance`(`instance`), - INDEX `i_configuration__name`(`name`), - INDEX `i_configuration__category`(`category`), - INDEX `i_configuration__component`(`component`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_ha_work` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance that needs to be ha.', - `type` varchar(32) NOT NULL COMMENT 'type of work', - `vm_type` varchar(32) NOT NULL COMMENT 'VM type', - `state` varchar(32) NOT NULL COMMENT 'state of the vm instance when this happened.', - `mgmt_server_id` bigint unsigned COMMENT 'management server that has taken up the work of doing ha', - `host_id` bigint unsigned COMMENT 'host that the vm is suppose to be on', - `created` datetime NOT NULL COMMENT 'time the entry was requested', - `tried` int(10) unsigned COMMENT '# of times tried', - `taken` datetime COMMENT 'time it was taken by the management server', - `step` varchar(32) NOT NULL COMMENT 'Step in the work', - `time_to_try` bigint COMMENT 'time to try do this work', - `updated` bigint unsigned NOT NULL COMMENT 'time the VM state was updated when it was stored into work queue', - PRIMARY KEY (`id`), - CONSTRAINT `fk_op_ha_work__instance_id` FOREIGN KEY `fk_op_ha_work__instance_id` (`instance_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE, - INDEX `i_op_ha_work__instance_id`(`instance_id`), - CONSTRAINT `fk_op_ha_work__host_id` FOREIGN KEY `fk_op_ha_work__host_id` (`host_id`) REFERENCES `host` (`id`), - INDEX `i_op_ha_work__host_id`(`host_id`), - INDEX `i_op_ha_work__step`(`step`), - INDEX `i_op_ha_work__type`(`type`), - CONSTRAINT `fk_op_ha_work__mgmt_server_id` FOREIGN KEY `fk_op_ha_work__mgmt_server_id`(`mgmt_server_id`) REFERENCES `mshost`(`msid`), - INDEX `i_op_ha_work__mgmt_server_id`(`mgmt_server_id`) - -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`sequence` ( - `name` varchar(64) UNIQUE NOT NULL COMMENT 'name of the sequence', - `value` bigint unsigned NOT NULL COMMENT 'sequence value', - PRIMARY KEY (`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('vm_instance_seq', 1); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('vm_template_seq', 200); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('public_mac_address_seq', 1); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('private_mac_address_seq', 1); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('storage_pool_seq', 200); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('volume_seq', 1); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('networks_seq', 200); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('checkpoint_seq', 1); -INSERT INTO `cloud`.`sequence` (name, value) VALUES ('physical_networks_seq', 200); - -CREATE TABLE `cloud`.`volumes` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', - `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', - `domain_id` bigint unsigned NOT NULL COMMENT 'the domain that the owner belongs to', - `pool_id` bigint unsigned COMMENT 'pool it belongs to. foreign key to storage_pool table', - `last_pool_id` bigint unsigned COMMENT 'last pool it belongs to.', - `instance_id` bigint unsigned NULL COMMENT 'vm instance it belongs to. foreign key to vm_instance table', - `device_id` bigint unsigned NULL COMMENT 'which device inside vm instance it is ', - `name` varchar(255) COMMENT 'A user specified name for the volume', - `uuid` varchar(40), - `size` bigint unsigned NOT NULL COMMENT 'total size', - `folder` varchar(255) COMMENT 'The folder where the volume is saved', - `path` varchar(255) COMMENT 'Path', - `pod_id` bigint unsigned COMMENT 'pod this volume belongs to', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center this volume belongs to', - `iscsi_name` varchar(255) COMMENT 'iscsi target name', - `host_ip` char(40) COMMENT 'host ip address for convenience', - `volume_type` varchar(64) NOT NULL COMMENT 'root, swap or data', - `pool_type` varchar(64) COMMENT 'type of the pool', - `disk_offering_id` bigint unsigned NOT NULL COMMENT 'can be null for system VMs', - `template_id` bigint unsigned COMMENT 'fk to vm_template.id', - `first_snapshot_backup_uuid` varchar (255) COMMENT 'The first snapshot that was ever taken for this volume', - `recreatable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this volume recreatable?', - `created` datetime COMMENT 'Date Created', - `attached` datetime COMMENT 'Date Attached', - `updated` datetime COMMENT 'Date updated for attach/detach', - `removed` datetime COMMENT 'Date removed. not null if removed', - `state` varchar(32) COMMENT 'State machine', - `chain_info` text COMMENT 'save possible disk chain info in primary storage', - `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'date state was updated', - PRIMARY KEY (`id`), - INDEX `i_volumes__removed`(`removed`), - INDEX `i_volumes__pod_id`(`pod_id`), - INDEX `i_volumes__data_center_id`(`data_center_id`), - CONSTRAINT `fk_volumes__account_id` FOREIGN KEY `fk_volumes__account_id` (`account_id`) REFERENCES `account` (`id`), - INDEX `i_volumes__account_id`(`account_id`), - CONSTRAINT `fk_volumes__pool_id` FOREIGN KEY `fk_volumes__pool_id` (`pool_id`) REFERENCES `storage_pool` (`id`), - INDEX `i_volumes__pool_id`(`pool_id`), - INDEX `i_volumes__last_pool_id`(`last_pool_id`), - CONSTRAINT `fk_volumes__instance_id` FOREIGN KEY `fk_volumes__instance_id` (`instance_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE, - INDEX `i_volumes__instance_id`(`instance_id`), - INDEX `i_volumes__state`(`state`), - INDEX `i_volumes__update_count`(`update_count`), - CONSTRAINT `uc_volumes__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`snapshots` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', - `data_center_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', - `domain_id` bigint unsigned NOT NULL COMMENT 'the domain that the owner belongs to', - `volume_id` bigint unsigned NOT NULL COMMENT 'volume it belongs to. foreign key to volume table', - `disk_offering_id` bigint unsigned NOT NULL COMMENT 'from original volume', - `status` varchar(32) COMMENT 'snapshot creation status', - `path` varchar(255) COMMENT 'Path', - `name` varchar(255) NOT NULL COMMENT 'snapshot name', - `uuid` varchar(40), - `snapshot_type` int(4) NOT NULL COMMENT 'type of snapshot, e.g. manual, recurring', - `type_description` varchar(25) COMMENT 'description of the type of snapshot, e.g. manual, recurring', - `size` bigint unsigned NOT NULL COMMENT 'original disk size of snapshot', - `created` datetime COMMENT 'Date Created', - `removed` datetime COMMENT 'Date removed. not null if removed', - `backup_snap_id` varchar(255) COMMENT 'Back up uuid of the snapshot', - `swift_id` bigint unsigned COMMENT 'which swift', - `sechost_id` bigint unsigned COMMENT 'secondary storage host id', - `prev_snap_id` bigint unsigned COMMENT 'Id of the most recent snapshot', - `hypervisor_type` varchar(32) NOT NULL COMMENT 'hypervisor that the snapshot was taken under', - `version` varchar(32) COMMENT 'snapshot version', - PRIMARY KEY (`id`), - CONSTRAINT `uc_snapshots__uuid` UNIQUE (`uuid`), - INDEX `i_snapshots__removed`(`removed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vlan` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `uuid` varchar(40), - `vlan_id` varchar(255), - `vlan_gateway` varchar(255), - `vlan_netmask` varchar(255), - `description` varchar(255), - `vlan_type` varchar(255), - `data_center_id` bigint unsigned NOT NULL, - `network_id` bigint unsigned NOT NULL COMMENT 'id of corresponding network offering', - `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on', - PRIMARY KEY (`id`), - #CONSTRAINT `fk_vlan__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), - CONSTRAINT `fk_vlan__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`), - CONSTRAINT `uc_vlan__uuid` UNIQUE (`uuid`), - CONSTRAINT `fk_vlan__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`pod_vlan_map` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `pod_id` bigint unsigned NOT NULL COMMENT 'pod id. foreign key to pod table', - `vlan_db_id` bigint unsigned NOT NULL COMMENT 'database id of vlan. foreign key to vlan table', - PRIMARY KEY (`id`), - CONSTRAINT `fk_pod_vlan_map__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, - INDEX `i_pod_vlan_map__pod_id`(`pod_id`), - CONSTRAINT `fk_pod_vlan_map__vlan_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE, - INDEX `i_pod_vlan_map__vlan_id`(`vlan_db_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`account_vlan_map` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `account_id` bigint unsigned NOT NULL COMMENT 'account id. foreign key to account table', - `vlan_db_id` bigint unsigned NOT NULL COMMENT 'database id of vlan. foreign key to vlan table', - PRIMARY KEY (`id`), - CONSTRAINT `fk_account_vlan_map__account_id` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, - INDEX `i_account_vlan_map__account_id`(`account_id`), - CONSTRAINT `fk_account_vlan_map__vlan_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE, - INDEX `i_account_vlan_map__vlan_id`(`vlan_db_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`data_center` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `name` varchar(255), - `uuid` varchar(40), - `description` varchar(255), - `dns1` varchar(255) NOT NULL, - `dns2` varchar(255), - `internal_dns1` varchar(255) NOT NULL, - `internal_dns2` varchar(255), - `gateway` varchar(15), - `netmask` varchar(15), - `router_mac_address` varchar(17) NOT NULL DEFAULT '02:00:00:00:00:01' COMMENT 'mac address for the router within the domain', - `mac_address` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Next available mac address for the ethernet card interacting with public internet', - `guest_network_cidr` varchar(18), - `domain` varchar(100) COMMENT 'Network domain name of the Vms of the zone', - `domain_id` bigint unsigned COMMENT 'domain id for the parent domain to this zone (null signifies public zone)', - `networktype` varchar(255) NOT NULL DEFAULT 'Basic' COMMENT 'Network type of the zone', - `dns_provider` char(64) DEFAULT 'VirtualRouter', - `gateway_provider` char(64) DEFAULT 'VirtualRouter', - `firewall_provider` char(64) DEFAULT 'VirtualRouter', - `dhcp_provider` char(64) DEFAULT 'VirtualRouter', - `lb_provider` char(64) DEFAULT 'VirtualRouter', - `vpn_provider` char(64) DEFAULT 'VirtualRouter', - `userdata_provider` char(64) DEFAULT 'VirtualRouter', - `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this data center enabled for allocation for new resources', - `zone_token` varchar(255), - `is_security_group_enabled` tinyint NOT NULL DEFAULT 0 COMMENT '1: enabled, 0: not', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_data_center__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`), - INDEX `i_data_center__domain_id`(`domain_id`), - INDEX `i_data_center__allocation_state`(`allocation_state`), - INDEX `i_data_center__zone_token`(`zone_token`), - INDEX `i_data_center__removed`(`removed`), - CONSTRAINT `uc_data_center__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_dc_ip_address_alloc` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', - `ip_address` char(40) NOT NULL COMMENT 'ip address', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center it belongs to', - `pod_id` bigint unsigned NOT NULL COMMENT 'pod it belongs to', - `nic_id` bigint unsigned NULL COMMENT 'nic id', - `reservation_id` char(40) NULL COMMENT 'reservation id', - `taken` datetime COMMENT 'Date taken', - `mac_address` bigint unsigned NOT NULL COMMENT 'mac address for management ips', - PRIMARY KEY (`id`), - CONSTRAINT `fk_op_dc_ip_address_alloc__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, - INDEX `i_op_dc_ip_address_alloc__pod_id__data_center_id__taken` (`pod_id`, `data_center_id`, `taken`, `nic_id`), - UNIQUE `i_op_dc_ip_address_alloc__ip_address__data_center_id`(`ip_address`, `data_center_id`), - CONSTRAINT `fk_op_dc_ip_address_alloc__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, - INDEX `i_op_dc_ip_address_alloc__pod_id`(`pod_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_dc_link_local_ip_address_alloc` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', - `ip_address` char(40) NOT NULL COMMENT 'ip address', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center it belongs to', - `pod_id` bigint unsigned NOT NULL COMMENT 'pod it belongs to', - `nic_id` bigint unsigned NULL COMMENT 'instance id', - `reservation_id` char(40) NULL COMMENT 'reservation id used to reserve this network', - `taken` datetime COMMENT 'Date taken', - PRIMARY KEY (`id`), - INDEX `i_op_dc_link_local_ip_address_alloc__pod_id`(`pod_id`), - INDEX `i_op_dc_link_local_ip_address_alloc__data_center_id`(`data_center_id`), - INDEX `i_op_dc_link_local_ip_address_alloc__nic_id_reservation_id`(`nic_id`,`reservation_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`dc_storage_network_ip_range` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `uuid` varchar(40), - `start_ip` char(40) NOT NULL COMMENT 'start ip address', - `end_ip` char(40) NOT NULL COMMENT 'end ip address', - `gateway` varchar(15) NOT NULL COMMENT 'gateway ip address', - `vlan` int unsigned DEFAULT NULL COMMENT 'vlan the storage network on', - `netmask` varchar(15) NOT NULL COMMENT 'netmask for storage network', - `data_center_id` bigint unsigned NOT NULL, - `pod_id` bigint unsigned NOT NULL COMMENT 'pod it belongs to', - `network_id` bigint unsigned NOT NULL COMMENT 'id of corresponding network offering', - PRIMARY KEY (`id`), - CONSTRAINT `fk_storage_ip_range__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), - CONSTRAINT `fk_storage_ip_range__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`), - CONSTRAINT `fk_storage_ip_range__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref`(`id`), - CONSTRAINT `uc_storage_ip_range__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_dc_storage_network_ip_address` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', - `range_id` bigint unsigned NOT NULL COMMENT 'id of ip range in dc_storage_network_ip_range', - `ip_address` char(40) NOT NULL COMMENT 'ip address', - `mac_address` bigint unsigned NOT NULL COMMENT 'mac address for storage ips', - `taken` datetime COMMENT 'Date taken', - PRIMARY KEY (`id`), - CONSTRAINT `fk_storage_ip_address__range_id` FOREIGN KEY (`range_id`) REFERENCES `dc_storage_network_ip_range`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`host_pod_ref` ( - `id` bigint unsigned NOT NULL UNIQUE auto_increment, - `name` varchar(255), - `uuid` varchar(40), - `data_center_id` bigint unsigned NOT NULL, - `gateway` varchar(255) NOT NULL COMMENT 'gateway for the pod', - `cidr_address` varchar(15) NOT NULL COMMENT 'CIDR address for the pod', - `cidr_size` bigint unsigned NOT NULL COMMENT 'CIDR size for the pod', - `description` varchar(255) COMMENT 'store private ip range in startIP-endIP format', - `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this Pod enabled for allocation for new resources', - `external_dhcp` tinyint NOT NULL DEFAULT 0 COMMENT 'Is this Pod using external DHCP', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - UNIQUE KEY (`name`, `data_center_id`), - INDEX `i_host_pod_ref__data_center_id`(`data_center_id`), - INDEX `i_host_pod_ref__allocation_state`(`allocation_state`), - INDEX `i_host_pod_ref__removed`(`removed`), - CONSTRAINT `uc_host_pod_ref__uuid` UNIQUE (`uuid`) - -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_dc_vnet_alloc` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary id', - `vnet` varchar(18) NOT NULL COMMENT 'vnet', - `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network the vnet belongs to', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center the vnet belongs to', - `reservation_id` char(40) NULL COMMENT 'reservation id', - `account_id` bigint unsigned NULL COMMENT 'account the vnet belongs to right now', - `taken` datetime COMMENT 'Date taken', - PRIMARY KEY (`id`), - UNIQUE `i_op_dc_vnet_alloc__vnet__data_center_id__account_id`(`vnet`, `data_center_id`, `account_id`), - INDEX `i_op_dc_vnet_alloc__dc_taken`(`data_center_id`, `taken`), - UNIQUE `i_op_dc_vnet_alloc__vnet__data_center_id`(`vnet`, `data_center_id`), - CONSTRAINT `fk_op_dc_vnet_alloc__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_op_dc_vnet_alloc__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`firewall_rules` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `ip_address_id` bigint unsigned COMMENT 'id of the corresponding ip address', - `start_port` int(10) COMMENT 'starting port of a port range', - `end_port` int(10) COMMENT 'end port of a port range', - `state` char(32) NOT NULL COMMENT 'current state of this rule', - `protocol` char(16) NOT NULL default 'TCP' COMMENT 'protocol to open these ports for', - `purpose` char(32) NOT NULL COMMENT 'why are these ports opened?', - `account_id` bigint unsigned NOT NULL COMMENT 'owner id', - `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', - `network_id` bigint unsigned NOT NULL COMMENT 'network id', - `xid` char(40) NOT NULL COMMENT 'external id', - `created` datetime COMMENT 'Date created', - `icmp_code` int(10) COMMENT 'The ICMP code (if protocol=ICMP). A value of -1 means all codes for the given ICMP type.', - `icmp_type` int(10) COMMENT 'The ICMP type (if protocol=ICMP). A value of -1 means all types.', - `related` bigint unsigned COMMENT 'related to what other firewall rule', - `type` varchar(10) NOT NULL DEFAULT 'USER', - `vpc_id` bigint unsigned COMMENT 'vpc the firewall rule is associated with', - `traffic_type` char(32) COMMENT 'the traffic type of the rule, can be Ingress or Egress', - PRIMARY KEY (`id`), - CONSTRAINT `fk_firewall_rules__ip_address_id` FOREIGN KEY(`ip_address_id`) REFERENCES `user_ip_address`(`id`), - CONSTRAINT `fk_firewall_rules__network_id` FOREIGN KEY(`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_firewall_rules__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_firewall_rules__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_firewall_rules__related` FOREIGN KEY(`related`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_firewall_rules__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, - INDEX `i_firewall_rules__purpose`(`purpose`), - CONSTRAINT `uc_firewall_rules__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`firewall_rules_cidrs` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `firewall_rule_id` bigint(20) unsigned NOT NULL COMMENT 'firewall rule id', - `source_cidr` varchar(18) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `fk_firewall_cidrs_firewall_rules` (`firewall_rule_id`), - UNIQUE INDEX `unique_rule_cidrs` (`firewall_rule_id`, `source_cidr`), - CONSTRAINT `fk_firewall_cidrs_firewall_rules` FOREIGN KEY (`firewall_rule_id`) REFERENCES `firewall_rules` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`load_balancing_rules` ( - `id` bigint unsigned NOT NULL, - `name` varchar(255) NOT NULL, - `description` varchar(4096) NULL COMMENT 'description', - `default_port_start` int(10) NOT NULL COMMENT 'default private port range start', - `default_port_end` int(10) NOT NULL COMMENT 'default destination port range end', - `algorithm` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_load_balancing_rules__id` FOREIGN KEY(`id`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`load_balancer_vm_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `load_balancer_id` bigint unsigned NOT NULL, - `instance_id` bigint unsigned NOT NULL, - `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when rule is set for Revoke', - PRIMARY KEY (`id`), - UNIQUE KEY (`load_balancer_id`, `instance_id`), - CONSTRAINT `fk_load_balancer_vm_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_load_balancer_vm_map__instance_id` FOREIGN KEY(`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`load_balancer_stickiness_policies` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `load_balancer_id` bigint unsigned NOT NULL, - `name` varchar(255) NOT NULL, - `description` varchar(4096) NULL COMMENT 'description', - `method_name` varchar(255) NOT NULL, - `params` varchar(4096) NOT NULL, - `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when rule is set for Revoke', - PRIMARY KEY (`id`), - CONSTRAINT `fk_load_balancer_stickiness_policies__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`inline_load_balancer_nic_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `load_balancer_id` bigint unsigned NOT NULL, - `public_ip_address` char(40) NOT NULL, - `nic_id` bigint unsigned NULL COMMENT 'nic id', - PRIMARY KEY (`id`), - UNIQUE KEY (`nic_id`), - CONSTRAINT `fk_inline_load_balancer_nic_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_inline_load_balancer_nic_map__nic_id` FOREIGN KEY(`nic_id`) REFERENCES `nics`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`port_forwarding_rules` ( - `id` bigint unsigned NOT NULL COMMENT 'id', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id', - `dest_ip_address` char(40) NOT NULL COMMENT 'id_address', - `dest_port_start` int(10) NOT NULL COMMENT 'starting port of the port range to map to', - `dest_port_end` int(10) NOT NULL COMMENT 'end port of the the port range to map to', - PRIMARY KEY (`id`), - CONSTRAINT `fk_port_forwarding_rules__id` FOREIGN KEY(`id`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_port_forwarding_rules__instance_id` FOREIGN KEY `fk_port_forwarding_rules__instance_id` (`instance_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`host` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255) NOT NULL, - `uuid` varchar(40) COMMENT 'this uuid is different with guid below, the later one is used by hypervisor resource', - `status` varchar(32) NOT NULL, - `type` varchar(32) NOT NULL, - `private_ip_address` char(40) NOT NULL, - `private_netmask` varchar(15), - `private_mac_address` varchar(17), - `storage_ip_address` char(40), - `storage_netmask` varchar(15), - `storage_mac_address` varchar(17), - `storage_ip_address_2` char(40), - `storage_mac_address_2` varchar(17), - `storage_netmask_2` varchar(15), - `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', - `public_ip_address` char(40), - `public_netmask` varchar(15), - `public_mac_address` varchar(17), - `proxy_port` int(10) unsigned, - `data_center_id` bigint unsigned NOT NULL, - `pod_id` bigint unsigned, - `cpus` int(10) unsigned, - `speed` int(10) unsigned, - `url` varchar(255) COMMENT 'iqn for the servers', - `fs_type` varchar(32), - `hypervisor_type` varchar(32) COMMENT 'hypervisor type, can be NONE for storage', - `hypervisor_version` varchar(32) COMMENT 'hypervisor version', - `ram` bigint unsigned, - `resource` varchar(255) DEFAULT NULL COMMENT 'If it is a local resource, this is the class name', - `version` varchar(40) NOT NULL, - `parent` varchar(255) COMMENT 'parent path for the storage server', - `total_size` bigint unsigned COMMENT 'TotalSize', - `capabilities` varchar(255) COMMENT 'host capabilities in comma separated list', - `guid` varchar(255) UNIQUE, - `available` int(1) unsigned NOT NULL DEFAULT 1 COMMENT 'Is this host ready for more resources?', - `setup` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this host already setup?', - `dom0_memory` bigint unsigned NOT NULL COMMENT 'memory used by dom0 for computing and routing servers', - `last_ping` int(10) unsigned NOT NULL COMMENT 'time in seconds from the start of machine of the last ping', - `mgmt_server_id` bigint unsigned COMMENT 'ManagementServer this host is connected to.', - `disconnected` datetime COMMENT 'Time this was disconnected', - `created` datetime COMMENT 'date the host first signed on', - `removed` datetime COMMENT 'date removed if not null', - `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'atomic increase count making status update operation atomical', - `resource_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this host enabled for allocation for new resources', - PRIMARY KEY (`id`), - INDEX `i_host__removed`(`removed`), - INDEX `i_host__last_ping`(`last_ping`), - INDEX `i_host__status`(`status`), - INDEX `i_host__data_center_id`(`data_center_id`), - CONSTRAINT `fk_host__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, - INDEX `i_host__pod_id`(`pod_id`), - CONSTRAINT `fk_host__cluster_id` FOREIGN KEY (`cluster_id`) REFERENCES `cloud`.`cluster`(`id`), - CONSTRAINT `uc_host__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_host` ( - `id` bigint unsigned NOT NULL UNIQUE COMMENT 'host id', - `sequence` bigint unsigned DEFAULT 1 NOT NULL COMMENT 'sequence for the host communication', - PRIMARY KEY (`id`), - CONSTRAINT `fk_op_host__id` FOREIGN KEY (`id`) REFERENCES `host`(`id`) ON DELETE CASCADE -) ENGINE = InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`account_details` ( - `id` bigint unsigned NOT NULL auto_increment, - `account_id` bigint unsigned NOT NULL COMMENT 'account id', - `name` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_account_details__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE -)ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`host_details` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned NOT NULL COMMENT 'host id', - `name` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_host_details__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`mshost` ( - `id` bigint unsigned NOT NULL auto_increment, - `msid` bigint unsigned NOT NULL UNIQUE COMMENT 'management server id derived from MAC address', - `runid` bigint NOT NULL DEFAULT 0 COMMENT 'run id, combined with msid to form a cluster session', - `name` varchar(255), - `state` varchar(10) NOT NULL DEFAULT 'Down', - `version` varchar(255), - `service_ip` char(40) NOT NULL, - `service_port` integer NOT NULL, - `last_update` DATETIME NULL COMMENT 'Last record update time', - `removed` datetime COMMENT 'date removed if not null', - `alert_count` integer NOT NULL DEFAULT 0, - PRIMARY KEY (`id`), - INDEX `i_mshost__removed`(`removed`), - INDEX `i_mshost__last_update`(`last_update`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`mshost_peer` ( - `id` bigint unsigned NOT NULL auto_increment, - `owner_mshost` bigint unsigned NOT NULL, - `peer_mshost` bigint unsigned NOT NULL, - `peer_runid` bigint NOT NULL, - `peer_state` varchar(10) NOT NULL DEFAULT 'Down', - `last_update` DATETIME NULL COMMENT 'Last record update time', - - PRIMARY KEY (`id`), - CONSTRAINT `fk_mshost_peer__owner_mshost` FOREIGN KEY (`owner_mshost`) REFERENCES `mshost`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_mshost_peer__peer_mshost` FOREIGN KEY (`peer_mshost`) REFERENCES `mshost`(`id`), - UNIQUE `i_mshost_peer__owner_peer_runid`(`owner_mshost`, `peer_mshost`, `peer_runid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`host_tags` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned NOT NULL COMMENT 'host id', - `tag` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_host_tags__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`user` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `username` varchar(255) NOT NULL, - `password` varchar(255) NOT NULL, - `account_id` bigint unsigned NOT NULL, - `firstname` varchar(255) default NULL, - `lastname` varchar(255) default NULL, - `email` varchar(255) default NULL, - `state` varchar(10) NOT NULL default 'enabled', - `api_key` varchar(255) default NULL, - `secret_key` varchar(255) default NULL, - `created` datetime NOT NULL COMMENT 'date created', - `removed` datetime COMMENT 'date removed', - `timezone` varchar(30) default NULL, - `registration_token` varchar(255) default NULL, - `is_registered` tinyint NOT NULL DEFAULT 0 COMMENT '1: yes, 0: no', - PRIMARY KEY (`id`), - INDEX `i_user__removed`(`removed`), - INDEX `i_user__secret_key_removed`(`secret_key`, `removed`), - UNIQUE `i_user__api_key`(`api_key`), - CONSTRAINT `fk_user__account_id` FOREIGN KEY `fk_user__account_id` (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, - INDEX `i_user__account_id`(`account_id`), - CONSTRAINT `uc_user__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`event` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `type` varchar(32) NOT NULL, - `state` varchar(32) NOT NULL DEFAULT 'Completed', - `description` varchar(1024) NOT NULL, - `user_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - `domain_id` bigint unsigned NOT NULL, - `created` datetime NOT NULL, - `level` varchar(16) NOT NULL, - `start_id` bigint unsigned NOT NULL DEFAULT 0, - `parameters` varchar(1024) NULL, - PRIMARY KEY (`id`), - CONSTRAINT `uc_event__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`user_ip_address` ( - `id` bigint unsigned NOT NULL UNIQUE auto_increment, - `uuid` varchar(40), - `account_id` bigint unsigned NULL, - `domain_id` bigint unsigned NULL, - `public_ip_address` char(40) NOT NULL, - `data_center_id` bigint unsigned NOT NULL COMMENT 'zone that it belongs to', - `source_nat` int(1) unsigned NOT NULL default '0', - `allocated` datetime NULL COMMENT 'Date this ip was allocated to someone', - `vlan_db_id` bigint unsigned NOT NULL, - `one_to_one_nat` int(1) unsigned NOT NULL default '0', - `vm_id` bigint unsigned COMMENT 'vm id the one_to_one nat ip is assigned to', - `state` char(32) NOT NULL default 'Free' COMMENT 'state of the ip address', - `mac_address` bigint unsigned NOT NULL COMMENT 'mac address of this ip', - `source_network_id` bigint unsigned NOT NULL COMMENT 'network id ip belongs to', - `network_id` bigint unsigned COMMENT 'network this public ip address is associated with', - `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on', - `is_system` int(1) unsigned NOT NULL default '0', - `vpc_id` bigint unsigned COMMENT 'vpc the ip address is associated with', - PRIMARY KEY (`id`), - UNIQUE (`public_ip_address`, `source_network_id`), - CONSTRAINT `fk_user_ip_address__source_network_id` FOREIGN KEY (`source_network_id`) REFERENCES `networks`(`id`), - CONSTRAINT `fk_user_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), - CONSTRAINT `fk_user_ip_address__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`), - CONSTRAINT `fk_user_ip_address__vm_id` FOREIGN KEY (`vm_id`) REFERENCES `vm_instance`(`id`), - CONSTRAINT `fk_user_ip_address__vlan_db_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_user_ip_address__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_user_ip_address__uuid` UNIQUE (`uuid`), - CONSTRAINT `fk_user_ip_address__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_user_ip_address__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, - INDEX `i_user_ip_address__allocated`(`allocated`), - INDEX `i_user_ip_address__source_nat`(`source_nat`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`user_statistics` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT, - `data_center_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - `public_ip_address` char(40), - `device_id` bigint unsigned NOT NULL, - `device_type` varchar(32) NOT NULL, - `network_id` bigint unsigned, - `net_bytes_received` bigint unsigned NOT NULL default '0', - `net_bytes_sent` bigint unsigned NOT NULL default '0', - `current_bytes_received` bigint unsigned NOT NULL default '0', - `current_bytes_sent` bigint unsigned NOT NULL default '0', - `agg_bytes_received` bigint unsigned NOT NULL default '0', - `agg_bytes_sent` bigint unsigned NOT NULL default '0', - PRIMARY KEY (`id`), - UNIQUE KEY (`account_id`, `data_center_id`, `public_ip_address`, `device_id`, `device_type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vm_template` ( - `id` bigint unsigned NOT NULL auto_increment, - `unique_name` varchar(255) NOT NULL, - `name` varchar(255) NOT NULL, - `uuid` varchar(40), - `public` int(1) unsigned NOT NULL, - `featured` int(1) unsigned NOT NULL, - `type` varchar(32) NULL, - `hvm` int(1) unsigned NOT NULL COMMENT 'requires HVM', - `bits` int(6) unsigned NOT NULL COMMENT '32 bit or 64 bit', - `url` varchar(255) NULL COMMENT 'the url where the template exists externally', - `format` varchar(32) NOT NULL COMMENT 'format for the template', - `created` datetime NOT NULL COMMENT 'Date created', - `removed` datetime COMMENT 'Date removed if not null', - `account_id` bigint unsigned NOT NULL COMMENT 'id of the account that created this template', - `checksum` varchar(255) COMMENT 'checksum for the template root disk', - `display_text` varchar(4096) NULL COMMENT 'Description text set by the admin for display purpose only', - `enable_password` int(1) unsigned NOT NULL default 1 COMMENT 'true if this template supports password reset', - `enable_sshkey` int(1) unsigned NOT NULL default 0 COMMENT 'true if this template supports sshkey reset', - `guest_os_id` bigint unsigned NOT NULL COMMENT 'the OS of the template', - `bootable` int(1) unsigned NOT NULL default 1 COMMENT 'true if this template represents a bootable ISO', - `prepopulate` int(1) unsigned NOT NULL default 0 COMMENT 'prepopulate this template to primary storage', - `cross_zones` int(1) unsigned NOT NULL default 0 COMMENT 'Make this template available in all zones', - `extractable` int(1) unsigned NOT NULL default 0 COMMENT 'Is this template extractable', - `hypervisor_type` varchar(32) COMMENT 'hypervisor that the template belongs to', - `source_template_id` bigint unsigned COMMENT 'Id of the original template, if this template is created from snapshot', - `template_tag` varchar(255) COMMENT 'template tag', - `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', - PRIMARY KEY (`id`), - INDEX `i_vm_template__removed`(`removed`), - CONSTRAINT `uc_vm_template__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vm_template_details` ( - `id` bigint unsigned NOT NULL auto_increment, - `template_id` bigint unsigned NOT NULL COMMENT 'template id', - `name` varchar(255) NOT NULL, - `value` varchar(1024) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_vm_template_details__template_id` FOREIGN KEY `fk_vm_template_details__template_id`(`template_id`) REFERENCES `vm_template`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vm_instance` ( - `id` bigint unsigned UNIQUE NOT NULL, - `name` varchar(255) NOT NULL, - `uuid` varchar(40), - `instance_name` varchar(255) NOT NULL COMMENT 'name of the vm instance running on the hosts', - `state` varchar(32) NOT NULL, - `vm_template_id` bigint unsigned, - `guest_os_id` bigint unsigned NOT NULL, - `private_mac_address` varchar(17), - `private_ip_address` char(40), - `pod_id` bigint unsigned, - `data_center_id` bigint unsigned NOT NULL COMMENT 'Data Center the instance belongs to', - `host_id` bigint unsigned, - `last_host_id` bigint unsigned COMMENT 'tentative host for first run or last host that it has been running on', - `proxy_id` bigint unsigned NULL COMMENT 'console proxy allocated in previous session', - `proxy_assign_time` DATETIME NULL COMMENT 'time when console proxy was assigned', - `vnc_password` varchar(255) NOT NULL COMMENT 'vnc password', - `ha_enabled` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Should HA be enabled for this VM', - `limit_cpu_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Limit the cpu usage to service offering', - `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'date state was updated', - `update_time` datetime COMMENT 'date the destroy was requested', - `created` datetime NOT NULL COMMENT 'date created', - `removed` datetime COMMENT 'date removed if not null', - `type` varchar(32) NOT NULL COMMENT 'type of vm it is', - `vm_type` varchar(32) NOT NULL COMMENT 'vm type', - `account_id` bigint unsigned NOT NULL COMMENT 'user id of owner', - `domain_id` bigint unsigned NOT NULL, - `service_offering_id` bigint unsigned NOT NULL COMMENT 'service offering id', - `reservation_id` char(40) COMMENT 'reservation id', - `hypervisor_type` char(32) COMMENT 'hypervisor type', - PRIMARY KEY (`id`), - INDEX `i_vm_instance__removed`(`removed`), - INDEX `i_vm_instance__type`(`type`), - INDEX `i_vm_instance__pod_id`(`pod_id`), - INDEX `i_vm_instance__update_time`(`update_time`), - INDEX `i_vm_instance__update_count`(`update_count`), - INDEX `i_vm_instance__state`(`state`), - INDEX `i_vm_instance__data_center_id`(`data_center_id`), - CONSTRAINT `fk_vm_instance__host_id` FOREIGN KEY `fk_vm_instance__host_id` (`host_id`) REFERENCES `host` (`id`), - CONSTRAINT `fk_vm_instance__last_host_id` FOREIGN KEY `fk_vm_instance__last_host_id` (`last_host_id`) REFERENCES `host`(`id`), - CONSTRAINT `fk_vm_instance__template_id` FOREIGN KEY `fk_vm_instance__template_id` (`vm_template_id`) REFERENCES `vm_template` (`id`), - INDEX `i_vm_instance__template_id`(`vm_template_id`), - CONSTRAINT `fk_vm_instance__account_id` FOREIGN KEY `fk_vm_instance__account_id` (`account_id`) REFERENCES `account` (`id`), - CONSTRAINT `fk_vm_instance__service_offering_id` FOREIGN KEY `fk_vm_instance__service_offering_id` (`service_offering_id`) REFERENCES `service_offering` (`id`), - CONSTRAINT `uc_vm_instance_uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`user_vm` ( - `id` bigint unsigned UNIQUE NOT NULL, - `iso_id` bigint unsigned, - `display_name` varchar(255), - `user_data` varchar(2048), - `update_parameters` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Defines if the parameters have been updated for the vm', - PRIMARY KEY (`id`), - CONSTRAINT `fk_user_vm__id` FOREIGN KEY `fk_user_vm__id` (`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - --- note, uer_vm_details is now used for all VMs (not just for user vms) -CREATE TABLE `cloud`.`user_vm_details` ( - `id` bigint unsigned NOT NULL auto_increment, - `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', - `name` varchar(255) NOT NULL, - `value` varchar(1024) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_user_vm_details__vm_id` FOREIGN KEY `fk_user_vm_details__vm_id`(`vm_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`domain_router` ( - `id` bigint unsigned UNIQUE NOT NULL COMMENT 'Primary Key', - `element_id` bigint unsigned NOT NULL COMMENT 'correlated virtual router provider ID', - `public_mac_address` varchar(17) COMMENT 'mac address of the public facing network card', - `public_ip_address` char(40) COMMENT 'public ip address used for source net', - `public_netmask` varchar(15) COMMENT 'netmask used for the domR', - `guest_netmask` varchar(15) COMMENT 'netmask used for the guest network', - `guest_ip_address` char(40) COMMENT ' ip address in the guest network', - `is_redundant_router` int(1) unsigned NOT NULL COMMENT 'if in redundant router mode', - `priority` int(4) unsigned COMMENT 'priority of router in the redundant router mode', - `is_priority_bumpup` int(1) unsigned NOT NULL COMMENT 'if the priority has been bumped up', - `redundant_state` varchar(64) NOT NULL COMMENT 'the state of redundant virtual router', - `stop_pending` int(1) unsigned NOT NULL COMMENT 'if this router would be stopped after we can connect to it', - `role` varchar(64) NOT NULL COMMENT 'type of role played by this router', - `template_version` varchar(100) COMMENT 'template version', - `scripts_version` varchar(100) COMMENT 'scripts version', - `vpc_id` bigint unsigned COMMENT 'correlated virtual router vpc ID', - PRIMARY KEY (`id`), - CONSTRAINT `fk_domain_router__id` FOREIGN KEY `fk_domain_router__id` (`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_domain_router__element_id` FOREIGN KEY `fk_domain_router__element_id`(`element_id`) REFERENCES `virtual_router_providers`(`id`), - CONSTRAINT `fk_domain_router__vpc_id` FOREIGN KEY `fk_domain_router__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`) -) ENGINE = InnoDB DEFAULT CHARSET=utf8 COMMENT = 'information about the domR instance'; - -CREATE TABLE `cloud`.`upload` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned NOT NULL, - `type_id` bigint unsigned NOT NULL, - `type` varchar(255), - `mode` varchar(255), - `created` DATETIME NOT NULL, - `last_updated` DATETIME, - `job_id` varchar(255), - `upload_pct` int(10) unsigned, - `upload_state` varchar(255), - `error_str` varchar(255), - `url` varchar(255), - `install_path` varchar(255), - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`template_host_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned NOT NULL, - `template_id` bigint unsigned NOT NULL, - `created` DATETIME NOT NULL, - `last_updated` DATETIME, - `job_id` varchar(255), - `download_pct` int(10) unsigned, - `size` bigint unsigned, - `physical_size` bigint unsigned DEFAULT 0, - `download_state` varchar(255), - `error_str` varchar(255), - `local_path` varchar(255), - `install_path` varchar(255), - `url` varchar(255), - `destroyed` tinyint(1) COMMENT 'indicates whether the template_host entry was destroyed by the user or not', - `is_copy` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'indicates whether this was copied ', - PRIMARY KEY (`id`), - CONSTRAINT `fk_template_host_ref__host_id` FOREIGN KEY `fk_template_host_ref__host_id` (`host_id`) REFERENCES `host` (`id`) ON DELETE CASCADE, - INDEX `i_template_host_ref__host_id`(`host_id`), - CONSTRAINT `fk_template_host_ref__template_id` FOREIGN KEY `fk_template_host_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`), - INDEX `i_template_host_ref__template_id`(`template_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`volume_host_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned NOT NULL, - `volume_id` bigint unsigned NOT NULL, - `zone_id` bigint unsigned NOT NULL, - `created` DATETIME NOT NULL, - `last_updated` DATETIME, - `job_id` varchar(255), - `download_pct` int(10) unsigned, - `size` bigint unsigned, - `physical_size` bigint unsigned DEFAULT 0, - `download_state` varchar(255), - `checksum` varchar(255) COMMENT 'checksum for the data disk', - `error_str` varchar(255), - `local_path` varchar(255), - `install_path` varchar(255), - `url` varchar(255), - `format` varchar(32) NOT NULL COMMENT 'format for the volume', - `destroyed` tinyint(1) COMMENT 'indicates whether the volume_host entry was destroyed by the user or not', - PRIMARY KEY (`id`), - CONSTRAINT `fk_volume_host_ref__host_id` FOREIGN KEY `fk_volume_host_ref__host_id` (`host_id`) REFERENCES `host` (`id`) ON DELETE CASCADE, - INDEX `i_volume_host_ref__host_id`(`host_id`), - CONSTRAINT `fk_volume_host_ref__volume_id` FOREIGN KEY `fk_volume_host_ref__volume_id` (`volume_id`) REFERENCES `volumes` (`id`), - INDEX `i_volume_host_ref__volume_id`(`volume_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`template_swift_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `swift_id` bigint unsigned NOT NULL, - `template_id` bigint unsigned NOT NULL, - `created` DATETIME NOT NULL, - `path` varchar(255), - `size` bigint unsigned, - `physical_size` bigint unsigned DEFAULT 0, - PRIMARY KEY (`id`), - CONSTRAINT `fk_template_swift_ref__swift_id` FOREIGN KEY `fk_template_swift_ref__swift_id` (`swift_id`) REFERENCES `swift` (`id`) ON DELETE CASCADE, - INDEX `i_template_swift_ref__swift_id`(`swift_id`), - CONSTRAINT `fk_template_swift_ref__template_id` FOREIGN KEY `fk_template_swift_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`), - INDEX `i_template_swift_ref__template_id`(`template_id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`template_zone_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `zone_id` bigint unsigned NOT NULL, - `template_id` bigint unsigned NOT NULL, - `created` DATETIME NOT NULL, - `last_updated` DATETIME, - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_template_zone_ref__zone_id` FOREIGN KEY `fk_template_zone_ref__zone_id` (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE, - INDEX `i_template_zone_ref__zone_id`(`zone_id`), - CONSTRAINT `fk_template_zone_ref__template_id` FOREIGN KEY `fk_template_zone_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`) ON DELETE CASCADE, - INDEX `i_template_zone_ref__template_id`(`template_id`), - INDEX `i_template_zone_ref__removed`(`removed`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`console_proxy` ( - `id` bigint unsigned NOT NULL auto_increment, - `public_mac_address` varchar(17) unique COMMENT 'mac address of the public facing network card', - `public_ip_address` char(40) COMMENT 'public ip address for the console proxy', - `public_netmask` varchar(15) COMMENT 'public netmask used for the console proxy', - `active_session` int(10) NOT NULL DEFAULT 0 COMMENT 'active session number', - `last_update` DATETIME NULL COMMENT 'Last session update time', - `session_details` BLOB NULL COMMENT 'session detail info', - PRIMARY KEY (`id`), - CONSTRAINT `fk_console_proxy__id` FOREIGN KEY `fk_console_proxy__id`(`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`secondary_storage_vm` ( - `id` bigint unsigned NOT NULL auto_increment, - `public_mac_address` varchar(17) unique COMMENT 'mac address of the public facing network card', - `public_ip_address` char(40) COMMENT 'public ip address for the sec storage vm', - `public_netmask` varchar(15) COMMENT 'public netmask used for the sec storage vm', - `guid` varchar(255) COMMENT 'copied from guid of secondary storage host', - `nfs_share` varchar(255) COMMENT 'server and path exported by the nfs server ', - `last_update` DATETIME NULL COMMENT 'Last session update time', - `role` varchar(64) NOT NULL DEFAULT 'templateProcessor' COMMENT 'work role of secondary storage host(templateProcessor | commandExecutor)', - PRIMARY KEY (`id`), - CONSTRAINT `fk_secondary_storage_vm__id` FOREIGN KEY `fk_secondary_storage_vm__id`(`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`domain` ( - `id` bigint unsigned NOT NULL auto_increment, - `parent` bigint unsigned, - `name` varchar(255), - `uuid` varchar(40), - `owner` bigint unsigned NOT NULL, - `path` varchar(255) NOT NULL, - `level` int(10) NOT NULL DEFAULT 0, - `child_count` int(10) NOT NULL DEFAULT 0, - `next_child_seq` bigint unsigned NOT NULL DEFAULT 1, - `removed` datetime COMMENT 'date removed', - `state` char(32) NOT NULL default 'Active' COMMENT 'state of the domain', - `network_domain` varchar(255), - `type` varchar(255) NOT NULL DEFAULT 'Normal' COMMENT 'type of the domain - can be Normal or Project', - PRIMARY KEY (`id`), - UNIQUE (parent, name, removed), - INDEX `i_domain__path`(`path`), - INDEX `i_domain__removed`(`removed`), - CONSTRAINT `uc_domain__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`account` ( - `id` bigint unsigned NOT NULL auto_increment, - `account_name` varchar(100) COMMENT 'an account name set by the creator of the account, defaults to username for single accounts', - `uuid` varchar(40), - `type` int(1) unsigned NOT NULL, - `domain_id` bigint unsigned, - `state` varchar(10) NOT NULL default 'enabled', - `removed` datetime COMMENT 'date removed', - `cleanup_needed` tinyint(1) NOT NULL default '0', - `network_domain` varchar(255), - `default_zone_id` bigint unsigned, - PRIMARY KEY (`id`), - INDEX i_account__removed(`removed`), - CONSTRAINT `fk_account__default_zone_id` FOREIGN KEY `fk_account__default_zone_id`(`default_zone_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_account__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`resource_limit` ( - `id` bigint unsigned NOT NULL auto_increment, - `domain_id` bigint unsigned, - `account_id` bigint unsigned, - `type` varchar(255), - `max` bigint NOT NULL default '-1', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`resource_count` ( - `id` bigint unsigned NOT NULL auto_increment, - `account_id` bigint unsigned, - `domain_id` bigint unsigned, - `type` varchar(255), - `count` bigint NOT NULL default '0', - PRIMARY KEY (`id`), - CONSTRAINT `fk_resource_count__account_id` FOREIGN KEY `fk_resource_count__account_id`(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_resource_count__domain_id` FOREIGN KEY `fk_resource_count__domain_id`(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - INDEX `i_resource_count__type`(`type`), - UNIQUE `i_resource_count__type_accountId`(`type`, `account_id`), - UNIQUE `i_resource_count__type_domaintId`(`type`, `domain_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_host_capacity` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned, - `data_center_id` bigint unsigned NOT NULL, - `pod_id` bigint unsigned, - `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', - `used_capacity` bigint signed NOT NULL, - `reserved_capacity` bigint signed NOT NULL, - `total_capacity` bigint signed NOT NULL, - `capacity_type` int(1) unsigned NOT NULL, - `capacity_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this capacity enabled for allocation for new resources', - `update_time` datetime COMMENT 'time the capacity was last updated', - `created` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - INDEX `i_op_host_capacity__host_type`(`host_id`, `capacity_type`), - INDEX `i_op_host_capacity__pod_id`(`pod_id`), - INDEX `i_op_host_capacity__data_center_id`(`data_center_id`), - INDEX `i_op_host_capacity__cluster_id`(`cluster_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`alert` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `type` int(1) unsigned NOT NULL, - `cluster_id` bigint unsigned, - `pod_id` bigint unsigned, - `data_center_id` bigint unsigned NOT NULL, - `subject` varchar(999) COMMENT 'according to SMTP spec, max subject length is 1000 including the CRLF character, so allow enough space to fit long pod/zone/host names', - `sent_count` int(3) unsigned NOT NULL, - `created` DATETIME NULL COMMENT 'when this alert type was created', - `last_sent` DATETIME NULL COMMENT 'Last time the alert was sent', - `resolved` DATETIME NULL COMMENT 'when the alert status was resolved (available memory no longer at critical level, etc.)', - PRIMARY KEY (`id`), - CONSTRAINT `uc_alert__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`async_job` ( - `id` bigint unsigned NOT NULL auto_increment, - `user_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - `session_key` varchar(64) COMMENT 'all async-job manage to apply session based security enforcement', - `instance_type` varchar(64) COMMENT 'instance_type and instance_id work together to allow attaching an instance object to a job', - `instance_id` bigint unsigned, - `job_cmd` varchar(64) NOT NULL COMMENT 'command name', - `job_cmd_originator` varchar(64) COMMENT 'command originator', - `job_cmd_info` text COMMENT 'command parameter info', - `job_cmd_ver` int(1) COMMENT 'command version', - `callback_type` int(1) COMMENT 'call back type, 0 : polling, 1 : email', - `callback_address` varchar(128) COMMENT 'call back address by callback_type', - `job_status` int(1) COMMENT 'general job execution status', - `job_process_status` int(1) COMMENT 'job specific process status for asynchronize progress update', - `job_result_code` int(1) COMMENT 'job result code, specify error code corresponding to result message', - `job_result` text COMMENT 'job result info', - `job_init_msid` bigint COMMENT 'the initiating msid', - `job_complete_msid` bigint COMMENT 'completing msid', - `created` datetime COMMENT 'date created', - `last_updated` datetime COMMENT 'date created', - `last_polled` datetime COMMENT 'date polled', - `removed` datetime COMMENT 'date removed', - `uuid` varchar(40), - PRIMARY KEY (`id`), - INDEX `i_async_job__removed`(`removed`), - INDEX `i_async__user_id`(`user_id`), - INDEX `i_async__account_id`(`account_id`), - INDEX `i_async__instance_type_id`(`instance_type`,`instance_id`), - INDEX `i_async__job_cmd`(`job_cmd`), - INDEX `i_async__created`(`created`), - INDEX `i_async__last_updated`(`last_updated`), - INDEX `i_async__last_poll`(`last_polled`), - CONSTRAINT `uc_async__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`sync_queue` ( - `id` bigint unsigned NOT NULL auto_increment, - `sync_objtype` varchar(64) NOT NULL, - `sync_objid` bigint unsigned NOT NULL, - `queue_proc_msid` bigint, - `queue_proc_number` bigint COMMENT 'process number, increase 1 for each iteration', - `queue_proc_time` datetime COMMENT 'last time to process the queue', - `created` datetime COMMENT 'date created', - `last_updated` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - UNIQUE `i_sync_queue__objtype__objid`(`sync_objtype`, `sync_objid`), - INDEX `i_sync_queue__created`(`created`), - INDEX `i_sync_queue__last_updated`(`last_updated`), - INDEX `i_sync_queue__queue_proc_time`(`queue_proc_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`stack_maid` ( - `id` bigint unsigned NOT NULL auto_increment, - `msid` bigint unsigned NOT NULL, - `thread_id` bigint unsigned NOT NULL, - `seq` int unsigned NOT NULL, - `cleanup_delegate` varchar(128), - `cleanup_context` text, - `created` datetime, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`sync_queue_item` ( - `id` bigint unsigned NOT NULL auto_increment, - `queue_id` bigint unsigned NOT NULL, - `content_type` varchar(64), - `content_id` bigint, - `queue_proc_msid` bigint COMMENT 'owner msid when the queue item is being processed', - `queue_proc_number` bigint COMMENT 'used to distinguish raw items and items being in process', - `created` datetime COMMENT 'time created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_sync_queue_item__queue_id` FOREIGN KEY `fk_sync_queue_item__queue_id` (`queue_id`) REFERENCES `sync_queue` (`id`) ON DELETE CASCADE, - INDEX `i_sync_queue_item__queue_id`(`queue_id`), - INDEX `i_sync_queue_item__created`(`created`), - INDEX `i_sync_queue_item__queue_proc_number`(`queue_proc_number`), - INDEX `i_sync_queue_item__queue_proc_msid`(`queue_proc_msid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`disk_offering` ( - `id` bigint unsigned NOT NULL auto_increment, - `domain_id` bigint unsigned, - `name` varchar(255) NOT NULL, - `uuid` varchar(40), - `display_text` varchar(4096) NULL COMMENT 'Descrianaption text set by the admin for display purpose only', - `disk_size` bigint unsigned NOT NULL COMMENT 'disk space in byte', - `type` varchar(32) COMMENT 'inheritted by who?', - `tags` varchar(4096) COMMENT 'comma separated tags about the disk_offering', - `recreatable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'The root disk is always recreatable', - `use_local_storage` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Indicates whether local storage pools should be used', - `unique_name` varchar(32) UNIQUE COMMENT 'unique name', - `system_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'is this offering for system used only', - `customized` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '0 implies not customized by default', - `removed` datetime COMMENT 'date removed', - `created` datetime COMMENT 'date the disk offering was created', - `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', - PRIMARY KEY (`id`), - INDEX `i_disk_offering__removed`(`removed`), - CONSTRAINT `uc_disk_offering__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`service_offering` ( - `id` bigint unsigned NOT NULL, - `cpu` int(10) unsigned NOT NULL COMMENT '# of cores', - `speed` int(10) unsigned NOT NULL COMMENT 'speed per core in mhz', - `ram_size` bigint unsigned NOT NULL, - `nw_rate` smallint unsigned default 200 COMMENT 'network rate throttle mbits/s', - `mc_rate` smallint unsigned default 10 COMMENT 'mcast rate throttle mbits/s', - `ha_enabled` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Enable HA', - `limit_cpu_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Limit the CPU usage to service offering', - `host_tag` varchar(255) COMMENT 'host tag specified by the service_offering', - `default_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'is this offering a default system offering', - `vm_type` varchar(32) COMMENT 'type of offering specified for system offerings', - `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', - PRIMARY KEY (`id`), - CONSTRAINT `fk_service_offering__id` FOREIGN KEY `fk_service_offering__id`(`id`) REFERENCES `disk_offering`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`network_rule_config` ( - `id` bigint unsigned NOT NULL auto_increment, - `security_group_id` bigint unsigned NOT NULL, - `public_port` varchar(10) default NULL, - `private_port` varchar(10) default NULL, - `protocol` varchar(16) NOT NULL default 'TCP', - `create_status` varchar(32) COMMENT 'rule creation status', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`remote_access_vpn` ( - `vpn_server_addr_id` bigint unsigned UNIQUE NOT NULL, - `account_id` bigint unsigned NOT NULL, - `network_id` bigint unsigned NOT NULL, - `domain_id` bigint unsigned NOT NULL, - `local_ip` char(40) NOT NULL, - `ip_range` varchar(32) NOT NULL, - `ipsec_psk` varchar(256) NOT NULL, - `state` char(32) NOT NULL, - PRIMARY KEY (`vpn_server_addr_id`), - CONSTRAINT `fk_remote_access_vpn__account_id` FOREIGN KEY `fk_remote_access_vpn__account_id`(`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_remote_access_vpn__domain_id` FOREIGN KEY `fk_remote_access_vpn__domain_id`(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_remote_access_vpn__network_id` FOREIGN KEY `fk_remote_access_vpn__network_id` (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_remote_access_vpn__vpn_server_addr_id` FOREIGN KEY `fk_remote_access_vpn__vpn_server_addr_id` (`vpn_server_addr_id`) REFERENCES `user_ip_address` (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vpn_users` ( - `id` bigint unsigned NOT NULL UNIQUE auto_increment, - `uuid` varchar(40), - `owner_id` bigint unsigned NOT NULL, - `domain_id` bigint unsigned NOT NULL, - `username` varchar(255) NOT NULL, - `password` varchar(255) NOT NULL, - `state` char(32) NOT NULL COMMENT 'What state is this vpn user in', - PRIMARY KEY (`id`), - CONSTRAINT `fk_vpn_users__owner_id` FOREIGN KEY (`owner_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_vpn_users__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - INDEX `i_vpn_users_username`(`username`), - UNIQUE `i_vpn_users__account_id__username`(`owner_id`, `username`), - CONSTRAINT `uc_vpn_users__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`storage_pool` ( - `id` bigint unsigned UNIQUE NOT NULL, - `name` varchar(255) COMMENT 'should be NOT NULL', - `uuid` varchar(255) UNIQUE, - `pool_type` varchar(32) NOT NULL, - `port` int unsigned NOT NULL, - `data_center_id` bigint unsigned NOT NULL, - `pod_id` bigint unsigned, - `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', - `available_bytes` bigint unsigned, - `capacity_bytes` bigint unsigned, - `host_address` varchar(255) NOT NULL COMMENT 'FQDN or IP of storage server', - `path` varchar(255) NOT NULL COMMENT 'Filesystem path that is shared', - `created` datetime COMMENT 'date the pool created', - `removed` datetime COMMENT 'date removed if not null', - `update_time` DATETIME, - `status` varchar(32), - PRIMARY KEY (`id`), - CONSTRAINT `fk_storage_pool__pod_id` FOREIGN KEY `fk_storage_pool__pod_id` (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, - INDEX `i_storage_pool__pod_id`(`pod_id`), - CONSTRAINT `fk_storage_pool__cluster_id` FOREIGN KEY `fk_storage_pool__cluster_id`(`cluster_id`) REFERENCES `cloud`.`cluster`(`id`), - INDEX `i_storage_pool__removed`(`removed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`storage_pool_details` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', - `pool_id` bigint unsigned NOT NULL COMMENT 'pool the detail is related to', - `name` varchar(255) NOT NULL COMMENT 'name of the detail', - `value` varchar(255) NOT NULL COMMENT 'value of the detail', - PRIMARY KEY (`id`), - CONSTRAINT `fk_storage_pool_details__pool_id` FOREIGN KEY `fk_storage_pool_details__pool_id`(`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE, - INDEX `i_storage_pool_details__name__value`(`name`(128), `value`(128)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`storage_pool_host_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `host_id` bigint unsigned NOT NULL, - `pool_id` bigint unsigned NOT NULL, - `created` DATETIME NOT NULL, - `last_updated` DATETIME, - `local_path` varchar(255), - PRIMARY KEY (`id`), - CONSTRAINT `fk_storage_pool_host_ref__host_id` FOREIGN KEY `fk_storage_pool_host_ref__host_id`(`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_storage_pool_host_ref__pool_id` FOREIGN KEY `fk_storage_pool_host_ref__pool_id`(`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`template_spool_ref` ( - `id` bigint unsigned NOT NULL auto_increment, - `pool_id` bigint unsigned NOT NULL, - `template_id` bigint unsigned NOT NULL, - `created` DATETIME NOT NULL, - `last_updated` DATETIME, - `job_id` varchar(255), - `download_pct` int(10) unsigned, - `download_state` varchar(255), - `error_str` varchar(255), - `local_path` varchar(255), - `install_path` varchar(255), - `template_size` bigint unsigned NOT NULL COMMENT 'the size of the template on the pool', - `marked_for_gc` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'if true, the garbage collector will evict the template from this pool.', - PRIMARY KEY (`id`), - UNIQUE `i_template_spool_ref__template_id__pool_id`(`template_id`, `pool_id`), - CONSTRAINT `fk_template_spool_ref__template_id` FOREIGN KEY (`template_id`) REFERENCES `vm_template`(`id`), - CONSTRAINT `fk_template_spool_ref__pool_id` FOREIGN KEY (`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`guest_os` ( - `id` bigint unsigned NOT NULL auto_increment, - `category_id` bigint unsigned NOT NULL, - `name` varchar(255), - `uuid` varchar(40), - `display_name` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `uc_guest_os__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`guest_os_hypervisor` ( - `id` bigint unsigned NOT NULL auto_increment, - `hypervisor_type` varchar(32) NOT NULL, - `guest_os_name` varchar(255) NOT NULL, - `guest_os_id` bigint unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`guest_os_category` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255) NOT NULL, - `uuid` varchar(40), - PRIMARY KEY (`id`), - CONSTRAINT `uc_guest_os_category__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`hypervisor_capabilities` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `hypervisor_type` varchar(32) NOT NULL, - `hypervisor_version` varchar(32), - `max_guests_limit` bigint unsigned DEFAULT 50, - `security_group_enabled` int(1) unsigned DEFAULT 1 COMMENT 'Is security group supported', - PRIMARY KEY (`id`), - CONSTRAINT `uc_hypervisor_capabilities__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', 'default', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', 'XCP 1.0', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6 FP1', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6 SP2', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '6.0', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '6.0.2', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', 'default', 128, 0); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '4.0', 128, 0); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '4.1', 128, 0); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '5.0', 128, 0); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('KVM', 'default', 50, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('Ovm', 'default', 25, 1); -INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('Ovm', '2.3', 25, 1); - -CREATE TABLE `cloud`.`launch_permission` ( - `id` bigint unsigned NOT NULL auto_increment, - `template_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`snapshot_policy` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `volume_id` bigint unsigned NOT NULL, - `schedule` varchar(100) NOT NULL COMMENT 'schedule time of execution', - `timezone` varchar(100) NOT NULL COMMENT 'the timezone in which the schedule time is specified', - `interval` int(4) NOT NULL default 4 COMMENT 'backup schedule, e.g. hourly, daily, etc.', - `max_snaps` int(8) NOT NULL default 0 COMMENT 'maximum number of snapshots to maintain', - `active` tinyint(1) unsigned NOT NULL COMMENT 'Is the policy active', - PRIMARY KEY (`id`), - CONSTRAINT `uc_snapshot_policy__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`snapshot_schedule` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `volume_id` bigint unsigned NOT NULL COMMENT 'The volume for which this snapshot is being taken', - `policy_id` bigint unsigned NOT NULL COMMENT 'One of the policyIds for which this snapshot was taken', - `scheduled_timestamp` datetime NOT NULL COMMENT 'Time at which the snapshot was scheduled for execution', - `async_job_id` bigint unsigned COMMENT 'If this schedule is being executed, it is the id of the create aysnc_job. Before that it is null', - `snapshot_id` bigint unsigned COMMENT 'If this schedule is being executed, then the corresponding snapshot has this id. Before that it is null', - UNIQUE (volume_id, policy_id), - CONSTRAINT `uc_snapshot_schedule__uuid` UNIQUE (`uuid`), - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_pod_vlan_alloc` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary id', - `vlan` varchar(18) NOT NULL COMMENT 'vlan id', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center the pod belongs to', - `pod_id` bigint unsigned NOT NULL COMMENT 'pod the vlan belongs to', - `account_id` bigint unsigned NULL COMMENT 'account the vlan belongs to right now', - `taken` datetime COMMENT 'Date taken', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`security_group` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255) NOT NULL, - `uuid` varchar(40), - `description` varchar(4096) NULL, - `domain_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - UNIQUE (`name`, `account_id`), - PRIMARY KEY (`id`), - CONSTRAINT `uc_security_group__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`security_group_rule` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `security_group_id` bigint unsigned NOT NULL, - `type` varchar(10) default 'ingress', - `start_port` varchar(10) default NULL, - `end_port` varchar(10) default NULL, - `protocol` varchar(16) NOT NULL default 'TCP', - `allowed_network_id` bigint unsigned, - `allowed_ip_cidr` varchar(44), - `create_status` varchar(32) COMMENT 'rule creation status', - PRIMARY KEY (`id`), - CONSTRAINT `uc_security_group_rule__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`security_group_vm_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `security_group_id` bigint unsigned NOT NULL, - `instance_id` bigint unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_nwgrp_work` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance that needs rules to be synced.', - `mgmt_server_id` bigint unsigned COMMENT 'management server that has taken up the work of doing rule sync', - `created` datetime NOT NULL COMMENT 'time the entry was requested', - `taken` datetime COMMENT 'time it was taken by the management server', - `step` varchar(32) NOT NULL COMMENT 'Step in the work', - `seq_no` bigint unsigned COMMENT 'seq number to be sent to agent, uniquely identifies ruleset update', - PRIMARY KEY (`id`), - INDEX `i_op_nwgrp_work__instance_id`(`instance_id`), - INDEX `i_op_nwgrp_work__mgmt_server_id`(`mgmt_server_id`), - INDEX `i_op_nwgrp_work__taken`(`taken`), - INDEX `i_op_nwgrp_work__step`(`step`), - INDEX `i_op_nwgrp_work__seq_no`(`seq_no`) -) ENGINE=MEMORY DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_vm_ruleset_log` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', - `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance that needs rules to be synced.', - `created` datetime NOT NULL COMMENT 'time the entry was requested', - `logsequence` bigint unsigned COMMENT 'seq number to be sent to agent, uniquely identifies ruleset update', - PRIMARY KEY (`id`), - UNIQUE `u_op_vm_ruleset_log__instance_id`(`instance_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`instance_group` ( - `id` bigint unsigned NOT NULL UNIQUE auto_increment, - `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', - `name` varchar(255) NOT NULL, - `uuid` varchar(40), - `removed` datetime COMMENT 'date the group was removed', - `created` datetime COMMENT 'date the group was created', - PRIMARY KEY (`id`), - INDEX `i_instance_group__removed`(`removed`), - CONSTRAINT `uc_instance_group__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`instance_group_vm_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `group_id` bigint unsigned NOT NULL, - `instance_id` bigint unsigned NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`ssh_keypairs` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `account_id` bigint unsigned NOT NULL COMMENT 'owner, foreign key to account table', - `domain_id` bigint unsigned NOT NULL COMMENT 'domain, foreign key to domain table', - `keypair_name` varchar(256) NOT NULL COMMENT 'name of the key pair', - `fingerprint` varchar(128) NOT NULL COMMENT 'fingerprint for the ssh public key', - `public_key` varchar(5120) NOT NULL COMMENT 'public key of the ssh key pair', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`usage_event` ( - `id` bigint unsigned NOT NULL auto_increment, - `type` varchar(32) NOT NULL, - `account_id` bigint unsigned NOT NULL, - `created` datetime NOT NULL, - `zone_id` bigint unsigned NOT NULL, - `resource_id` bigint unsigned, - `resource_name` varchar(255), - `offering_id` bigint unsigned, - `template_id` bigint unsigned, - `size` bigint unsigned, - `resource_type` varchar(32), - `processed` tinyint NOT NULL default '0', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`ovs_tunnel_interface` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `ip` varchar(16) DEFAULT NULL, - `netmask` varchar(16) DEFAULT NULL, - `mac` varchar(18) DEFAULT NULL, - `host_id` bigint DEFAULT NULL, - `label` varchar(45) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO `cloud`.`ovs_tunnel_interface` (`ip`, `netmask`, `mac`, `host_id`, `label`) VALUES ('0', '0', '0', 0, 'lock'); - -CREATE TABLE `cloud`.`ovs_tunnel_network`( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, - `from` bigint unsigned COMMENT 'from host id', - `to` bigint unsigned COMMENT 'to host id', - `network_id` bigint unsigned COMMENT 'network identifier', - `key` int unsigned COMMENT 'gre key', - `port_name` varchar(32) COMMENT 'in port on open vswitch', - `state` varchar(16) default 'FAILED' COMMENT 'result of tunnel creatation', - PRIMARY KEY(`from`, `to`, `network_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO `cloud`.`ovs_tunnel_network` (`from`, `to`, `network_id`, `key`, `port_name`, `state`) VALUES (0, 0, 0, 0, 'lock', 'SUCCESS'); - -CREATE TABLE `cloud`.`storage_pool_work` ( - `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', - `pool_id` bigint unsigned NOT NULL COMMENT 'storage pool associated with the vm', - `vm_id` bigint unsigned NOT NULL COMMENT 'vm identifier', - `stopped_for_maintenance` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'this flag denoted whether the vm was stopped during maintenance', - `started_after_maintenance` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'this flag denoted whether the vm was started after maintenance', - `mgmt_server_id` bigint unsigned NOT NULL COMMENT 'management server id', - PRIMARY KEY (`id`), - UNIQUE (pool_id,vm_id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`data_center_details` ( - `id` bigint unsigned NOT NULL auto_increment, - `dc_id` bigint unsigned NOT NULL COMMENT 'dc id', - `name` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`id`), - CONSTRAINT `fk_dc_details__dc_id` FOREIGN KEY (`dc_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`domain_network_ref` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', - `network_id` bigint unsigned NOT NULL COMMENT 'network id', - `subdomain_access` int(1) unsigned COMMENT '1 if network can be accessible from the subdomain', - PRIMARY KEY (`id`), - CONSTRAINT `fk_domain_network_ref__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_domain_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`cmd_exec_log` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `host_id` bigint unsigned NOT NULL COMMENT 'host id of the system VM agent that command is sent to', - `instance_id` bigint unsigned NOT NULL COMMENT 'instance id of the system VM that command is executed on', - `command_name` varchar(255) NOT NULL COMMENT 'command name', - `weight` integer NOT NULL DEFAULT 1 COMMENT 'command weight in consideration of the load factor added to host that is executing the command', - `created` datetime NOT NULL COMMENT 'date created', - PRIMARY KEY (`id`), - INDEX `i_cmd_exec_log__host_id`(`host_id`), - INDEX `i_cmd_exec_log__instance_id`(`instance_id`), - CONSTRAINT `fk_cmd_exec_log_ref__inst_id` FOREIGN KEY (`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`keystore` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `name` varchar(64) NOT NULL COMMENT 'unique name for the certifiation', - `certificate` text NOT NULL COMMENT 'the actual certificate being stored in the db', - `key` text COMMENT 'private key associated wih the certificate', - `domain_suffix` varchar(256) NOT NULL COMMENT 'DNS domain suffix associated with the certificate', - `seq` int, - PRIMARY KEY (`id`), - UNIQUE(name) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`swift` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT, - `uuid` varchar(40), - `url` varchar(255) NOT NULL, - `account` varchar(255) NOT NULL COMMENT ' account in swift', - `username` varchar(255) NOT NULL COMMENT ' username in swift', - `key` varchar(255) NOT NULL COMMENT 'token for this user', - `created` datetime COMMENT 'date the swift first signed on', - PRIMARY KEY (`id`), - CONSTRAINT `uc_swift__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`op_host_transfer` ( - `id` bigint unsigned UNIQUE NOT NULL COMMENT 'Id of the host', - `initial_mgmt_server_id` bigint unsigned COMMENT 'management server the host is transfered from', - `future_mgmt_server_id` bigint unsigned COMMENT 'management server the host is transfered to', - `state` varchar(32) NOT NULL COMMENT 'the transfer state of the host', - `created` datetime NOT NULL COMMENT 'date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_op_host_transfer__id` FOREIGN KEY `fk_op_host_transfer__id` (`id`) REFERENCES `host` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_op_host_transfer__initial_mgmt_server_id` FOREIGN KEY `fk_op_host_transfer__initial_mgmt_server_id`(`initial_mgmt_server_id`) REFERENCES `mshost`(`msid`), - CONSTRAINT `fk_op_host_transfer__future_mgmt_server_id` FOREIGN KEY `fk_op_host_transfer__future_mgmt_server_id`(`future_mgmt_server_id`) REFERENCES `mshost`(`msid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`projects` ( - `id` bigint unsigned NOT NULL auto_increment, - `name` varchar(255) COMMENT 'project name', - `uuid` varchar(40), - `display_text` varchar(255) COMMENT 'project name', - `project_account_id` bigint unsigned NOT NULL, - `domain_id` bigint unsigned NOT NULL, - `created` datetime COMMENT 'date created', - `removed` datetime COMMENT 'date removed', - `state` varchar(255) NOT NULL COMMENT 'state of the project (Active/Inactive/Suspended)', - PRIMARY KEY (`id`), - CONSTRAINT `fk_projects__project_account_id` FOREIGN KEY(`project_account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_projects__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - INDEX `i_projects__removed`(`removed`), - CONSTRAINT `uc_projects__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`project_account` ( - `id` bigint unsigned NOT NULL auto_increment, - `account_id` bigint unsigned NOT NULL COMMENT'account id', - `account_role` varchar(255) NOT NULL DEFAULT 'Regular' COMMENT 'Account role in the project (Owner or Regular)', - `project_id` bigint unsigned NOT NULL COMMENT 'project id', - `project_account_id` bigint unsigned NOT NULL, - `created` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_project_account__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_project_account__project_id` FOREIGN KEY(`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_project_account__project_account_id` FOREIGN KEY(`project_account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - UNIQUE (`account_id`, `project_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`project_invitations` ( - `id` bigint unsigned NOT NULL auto_increment, - `uuid` varchar(40), - `project_id` bigint unsigned NOT NULL COMMENT 'project id', - `account_id` bigint unsigned COMMENT 'account id', - `domain_id` bigint unsigned COMMENT 'domain id', - `email` varchar(255) COMMENT 'email', - `token` varchar(255) COMMENT 'token', - `state` varchar(255) NOT NULL DEFAULT 'Pending' COMMENT 'the state of the invitation', - `created` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_project_invitations__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_project_invitations__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_project_invitations__project_id` FOREIGN KEY(`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE, - UNIQUE (`project_id`, `account_id`), - UNIQUE (`project_id`, `email`), - UNIQUE (`project_id`, `token`), - CONSTRAINT `uc_project_invitations__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`elastic_lb_vm_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `ip_addr_id` bigint unsigned NOT NULL, - `elb_vm_id` bigint unsigned NOT NULL, - `lb_id` bigint unsigned, - PRIMARY KEY (`id`), - CONSTRAINT `fk_elastic_lb_vm_map__ip_id` FOREIGN KEY `fk_elastic_lb_vm_map__ip_id` (`ip_addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_elastic_lb_vm_map__elb_vm_id` FOREIGN KEY `fk_elastic_lb_vm_map__elb_vm_id` (`elb_vm_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_elastic_lb_vm_map__lb_id` FOREIGN KEY `fk_elastic_lb_vm_map__lb_id` (`lb_id`) REFERENCES `load_balancing_rules` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `ntwk_offering_service_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `network_offering_id` bigint unsigned NOT NULL COMMENT 'network_offering_id', - `service` varchar(255) NOT NULL COMMENT 'service', - `provider` varchar(255) COMMENT 'service provider', - `created` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_ntwk_offering_service_map__network_offering_id` FOREIGN KEY(`network_offering_id`) REFERENCES `network_offerings`(`id`) ON DELETE CASCADE, - UNIQUE (`network_offering_id`, `service`, `provider`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `ntwk_service_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `network_id` bigint unsigned NOT NULL COMMENT 'network_id', - `service` varchar(255) NOT NULL COMMENT 'service', - `provider` varchar(255) COMMENT 'service provider', - `created` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_ntwk_service_map__network_id` FOREIGN KEY(`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, - UNIQUE (`network_id`, `service`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`physical_network` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(40), - `name` varchar(255) NOT NULL, - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this physical network belongs to', - `vnet` varchar(255), - `speed` varchar(32), - `domain_id` bigint unsigned COMMENT 'foreign key to domain id', - `broadcast_domain_range` varchar(32) NOT NULL DEFAULT 'POD' COMMENT 'range of broadcast domain : POD/ZONE', - `state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'what state is this configuration in', - `created` datetime COMMENT 'date created', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_physical_network__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_physical_network__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), - CONSTRAINT `uc_physical_networks__uuid` UNIQUE (`uuid`), - INDEX `i_physical_network__removed`(`removed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`physical_network_tags` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', - `tag` varchar(255) NOT NULL COMMENT 'tag', - PRIMARY KEY (`id`), - CONSTRAINT `fk_physical_network_tags__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, - UNIQUE KEY(`physical_network_id`, `tag`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`physical_network_isolation_methods` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', - `isolation_method` varchar(255) NOT NULL COMMENT 'isolation method(VLAN, L3 or GRE)', - PRIMARY KEY (`id`), - CONSTRAINT `fk_physical_network_imethods__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, - UNIQUE KEY(`physical_network_id`, `isolation_method`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`physical_network_traffic_types` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(40), - `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', - `traffic_type` varchar(32) NOT NULL COMMENT 'type of traffic going through this network', - `xen_network_label` varchar(255) COMMENT 'The network name label of the physical device dedicated to this traffic on a XenServer host', - `kvm_network_label` varchar(255) DEFAULT 'cloudbr0' COMMENT 'The network name label of the physical device dedicated to this traffic on a KVM host', - `vmware_network_label` varchar(255) DEFAULT 'vSwitch0' COMMENT 'The network name label of the physical device dedicated to this traffic on a VMware host', - `simulator_network_label` varchar(255) COMMENT 'The name labels needed for identifying the simulator', - `ovm_network_label` varchar(255) COMMENT 'The network name label of the physical device dedicated to this traffic on a Ovm host', - `vlan` varchar(255) COMMENT 'The vlan tag to be sent down to a VMware host', - PRIMARY KEY (`id`), - CONSTRAINT `fk_physical_network_traffic_types__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_traffic_types__uuid` UNIQUE (`uuid`), - UNIQUE KEY(`physical_network_id`, `traffic_type`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`physical_network_service_providers` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(40), - `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', - `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name', - `state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'provider state', - `destination_physical_network_id` bigint unsigned COMMENT 'id of the physical network to bridge to', - `vpn_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is VPN service provided', - `dhcp_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is DHCP service provided', - `dns_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is DNS service provided', - `gateway_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Gateway service provided', - `firewall_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Firewall service provided', - `source_nat_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Source NAT service provided', - `load_balance_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is LB service provided', - `static_nat_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Static NAT service provided', - `port_forwarding_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Port Forwarding service provided', - `user_data_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is UserData service provided', - `security_group_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is SG service provided', - `networkacl_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Network ACL service provided', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_pnetwork_service_providers__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_service_providers__uuid` UNIQUE (`uuid`), - UNIQUE KEY(`physical_network_id`, `provider_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`external_load_balancer_devices` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(255) UNIQUE, - `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which load balancer device is added', - `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this load balancer device', - `device_name` varchar(255) NOT NULL COMMENT 'name of the load balancer device', - `capacity` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'Capacity of the load balancer device', - `device_state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'state (enabled/disabled/shutdown) of the device', - `allocation_state` varchar(32) NOT NULL DEFAULT 'Free' COMMENT 'Allocation state (Free/Shared/Dedicated/Provider) of the device', - `is_dedicated` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if device/appliance is provisioned for dedicated use only', - `is_inline` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer will be used in in-line configuration with firewall', - `is_managed` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer appliance is provisioned and its life cycle is managed by by cloudstack', - `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external load balancer device', - `parent_host_id` bigint unsigned COMMENT 'if the load balancer appliance is cloudstack managed, then host id on which this appliance is provisioned', - PRIMARY KEY (`id`), - CONSTRAINT `fk_external_lb_devices_host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_external_lb_devices_parent_host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_external_lb_devices_physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`external_firewall_devices` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(255) UNIQUE, - `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which firewall device is added', - `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this firewall device', - `device_name` varchar(255) NOT NULL COMMENT 'name of the firewall device', - `device_state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'state (enabled/disabled/shutdown) of the device', - `is_dedicated` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if device/appliance meant for dedicated use only', - `allocation_state` varchar(32) NOT NULL DEFAULT 'Free' COMMENT 'Allocation state (Free/Allocated) of the device', - `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external firewall device', - `capacity` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'Capacity of the external firewall device', - PRIMARY KEY (`id`), - CONSTRAINT `fk_external_firewall_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_external_firewall_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`network_external_lb_device_map` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(255) UNIQUE, - `network_id` bigint unsigned NOT NULL COMMENT ' guest network id', - `external_load_balancer_device_id` bigint unsigned NOT NULL COMMENT 'id of external load balancer device assigned for this network', - `created` datetime COMMENT 'Date from when network started using the device', - `removed` datetime COMMENT 'Date till the network stopped using the device ', - PRIMARY KEY (`id`), - CONSTRAINT `fk_network_external_lb_devices_network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_network_external_lb_devices_device_id` FOREIGN KEY (`external_load_balancer_device_id`) REFERENCES `external_load_balancer_devices`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`network_external_firewall_device_map` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(255) UNIQUE, - `network_id` bigint unsigned NOT NULL COMMENT ' guest network id', - `external_firewall_device_id` bigint unsigned NOT NULL COMMENT 'id of external firewall device assigned for this device', - `created` datetime COMMENT 'Date from when network started using the device', - `removed` datetime COMMENT 'Date till the network stopped using the device ', - PRIMARY KEY (`id`), - CONSTRAINT `fk_network_external_firewall_devices_network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_network_external_firewall_devices_device_id` FOREIGN KEY (`external_firewall_device_id`) REFERENCES `external_firewall_devices`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`virtual_router_providers` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `nsp_id` bigint unsigned NOT NULL COMMENT 'Network Service Provider ID', - `uuid` varchar(40), - `type` varchar(255) NOT NULL COMMENT 'Virtual router, or ElbVM', - `enabled` int(1) NOT NULL COMMENT 'Enabled or disabled', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_virtual_router_providers__nsp_id` FOREIGN KEY (`nsp_id`) REFERENCES `physical_network_service_providers` (`id`) ON DELETE CASCADE, - CONSTRAINT `uc_virtual_router_providers__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`op_user_stats_log` ( - `user_stats_id` bigint unsigned NOT NULL, - `net_bytes_received` bigint unsigned NOT NULL default '0', - `net_bytes_sent` bigint unsigned NOT NULL default '0', - `current_bytes_received` bigint unsigned NOT NULL default '0', - `current_bytes_sent` bigint unsigned NOT NULL default '0', - `agg_bytes_received` bigint unsigned NOT NULL default '0', - `agg_bytes_sent` bigint unsigned NOT NULL default '0', - `updated` datetime COMMENT 'stats update timestamp', - UNIQUE KEY (`user_stats_id`, `updated`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`cluster_vsm_map` ( - `cluster_id` bigint unsigned NOT NULL, - `vsm_id` bigint unsigned NOT NULL, - PRIMARY KEY (`cluster_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`virtual_supervisor_module` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `host_id` bigint NOT NULL, - `vsm_name` varchar(255), - `username` varchar(255) NOT NULL, - `password` varchar(255) NOT NULL, - `ipaddr` varchar(80) NOT NULL, - `management_vlan` int(32), - `control_vlan` int(32), - `packet_vlan` int(32), - `storage_vlan` int(32), - `vsm_domain_id` bigint unsigned, - `config_mode` varchar(20), - `config_state` varchar(20), - `vsm_device_state` varchar(20) NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`port_profile` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `port_profile_name` varchar(255), - `port_mode` varchar(10), - `vsm_id` bigint unsigned NOT NULL, - `trunk_low_vlan_id` int, - `trunk_high_vlan_id` int, - `access_vlan_id` int, - `port_type` varchar(20) NOT NULL, - `port_binding` varchar(20), - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`s2s_vpn_gateway` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `addr_id` bigint unsigned NOT NULL, - `vpc_id` bigint unsigned NOT NULL, - `domain_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_s2s_vpn_gateway__addr_id` FOREIGN KEY (`addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_vpn_gateway__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_vpn_gateway__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_vpn_gateway__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_s2s_vpn_gateway__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`s2s_customer_gateway` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `gateway_ip` char(40) NOT NULL, - `guest_cidr_list` varchar(200) NOT NULL, - `ipsec_psk` varchar(256), - `ike_policy` varchar(30) NOT NULL, - `esp_policy` varchar(30) NOT NULL, - `lifetime` int, - `domain_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_s2s_customer_gateway__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_customer_gateway__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_s2s_customer_gateway__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`s2s_vpn_connection` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `vpn_gateway_id` bigint unsigned NULL, - `customer_gateway_id` bigint unsigned NULL, - `state` varchar(32) NOT NULL, - `domain_id` bigint unsigned NOT NULL, - `account_id` bigint unsigned NOT NULL, - `created` datetime NOT NULL COMMENT 'date created', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_s2s_vpn_connection__vpn_gateway_id` FOREIGN KEY (`vpn_gateway_id`) REFERENCES `s2s_vpn_gateway` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_vpn_connection__customer_gateway_id` FOREIGN KEY (`customer_gateway_id`) REFERENCES `s2s_customer_gateway` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_vpn_connection__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_s2s_vpn_connection__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_s2s_vpn_connection__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`resource_tags` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `key` varchar(255), - `value` varchar(255), - `resource_id` bigint unsigned NOT NULL, - `resource_uuid` varchar(40), - `resource_type` varchar(255), - `customer` varchar(255), - `domain_id` bigint unsigned NOT NULL COMMENT 'foreign key to domain id', - `account_id` bigint unsigned NOT NULL COMMENT 'owner of this network', - PRIMARY KEY (`id`), - CONSTRAINT `fk_tags__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), - CONSTRAINT `fk_tags__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), - UNIQUE `i_tags__resource_id__resource_type__key`(`resource_id`, `resource_type`, `key`), - CONSTRAINT `uc_resource_tags__uuid` UNIQUE (`uuid`) - ) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vpc` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40) NOT NULL, - `name` varchar(255) COMMENT 'vpc name', - `display_text` varchar(255) COMMENT 'vpc display text', - `cidr` varchar(18) COMMENT 'vpc cidr', - `vpc_offering_id` bigint unsigned NOT NULL COMMENT 'vpc offering id that this vpc is created from', - `zone_id` bigint unsigned NOT NULL COMMENT 'the id of the zone this Vpc belongs to', - `state` varchar(32) NOT NULL COMMENT 'state of the VP (can be Enabled and Disabled)', - `domain_id` bigint unsigned NOT NULL COMMENT 'domain the vpc belongs to', - `account_id` bigint unsigned NOT NULL COMMENT 'owner of this vpc', - `network_domain` varchar(255) COMMENT 'network domain', - `removed` datetime COMMENT 'date removed if not null', - `created` datetime NOT NULL COMMENT 'date created', - `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the VPC', - PRIMARY KEY (`id`), - INDEX `i_vpc__removed`(`removed`), - CONSTRAINT `fk_vpc__zone_id` FOREIGN KEY `fk_vpc__zone_id` (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_vpc__vpc_offering_id` FOREIGN KEY (`vpc_offering_id`) REFERENCES `vpc_offerings`(`id`), - CONSTRAINT `fk_vpc__account_id` FOREIGN KEY `fk_vpc__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_vpc__domain_id` FOREIGN KEY `fk_vpc__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`vpc_offerings` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40) NOT NULL, - `unique_name` varchar(64) UNIQUE COMMENT 'unique name of the vpc offering', - `name` varchar(255) COMMENT 'vpc name', - `display_text` varchar(255) COMMENT 'display text', - `state` char(32) COMMENT 'state of the vpc offering that has Disabled value by default', - `default` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if vpc offering is default', - `removed` datetime COMMENT 'date removed if not null', - `created` datetime NOT NULL COMMENT 'date created', - `service_offering_id` bigint unsigned COMMENT 'service offering id that virtual router is tied to', - PRIMARY KEY (`id`), - INDEX `i_vpc__removed`(`removed`), - CONSTRAINT `fk_vpc_offerings__service_offering_id` FOREIGN KEY `fk_vpc_offerings__service_offering_id` (`service_offering_id`) REFERENCES `service_offering`(`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`vpc_offering_service_map` ( - `id` bigint unsigned NOT NULL auto_increment, - `vpc_offering_id` bigint unsigned NOT NULL COMMENT 'vpc_offering_id', - `service` varchar(255) NOT NULL COMMENT 'service', - `provider` varchar(255) COMMENT 'service provider', - `created` datetime COMMENT 'date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_vpc_offering_service_map__vpc_offering_id` FOREIGN KEY(`vpc_offering_id`) REFERENCES `vpc_offerings`(`id`) ON DELETE CASCADE, - UNIQUE (`vpc_offering_id`, `service`, `provider`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`router_network_ref` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', - `router_id` bigint unsigned NOT NULL COMMENT 'router id', - `network_id` bigint unsigned NOT NULL COMMENT 'network id', - `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', - PRIMARY KEY (`id`), - CONSTRAINT `fk_router_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, - UNIQUE `i_router_network_ref__router_id__network_id`(`router_id`, `network_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`vpc_gateways` ( - `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', - `uuid` varchar(40), - `ip4_address` char(40) COMMENT 'ip4 address of the gateway', - `netmask` varchar(15) COMMENT 'netmask of the gateway', - `gateway` varchar(15) COMMENT 'gateway', - `vlan_tag` varchar(255), - `type` varchar(32) COMMENT 'type of gateway; can be Public/Private/Vpn', - `network_id` bigint unsigned NOT NULL COMMENT 'network id vpc gateway belongs to', - `vpc_id` bigint unsigned NOT NULL COMMENT 'id of the vpc the gateway belongs to', - `zone_id` bigint unsigned NOT NULL COMMENT 'id of the zone the gateway belongs to', - `created` datetime COMMENT 'date created', - `account_id` bigint unsigned NOT NULL COMMENT 'owner id', - `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', - `state` varchar(32) NOT NULL COMMENT 'what state the vpc gateway in', - `removed` datetime COMMENT 'date removed if not null', - PRIMARY KEY (`id`), - CONSTRAINT `fk_vpc_gateways__network_id` FOREIGN KEY `fk_vpc_gateways__network_id`(`network_id`) REFERENCES `networks`(`id`), - CONSTRAINT `fk_vpc_gateways__vpc_id` FOREIGN KEY `fk_vpc_gateways__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`), - CONSTRAINT `fk_vpc_gateways__zone_id` FOREIGN KEY `fk_vpc_gateways__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), - CONSTRAINT `fk_vpc_gateways__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_vpc_gateways__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_vpc_gateways__uuid` UNIQUE (`uuid`), - INDEX `i_vpc_gateways__removed`(`removed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -CREATE TABLE `cloud`.`private_ip_address` ( - `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', - `ip_address` char(40) NOT NULL COMMENT 'ip address', - `network_id` bigint unsigned NOT NULL COMMENT 'id of the network ip belongs to', - `reservation_id` char(40) COMMENT 'reservation id', - `mac_address` varchar(17) COMMENT 'mac address', - `vpc_id` bigint unsigned COMMENT 'vpc this ip belongs to', - `taken` datetime COMMENT 'Date taken', - PRIMARY KEY (`id`), - CONSTRAINT `fk_private_ip_address__vpc_id` FOREIGN KEY `fk_private_ip_address__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`), - CONSTRAINT `fk_private_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -CREATE TABLE `cloud`.`static_routes` ( - `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', - `uuid` varchar(40), - `vpc_gateway_id` bigint unsigned COMMENT 'id of the corresponding ip address', - `cidr` varchar(18) COMMENT 'cidr for the static route', - `state` char(32) NOT NULL COMMENT 'current state of this rule', - `vpc_id` bigint unsigned COMMENT 'vpc the firewall rule is associated with', - `account_id` bigint unsigned NOT NULL COMMENT 'owner id', - `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', - `created` datetime COMMENT 'Date created', - PRIMARY KEY (`id`), - CONSTRAINT `fk_static_routes__vpc_gateway_id` FOREIGN KEY(`vpc_gateway_id`) REFERENCES `vpc_gateways`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_static_routes__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_static_routes__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `fk_static_routes__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_static_routes__uuid` UNIQUE (`uuid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - - -SET foreign_key_checks = 1; - +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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. +# +# Automatically generated by addcopyright.py at 04/03/2012 +SET foreign_key_checks = 0; +use cloud; + +DROP VIEW IF EXISTS `cloud`.`port_forwarding_rules_view`; +DROP TABLE IF EXISTS `cloud`.`configuration`; +DROP TABLE IF EXISTS `cloud`.`ip_forwarding`; +DROP TABLE IF EXISTS `cloud`.`management_agent`; +DROP TABLE IF EXISTS `cloud`.`host`; +DROP TABLE IF EXISTS `cloud`.`mshost`; +DROP TABLE IF EXISTS `cloud`.`service_offering`; +DROP TABLE IF EXISTS `cloud`.`user`; +DROP TABLE IF EXISTS `cloud`.`user_ip_address`; +DROP TABLE IF EXISTS `cloud`.`user_statistics`; +DROP TABLE IF EXISTS `cloud`.`vm_template`; +DROP TABLE IF EXISTS `cloud`.`vm_instance`; +DROP TABLE IF EXISTS `cloud`.`domain_router`; +DROP TABLE IF EXISTS `cloud`.`event`; +DROP TABLE IF EXISTS `cloud`.`host_details`; +DROP TABLE IF EXISTS `cloud`.`host_pod_ref`; +DROP TABLE IF EXISTS `cloud`.`host_zone_ref`; +DROP TABLE IF EXISTS `cloud`.`data_ceneter`; +DROP TABLE IF EXISTS `cloud`.`volumes`; +DROP TABLE IF EXISTS `cloud`.`storage`; +DROP TABLE IF EXISTS `cloud`.`data_center`; +DROP TABLE IF EXISTS `cloud`.`pricing`; +DROP TABLE IF EXISTS `cloud`.`sequence`; +DROP TABLE IF EXISTS `cloud`.`user_vm`; +DROP TABLE IF EXISTS `cloud`.`template_host_ref`; +DROP TABLE IF EXISTS `cloud`.`volume_host_ref`; +DROP TABLE IF EXISTS `cloud`.`upload`; +DROP TABLE IF EXISTS `cloud`.`template_zone_ref`; +DROP TABLE IF EXISTS `cloud`.`dc_vnet_alloc`; +DROP TABLE IF EXISTS `cloud`.`dc_ip_address_alloc`; +DROP TABLE IF EXISTS `cloud`.`vlan`; +DROP TABLE IF EXISTS `cloud`.`host_vlan_map`; +DROP TABLE IF EXISTS `cloud`.`pod_vlan_map`; +DROP TABLE IF EXISTS `cloud`.`vm_host`; +DROP TABLE IF EXISTS `cloud`.`op_ha_work`; +DROP TABLE IF EXISTS `cloud`.`op_dc_vnet_alloc`; +DROP TABLE IF EXISTS `cloud`.`op_dc_ip_address_alloc`; +DROP TABLE IF EXISTS `cloud`.`op_vm_host`; +DROP TABLE IF EXISTS `cloud`.`op_host_queue`; +DROP TABLE IF EXISTS `cloud`.`console_proxy`; +DROP TABLE IF EXISTS `cloud`.`secondary_storage_vm`; +DROP TABLE IF EXISTS `cloud`.`domain`; +DROP TABLE IF EXISTS `cloud`.`account`; +DROP TABLE IF EXISTS `cloud`.`limit`; +DROP TABLE IF EXISTS `cloud`.`op_host_capacity`; +DROP TABLE IF EXISTS `cloud`.`alert`; +DROP TABLE IF EXISTS `cloud`.`op_lock`; +DROP TABLE IF EXISTS `cloud`.`op_host_upgrade`; +DROP TABLE IF EXISTS `cloud`.`snapshots`; +DROP TABLE IF EXISTS `cloud`.`scheduled_volume_backups`; +DROP TABLE IF EXISTS `cloud`.`disk_offering`; +DROP TABLE IF EXISTS `cloud`.`security_group`; +DROP TABLE IF EXISTS `cloud`.`network_rule_config`; +DROP TABLE IF EXISTS `cloud`.`host_details`; +DROP TABLE IF EXISTS `cloud`.`launch_permission`; +DROP TABLE IF EXISTS `cloud`.`resource_limit`; +DROP TABLE IF EXISTS `cloud`.`async_job`; +DROP TABLE IF EXISTS `cloud`.`sync_queue`; +DROP TABLE IF EXISTS `cloud`.`sync_queue_item`; +DROP TABLE IF EXISTS `cloud`.`security_group_vm_map`; +DROP TABLE IF EXISTS `cloud`.`load_balancer_vm_map`; +DROP TABLE IF EXISTS `cloud`.`load_balancer_stickiness_policies`; +DROP TABLE IF EXISTS `cloud`.`load_balancer_inline_ip_map`; +DROP TABLE IF EXISTS `cloud`.`storage_pool`; +DROP TABLE IF EXISTS `cloud`.`storage_pool_host_ref`; +DROP TABLE IF EXISTS `cloud`.`template_spool_ref`; +DROP TABLE IF EXISTS `cloud`.`guest_os`; +DROP TABLE IF EXISTS `cloud`.`snapshot_policy`; +DROP TABLE IF EXISTS `cloud`.`snapshot_policy_ref`; +DROP TABLE IF EXISTS `cloud`.`snapshot_schedule`; +DROP TABLE IF EXISTS `cloud`.`op_pod_vlan_alloc`; +DROP TABLE IF EXISTS `cloud`.`storage_pool_details`; +DROP TABLE IF EXISTS `cloud`.`cluster`; +DROP TABLE IF EXISTS `cloud`.`nics`; +DROP TABLE IF EXISTS `cloud`.`networks`; +DROP TABLE IF EXISTS `cloud`.`op_networks`; +DROP TABLE IF EXISTS `cloud`.`network_offerings`; +DROP TABLE IF EXISTS `cloud`.`account_network_ref`; +DROP TABLE IF EXISTS `cloud`.`domain_network_ref`; +DROP TABLE IF EXISTS `cloud`.`instance_group`; +DROP TABLE IF EXISTS `cloud`.`instance_group_vm_map`; +DROP TABLE IF EXISTS `cloud`.`op_it_work`; +DROP TABLE IF EXISTS `cloud`.`load_balancing_ip_map`; +DROP TABLE IF EXISTS `cloud`.`load_balancing_rules`; +DROP TABLE IF EXISTS `cloud`.`port_forwarding_rules`; +DROP TABLE IF EXISTS `cloud`.`firewall_rules`; +DROP TABLE IF EXISTS `cloud`.`firewall_rules_cidrs`; +DROP TABLE IF EXISTS `cloud`.`ssh_keypairs`; +DROP TABLE IF EXISTS `cloud`.`usage_event`; +DROP TABLE IF EXISTS `cloud`.`host_tags`; +DROP TABLE IF EXISTS `cloud`.`version`; +DROP TABLE IF EXISTS `cloud`.`account_vlan_map`; +DROP TABLE IF EXISTS `cloud`.`cluster_details`; +DROP TABLE IF EXISTS `cloud`.`guest_os_category`; +DROP TABLE IF EXISTS `cloud`.`guest_os_hypervisor`; +DROP TABLE IF EXISTS `cloud`.`op_dc_link_local_ip_address_alloc`; +DROP TABLE IF EXISTS `cloud`.`op_host`; +DROP TABLE IF EXISTS `cloud`.`op_nwgrp_work`; +DROP TABLE IF EXISTS `cloud`.`op_vm_ruleset_log`; +DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_network`; +DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_interface`; +DROP TABLE IF EXISTS `cloud`.`remote_access_vpn`; +DROP TABLE IF EXISTS `cloud`.`resource_count`; +DROP TABLE IF EXISTS `cloud`.`security_ingress_rule`; +DROP TABLE IF EXISTS `cloud`.`security_group_rule`; +DROP TABLE IF EXISTS `cloud`.`stack_maid`; +DROP TABLE IF EXISTS `cloud`.`storage_pool_work`; +DROP TABLE IF EXISTS `cloud`.`user_vm_details`; +DROP TABLE IF EXISTS `cloud`.`vpn_users`; +DROP TABLE IF EXISTS `cloud`.`data_center_details`; +DROP TABLE IF EXISTS `cloud`.`network_tags`; +DROP TABLE IF EXISTS `cloud`.`op_host_transfer`; +DROP TABLE IF EXISTS `cloud`.`projects`; +DROP TABLE IF EXISTS `cloud`.`physical_network`; +DROP TABLE IF EXISTS `cloud`.`physical_network_tags`; +DROP TABLE IF EXISTS `cloud`.`physical_network_isolation_methods`; +DROP TABLE IF EXISTS `cloud`.`physical_network_traffic_types`; +DROP TABLE IF EXISTS `cloud`.`physical_network_service_providers`; +DROP TABLE IF EXISTS `cloud`.`virtual_router_elements`; +DROP TABLE IF EXISTS `cloud`.`dc_storage_network_ip_range`; +DROP TABLE IF EXISTS `cloud`.`op_dc_storage_network_ip_address`; +DROP TABLE IF EXISTS `cloud`.`cluster_vsm_map`; +DROP TABLE IF EXISTS `cloud`.`virtual_supervisor_module`; +DROP TABLE IF EXISTS `cloud`.`port_profile`; +DROP TABLE IF EXISTS `cloud`.`s2s_customer_gateway`; +DROP TABLE IF EXISTS `cloud`.`s2s_vpn_gateway`; +DROP TABLE IF EXISTS `cloud`.`s2s_vpn_connection`; +DROP TABLE IF EXISTS `cloud`.`autoscale_vmgroup_policy_map`; +DROP TABLE IF EXISTS `cloud`.`autoscale_policy_condition_map`; +DROP TABLE IF EXISTS `cloud`.`autoscale_vmgroups`; +DROP TABLE IF EXISTS `cloud`.`autoscale_vmprofiles`; +DROP TABLE IF EXISTS `cloud`.`autoscale_policies`; +DROP TABLE IF EXISTS `cloud`.`counter`; +DROP TABLE IF EXISTS `cloud`.`conditions`; + + +CREATE TABLE `cloud`.`version` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `version` char(40) NOT NULL UNIQUE COMMENT 'version', + `updated` datetime NOT NULL COMMENT 'Date this version table was updated', + `step` char(32) NOT NULL COMMENT 'Step in the upgrade to this version', + PRIMARY KEY (`id`), + INDEX `i_version__version`(`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `version` (`version`, `updated`, `step`) VALUES('@VERSION@', now(), 'Complete'); + +CREATE TABLE `cloud`.`op_it_work` ( + `id` char(40) COMMENT 'reservation id', + `mgmt_server_id` bigint unsigned COMMENT 'management server id', + `created_at` bigint unsigned NOT NULL COMMENT 'when was this work detail created', + `thread` varchar(255) NOT NULL COMMENT 'thread name', + `type` char(32) NOT NULL COMMENT 'type of work', + `vm_type` char(32) NOT NULL COMMENT 'type of vm', + `step` char(32) NOT NULL COMMENT 'state', + `updated_at` bigint unsigned NOT NULL COMMENT 'time it was taken over', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance', + `resource_type` char(32) COMMENT 'type of resource being worked on', + `resource_id` bigint unsigned COMMENT 'resource id being worked on', + PRIMARY KEY (`id`), + CONSTRAINT `fk_op_it_work__mgmt_server_id` FOREIGN KEY (`mgmt_server_id`) REFERENCES `mshost`(`msid`), + CONSTRAINT `fk_op_it_work__instance_id` FOREIGN KEY (`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE, + INDEX `i_op_it_work__step`(`step`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_networks`( + `id` bigint unsigned NOT NULL UNIQUE KEY, + `mac_address_seq` bigint unsigned NOT NULL DEFAULT 1 COMMENT 'mac address', + `nics_count` int unsigned NOT NULL DEFAULT 0 COMMENT '# of nics', + `gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'gc this network or not', + `check_for_gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'check this network for gc or not', + PRIMARY KEY(`id`), + CONSTRAINT `fk_op_networks__id` FOREIGN KEY (`id`) REFERENCES `networks`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`networks` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(255) COMMENT 'name for this network', + `uuid` varchar(40), + `display_text` varchar(255) COMMENT 'display text for this network', + `traffic_type` varchar(32) NOT NULL COMMENT 'type of traffic going through this network', + `broadcast_domain_type` varchar(32) NOT NULL COMMENT 'type of broadcast domain used', + `broadcast_uri` varchar(255) COMMENT 'broadcast domain specifier', + `gateway` varchar(15) COMMENT 'gateway for this network configuration', + `cidr` varchar(18) COMMENT 'network cidr', + `mode` varchar(32) COMMENT 'How to retrieve ip address in this network', + `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id that this configuration is created from', + `physical_network_id` bigint unsigned COMMENT 'physical network id that this configuration is based on', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this configuration is used in', + `guru_name` varchar(255) NOT NULL COMMENT 'who is responsible for this type of network configuration', + `state` varchar(32) NOT NULL COMMENT 'what state is this configuration in', + `related` bigint unsigned NOT NULL COMMENT 'related to what other network configuration', + `domain_id` bigint unsigned NOT NULL COMMENT 'foreign key to domain id', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this network', + `dns1` varchar(255) COMMENT 'comma separated DNS list', + `dns2` varchar(255) COMMENT 'comma separated DNS list', + `guru_data` varchar(1024) COMMENT 'data stored by the network guru that setup this network', + `set_fields` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'which fields are set already', + `acl_type` varchar(15) COMMENT 'ACL access type. Null for system networks, can be Account/Domain for Guest networks', + `network_domain` varchar(255) COMMENT 'domain', + `reservation_id` char(40) COMMENT 'reservation id', + `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', + `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the network', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + `specify_ip_ranges` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network provides an ability to define ip ranges', + `vpc_id` bigint unsigned COMMENT 'vpc this network belongs to', + PRIMARY KEY (`id`), + CONSTRAINT `fk_networks__network_offering_id` FOREIGN KEY (`network_offering_id`) REFERENCES `network_offerings`(`id`), + CONSTRAINT `fk_networks__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_networks__related` FOREIGN KEY(`related`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_networks__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), + CONSTRAINT `fk_networks__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), + CONSTRAINT `fk_networks__vpc_id` FOREIGN KEY(`vpc_id`) REFERENCES `vpc`(`id`), + CONSTRAINT `uc_networks__uuid` UNIQUE (`uuid`), + INDEX `i_networks__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`account_network_ref` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `account_id` bigint unsigned NOT NULL COMMENT 'account id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + `is_owner` smallint(1) NOT NULL COMMENT 'is the owner of the network', + PRIMARY KEY (`id`), + CONSTRAINT `fk_account_network_ref__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_account_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`nics` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `instance_id` bigint unsigned COMMENT 'vm instance id', + `mac_address` varchar(17) COMMENT 'mac address', + `ip4_address` char(40) COMMENT 'ip4 address', + `netmask` varchar(15) COMMENT 'netmask for ip4 address', + `gateway` varchar(15) COMMENT 'gateway', + `ip_type` varchar(32) COMMENT 'type of ip', + `broadcast_uri` varchar(255) COMMENT 'broadcast uri', + `network_id` bigint unsigned NOT NULL COMMENT 'network configuration id', + `mode` varchar(32) COMMENT 'mode of getting ip address', + `state` varchar(32) NOT NULL COMMENT 'state of the creation', + `strategy` varchar(32) NOT NULL COMMENT 'reservation strategy', + `reserver_name` varchar(255) COMMENT 'Name of the component that reserved the ip address', + `reservation_id` varchar(64) COMMENT 'id for the reservation', + `device_id` int(10) COMMENT 'device id for the network when plugged into the virtual machine', + `update_time` timestamp NOT NULL COMMENT 'time the state was changed', + `isolation_uri` varchar(255) COMMENT 'id for isolation', + `ip6_address` char(40) COMMENT 'ip6 address', + `default_nic` tinyint NOT NULL COMMENT "None", + `vm_type` varchar(32) COMMENT 'type of vm: System or User vm', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_nics__instance_id` FOREIGN KEY `fk_nics__instance_id`(`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_nics__networks_id` FOREIGN KEY `fk_nics__networks_id`(`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `uc_nics__uuid` UNIQUE (`uuid`), + INDEX `i_nics__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`network_offerings` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `name` varchar(64) COMMENT 'name of the network offering', + `uuid` varchar(40), + `unique_name` varchar(64) UNIQUE COMMENT 'unique name of the network offering', + `display_text` varchar(255) NOT NULL COMMENT 'text to display to users', + `nw_rate` smallint unsigned COMMENT 'network rate throttle mbits/s', + `mc_rate` smallint unsigned COMMENT 'mcast rate throttle mbits/s', + `traffic_type` varchar(32) NOT NULL COMMENT 'traffic type carried on this network', + `tags` varchar(4096) COMMENT 'tags supported by this offering', + `system_only` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this network offering for system use only', + `specify_vlan` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Should the user specify vlan', + `service_offering_id` bigint unsigned COMMENT 'service offering id that virtual router is tied to', + `conserve_mode` int(1) unsigned NOT NULL DEFAULT 1 COMMENT 'Is this network offering is IP conserve mode enabled', + `created` datetime NOT NULL COMMENT 'time the entry was created', + `removed` datetime DEFAULT NULL COMMENT 'time the entry was removed', + `default` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if network offering is default', + `availability` varchar(255) NOT NULL COMMENT 'availability of the network', + `dedicated_lb_service` int(1) unsigned NOT NULL DEFAULT 1 COMMENT 'true if the network offering provides a dedicated load balancer for each network', + `shared_source_nat_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides the shared source nat service', + `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', + `redundant_router_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides the redundant router service', + `state` char(32) COMMENT 'state of the network offering that has Disabled value by default', + `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', + `elastic_ip_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides elastic ip service', + `elastic_lb_service` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides elastic lb service', + `specify_ip_ranges` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides an ability to define ip ranges', + PRIMARY KEY (`id`), + INDEX `i_network_offerings__system_only`(`system_only`), + INDEX `i_network_offerings__removed`(`removed`), + CONSTRAINT `uc_network_offerings__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`cluster` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `name` varchar(255) COMMENT 'name for the cluster', + `uuid` varchar(40) COMMENT 'uuid is different with following guid, while the later one is generated by hypervisor resource', + `guid` varchar(255) UNIQUE DEFAULT NULL COMMENT 'guid for the cluster', + `pod_id` bigint unsigned NOT NULL COMMENT 'pod id', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id', + `hypervisor_type` varchar(32), + `cluster_type` varchar(64) DEFAULT 'CloudManaged', + `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this cluster enabled for allocation for new resources', + `managed_state` varchar(32) NOT NULL DEFAULT 'Managed' COMMENT 'Is this cluster managed by cloudstack', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_cluster__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `cloud`.`data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_cluster__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `cloud`.`host_pod_ref`(`id`), + UNIQUE `i_cluster__pod_id__name`(`pod_id`, `name`), + INDEX `i_cluster__allocation_state`(`allocation_state`), + INDEX `i_cluster__removed`(`removed`), + CONSTRAINT `uc_cluster__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`cluster_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `cluster_id` bigint unsigned NOT NULL COMMENT 'cluster id', + `name` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_cluster_details__cluster_id` FOREIGN KEY (`cluster_id`) REFERENCES `cluster`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_host_upgrade` ( + `host_id` bigint unsigned NOT NULL UNIQUE COMMENT 'host id', + `version` varchar(20) NOT NULL COMMENT 'version', + `state` varchar(20) NOT NULL COMMENT 'state', + PRIMARY KEY (`host_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_lock` ( + `key` varchar(128) NOT NULL UNIQUE COMMENT 'primary key of the table', + `mac` varchar(17) NOT NULL COMMENT 'management server id of the server that holds this lock', + `ip` char(40) NOT NULL COMMENT 'name of the thread that holds this lock', + `thread` varchar(255) NOT NULL COMMENT 'Thread id that acquired this lock', + `acquired_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Time acquired', + `waiters` int NOT NULL DEFAULT 0 COMMENT 'How many have the thread acquired this lock (reentrant)', + PRIMARY KEY (`key`), + INDEX `i_op_lock__mac_ip_thread`(`mac`, `ip`, `thread`) +) ENGINE=Memory DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`configuration` ( + `category` varchar(255) NOT NULL DEFAULT 'Advanced', + `instance` varchar(255) NOT NULL, + `component` varchar(255) NOT NULL DEFAULT 'management-server', + `name` varchar(255) NOT NULL, + `value` varchar(4095), + `description` varchar(1024), + PRIMARY KEY (`name`), + INDEX `i_configuration__instance`(`instance`), + INDEX `i_configuration__name`(`name`), + INDEX `i_configuration__category`(`category`), + INDEX `i_configuration__component`(`component`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_ha_work` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance that needs to be ha.', + `type` varchar(32) NOT NULL COMMENT 'type of work', + `vm_type` varchar(32) NOT NULL COMMENT 'VM type', + `state` varchar(32) NOT NULL COMMENT 'state of the vm instance when this happened.', + `mgmt_server_id` bigint unsigned COMMENT 'management server that has taken up the work of doing ha', + `host_id` bigint unsigned COMMENT 'host that the vm is suppose to be on', + `created` datetime NOT NULL COMMENT 'time the entry was requested', + `tried` int(10) unsigned COMMENT '# of times tried', + `taken` datetime COMMENT 'time it was taken by the management server', + `step` varchar(32) NOT NULL COMMENT 'Step in the work', + `time_to_try` bigint COMMENT 'time to try do this work', + `updated` bigint unsigned NOT NULL COMMENT 'time the VM state was updated when it was stored into work queue', + PRIMARY KEY (`id`), + CONSTRAINT `fk_op_ha_work__instance_id` FOREIGN KEY `fk_op_ha_work__instance_id` (`instance_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE, + INDEX `i_op_ha_work__instance_id`(`instance_id`), + CONSTRAINT `fk_op_ha_work__host_id` FOREIGN KEY `fk_op_ha_work__host_id` (`host_id`) REFERENCES `host` (`id`), + INDEX `i_op_ha_work__host_id`(`host_id`), + INDEX `i_op_ha_work__step`(`step`), + INDEX `i_op_ha_work__type`(`type`), + CONSTRAINT `fk_op_ha_work__mgmt_server_id` FOREIGN KEY `fk_op_ha_work__mgmt_server_id`(`mgmt_server_id`) REFERENCES `mshost`(`msid`), + INDEX `i_op_ha_work__mgmt_server_id`(`mgmt_server_id`) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`sequence` ( + `name` varchar(64) UNIQUE NOT NULL COMMENT 'name of the sequence', + `value` bigint unsigned NOT NULL COMMENT 'sequence value', + PRIMARY KEY (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('vm_instance_seq', 1); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('vm_template_seq', 200); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('public_mac_address_seq', 1); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('private_mac_address_seq', 1); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('storage_pool_seq', 200); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('volume_seq', 1); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('networks_seq', 200); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('checkpoint_seq', 1); +INSERT INTO `cloud`.`sequence` (name, value) VALUES ('physical_networks_seq', 200); + +CREATE TABLE `cloud`.`volumes` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', + `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', + `domain_id` bigint unsigned NOT NULL COMMENT 'the domain that the owner belongs to', + `pool_id` bigint unsigned COMMENT 'pool it belongs to. foreign key to storage_pool table', + `last_pool_id` bigint unsigned COMMENT 'last pool it belongs to.', + `instance_id` bigint unsigned NULL COMMENT 'vm instance it belongs to. foreign key to vm_instance table', + `device_id` bigint unsigned NULL COMMENT 'which device inside vm instance it is ', + `name` varchar(255) COMMENT 'A user specified name for the volume', + `uuid` varchar(40), + `size` bigint unsigned NOT NULL COMMENT 'total size', + `folder` varchar(255) COMMENT 'The folder where the volume is saved', + `path` varchar(255) COMMENT 'Path', + `pod_id` bigint unsigned COMMENT 'pod this volume belongs to', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center this volume belongs to', + `iscsi_name` varchar(255) COMMENT 'iscsi target name', + `host_ip` char(40) COMMENT 'host ip address for convenience', + `volume_type` varchar(64) NOT NULL COMMENT 'root, swap or data', + `pool_type` varchar(64) COMMENT 'type of the pool', + `disk_offering_id` bigint unsigned NOT NULL COMMENT 'can be null for system VMs', + `template_id` bigint unsigned COMMENT 'fk to vm_template.id', + `first_snapshot_backup_uuid` varchar (255) COMMENT 'The first snapshot that was ever taken for this volume', + `recreatable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this volume recreatable?', + `created` datetime COMMENT 'Date Created', + `attached` datetime COMMENT 'Date Attached', + `updated` datetime COMMENT 'Date updated for attach/detach', + `removed` datetime COMMENT 'Date removed. not null if removed', + `state` varchar(32) COMMENT 'State machine', + `chain_info` text COMMENT 'save possible disk chain info in primary storage', + `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'date state was updated', + PRIMARY KEY (`id`), + INDEX `i_volumes__removed`(`removed`), + INDEX `i_volumes__pod_id`(`pod_id`), + INDEX `i_volumes__data_center_id`(`data_center_id`), + CONSTRAINT `fk_volumes__account_id` FOREIGN KEY `fk_volumes__account_id` (`account_id`) REFERENCES `account` (`id`), + INDEX `i_volumes__account_id`(`account_id`), + CONSTRAINT `fk_volumes__pool_id` FOREIGN KEY `fk_volumes__pool_id` (`pool_id`) REFERENCES `storage_pool` (`id`), + INDEX `i_volumes__pool_id`(`pool_id`), + INDEX `i_volumes__last_pool_id`(`last_pool_id`), + CONSTRAINT `fk_volumes__instance_id` FOREIGN KEY `fk_volumes__instance_id` (`instance_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE, + INDEX `i_volumes__instance_id`(`instance_id`), + INDEX `i_volumes__state`(`state`), + INDEX `i_volumes__update_count`(`update_count`), + CONSTRAINT `uc_volumes__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`snapshots` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', + `data_center_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', + `domain_id` bigint unsigned NOT NULL COMMENT 'the domain that the owner belongs to', + `volume_id` bigint unsigned NOT NULL COMMENT 'volume it belongs to. foreign key to volume table', + `disk_offering_id` bigint unsigned NOT NULL COMMENT 'from original volume', + `status` varchar(32) COMMENT 'snapshot creation status', + `path` varchar(255) COMMENT 'Path', + `name` varchar(255) NOT NULL COMMENT 'snapshot name', + `uuid` varchar(40), + `snapshot_type` int(4) NOT NULL COMMENT 'type of snapshot, e.g. manual, recurring', + `type_description` varchar(25) COMMENT 'description of the type of snapshot, e.g. manual, recurring', + `size` bigint unsigned NOT NULL COMMENT 'original disk size of snapshot', + `created` datetime COMMENT 'Date Created', + `removed` datetime COMMENT 'Date removed. not null if removed', + `backup_snap_id` varchar(255) COMMENT 'Back up uuid of the snapshot', + `swift_id` bigint unsigned COMMENT 'which swift', + `sechost_id` bigint unsigned COMMENT 'secondary storage host id', + `prev_snap_id` bigint unsigned COMMENT 'Id of the most recent snapshot', + `hypervisor_type` varchar(32) NOT NULL COMMENT 'hypervisor that the snapshot was taken under', + `version` varchar(32) COMMENT 'snapshot version', + PRIMARY KEY (`id`), + CONSTRAINT `uc_snapshots__uuid` UNIQUE (`uuid`), + INDEX `i_snapshots__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vlan` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `uuid` varchar(40), + `vlan_id` varchar(255), + `vlan_gateway` varchar(255), + `vlan_netmask` varchar(255), + `description` varchar(255), + `vlan_type` varchar(255), + `data_center_id` bigint unsigned NOT NULL, + `network_id` bigint unsigned NOT NULL COMMENT 'id of corresponding network offering', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on', + PRIMARY KEY (`id`), + #CONSTRAINT `fk_vlan__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_vlan__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`), + CONSTRAINT `uc_vlan__uuid` UNIQUE (`uuid`), + CONSTRAINT `fk_vlan__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`pod_vlan_map` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `pod_id` bigint unsigned NOT NULL COMMENT 'pod id. foreign key to pod table', + `vlan_db_id` bigint unsigned NOT NULL COMMENT 'database id of vlan. foreign key to vlan table', + PRIMARY KEY (`id`), + CONSTRAINT `fk_pod_vlan_map__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, + INDEX `i_pod_vlan_map__pod_id`(`pod_id`), + CONSTRAINT `fk_pod_vlan_map__vlan_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE, + INDEX `i_pod_vlan_map__vlan_id`(`vlan_db_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`account_vlan_map` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `account_id` bigint unsigned NOT NULL COMMENT 'account id. foreign key to account table', + `vlan_db_id` bigint unsigned NOT NULL COMMENT 'database id of vlan. foreign key to vlan table', + PRIMARY KEY (`id`), + CONSTRAINT `fk_account_vlan_map__account_id` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, + INDEX `i_account_vlan_map__account_id`(`account_id`), + CONSTRAINT `fk_account_vlan_map__vlan_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan` (`id`) ON DELETE CASCADE, + INDEX `i_account_vlan_map__vlan_id`(`vlan_db_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`data_center` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `name` varchar(255), + `uuid` varchar(40), + `description` varchar(255), + `dns1` varchar(255) NOT NULL, + `dns2` varchar(255), + `internal_dns1` varchar(255) NOT NULL, + `internal_dns2` varchar(255), + `gateway` varchar(15), + `netmask` varchar(15), + `router_mac_address` varchar(17) NOT NULL DEFAULT '02:00:00:00:00:01' COMMENT 'mac address for the router within the domain', + `mac_address` bigint unsigned NOT NULL DEFAULT '1' COMMENT 'Next available mac address for the ethernet card interacting with public internet', + `guest_network_cidr` varchar(18), + `domain` varchar(100) COMMENT 'Network domain name of the Vms of the zone', + `domain_id` bigint unsigned COMMENT 'domain id for the parent domain to this zone (null signifies public zone)', + `networktype` varchar(255) NOT NULL DEFAULT 'Basic' COMMENT 'Network type of the zone', + `dns_provider` char(64) DEFAULT 'VirtualRouter', + `gateway_provider` char(64) DEFAULT 'VirtualRouter', + `firewall_provider` char(64) DEFAULT 'VirtualRouter', + `dhcp_provider` char(64) DEFAULT 'VirtualRouter', + `lb_provider` char(64) DEFAULT 'VirtualRouter', + `vpn_provider` char(64) DEFAULT 'VirtualRouter', + `userdata_provider` char(64) DEFAULT 'VirtualRouter', + `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this data center enabled for allocation for new resources', + `zone_token` varchar(255), + `is_security_group_enabled` tinyint NOT NULL DEFAULT 0 COMMENT '1: enabled, 0: not', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_data_center__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`), + INDEX `i_data_center__domain_id`(`domain_id`), + INDEX `i_data_center__allocation_state`(`allocation_state`), + INDEX `i_data_center__zone_token`(`zone_token`), + INDEX `i_data_center__removed`(`removed`), + CONSTRAINT `uc_data_center__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_dc_ip_address_alloc` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', + `ip_address` char(40) NOT NULL COMMENT 'ip address', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center it belongs to', + `pod_id` bigint unsigned NOT NULL COMMENT 'pod it belongs to', + `nic_id` bigint unsigned NULL COMMENT 'nic id', + `reservation_id` char(40) NULL COMMENT 'reservation id', + `taken` datetime COMMENT 'Date taken', + `mac_address` bigint unsigned NOT NULL COMMENT 'mac address for management ips', + PRIMARY KEY (`id`), + CONSTRAINT `fk_op_dc_ip_address_alloc__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + INDEX `i_op_dc_ip_address_alloc__pod_id__data_center_id__taken` (`pod_id`, `data_center_id`, `taken`, `nic_id`), + UNIQUE `i_op_dc_ip_address_alloc__ip_address__data_center_id`(`ip_address`, `data_center_id`), + CONSTRAINT `fk_op_dc_ip_address_alloc__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, + INDEX `i_op_dc_ip_address_alloc__pod_id`(`pod_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_dc_link_local_ip_address_alloc` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', + `ip_address` char(40) NOT NULL COMMENT 'ip address', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center it belongs to', + `pod_id` bigint unsigned NOT NULL COMMENT 'pod it belongs to', + `nic_id` bigint unsigned NULL COMMENT 'instance id', + `reservation_id` char(40) NULL COMMENT 'reservation id used to reserve this network', + `taken` datetime COMMENT 'Date taken', + PRIMARY KEY (`id`), + INDEX `i_op_dc_link_local_ip_address_alloc__pod_id`(`pod_id`), + INDEX `i_op_dc_link_local_ip_address_alloc__data_center_id`(`data_center_id`), + INDEX `i_op_dc_link_local_ip_address_alloc__nic_id_reservation_id`(`nic_id`,`reservation_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`dc_storage_network_ip_range` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `uuid` varchar(40), + `start_ip` char(40) NOT NULL COMMENT 'start ip address', + `end_ip` char(40) NOT NULL COMMENT 'end ip address', + `gateway` varchar(15) NOT NULL COMMENT 'gateway ip address', + `vlan` int unsigned DEFAULT NULL COMMENT 'vlan the storage network on', + `netmask` varchar(15) NOT NULL COMMENT 'netmask for storage network', + `data_center_id` bigint unsigned NOT NULL, + `pod_id` bigint unsigned NOT NULL COMMENT 'pod it belongs to', + `network_id` bigint unsigned NOT NULL COMMENT 'id of corresponding network offering', + PRIMARY KEY (`id`), + CONSTRAINT `fk_storage_ip_range__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_storage_ip_range__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`), + CONSTRAINT `fk_storage_ip_range__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref`(`id`), + CONSTRAINT `uc_storage_ip_range__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_dc_storage_network_ip_address` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', + `range_id` bigint unsigned NOT NULL COMMENT 'id of ip range in dc_storage_network_ip_range', + `ip_address` char(40) NOT NULL COMMENT 'ip address', + `mac_address` bigint unsigned NOT NULL COMMENT 'mac address for storage ips', + `taken` datetime COMMENT 'Date taken', + PRIMARY KEY (`id`), + CONSTRAINT `fk_storage_ip_address__range_id` FOREIGN KEY (`range_id`) REFERENCES `dc_storage_network_ip_range`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`host_pod_ref` ( + `id` bigint unsigned NOT NULL UNIQUE auto_increment, + `name` varchar(255), + `uuid` varchar(40), + `data_center_id` bigint unsigned NOT NULL, + `gateway` varchar(255) NOT NULL COMMENT 'gateway for the pod', + `cidr_address` varchar(15) NOT NULL COMMENT 'CIDR address for the pod', + `cidr_size` bigint unsigned NOT NULL COMMENT 'CIDR size for the pod', + `description` varchar(255) COMMENT 'store private ip range in startIP-endIP format', + `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this Pod enabled for allocation for new resources', + `external_dhcp` tinyint NOT NULL DEFAULT 0 COMMENT 'Is this Pod using external DHCP', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + UNIQUE KEY (`name`, `data_center_id`), + INDEX `i_host_pod_ref__data_center_id`(`data_center_id`), + INDEX `i_host_pod_ref__allocation_state`(`allocation_state`), + INDEX `i_host_pod_ref__removed`(`removed`), + CONSTRAINT `uc_host_pod_ref__uuid` UNIQUE (`uuid`) + +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_dc_vnet_alloc` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary id', + `vnet` varchar(18) NOT NULL COMMENT 'vnet', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network the vnet belongs to', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center the vnet belongs to', + `reservation_id` char(40) NULL COMMENT 'reservation id', + `account_id` bigint unsigned NULL COMMENT 'account the vnet belongs to right now', + `taken` datetime COMMENT 'Date taken', + PRIMARY KEY (`id`), + UNIQUE `i_op_dc_vnet_alloc__vnet__data_center_id__account_id`(`vnet`, `data_center_id`, `account_id`), + INDEX `i_op_dc_vnet_alloc__dc_taken`(`data_center_id`, `taken`), + UNIQUE `i_op_dc_vnet_alloc__vnet__data_center_id`(`vnet`, `data_center_id`), + CONSTRAINT `fk_op_dc_vnet_alloc__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_op_dc_vnet_alloc__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`firewall_rules` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `ip_address_id` bigint unsigned COMMENT 'id of the corresponding ip address', + `start_port` int(10) COMMENT 'starting port of a port range', + `end_port` int(10) COMMENT 'end port of a port range', + `state` char(32) NOT NULL COMMENT 'current state of this rule', + `protocol` char(16) NOT NULL default 'TCP' COMMENT 'protocol to open these ports for', + `purpose` char(32) NOT NULL COMMENT 'why are these ports opened?', + `account_id` bigint unsigned NOT NULL COMMENT 'owner id', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + `xid` char(40) NOT NULL COMMENT 'external id', + `created` datetime COMMENT 'Date created', + `icmp_code` int(10) COMMENT 'The ICMP code (if protocol=ICMP). A value of -1 means all codes for the given ICMP type.', + `icmp_type` int(10) COMMENT 'The ICMP type (if protocol=ICMP). A value of -1 means all types.', + `related` bigint unsigned COMMENT 'related to what other firewall rule', + `type` varchar(10) NOT NULL DEFAULT 'USER', + `vpc_id` bigint unsigned COMMENT 'vpc the firewall rule is associated with', + `traffic_type` char(32) COMMENT 'the traffic type of the rule, can be Ingress or Egress', + PRIMARY KEY (`id`), + CONSTRAINT `fk_firewall_rules__ip_address_id` FOREIGN KEY(`ip_address_id`) REFERENCES `user_ip_address`(`id`), + CONSTRAINT `fk_firewall_rules__network_id` FOREIGN KEY(`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_firewall_rules__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_firewall_rules__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_firewall_rules__related` FOREIGN KEY(`related`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_firewall_rules__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, + INDEX `i_firewall_rules__purpose`(`purpose`), + CONSTRAINT `uc_firewall_rules__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`firewall_rules_cidrs` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `firewall_rule_id` bigint(20) unsigned NOT NULL COMMENT 'firewall rule id', + `source_cidr` varchar(18) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `fk_firewall_cidrs_firewall_rules` (`firewall_rule_id`), + UNIQUE INDEX `unique_rule_cidrs` (`firewall_rule_id`, `source_cidr`), + CONSTRAINT `fk_firewall_cidrs_firewall_rules` FOREIGN KEY (`firewall_rule_id`) REFERENCES `firewall_rules` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`load_balancing_rules` ( + `id` bigint unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `description` varchar(4096) NULL COMMENT 'description', + `default_port_start` int(10) NOT NULL COMMENT 'default private port range start', + `default_port_end` int(10) NOT NULL COMMENT 'default destination port range end', + `algorithm` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_load_balancing_rules__id` FOREIGN KEY(`id`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`load_balancer_vm_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `load_balancer_id` bigint unsigned NOT NULL, + `instance_id` bigint unsigned NOT NULL, + `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when rule is set for Revoke', + PRIMARY KEY (`id`), + UNIQUE KEY (`load_balancer_id`, `instance_id`), + CONSTRAINT `fk_load_balancer_vm_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_load_balancer_vm_map__instance_id` FOREIGN KEY(`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`load_balancer_stickiness_policies` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `load_balancer_id` bigint unsigned NOT NULL, + `name` varchar(255) NOT NULL, + `description` varchar(4096) NULL COMMENT 'description', + `method_name` varchar(255) NOT NULL, + `params` varchar(4096) NOT NULL, + `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when rule is set for Revoke', + PRIMARY KEY (`id`), + CONSTRAINT `fk_load_balancer_stickiness_policies__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`inline_load_balancer_nic_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `load_balancer_id` bigint unsigned NOT NULL, + `public_ip_address` char(40) NOT NULL, + `nic_id` bigint unsigned NULL COMMENT 'nic id', + PRIMARY KEY (`id`), + UNIQUE KEY (`nic_id`), + CONSTRAINT `fk_inline_load_balancer_nic_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_inline_load_balancer_nic_map__nic_id` FOREIGN KEY(`nic_id`) REFERENCES `nics`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`port_forwarding_rules` ( + `id` bigint unsigned NOT NULL COMMENT 'id', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id', + `dest_ip_address` char(40) NOT NULL COMMENT 'id_address', + `dest_port_start` int(10) NOT NULL COMMENT 'starting port of the port range to map to', + `dest_port_end` int(10) NOT NULL COMMENT 'end port of the the port range to map to', + PRIMARY KEY (`id`), + CONSTRAINT `fk_port_forwarding_rules__id` FOREIGN KEY(`id`) REFERENCES `firewall_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_port_forwarding_rules__instance_id` FOREIGN KEY `fk_port_forwarding_rules__instance_id` (`instance_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`host` ( + `id` bigint unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL, + `uuid` varchar(40) COMMENT 'this uuid is different with guid below, the later one is used by hypervisor resource', + `status` varchar(32) NOT NULL, + `type` varchar(32) NOT NULL, + `private_ip_address` char(40) NOT NULL, + `private_netmask` varchar(15), + `private_mac_address` varchar(17), + `storage_ip_address` char(40), + `storage_netmask` varchar(15), + `storage_mac_address` varchar(17), + `storage_ip_address_2` char(40), + `storage_mac_address_2` varchar(17), + `storage_netmask_2` varchar(15), + `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', + `public_ip_address` char(40), + `public_netmask` varchar(15), + `public_mac_address` varchar(17), + `proxy_port` int(10) unsigned, + `data_center_id` bigint unsigned NOT NULL, + `pod_id` bigint unsigned, + `cpus` int(10) unsigned, + `speed` int(10) unsigned, + `url` varchar(255) COMMENT 'iqn for the servers', + `fs_type` varchar(32), + `hypervisor_type` varchar(32) COMMENT 'hypervisor type, can be NONE for storage', + `hypervisor_version` varchar(32) COMMENT 'hypervisor version', + `ram` bigint unsigned, + `resource` varchar(255) DEFAULT NULL COMMENT 'If it is a local resource, this is the class name', + `version` varchar(40) NOT NULL, + `parent` varchar(255) COMMENT 'parent path for the storage server', + `total_size` bigint unsigned COMMENT 'TotalSize', + `capabilities` varchar(255) COMMENT 'host capabilities in comma separated list', + `guid` varchar(255) UNIQUE, + `available` int(1) unsigned NOT NULL DEFAULT 1 COMMENT 'Is this host ready for more resources?', + `setup` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this host already setup?', + `dom0_memory` bigint unsigned NOT NULL COMMENT 'memory used by dom0 for computing and routing servers', + `last_ping` int(10) unsigned NOT NULL COMMENT 'time in seconds from the start of machine of the last ping', + `mgmt_server_id` bigint unsigned COMMENT 'ManagementServer this host is connected to.', + `disconnected` datetime COMMENT 'Time this was disconnected', + `created` datetime COMMENT 'date the host first signed on', + `removed` datetime COMMENT 'date removed if not null', + `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'atomic increase count making status update operation atomical', + `resource_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this host enabled for allocation for new resources', + PRIMARY KEY (`id`), + INDEX `i_host__removed`(`removed`), + INDEX `i_host__last_ping`(`last_ping`), + INDEX `i_host__status`(`status`), + INDEX `i_host__data_center_id`(`data_center_id`), + CONSTRAINT `fk_host__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, + INDEX `i_host__pod_id`(`pod_id`), + CONSTRAINT `fk_host__cluster_id` FOREIGN KEY (`cluster_id`) REFERENCES `cloud`.`cluster`(`id`), + CONSTRAINT `uc_host__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_host` ( + `id` bigint unsigned NOT NULL UNIQUE COMMENT 'host id', + `sequence` bigint unsigned DEFAULT 1 NOT NULL COMMENT 'sequence for the host communication', + PRIMARY KEY (`id`), + CONSTRAINT `fk_op_host__id` FOREIGN KEY (`id`) REFERENCES `host`(`id`) ON DELETE CASCADE +) ENGINE = InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`account_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `account_id` bigint unsigned NOT NULL COMMENT 'account id', + `name` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_account_details__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`host_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL COMMENT 'host id', + `name` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_host_details__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`mshost` ( + `id` bigint unsigned NOT NULL auto_increment, + `msid` bigint unsigned NOT NULL UNIQUE COMMENT 'management server id derived from MAC address', + `runid` bigint NOT NULL DEFAULT 0 COMMENT 'run id, combined with msid to form a cluster session', + `name` varchar(255), + `state` varchar(10) NOT NULL DEFAULT 'Down', + `version` varchar(255), + `service_ip` char(40) NOT NULL, + `service_port` integer NOT NULL, + `last_update` DATETIME NULL COMMENT 'Last record update time', + `removed` datetime COMMENT 'date removed if not null', + `alert_count` integer NOT NULL DEFAULT 0, + PRIMARY KEY (`id`), + INDEX `i_mshost__removed`(`removed`), + INDEX `i_mshost__last_update`(`last_update`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`mshost_peer` ( + `id` bigint unsigned NOT NULL auto_increment, + `owner_mshost` bigint unsigned NOT NULL, + `peer_mshost` bigint unsigned NOT NULL, + `peer_runid` bigint NOT NULL, + `peer_state` varchar(10) NOT NULL DEFAULT 'Down', + `last_update` DATETIME NULL COMMENT 'Last record update time', + + PRIMARY KEY (`id`), + CONSTRAINT `fk_mshost_peer__owner_mshost` FOREIGN KEY (`owner_mshost`) REFERENCES `mshost`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_mshost_peer__peer_mshost` FOREIGN KEY (`peer_mshost`) REFERENCES `mshost`(`id`), + UNIQUE `i_mshost_peer__owner_peer_runid`(`owner_mshost`, `peer_mshost`, `peer_runid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`host_tags` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL COMMENT 'host id', + `tag` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_host_tags__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`user` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `account_id` bigint unsigned NOT NULL, + `firstname` varchar(255) default NULL, + `lastname` varchar(255) default NULL, + `email` varchar(255) default NULL, + `state` varchar(10) NOT NULL default 'enabled', + `api_key` varchar(255) default NULL, + `secret_key` varchar(255) default NULL, + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed', + `timezone` varchar(30) default NULL, + `registration_token` varchar(255) default NULL, + `is_registered` tinyint NOT NULL DEFAULT 0 COMMENT '1: yes, 0: no', + PRIMARY KEY (`id`), + INDEX `i_user__removed`(`removed`), + INDEX `i_user__secret_key_removed`(`secret_key`, `removed`), + UNIQUE `i_user__api_key`(`api_key`), + CONSTRAINT `fk_user__account_id` FOREIGN KEY `fk_user__account_id` (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, + INDEX `i_user__account_id`(`account_id`), + CONSTRAINT `uc_user__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`event` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `type` varchar(32) NOT NULL, + `state` varchar(32) NOT NULL DEFAULT 'Completed', + `description` varchar(1024) NOT NULL, + `user_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `created` datetime NOT NULL, + `level` varchar(16) NOT NULL, + `start_id` bigint unsigned NOT NULL DEFAULT 0, + `parameters` varchar(1024) NULL, + PRIMARY KEY (`id`), + CONSTRAINT `uc_event__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`user_ip_address` ( + `id` bigint unsigned NOT NULL UNIQUE auto_increment, + `uuid` varchar(40), + `account_id` bigint unsigned NULL, + `domain_id` bigint unsigned NULL, + `public_ip_address` char(40) NOT NULL, + `data_center_id` bigint unsigned NOT NULL COMMENT 'zone that it belongs to', + `source_nat` int(1) unsigned NOT NULL default '0', + `allocated` datetime NULL COMMENT 'Date this ip was allocated to someone', + `vlan_db_id` bigint unsigned NOT NULL, + `one_to_one_nat` int(1) unsigned NOT NULL default '0', + `vm_id` bigint unsigned COMMENT 'vm id the one_to_one nat ip is assigned to', + `state` char(32) NOT NULL default 'Free' COMMENT 'state of the ip address', + `mac_address` bigint unsigned NOT NULL COMMENT 'mac address of this ip', + `source_network_id` bigint unsigned NOT NULL COMMENT 'network id ip belongs to', + `network_id` bigint unsigned COMMENT 'network this public ip address is associated with', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on', + `is_system` int(1) unsigned NOT NULL default '0', + `vpc_id` bigint unsigned COMMENT 'vpc the ip address is associated with', + PRIMARY KEY (`id`), + UNIQUE (`public_ip_address`, `source_network_id`), + CONSTRAINT `fk_user_ip_address__source_network_id` FOREIGN KEY (`source_network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_user_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_user_ip_address__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`), + CONSTRAINT `fk_user_ip_address__vm_id` FOREIGN KEY (`vm_id`) REFERENCES `vm_instance`(`id`), + CONSTRAINT `fk_user_ip_address__vlan_db_id` FOREIGN KEY (`vlan_db_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_user_ip_address__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_user_ip_address__uuid` UNIQUE (`uuid`), + CONSTRAINT `fk_user_ip_address__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_user_ip_address__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, + INDEX `i_user_ip_address__allocated`(`allocated`), + INDEX `i_user_ip_address__source_nat`(`source_nat`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`user_statistics` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT, + `data_center_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `public_ip_address` char(40), + `device_id` bigint unsigned NOT NULL, + `device_type` varchar(32) NOT NULL, + `network_id` bigint unsigned, + `net_bytes_received` bigint unsigned NOT NULL default '0', + `net_bytes_sent` bigint unsigned NOT NULL default '0', + `current_bytes_received` bigint unsigned NOT NULL default '0', + `current_bytes_sent` bigint unsigned NOT NULL default '0', + `agg_bytes_received` bigint unsigned NOT NULL default '0', + `agg_bytes_sent` bigint unsigned NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY (`account_id`, `data_center_id`, `public_ip_address`, `device_id`, `device_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vm_template` ( + `id` bigint unsigned NOT NULL auto_increment, + `unique_name` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `uuid` varchar(40), + `public` int(1) unsigned NOT NULL, + `featured` int(1) unsigned NOT NULL, + `type` varchar(32) NULL, + `hvm` int(1) unsigned NOT NULL COMMENT 'requires HVM', + `bits` int(6) unsigned NOT NULL COMMENT '32 bit or 64 bit', + `url` varchar(255) NULL COMMENT 'the url where the template exists externally', + `format` varchar(32) NOT NULL COMMENT 'format for the template', + `created` datetime NOT NULL COMMENT 'Date created', + `removed` datetime COMMENT 'Date removed if not null', + `account_id` bigint unsigned NOT NULL COMMENT 'id of the account that created this template', + `checksum` varchar(255) COMMENT 'checksum for the template root disk', + `display_text` varchar(4096) NULL COMMENT 'Description text set by the admin for display purpose only', + `enable_password` int(1) unsigned NOT NULL default 1 COMMENT 'true if this template supports password reset', + `enable_sshkey` int(1) unsigned NOT NULL default 0 COMMENT 'true if this template supports sshkey reset', + `guest_os_id` bigint unsigned NOT NULL COMMENT 'the OS of the template', + `bootable` int(1) unsigned NOT NULL default 1 COMMENT 'true if this template represents a bootable ISO', + `prepopulate` int(1) unsigned NOT NULL default 0 COMMENT 'prepopulate this template to primary storage', + `cross_zones` int(1) unsigned NOT NULL default 0 COMMENT 'Make this template available in all zones', + `extractable` int(1) unsigned NOT NULL default 0 COMMENT 'Is this template extractable', + `hypervisor_type` varchar(32) COMMENT 'hypervisor that the template belongs to', + `source_template_id` bigint unsigned COMMENT 'Id of the original template, if this template is created from snapshot', + `template_tag` varchar(255) COMMENT 'template tag', + `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', + PRIMARY KEY (`id`), + INDEX `i_vm_template__removed`(`removed`), + CONSTRAINT `uc_vm_template__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vm_template_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `template_id` bigint unsigned NOT NULL COMMENT 'template id', + `name` varchar(255) NOT NULL, + `value` varchar(1024) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_vm_template_details__template_id` FOREIGN KEY `fk_vm_template_details__template_id`(`template_id`) REFERENCES `vm_template`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vm_instance` ( + `id` bigint unsigned UNIQUE NOT NULL, + `name` varchar(255) NOT NULL, + `uuid` varchar(40), + `instance_name` varchar(255) NOT NULL COMMENT 'name of the vm instance running on the hosts', + `state` varchar(32) NOT NULL, + `vm_template_id` bigint unsigned, + `guest_os_id` bigint unsigned NOT NULL, + `private_mac_address` varchar(17), + `private_ip_address` char(40), + `pod_id` bigint unsigned, + `data_center_id` bigint unsigned NOT NULL COMMENT 'Data Center the instance belongs to', + `host_id` bigint unsigned, + `last_host_id` bigint unsigned COMMENT 'tentative host for first run or last host that it has been running on', + `proxy_id` bigint unsigned NULL COMMENT 'console proxy allocated in previous session', + `proxy_assign_time` DATETIME NULL COMMENT 'time when console proxy was assigned', + `vnc_password` varchar(255) NOT NULL COMMENT 'vnc password', + `ha_enabled` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Should HA be enabled for this VM', + `limit_cpu_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Limit the cpu usage to service offering', + `update_count` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'date state was updated', + `update_time` datetime COMMENT 'date the destroy was requested', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + `type` varchar(32) NOT NULL COMMENT 'type of vm it is', + `vm_type` varchar(32) NOT NULL COMMENT 'vm type', + `account_id` bigint unsigned NOT NULL COMMENT 'user id of owner', + `domain_id` bigint unsigned NOT NULL, + `service_offering_id` bigint unsigned NOT NULL COMMENT 'service offering id', + `reservation_id` char(40) COMMENT 'reservation id', + `hypervisor_type` char(32) COMMENT 'hypervisor type', + PRIMARY KEY (`id`), + INDEX `i_vm_instance__removed`(`removed`), + INDEX `i_vm_instance__type`(`type`), + INDEX `i_vm_instance__pod_id`(`pod_id`), + INDEX `i_vm_instance__update_time`(`update_time`), + INDEX `i_vm_instance__update_count`(`update_count`), + INDEX `i_vm_instance__state`(`state`), + INDEX `i_vm_instance__data_center_id`(`data_center_id`), + CONSTRAINT `fk_vm_instance__host_id` FOREIGN KEY `fk_vm_instance__host_id` (`host_id`) REFERENCES `host` (`id`), + CONSTRAINT `fk_vm_instance__last_host_id` FOREIGN KEY `fk_vm_instance__last_host_id` (`last_host_id`) REFERENCES `host`(`id`), + CONSTRAINT `fk_vm_instance__template_id` FOREIGN KEY `fk_vm_instance__template_id` (`vm_template_id`) REFERENCES `vm_template` (`id`), + INDEX `i_vm_instance__template_id`(`vm_template_id`), + CONSTRAINT `fk_vm_instance__account_id` FOREIGN KEY `fk_vm_instance__account_id` (`account_id`) REFERENCES `account` (`id`), + CONSTRAINT `fk_vm_instance__service_offering_id` FOREIGN KEY `fk_vm_instance__service_offering_id` (`service_offering_id`) REFERENCES `service_offering` (`id`), + CONSTRAINT `uc_vm_instance_uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`user_vm` ( + `id` bigint unsigned UNIQUE NOT NULL, + `iso_id` bigint unsigned, + `display_name` varchar(255), + `user_data` varchar(2048), + `update_parameters` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Defines if the parameters have been updated for the vm', + PRIMARY KEY (`id`), + CONSTRAINT `fk_user_vm__id` FOREIGN KEY `fk_user_vm__id` (`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- note, uer_vm_details is now used for all VMs (not just for user vms) +CREATE TABLE `cloud`.`user_vm_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', + `name` varchar(255) NOT NULL, + `value` varchar(1024) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_user_vm_details__vm_id` FOREIGN KEY `fk_user_vm_details__vm_id`(`vm_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`domain_router` ( + `id` bigint unsigned UNIQUE NOT NULL COMMENT 'Primary Key', + `element_id` bigint unsigned NOT NULL COMMENT 'correlated virtual router provider ID', + `public_mac_address` varchar(17) COMMENT 'mac address of the public facing network card', + `public_ip_address` char(40) COMMENT 'public ip address used for source net', + `public_netmask` varchar(15) COMMENT 'netmask used for the domR', + `guest_netmask` varchar(15) COMMENT 'netmask used for the guest network', + `guest_ip_address` char(40) COMMENT ' ip address in the guest network', + `is_redundant_router` int(1) unsigned NOT NULL COMMENT 'if in redundant router mode', + `priority` int(4) unsigned COMMENT 'priority of router in the redundant router mode', + `is_priority_bumpup` int(1) unsigned NOT NULL COMMENT 'if the priority has been bumped up', + `redundant_state` varchar(64) NOT NULL COMMENT 'the state of redundant virtual router', + `stop_pending` int(1) unsigned NOT NULL COMMENT 'if this router would be stopped after we can connect to it', + `role` varchar(64) NOT NULL COMMENT 'type of role played by this router', + `template_version` varchar(100) COMMENT 'template version', + `scripts_version` varchar(100) COMMENT 'scripts version', + `vpc_id` bigint unsigned COMMENT 'correlated virtual router vpc ID', + PRIMARY KEY (`id`), + CONSTRAINT `fk_domain_router__id` FOREIGN KEY `fk_domain_router__id` (`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_domain_router__element_id` FOREIGN KEY `fk_domain_router__element_id`(`element_id`) REFERENCES `virtual_router_providers`(`id`), + CONSTRAINT `fk_domain_router__vpc_id` FOREIGN KEY `fk_domain_router__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`) +) ENGINE = InnoDB DEFAULT CHARSET=utf8 COMMENT = 'information about the domR instance'; + +CREATE TABLE `cloud`.`upload` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL, + `type_id` bigint unsigned NOT NULL, + `type` varchar(255), + `mode` varchar(255), + `created` DATETIME NOT NULL, + `last_updated` DATETIME, + `job_id` varchar(255), + `upload_pct` int(10) unsigned, + `upload_state` varchar(255), + `error_str` varchar(255), + `url` varchar(255), + `install_path` varchar(255), + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`template_host_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL, + `template_id` bigint unsigned NOT NULL, + `created` DATETIME NOT NULL, + `last_updated` DATETIME, + `job_id` varchar(255), + `download_pct` int(10) unsigned, + `size` bigint unsigned, + `physical_size` bigint unsigned DEFAULT 0, + `download_state` varchar(255), + `error_str` varchar(255), + `local_path` varchar(255), + `install_path` varchar(255), + `url` varchar(255), + `destroyed` tinyint(1) COMMENT 'indicates whether the template_host entry was destroyed by the user or not', + `is_copy` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'indicates whether this was copied ', + PRIMARY KEY (`id`), + CONSTRAINT `fk_template_host_ref__host_id` FOREIGN KEY `fk_template_host_ref__host_id` (`host_id`) REFERENCES `host` (`id`) ON DELETE CASCADE, + INDEX `i_template_host_ref__host_id`(`host_id`), + CONSTRAINT `fk_template_host_ref__template_id` FOREIGN KEY `fk_template_host_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`), + INDEX `i_template_host_ref__template_id`(`template_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`volume_host_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL, + `volume_id` bigint unsigned NOT NULL, + `zone_id` bigint unsigned NOT NULL, + `created` DATETIME NOT NULL, + `last_updated` DATETIME, + `job_id` varchar(255), + `download_pct` int(10) unsigned, + `size` bigint unsigned, + `physical_size` bigint unsigned DEFAULT 0, + `download_state` varchar(255), + `checksum` varchar(255) COMMENT 'checksum for the data disk', + `error_str` varchar(255), + `local_path` varchar(255), + `install_path` varchar(255), + `url` varchar(255), + `format` varchar(32) NOT NULL COMMENT 'format for the volume', + `destroyed` tinyint(1) COMMENT 'indicates whether the volume_host entry was destroyed by the user or not', + PRIMARY KEY (`id`), + CONSTRAINT `fk_volume_host_ref__host_id` FOREIGN KEY `fk_volume_host_ref__host_id` (`host_id`) REFERENCES `host` (`id`) ON DELETE CASCADE, + INDEX `i_volume_host_ref__host_id`(`host_id`), + CONSTRAINT `fk_volume_host_ref__volume_id` FOREIGN KEY `fk_volume_host_ref__volume_id` (`volume_id`) REFERENCES `volumes` (`id`), + INDEX `i_volume_host_ref__volume_id`(`volume_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`template_swift_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `swift_id` bigint unsigned NOT NULL, + `template_id` bigint unsigned NOT NULL, + `created` DATETIME NOT NULL, + `path` varchar(255), + `size` bigint unsigned, + `physical_size` bigint unsigned DEFAULT 0, + PRIMARY KEY (`id`), + CONSTRAINT `fk_template_swift_ref__swift_id` FOREIGN KEY `fk_template_swift_ref__swift_id` (`swift_id`) REFERENCES `swift` (`id`) ON DELETE CASCADE, + INDEX `i_template_swift_ref__swift_id`(`swift_id`), + CONSTRAINT `fk_template_swift_ref__template_id` FOREIGN KEY `fk_template_swift_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`), + INDEX `i_template_swift_ref__template_id`(`template_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`template_zone_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `zone_id` bigint unsigned NOT NULL, + `template_id` bigint unsigned NOT NULL, + `created` DATETIME NOT NULL, + `last_updated` DATETIME, + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_template_zone_ref__zone_id` FOREIGN KEY `fk_template_zone_ref__zone_id` (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE, + INDEX `i_template_zone_ref__zone_id`(`zone_id`), + CONSTRAINT `fk_template_zone_ref__template_id` FOREIGN KEY `fk_template_zone_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`) ON DELETE CASCADE, + INDEX `i_template_zone_ref__template_id`(`template_id`), + INDEX `i_template_zone_ref__removed`(`removed`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`console_proxy` ( + `id` bigint unsigned NOT NULL auto_increment, + `public_mac_address` varchar(17) unique COMMENT 'mac address of the public facing network card', + `public_ip_address` char(40) COMMENT 'public ip address for the console proxy', + `public_netmask` varchar(15) COMMENT 'public netmask used for the console proxy', + `active_session` int(10) NOT NULL DEFAULT 0 COMMENT 'active session number', + `last_update` DATETIME NULL COMMENT 'Last session update time', + `session_details` BLOB NULL COMMENT 'session detail info', + PRIMARY KEY (`id`), + CONSTRAINT `fk_console_proxy__id` FOREIGN KEY `fk_console_proxy__id`(`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`secondary_storage_vm` ( + `id` bigint unsigned NOT NULL auto_increment, + `public_mac_address` varchar(17) unique COMMENT 'mac address of the public facing network card', + `public_ip_address` char(40) COMMENT 'public ip address for the sec storage vm', + `public_netmask` varchar(15) COMMENT 'public netmask used for the sec storage vm', + `guid` varchar(255) COMMENT 'copied from guid of secondary storage host', + `nfs_share` varchar(255) COMMENT 'server and path exported by the nfs server ', + `last_update` DATETIME NULL COMMENT 'Last session update time', + `role` varchar(64) NOT NULL DEFAULT 'templateProcessor' COMMENT 'work role of secondary storage host(templateProcessor | commandExecutor)', + PRIMARY KEY (`id`), + CONSTRAINT `fk_secondary_storage_vm__id` FOREIGN KEY `fk_secondary_storage_vm__id`(`id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`domain` ( + `id` bigint unsigned NOT NULL auto_increment, + `parent` bigint unsigned, + `name` varchar(255), + `uuid` varchar(40), + `owner` bigint unsigned NOT NULL, + `path` varchar(255) NOT NULL, + `level` int(10) NOT NULL DEFAULT 0, + `child_count` int(10) NOT NULL DEFAULT 0, + `next_child_seq` bigint unsigned NOT NULL DEFAULT 1, + `removed` datetime COMMENT 'date removed', + `state` char(32) NOT NULL default 'Active' COMMENT 'state of the domain', + `network_domain` varchar(255), + `type` varchar(255) NOT NULL DEFAULT 'Normal' COMMENT 'type of the domain - can be Normal or Project', + PRIMARY KEY (`id`), + UNIQUE (parent, name, removed), + INDEX `i_domain__path`(`path`), + INDEX `i_domain__removed`(`removed`), + CONSTRAINT `uc_domain__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`account` ( + `id` bigint unsigned NOT NULL auto_increment, + `account_name` varchar(100) COMMENT 'an account name set by the creator of the account, defaults to username for single accounts', + `uuid` varchar(40), + `type` int(1) unsigned NOT NULL, + `domain_id` bigint unsigned, + `state` varchar(10) NOT NULL default 'enabled', + `removed` datetime COMMENT 'date removed', + `cleanup_needed` tinyint(1) NOT NULL default '0', + `network_domain` varchar(255), + `default_zone_id` bigint unsigned, + PRIMARY KEY (`id`), + INDEX i_account__removed(`removed`), + CONSTRAINT `fk_account__default_zone_id` FOREIGN KEY `fk_account__default_zone_id`(`default_zone_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_account__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`resource_limit` ( + `id` bigint unsigned NOT NULL auto_increment, + `domain_id` bigint unsigned, + `account_id` bigint unsigned, + `type` varchar(255), + `max` bigint NOT NULL default '-1', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`resource_count` ( + `id` bigint unsigned NOT NULL auto_increment, + `account_id` bigint unsigned, + `domain_id` bigint unsigned, + `type` varchar(255), + `count` bigint NOT NULL default '0', + PRIMARY KEY (`id`), + CONSTRAINT `fk_resource_count__account_id` FOREIGN KEY `fk_resource_count__account_id`(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_resource_count__domain_id` FOREIGN KEY `fk_resource_count__domain_id`(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + INDEX `i_resource_count__type`(`type`), + UNIQUE `i_resource_count__type_accountId`(`type`, `account_id`), + UNIQUE `i_resource_count__type_domaintId`(`type`, `domain_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_host_capacity` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned, + `data_center_id` bigint unsigned NOT NULL, + `pod_id` bigint unsigned, + `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', + `used_capacity` bigint signed NOT NULL, + `reserved_capacity` bigint signed NOT NULL, + `total_capacity` bigint signed NOT NULL, + `capacity_type` int(1) unsigned NOT NULL, + `capacity_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this capacity enabled for allocation for new resources', + `update_time` datetime COMMENT 'time the capacity was last updated', + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + INDEX `i_op_host_capacity__host_type`(`host_id`, `capacity_type`), + INDEX `i_op_host_capacity__pod_id`(`pod_id`), + INDEX `i_op_host_capacity__data_center_id`(`data_center_id`), + INDEX `i_op_host_capacity__cluster_id`(`cluster_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`alert` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `type` int(1) unsigned NOT NULL, + `cluster_id` bigint unsigned, + `pod_id` bigint unsigned, + `data_center_id` bigint unsigned NOT NULL, + `subject` varchar(999) COMMENT 'according to SMTP spec, max subject length is 1000 including the CRLF character, so allow enough space to fit long pod/zone/host names', + `sent_count` int(3) unsigned NOT NULL, + `created` DATETIME NULL COMMENT 'when this alert type was created', + `last_sent` DATETIME NULL COMMENT 'Last time the alert was sent', + `resolved` DATETIME NULL COMMENT 'when the alert status was resolved (available memory no longer at critical level, etc.)', + PRIMARY KEY (`id`), + CONSTRAINT `uc_alert__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`async_job` ( + `id` bigint unsigned NOT NULL auto_increment, + `user_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `session_key` varchar(64) COMMENT 'all async-job manage to apply session based security enforcement', + `instance_type` varchar(64) COMMENT 'instance_type and instance_id work together to allow attaching an instance object to a job', + `instance_id` bigint unsigned, + `job_cmd` varchar(64) NOT NULL COMMENT 'command name', + `job_cmd_originator` varchar(64) COMMENT 'command originator', + `job_cmd_info` text COMMENT 'command parameter info', + `job_cmd_ver` int(1) COMMENT 'command version', + `callback_type` int(1) COMMENT 'call back type, 0 : polling, 1 : email', + `callback_address` varchar(128) COMMENT 'call back address by callback_type', + `job_status` int(1) COMMENT 'general job execution status', + `job_process_status` int(1) COMMENT 'job specific process status for asynchronize progress update', + `job_result_code` int(1) COMMENT 'job result code, specify error code corresponding to result message', + `job_result` text COMMENT 'job result info', + `job_init_msid` bigint COMMENT 'the initiating msid', + `job_complete_msid` bigint COMMENT 'completing msid', + `created` datetime COMMENT 'date created', + `last_updated` datetime COMMENT 'date created', + `last_polled` datetime COMMENT 'date polled', + `removed` datetime COMMENT 'date removed', + `uuid` varchar(40), + PRIMARY KEY (`id`), + INDEX `i_async_job__removed`(`removed`), + INDEX `i_async__user_id`(`user_id`), + INDEX `i_async__account_id`(`account_id`), + INDEX `i_async__instance_type_id`(`instance_type`,`instance_id`), + INDEX `i_async__job_cmd`(`job_cmd`), + INDEX `i_async__created`(`created`), + INDEX `i_async__last_updated`(`last_updated`), + INDEX `i_async__last_poll`(`last_polled`), + CONSTRAINT `uc_async__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`sync_queue` ( + `id` bigint unsigned NOT NULL auto_increment, + `sync_objtype` varchar(64) NOT NULL, + `sync_objid` bigint unsigned NOT NULL, + `queue_proc_msid` bigint, + `queue_proc_number` bigint COMMENT 'process number, increase 1 for each iteration', + `queue_proc_time` datetime COMMENT 'last time to process the queue', + `created` datetime COMMENT 'date created', + `last_updated` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + UNIQUE `i_sync_queue__objtype__objid`(`sync_objtype`, `sync_objid`), + INDEX `i_sync_queue__created`(`created`), + INDEX `i_sync_queue__last_updated`(`last_updated`), + INDEX `i_sync_queue__queue_proc_time`(`queue_proc_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`stack_maid` ( + `id` bigint unsigned NOT NULL auto_increment, + `msid` bigint unsigned NOT NULL, + `thread_id` bigint unsigned NOT NULL, + `seq` int unsigned NOT NULL, + `cleanup_delegate` varchar(128), + `cleanup_context` text, + `created` datetime, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`sync_queue_item` ( + `id` bigint unsigned NOT NULL auto_increment, + `queue_id` bigint unsigned NOT NULL, + `content_type` varchar(64), + `content_id` bigint, + `queue_proc_msid` bigint COMMENT 'owner msid when the queue item is being processed', + `queue_proc_number` bigint COMMENT 'used to distinguish raw items and items being in process', + `created` datetime COMMENT 'time created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_sync_queue_item__queue_id` FOREIGN KEY `fk_sync_queue_item__queue_id` (`queue_id`) REFERENCES `sync_queue` (`id`) ON DELETE CASCADE, + INDEX `i_sync_queue_item__queue_id`(`queue_id`), + INDEX `i_sync_queue_item__created`(`created`), + INDEX `i_sync_queue_item__queue_proc_number`(`queue_proc_number`), + INDEX `i_sync_queue_item__queue_proc_msid`(`queue_proc_msid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`disk_offering` ( + `id` bigint unsigned NOT NULL auto_increment, + `domain_id` bigint unsigned, + `name` varchar(255) NOT NULL, + `uuid` varchar(40), + `display_text` varchar(4096) NULL COMMENT 'Descrianaption text set by the admin for display purpose only', + `disk_size` bigint unsigned NOT NULL COMMENT 'disk space in byte', + `type` varchar(32) COMMENT 'inheritted by who?', + `tags` varchar(4096) COMMENT 'comma separated tags about the disk_offering', + `recreatable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'The root disk is always recreatable', + `use_local_storage` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Indicates whether local storage pools should be used', + `unique_name` varchar(32) UNIQUE COMMENT 'unique name', + `system_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'is this offering for system used only', + `customized` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '0 implies not customized by default', + `removed` datetime COMMENT 'date removed', + `created` datetime COMMENT 'date the disk offering was created', + `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', + PRIMARY KEY (`id`), + INDEX `i_disk_offering__removed`(`removed`), + CONSTRAINT `uc_disk_offering__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`service_offering` ( + `id` bigint unsigned NOT NULL, + `cpu` int(10) unsigned NOT NULL COMMENT '# of cores', + `speed` int(10) unsigned NOT NULL COMMENT 'speed per core in mhz', + `ram_size` bigint unsigned NOT NULL, + `nw_rate` smallint unsigned default 200 COMMENT 'network rate throttle mbits/s', + `mc_rate` smallint unsigned default 10 COMMENT 'mcast rate throttle mbits/s', + `ha_enabled` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Enable HA', + `limit_cpu_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Limit the CPU usage to service offering', + `host_tag` varchar(255) COMMENT 'host tag specified by the service_offering', + `default_use` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'is this offering a default system offering', + `vm_type` varchar(32) COMMENT 'type of offering specified for system offerings', + `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method', + PRIMARY KEY (`id`), + CONSTRAINT `fk_service_offering__id` FOREIGN KEY `fk_service_offering__id`(`id`) REFERENCES `disk_offering`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`network_rule_config` ( + `id` bigint unsigned NOT NULL auto_increment, + `security_group_id` bigint unsigned NOT NULL, + `public_port` varchar(10) default NULL, + `private_port` varchar(10) default NULL, + `protocol` varchar(16) NOT NULL default 'TCP', + `create_status` varchar(32) COMMENT 'rule creation status', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`remote_access_vpn` ( + `vpn_server_addr_id` bigint unsigned UNIQUE NOT NULL, + `account_id` bigint unsigned NOT NULL, + `network_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `local_ip` char(40) NOT NULL, + `ip_range` varchar(32) NOT NULL, + `ipsec_psk` varchar(256) NOT NULL, + `state` char(32) NOT NULL, + PRIMARY KEY (`vpn_server_addr_id`), + CONSTRAINT `fk_remote_access_vpn__account_id` FOREIGN KEY `fk_remote_access_vpn__account_id`(`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_remote_access_vpn__domain_id` FOREIGN KEY `fk_remote_access_vpn__domain_id`(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_remote_access_vpn__network_id` FOREIGN KEY `fk_remote_access_vpn__network_id` (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_remote_access_vpn__vpn_server_addr_id` FOREIGN KEY `fk_remote_access_vpn__vpn_server_addr_id` (`vpn_server_addr_id`) REFERENCES `user_ip_address` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vpn_users` ( + `id` bigint unsigned NOT NULL UNIQUE auto_increment, + `uuid` varchar(40), + `owner_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `state` char(32) NOT NULL COMMENT 'What state is this vpn user in', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vpn_users__owner_id` FOREIGN KEY (`owner_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpn_users__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + INDEX `i_vpn_users_username`(`username`), + UNIQUE `i_vpn_users__account_id__username`(`owner_id`, `username`), + CONSTRAINT `uc_vpn_users__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`storage_pool` ( + `id` bigint unsigned UNIQUE NOT NULL, + `name` varchar(255) COMMENT 'should be NOT NULL', + `uuid` varchar(255) UNIQUE, + `pool_type` varchar(32) NOT NULL, + `port` int unsigned NOT NULL, + `data_center_id` bigint unsigned NOT NULL, + `pod_id` bigint unsigned, + `cluster_id` bigint unsigned COMMENT 'foreign key to cluster', + `available_bytes` bigint unsigned, + `capacity_bytes` bigint unsigned, + `host_address` varchar(255) NOT NULL COMMENT 'FQDN or IP of storage server', + `path` varchar(255) NOT NULL COMMENT 'Filesystem path that is shared', + `created` datetime COMMENT 'date the pool created', + `removed` datetime COMMENT 'date removed if not null', + `update_time` DATETIME, + `status` varchar(32), + PRIMARY KEY (`id`), + CONSTRAINT `fk_storage_pool__pod_id` FOREIGN KEY `fk_storage_pool__pod_id` (`pod_id`) REFERENCES `host_pod_ref` (`id`) ON DELETE CASCADE, + INDEX `i_storage_pool__pod_id`(`pod_id`), + CONSTRAINT `fk_storage_pool__cluster_id` FOREIGN KEY `fk_storage_pool__cluster_id`(`cluster_id`) REFERENCES `cloud`.`cluster`(`id`), + INDEX `i_storage_pool__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`storage_pool_details` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', + `pool_id` bigint unsigned NOT NULL COMMENT 'pool the detail is related to', + `name` varchar(255) NOT NULL COMMENT 'name of the detail', + `value` varchar(255) NOT NULL COMMENT 'value of the detail', + PRIMARY KEY (`id`), + CONSTRAINT `fk_storage_pool_details__pool_id` FOREIGN KEY `fk_storage_pool_details__pool_id`(`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE, + INDEX `i_storage_pool_details__name__value`(`name`(128), `value`(128)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`storage_pool_host_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL, + `pool_id` bigint unsigned NOT NULL, + `created` DATETIME NOT NULL, + `last_updated` DATETIME, + `local_path` varchar(255), + PRIMARY KEY (`id`), + CONSTRAINT `fk_storage_pool_host_ref__host_id` FOREIGN KEY `fk_storage_pool_host_ref__host_id`(`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_storage_pool_host_ref__pool_id` FOREIGN KEY `fk_storage_pool_host_ref__pool_id`(`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`template_spool_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `pool_id` bigint unsigned NOT NULL, + `template_id` bigint unsigned NOT NULL, + `created` DATETIME NOT NULL, + `last_updated` DATETIME, + `job_id` varchar(255), + `download_pct` int(10) unsigned, + `download_state` varchar(255), + `error_str` varchar(255), + `local_path` varchar(255), + `install_path` varchar(255), + `template_size` bigint unsigned NOT NULL COMMENT 'the size of the template on the pool', + `marked_for_gc` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'if true, the garbage collector will evict the template from this pool.', + PRIMARY KEY (`id`), + UNIQUE `i_template_spool_ref__template_id__pool_id`(`template_id`, `pool_id`), + CONSTRAINT `fk_template_spool_ref__template_id` FOREIGN KEY (`template_id`) REFERENCES `vm_template`(`id`), + CONSTRAINT `fk_template_spool_ref__pool_id` FOREIGN KEY (`pool_id`) REFERENCES `storage_pool`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`guest_os` ( + `id` bigint unsigned NOT NULL auto_increment, + `category_id` bigint unsigned NOT NULL, + `name` varchar(255), + `uuid` varchar(40), + `display_name` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `uc_guest_os__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`guest_os_hypervisor` ( + `id` bigint unsigned NOT NULL auto_increment, + `hypervisor_type` varchar(32) NOT NULL, + `guest_os_name` varchar(255) NOT NULL, + `guest_os_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`guest_os_category` ( + `id` bigint unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL, + `uuid` varchar(40), + PRIMARY KEY (`id`), + CONSTRAINT `uc_guest_os_category__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`hypervisor_capabilities` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `hypervisor_type` varchar(32) NOT NULL, + `hypervisor_version` varchar(32), + `max_guests_limit` bigint unsigned DEFAULT 50, + `security_group_enabled` int(1) unsigned DEFAULT 1 COMMENT 'Is security group supported', + PRIMARY KEY (`id`), + CONSTRAINT `uc_hypervisor_capabilities__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', 'default', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', 'XCP 1.0', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6 FP1', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '5.6 SP2', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '6.0', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('XenServer', '6.0.2', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', 'default', 128, 0); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '4.0', 128, 0); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '4.1', 128, 0); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '5.0', 128, 0); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('KVM', 'default', 50, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('Ovm', 'default', 25, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('Ovm', '2.3', 25, 1); + +CREATE TABLE `cloud`.`launch_permission` ( + `id` bigint unsigned NOT NULL auto_increment, + `template_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`snapshot_policy` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `volume_id` bigint unsigned NOT NULL, + `schedule` varchar(100) NOT NULL COMMENT 'schedule time of execution', + `timezone` varchar(100) NOT NULL COMMENT 'the timezone in which the schedule time is specified', + `interval` int(4) NOT NULL default 4 COMMENT 'backup schedule, e.g. hourly, daily, etc.', + `max_snaps` int(8) NOT NULL default 0 COMMENT 'maximum number of snapshots to maintain', + `active` tinyint(1) unsigned NOT NULL COMMENT 'Is the policy active', + PRIMARY KEY (`id`), + CONSTRAINT `uc_snapshot_policy__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`snapshot_schedule` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `volume_id` bigint unsigned NOT NULL COMMENT 'The volume for which this snapshot is being taken', + `policy_id` bigint unsigned NOT NULL COMMENT 'One of the policyIds for which this snapshot was taken', + `scheduled_timestamp` datetime NOT NULL COMMENT 'Time at which the snapshot was scheduled for execution', + `async_job_id` bigint unsigned COMMENT 'If this schedule is being executed, it is the id of the create aysnc_job. Before that it is null', + `snapshot_id` bigint unsigned COMMENT 'If this schedule is being executed, then the corresponding snapshot has this id. Before that it is null', + UNIQUE (volume_id, policy_id), + CONSTRAINT `uc_snapshot_schedule__uuid` UNIQUE (`uuid`), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_pod_vlan_alloc` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary id', + `vlan` varchar(18) NOT NULL COMMENT 'vlan id', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center the pod belongs to', + `pod_id` bigint unsigned NOT NULL COMMENT 'pod the vlan belongs to', + `account_id` bigint unsigned NULL COMMENT 'account the vlan belongs to right now', + `taken` datetime COMMENT 'Date taken', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`security_group` ( + `id` bigint unsigned NOT NULL auto_increment, + `name` varchar(255) NOT NULL, + `uuid` varchar(40), + `description` varchar(4096) NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + UNIQUE (`name`, `account_id`), + PRIMARY KEY (`id`), + CONSTRAINT `uc_security_group__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`security_group_rule` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `security_group_id` bigint unsigned NOT NULL, + `type` varchar(10) default 'ingress', + `start_port` varchar(10) default NULL, + `end_port` varchar(10) default NULL, + `protocol` varchar(16) NOT NULL default 'TCP', + `allowed_network_id` bigint unsigned, + `allowed_ip_cidr` varchar(44), + `create_status` varchar(32) COMMENT 'rule creation status', + PRIMARY KEY (`id`), + CONSTRAINT `uc_security_group_rule__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`security_group_vm_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `security_group_id` bigint unsigned NOT NULL, + `instance_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_nwgrp_work` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance that needs rules to be synced.', + `mgmt_server_id` bigint unsigned COMMENT 'management server that has taken up the work of doing rule sync', + `created` datetime NOT NULL COMMENT 'time the entry was requested', + `taken` datetime COMMENT 'time it was taken by the management server', + `step` varchar(32) NOT NULL COMMENT 'Step in the work', + `seq_no` bigint unsigned COMMENT 'seq number to be sent to agent, uniquely identifies ruleset update', + PRIMARY KEY (`id`), + INDEX `i_op_nwgrp_work__instance_id`(`instance_id`), + INDEX `i_op_nwgrp_work__mgmt_server_id`(`mgmt_server_id`), + INDEX `i_op_nwgrp_work__taken`(`taken`), + INDEX `i_op_nwgrp_work__step`(`step`), + INDEX `i_op_nwgrp_work__seq_no`(`seq_no`) +) ENGINE=MEMORY DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_vm_ruleset_log` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance that needs rules to be synced.', + `created` datetime NOT NULL COMMENT 'time the entry was requested', + `logsequence` bigint unsigned COMMENT 'seq number to be sent to agent, uniquely identifies ruleset update', + PRIMARY KEY (`id`), + UNIQUE `u_op_vm_ruleset_log__instance_id`(`instance_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`instance_group` ( + `id` bigint unsigned NOT NULL UNIQUE auto_increment, + `account_id` bigint unsigned NOT NULL COMMENT 'owner. foreign key to account table', + `name` varchar(255) NOT NULL, + `uuid` varchar(40), + `removed` datetime COMMENT 'date the group was removed', + `created` datetime COMMENT 'date the group was created', + PRIMARY KEY (`id`), + INDEX `i_instance_group__removed`(`removed`), + CONSTRAINT `uc_instance_group__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`instance_group_vm_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `group_id` bigint unsigned NOT NULL, + `instance_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`ssh_keypairs` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `account_id` bigint unsigned NOT NULL COMMENT 'owner, foreign key to account table', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain, foreign key to domain table', + `keypair_name` varchar(256) NOT NULL COMMENT 'name of the key pair', + `fingerprint` varchar(128) NOT NULL COMMENT 'fingerprint for the ssh public key', + `public_key` varchar(5120) NOT NULL COMMENT 'public key of the ssh key pair', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`usage_event` ( + `id` bigint unsigned NOT NULL auto_increment, + `type` varchar(32) NOT NULL, + `account_id` bigint unsigned NOT NULL, + `created` datetime NOT NULL, + `zone_id` bigint unsigned NOT NULL, + `resource_id` bigint unsigned, + `resource_name` varchar(255), + `offering_id` bigint unsigned, + `template_id` bigint unsigned, + `size` bigint unsigned, + `resource_type` varchar(32), + `processed` tinyint NOT NULL default '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`ovs_tunnel_interface` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `ip` varchar(16) DEFAULT NULL, + `netmask` varchar(16) DEFAULT NULL, + `mac` varchar(18) DEFAULT NULL, + `host_id` bigint DEFAULT NULL, + `label` varchar(45) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `cloud`.`ovs_tunnel_interface` (`ip`, `netmask`, `mac`, `host_id`, `label`) VALUES ('0', '0', '0', 0, 'lock'); + +CREATE TABLE `cloud`.`ovs_tunnel_network`( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT, + `from` bigint unsigned COMMENT 'from host id', + `to` bigint unsigned COMMENT 'to host id', + `network_id` bigint unsigned COMMENT 'network identifier', + `key` int unsigned COMMENT 'gre key', + `port_name` varchar(32) COMMENT 'in port on open vswitch', + `state` varchar(16) default 'FAILED' COMMENT 'result of tunnel creatation', + PRIMARY KEY(`from`, `to`, `network_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `cloud`.`ovs_tunnel_network` (`from`, `to`, `network_id`, `key`, `port_name`, `state`) VALUES (0, 0, 0, 0, 'lock', 'SUCCESS'); + +CREATE TABLE `cloud`.`storage_pool_work` ( + `id` bigint unsigned UNIQUE NOT NULL AUTO_INCREMENT COMMENT 'id', + `pool_id` bigint unsigned NOT NULL COMMENT 'storage pool associated with the vm', + `vm_id` bigint unsigned NOT NULL COMMENT 'vm identifier', + `stopped_for_maintenance` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'this flag denoted whether the vm was stopped during maintenance', + `started_after_maintenance` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'this flag denoted whether the vm was started after maintenance', + `mgmt_server_id` bigint unsigned NOT NULL COMMENT 'management server id', + PRIMARY KEY (`id`), + UNIQUE (pool_id,vm_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`data_center_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `dc_id` bigint unsigned NOT NULL COMMENT 'dc id', + `name` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_dc_details__dc_id` FOREIGN KEY (`dc_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`domain_network_ref` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + `subdomain_access` int(1) unsigned COMMENT '1 if network can be accessible from the subdomain', + PRIMARY KEY (`id`), + CONSTRAINT `fk_domain_network_ref__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_domain_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`cmd_exec_log` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `host_id` bigint unsigned NOT NULL COMMENT 'host id of the system VM agent that command is sent to', + `instance_id` bigint unsigned NOT NULL COMMENT 'instance id of the system VM that command is executed on', + `command_name` varchar(255) NOT NULL COMMENT 'command name', + `weight` integer NOT NULL DEFAULT 1 COMMENT 'command weight in consideration of the load factor added to host that is executing the command', + `created` datetime NOT NULL COMMENT 'date created', + PRIMARY KEY (`id`), + INDEX `i_cmd_exec_log__host_id`(`host_id`), + INDEX `i_cmd_exec_log__instance_id`(`instance_id`), + CONSTRAINT `fk_cmd_exec_log_ref__inst_id` FOREIGN KEY (`instance_id`) REFERENCES `vm_instance`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`keystore` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(64) NOT NULL COMMENT 'unique name for the certifiation', + `certificate` text NOT NULL COMMENT 'the actual certificate being stored in the db', + `key` text COMMENT 'private key associated wih the certificate', + `domain_suffix` varchar(256) NOT NULL COMMENT 'DNS domain suffix associated with the certificate', + `seq` int, + PRIMARY KEY (`id`), + UNIQUE(name) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`swift` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT, + `uuid` varchar(40), + `url` varchar(255) NOT NULL, + `account` varchar(255) NOT NULL COMMENT ' account in swift', + `username` varchar(255) NOT NULL COMMENT ' username in swift', + `key` varchar(255) NOT NULL COMMENT 'token for this user', + `created` datetime COMMENT 'date the swift first signed on', + PRIMARY KEY (`id`), + CONSTRAINT `uc_swift__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`op_host_transfer` ( + `id` bigint unsigned UNIQUE NOT NULL COMMENT 'Id of the host', + `initial_mgmt_server_id` bigint unsigned COMMENT 'management server the host is transfered from', + `future_mgmt_server_id` bigint unsigned COMMENT 'management server the host is transfered to', + `state` varchar(32) NOT NULL COMMENT 'the transfer state of the host', + `created` datetime NOT NULL COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_op_host_transfer__id` FOREIGN KEY `fk_op_host_transfer__id` (`id`) REFERENCES `host` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_op_host_transfer__initial_mgmt_server_id` FOREIGN KEY `fk_op_host_transfer__initial_mgmt_server_id`(`initial_mgmt_server_id`) REFERENCES `mshost`(`msid`), + CONSTRAINT `fk_op_host_transfer__future_mgmt_server_id` FOREIGN KEY `fk_op_host_transfer__future_mgmt_server_id`(`future_mgmt_server_id`) REFERENCES `mshost`(`msid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`projects` ( + `id` bigint unsigned NOT NULL auto_increment, + `name` varchar(255) COMMENT 'project name', + `uuid` varchar(40), + `display_text` varchar(255) COMMENT 'project name', + `project_account_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `created` datetime COMMENT 'date created', + `removed` datetime COMMENT 'date removed', + `state` varchar(255) NOT NULL COMMENT 'state of the project (Active/Inactive/Suspended)', + PRIMARY KEY (`id`), + CONSTRAINT `fk_projects__project_account_id` FOREIGN KEY(`project_account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_projects__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + INDEX `i_projects__removed`(`removed`), + CONSTRAINT `uc_projects__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`project_account` ( + `id` bigint unsigned NOT NULL auto_increment, + `account_id` bigint unsigned NOT NULL COMMENT'account id', + `account_role` varchar(255) NOT NULL DEFAULT 'Regular' COMMENT 'Account role in the project (Owner or Regular)', + `project_id` bigint unsigned NOT NULL COMMENT 'project id', + `project_account_id` bigint unsigned NOT NULL, + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_project_account__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_project_account__project_id` FOREIGN KEY(`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_project_account__project_account_id` FOREIGN KEY(`project_account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + UNIQUE (`account_id`, `project_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`project_invitations` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `project_id` bigint unsigned NOT NULL COMMENT 'project id', + `account_id` bigint unsigned COMMENT 'account id', + `domain_id` bigint unsigned COMMENT 'domain id', + `email` varchar(255) COMMENT 'email', + `token` varchar(255) COMMENT 'token', + `state` varchar(255) NOT NULL DEFAULT 'Pending' COMMENT 'the state of the invitation', + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_project_invitations__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_project_invitations__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_project_invitations__project_id` FOREIGN KEY(`project_id`) REFERENCES `projects`(`id`) ON DELETE CASCADE, + UNIQUE (`project_id`, `account_id`), + UNIQUE (`project_id`, `email`), + UNIQUE (`project_id`, `token`), + CONSTRAINT `uc_project_invitations__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`elastic_lb_vm_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `ip_addr_id` bigint unsigned NOT NULL, + `elb_vm_id` bigint unsigned NOT NULL, + `lb_id` bigint unsigned, + PRIMARY KEY (`id`), + CONSTRAINT `fk_elastic_lb_vm_map__ip_id` FOREIGN KEY `fk_elastic_lb_vm_map__ip_id` (`ip_addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_elastic_lb_vm_map__elb_vm_id` FOREIGN KEY `fk_elastic_lb_vm_map__elb_vm_id` (`elb_vm_id`) REFERENCES `vm_instance` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_elastic_lb_vm_map__lb_id` FOREIGN KEY `fk_elastic_lb_vm_map__lb_id` (`lb_id`) REFERENCES `load_balancing_rules` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `ntwk_offering_service_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `network_offering_id` bigint unsigned NOT NULL COMMENT 'network_offering_id', + `service` varchar(255) NOT NULL COMMENT 'service', + `provider` varchar(255) COMMENT 'service provider', + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_ntwk_offering_service_map__network_offering_id` FOREIGN KEY(`network_offering_id`) REFERENCES `network_offerings`(`id`) ON DELETE CASCADE, + UNIQUE (`network_offering_id`, `service`, `provider`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `ntwk_service_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `network_id` bigint unsigned NOT NULL COMMENT 'network_id', + `service` varchar(255) NOT NULL COMMENT 'service', + `provider` varchar(255) COMMENT 'service provider', + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_ntwk_service_map__network_id` FOREIGN KEY(`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + UNIQUE (`network_id`, `service`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`physical_network` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `name` varchar(255) NOT NULL, + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this physical network belongs to', + `vnet` varchar(255), + `speed` varchar(32), + `domain_id` bigint unsigned COMMENT 'foreign key to domain id', + `broadcast_domain_range` varchar(32) NOT NULL DEFAULT 'POD' COMMENT 'range of broadcast domain : POD/ZONE', + `state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'what state is this configuration in', + `created` datetime COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_physical_network__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), + CONSTRAINT `uc_physical_networks__uuid` UNIQUE (`uuid`), + INDEX `i_physical_network__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `tag` varchar(255) NOT NULL COMMENT 'tag', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network_tags__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + UNIQUE KEY(`physical_network_id`, `tag`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_isolation_methods` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `isolation_method` varchar(255) NOT NULL COMMENT 'isolation method(VLAN, L3 or GRE)', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network_imethods__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + UNIQUE KEY(`physical_network_id`, `isolation_method`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_traffic_types` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `traffic_type` varchar(32) NOT NULL COMMENT 'type of traffic going through this network', + `xen_network_label` varchar(255) COMMENT 'The network name label of the physical device dedicated to this traffic on a XenServer host', + `kvm_network_label` varchar(255) DEFAULT 'cloudbr0' COMMENT 'The network name label of the physical device dedicated to this traffic on a KVM host', + `vmware_network_label` varchar(255) DEFAULT 'vSwitch0' COMMENT 'The network name label of the physical device dedicated to this traffic on a VMware host', + `simulator_network_label` varchar(255) COMMENT 'The name labels needed for identifying the simulator', + `ovm_network_label` varchar(255) COMMENT 'The network name label of the physical device dedicated to this traffic on a Ovm host', + `vlan` varchar(255) COMMENT 'The vlan tag to be sent down to a VMware host', + PRIMARY KEY (`id`), + CONSTRAINT `fk_physical_network_traffic_types__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_traffic_types__uuid` UNIQUE (`uuid`), + UNIQUE KEY(`physical_network_id`, `traffic_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`physical_network_service_providers` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network', + `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name', + `state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'provider state', + `destination_physical_network_id` bigint unsigned COMMENT 'id of the physical network to bridge to', + `vpn_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is VPN service provided', + `dhcp_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is DHCP service provided', + `dns_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is DNS service provided', + `gateway_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Gateway service provided', + `firewall_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Firewall service provided', + `source_nat_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Source NAT service provided', + `load_balance_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is LB service provided', + `static_nat_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Static NAT service provided', + `port_forwarding_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Port Forwarding service provided', + `user_data_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is UserData service provided', + `security_group_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is SG service provided', + `networkacl_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Network ACL service provided', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_pnetwork_service_providers__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_service_providers__uuid` UNIQUE (`uuid`), + UNIQUE KEY(`physical_network_id`, `provider_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`external_load_balancer_devices` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which load balancer device is added', + `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this load balancer device', + `device_name` varchar(255) NOT NULL COMMENT 'name of the load balancer device', + `capacity` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'Capacity of the load balancer device', + `device_state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'state (enabled/disabled/shutdown) of the device', + `allocation_state` varchar(32) NOT NULL DEFAULT 'Free' COMMENT 'Allocation state (Free/Shared/Dedicated/Provider) of the device', + `is_dedicated` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if device/appliance is provisioned for dedicated use only', + `is_inline` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer will be used in in-line configuration with firewall', + `is_managed` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if load balancer appliance is provisioned and its life cycle is managed by by cloudstack', + `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external load balancer device', + `parent_host_id` bigint unsigned COMMENT 'if the load balancer appliance is cloudstack managed, then host id on which this appliance is provisioned', + PRIMARY KEY (`id`), + CONSTRAINT `fk_external_lb_devices_host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_external_lb_devices_parent_host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_external_lb_devices_physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`external_firewall_devices` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which firewall device is added', + `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this firewall device', + `device_name` varchar(255) NOT NULL COMMENT 'name of the firewall device', + `device_state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'state (enabled/disabled/shutdown) of the device', + `is_dedicated` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if device/appliance meant for dedicated use only', + `allocation_state` varchar(32) NOT NULL DEFAULT 'Free' COMMENT 'Allocation state (Free/Allocated) of the device', + `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external firewall device', + `capacity` bigint unsigned NOT NULL DEFAULT 0 COMMENT 'Capacity of the external firewall device', + PRIMARY KEY (`id`), + CONSTRAINT `fk_external_firewall_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_external_firewall_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`network_external_lb_device_map` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `network_id` bigint unsigned NOT NULL COMMENT ' guest network id', + `external_load_balancer_device_id` bigint unsigned NOT NULL COMMENT 'id of external load balancer device assigned for this network', + `created` datetime COMMENT 'Date from when network started using the device', + `removed` datetime COMMENT 'Date till the network stopped using the device ', + PRIMARY KEY (`id`), + CONSTRAINT `fk_network_external_lb_devices_network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_network_external_lb_devices_device_id` FOREIGN KEY (`external_load_balancer_device_id`) REFERENCES `external_load_balancer_devices`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`network_external_firewall_device_map` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `network_id` bigint unsigned NOT NULL COMMENT ' guest network id', + `external_firewall_device_id` bigint unsigned NOT NULL COMMENT 'id of external firewall device assigned for this device', + `created` datetime COMMENT 'Date from when network started using the device', + `removed` datetime COMMENT 'Date till the network stopped using the device ', + PRIMARY KEY (`id`), + CONSTRAINT `fk_network_external_firewall_devices_network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_network_external_firewall_devices_device_id` FOREIGN KEY (`external_firewall_device_id`) REFERENCES `external_firewall_devices`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`virtual_router_providers` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `nsp_id` bigint unsigned NOT NULL COMMENT 'Network Service Provider ID', + `uuid` varchar(40), + `type` varchar(255) NOT NULL COMMENT 'Virtual router, or ElbVM', + `enabled` int(1) NOT NULL COMMENT 'Enabled or disabled', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_virtual_router_providers__nsp_id` FOREIGN KEY (`nsp_id`) REFERENCES `physical_network_service_providers` (`id`) ON DELETE CASCADE, + CONSTRAINT `uc_virtual_router_providers__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`op_user_stats_log` ( + `user_stats_id` bigint unsigned NOT NULL, + `net_bytes_received` bigint unsigned NOT NULL default '0', + `net_bytes_sent` bigint unsigned NOT NULL default '0', + `current_bytes_received` bigint unsigned NOT NULL default '0', + `current_bytes_sent` bigint unsigned NOT NULL default '0', + `agg_bytes_received` bigint unsigned NOT NULL default '0', + `agg_bytes_sent` bigint unsigned NOT NULL default '0', + `updated` datetime COMMENT 'stats update timestamp', + UNIQUE KEY (`user_stats_id`, `updated`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`cluster_vsm_map` ( + `cluster_id` bigint unsigned NOT NULL, + `vsm_id` bigint unsigned NOT NULL, + PRIMARY KEY (`cluster_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`virtual_supervisor_module` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `host_id` bigint NOT NULL, + `vsm_name` varchar(255), + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `ipaddr` varchar(80) NOT NULL, + `management_vlan` int(32), + `control_vlan` int(32), + `packet_vlan` int(32), + `storage_vlan` int(32), + `vsm_domain_id` bigint unsigned, + `config_mode` varchar(20), + `config_state` varchar(20), + `vsm_device_state` varchar(20) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`port_profile` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `port_profile_name` varchar(255), + `port_mode` varchar(10), + `vsm_id` bigint unsigned NOT NULL, + `trunk_low_vlan_id` int, + `trunk_high_vlan_id` int, + `access_vlan_id` int, + `port_type` varchar(20) NOT NULL, + `port_binding` varchar(20), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`s2s_vpn_gateway` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `addr_id` bigint unsigned NOT NULL, + `vpc_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_s2s_vpn_gateway__addr_id` FOREIGN KEY (`addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_gateway__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_gateway__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_gateway__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_s2s_vpn_gateway__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`s2s_customer_gateway` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `gateway_ip` char(40) NOT NULL, + `guest_cidr_list` varchar(200) NOT NULL, + `ipsec_psk` varchar(256), + `ike_policy` varchar(30) NOT NULL, + `esp_policy` varchar(30) NOT NULL, + `lifetime` int, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_s2s_customer_gateway__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_customer_gateway__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_s2s_customer_gateway__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`s2s_vpn_connection` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `vpn_gateway_id` bigint unsigned NULL, + `customer_gateway_id` bigint unsigned NULL, + `state` varchar(32) NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_s2s_vpn_connection__vpn_gateway_id` FOREIGN KEY (`vpn_gateway_id`) REFERENCES `s2s_vpn_gateway` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_connection__customer_gateway_id` FOREIGN KEY (`customer_gateway_id`) REFERENCES `s2s_customer_gateway` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_connection__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_connection__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_s2s_vpn_connection__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`resource_tags` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `key` varchar(255), + `value` varchar(255), + `resource_id` bigint unsigned NOT NULL, + `resource_uuid` varchar(40), + `resource_type` varchar(255), + `customer` varchar(255), + `domain_id` bigint unsigned NOT NULL COMMENT 'foreign key to domain id', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this network', + PRIMARY KEY (`id`), + CONSTRAINT `fk_tags__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), + CONSTRAINT `fk_tags__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), + UNIQUE `i_tags__resource_id__resource_type__key`(`resource_id`, `resource_type`, `key`), + CONSTRAINT `uc_resource_tags__uuid` UNIQUE (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vpc` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40) NOT NULL, + `name` varchar(255) COMMENT 'vpc name', + `display_text` varchar(255) COMMENT 'vpc display text', + `cidr` varchar(18) COMMENT 'vpc cidr', + `vpc_offering_id` bigint unsigned NOT NULL COMMENT 'vpc offering id that this vpc is created from', + `zone_id` bigint unsigned NOT NULL COMMENT 'the id of the zone this Vpc belongs to', + `state` varchar(32) NOT NULL COMMENT 'state of the VP (can be Enabled and Disabled)', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain the vpc belongs to', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this vpc', + `network_domain` varchar(255) COMMENT 'network domain', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the VPC', + PRIMARY KEY (`id`), + INDEX `i_vpc__removed`(`removed`), + CONSTRAINT `fk_vpc__zone_id` FOREIGN KEY `fk_vpc__zone_id` (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpc__vpc_offering_id` FOREIGN KEY (`vpc_offering_id`) REFERENCES `vpc_offerings`(`id`), + CONSTRAINT `fk_vpc__account_id` FOREIGN KEY `fk_vpc__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpc__domain_id` FOREIGN KEY `fk_vpc__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`vpc_offerings` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40) NOT NULL, + `unique_name` varchar(64) UNIQUE COMMENT 'unique name of the vpc offering', + `name` varchar(255) COMMENT 'vpc name', + `display_text` varchar(255) COMMENT 'display text', + `state` char(32) COMMENT 'state of the vpc offering that has Disabled value by default', + `default` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if vpc offering is default', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + `service_offering_id` bigint unsigned COMMENT 'service offering id that virtual router is tied to', + PRIMARY KEY (`id`), + INDEX `i_vpc__removed`(`removed`), + CONSTRAINT `fk_vpc_offerings__service_offering_id` FOREIGN KEY `fk_vpc_offerings__service_offering_id` (`service_offering_id`) REFERENCES `service_offering`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vpc_offering_service_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `vpc_offering_id` bigint unsigned NOT NULL COMMENT 'vpc_offering_id', + `service` varchar(255) NOT NULL COMMENT 'service', + `provider` varchar(255) COMMENT 'service provider', + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vpc_offering_service_map__vpc_offering_id` FOREIGN KEY(`vpc_offering_id`) REFERENCES `vpc_offerings`(`id`) ON DELETE CASCADE, + UNIQUE (`vpc_offering_id`, `service`, `provider`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`router_network_ref` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `router_id` bigint unsigned NOT NULL COMMENT 'router id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', + PRIMARY KEY (`id`), + CONSTRAINT `fk_router_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + UNIQUE `i_router_network_ref__router_id__network_id`(`router_id`, `network_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`vpc_gateways` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `ip4_address` char(40) COMMENT 'ip4 address of the gateway', + `netmask` varchar(15) COMMENT 'netmask of the gateway', + `gateway` varchar(15) COMMENT 'gateway', + `vlan_tag` varchar(255), + `type` varchar(32) COMMENT 'type of gateway; can be Public/Private/Vpn', + `network_id` bigint unsigned NOT NULL COMMENT 'network id vpc gateway belongs to', + `vpc_id` bigint unsigned NOT NULL COMMENT 'id of the vpc the gateway belongs to', + `zone_id` bigint unsigned NOT NULL COMMENT 'id of the zone the gateway belongs to', + `created` datetime COMMENT 'date created', + `account_id` bigint unsigned NOT NULL COMMENT 'owner id', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', + `state` varchar(32) NOT NULL COMMENT 'what state the vpc gateway in', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vpc_gateways__network_id` FOREIGN KEY `fk_vpc_gateways__network_id`(`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_vpc_gateways__vpc_id` FOREIGN KEY `fk_vpc_gateways__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`), + CONSTRAINT `fk_vpc_gateways__zone_id` FOREIGN KEY `fk_vpc_gateways__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), + CONSTRAINT `fk_vpc_gateways__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpc_gateways__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_vpc_gateways__uuid` UNIQUE (`uuid`), + INDEX `i_vpc_gateways__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`private_ip_address` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', + `ip_address` char(40) NOT NULL COMMENT 'ip address', + `network_id` bigint unsigned NOT NULL COMMENT 'id of the network ip belongs to', + `reservation_id` char(40) COMMENT 'reservation id', + `mac_address` varchar(17) COMMENT 'mac address', + `vpc_id` bigint unsigned COMMENT 'vpc this ip belongs to', + `taken` datetime COMMENT 'Date taken', + PRIMARY KEY (`id`), + CONSTRAINT `fk_private_ip_address__vpc_id` FOREIGN KEY `fk_private_ip_address__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`), + CONSTRAINT `fk_private_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`static_routes` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `vpc_gateway_id` bigint unsigned COMMENT 'id of the corresponding ip address', + `cidr` varchar(18) COMMENT 'cidr for the static route', + `state` char(32) NOT NULL COMMENT 'current state of this rule', + `vpc_id` bigint unsigned COMMENT 'vpc the firewall rule is associated with', + `account_id` bigint unsigned NOT NULL COMMENT 'owner id', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', + `created` datetime COMMENT 'Date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_static_routes__vpc_gateway_id` FOREIGN KEY(`vpc_gateway_id`) REFERENCES `vpc_gateways`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_static_routes__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_static_routes__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_static_routes__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_static_routes__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`counter` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `source` varchar(255) NOT NULL COMMENT 'source e.g. netscaler, snmp', + `name` varchar(255) NOT NULL COMMENT 'Counter name', + `value` varchar(255) NOT NULL COMMENT 'Value in case of source=snmp', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `uc_counter__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`conditions` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `counter_id` bigint unsigned NOT NULL COMMENT 'Counter Id', + `threshold` bigint unsigned NOT NULL COMMENT 'threshold value for the given counter', + `relational_operator` char(2) COMMENT 'relational operator to be used upon the counter and condition', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain the Condition belongs to', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this Condition', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_conditions__counter_id` FOREIGN KEY `fk_condition__counter_id`(`counter_id`) REFERENCES `counter`(`id`), + CONSTRAINT `fk_conditions__account_id` FOREIGN KEY `fk_condition__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_conditions__domain_id` FOREIGN KEY `fk_condition__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_conditions__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_vmprofiles` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `zone_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `autoscale_user_id` bigint unsigned NOT NULL, + `service_offering_id` bigint unsigned NOT NULL, + `template_id` bigint unsigned NOT NULL, + `other_deploy_params` varchar(1024) COMMENT 'other deployment parameters that is in addition to zoneid,serviceofferingid,domainid', + `destroy_vm_grace_period` int unsigned COMMENT 'the time allowed for existing connections to get closed before a vm is destroyed', + `snmp_community` varchar(255) COMMENT 'the community string to be used to reach out to the VM deployed by this profile', + `snmp_port` int unsigned COMMENT 'the snmp port to be used to reach out to the VM deployed by this profile', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_vmprofiles__domain_id` FOREIGN KEY `fk_autoscale_vmprofiles__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmprofiles__account_id` FOREIGN KEY `fk_autoscale_vmprofiles__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmprofiles__autoscale_user_id` FOREIGN KEY `fk_autoscale_vmprofiles__autoscale_user_id` (`autoscale_user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_autoscale_vmprofiles__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_policies` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `duration` int unsigned NOT NULL, + `quiet_time` int unsigned NOT NULL, + `action` varchar(15), + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_policies__domain_id` FOREIGN KEY `fk_autoscale_policies__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_policies__account_id` FOREIGN KEY `fk_autoscale_policies__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_autoscale_policies__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_vmgroups` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `zone_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `load_balancer_id` bigint unsigned NOT NULL, + `min_members` int unsigned DEFAULT 1, + `max_members` int unsigned NOT NULL, + `interval` int unsigned NOT NULL, + `profile_id` bigint unsigned NOT NULL, + `state` varchar(255) NOT NULL COMMENT 'enabled or disabled, a vmgroup is disabled to stop autoscaling activity', + `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when a condition needs to be disassociated with a policy', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_vmgroup__autoscale_vmprofile_id` FOREIGN KEY(`profile_id`) REFERENCES `autoscale_vmprofiles`(`id`), + CONSTRAINT `fk_autoscale_vmgroup__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroups__domain_id` FOREIGN KEY `fk_autoscale_vmgroups__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroups__account_id` FOREIGN KEY `fk_autoscale_vmgroups__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroups__zone_id` FOREIGN KEY `fk_autoscale_vmgroups__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), + CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `policy_id` bigint unsigned NOT NULL, + `condition_id` bigint unsigned NOT NULL, + `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when a condition needs to be disassociated with a policy', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_policy_condition_map__policy_id` FOREIGN KEY `fk_autoscale_policy_condition_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `vmgroup_id` bigint unsigned NOT NULL, + `policy_id` bigint unsigned NOT NULL, + `revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 is when a policy needs to be disassociated with a vmgroup', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_vmgroup_policy_map__vmgroup_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__vmgroup_id` (`vmgroup_id`) REFERENCES `autoscale_vmgroups` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroup_policy_map__policy_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +SET foreign_key_checks = 1; + diff --git a/utils/src/com/cloud/utils/net/NetUtils.java b/utils/src/com/cloud/utils/net/NetUtils.java index ac301726da5..8e35822fbd7 100755 --- a/utils/src/com/cloud/utils/net/NetUtils.java +++ b/utils/src/com/cloud/utils/net/NetUtils.java @@ -1,1138 +1,1150 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 -package com.cloud.utils.net; - -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStreamReader; -import java.lang.reflect.Array; -import java.net.InetAddress; -import java.net.InterfaceAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Formatter; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.log4j.Logger; -import org.apache.log4j.xml.DOMConfigurator; - -import com.cloud.utils.IteratorUtil; -import com.cloud.utils.Pair; -import com.cloud.utils.script.Script; - -public class NetUtils { - protected final static Logger s_logger = Logger.getLogger(NetUtils.class); - public final static String HTTP_PORT = "80"; - public final static int VPN_PORT = 500; - public final static int VPN_NATT_PORT = 4500; - public final static int VPN_L2TP_PORT = 1701; - - public final static String UDP_PROTO = "udp"; - public final static String TCP_PROTO = "tcp"; - public final static String ANY_PROTO = "any"; - public final static String ICMP_PROTO = "icmp"; - public final static String ALL_PROTO = "all"; - - public final static String ALL_CIDRS = "0.0.0.0/0"; - - private final static Random _rand = new Random(System.currentTimeMillis()); - - public static long createSequenceBasedMacAddress(long macAddress) { - return macAddress | 0x060000000000l | (((long) _rand.nextInt(32768) << 25) & 0x00fffe000000l); - } - - public static String getHostName() { - try { - InetAddress localAddr = InetAddress.getLocalHost(); - if (localAddr != null) { - return localAddr.getHostName(); - } - } catch (UnknownHostException e) { - s_logger.warn("UnknownHostException when trying to get host name. ", e); - } - return "localhost"; - } - - public static InetAddress getLocalInetAddress() { - try { - return InetAddress.getLocalHost(); - } catch (UnknownHostException e) { - s_logger.warn("UnknownHostException in getLocalInetAddress().", e); - return null; - } - } - - public static String resolveToIp(String host) { - try { - InetAddress addr = InetAddress.getByName(host); - return ipFromInetAddress(addr); - } catch (UnknownHostException e) { - s_logger.warn("Unable to resolve " + host + " to IP due to UnknownHostException"); - return null; - } - } - - public static InetAddress[] getAllLocalInetAddresses() { - List addrList = new ArrayList(); - try { - for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { - if (ifc.isUp() && !ifc.isVirtual()) { - for (InetAddress addr : IteratorUtil.enumerationAsIterable(ifc.getInetAddresses())) { - addrList.add(addr); - } - } - } - } catch (SocketException e) { - s_logger.warn("SocketException in getAllLocalInetAddresses().", e); - } - - InetAddress[] addrs = new InetAddress[addrList.size()]; - if (addrList.size() > 0) { - System.arraycopy(addrList.toArray(), 0, addrs, 0, addrList.size()); - } - return addrs; - } - - public static String[] getLocalCidrs() { - String defaultHostIp = getDefaultHostIp(); - - List cidrList = new ArrayList(); - try { - for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { - if (ifc.isUp() && !ifc.isVirtual() && !ifc.isLoopback()) { - for (InterfaceAddress address : ifc.getInterfaceAddresses()) { - InetAddress addr = address.getAddress(); - int prefixLength = address.getNetworkPrefixLength(); - if (prefixLength < 32 && prefixLength > 0) { - String ip = ipFromInetAddress(addr); - if(ip.equalsIgnoreCase(defaultHostIp)) - cidrList.add(ipAndNetMaskToCidr(ip, getCidrNetmask(prefixLength))); - } - } - } - } - } catch (SocketException e) { - s_logger.warn("UnknownHostException in getLocalCidrs().", e); - } - - return cidrList.toArray(new String[0]); - } - - private static boolean isWindows() { - String os = System.getProperty("os.name"); - if(os != null && os.startsWith("Windows")) - return true; - - return false; - } - - public static String getDefaultHostIp() { - if(isWindows()) { - Pattern pattern = Pattern.compile("\\s*0.0.0.0\\s*0.0.0.0\\s*(\\S*)\\s*(\\S*)\\s*"); - try { - Process result = Runtime.getRuntime().exec("route print -4"); - BufferedReader output = new BufferedReader - (new InputStreamReader(result.getInputStream())); - - String line = output.readLine(); - while(line != null){ - Matcher matcher = pattern.matcher(line); - if (matcher.find()) { - return matcher.group(2); - } - line = output.readLine(); - } - } catch( Exception e ) { - } - return null; - } else { - NetworkInterface nic = null; - String pubNic = getDefaultEthDevice(); - - if (pubNic == null) { - return null; - } - - try { - nic = NetworkInterface.getByName(pubNic); - } catch (final SocketException e) { - return null; - } - - String[] info = NetUtils.getNetworkParams(nic); - return info[0]; - } - } - - public static String getDefaultEthDevice() { - String defaultRoute = Script.runSimpleBashScript("/sbin/route | grep default"); - - if (defaultRoute == null) { - return null; - } - - String[] defaultRouteList = defaultRoute.split("\\s+"); - - if (defaultRouteList.length != 8) { - return null; - } - - return defaultRouteList[7]; - } - - public static InetAddress getFirstNonLoopbackLocalInetAddress() { - InetAddress[] addrs = getAllLocalInetAddresses(); - if (addrs != null) { - for (InetAddress addr : addrs) { - if (s_logger.isInfoEnabled()) { - s_logger.info("Check local InetAddress : " + addr.toString() + ", total count :" + addrs.length); - } - - if (!addr.isLoopbackAddress()) { - return addr; - } - } - } - - s_logger.warn("Unable to determine a non-loopback address, local inet address count :" + addrs.length); - return null; - } - - public static InetAddress[] getInterfaceInetAddresses(String ifName) { - List addrList = new ArrayList(); - try { - for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { - if (ifc.isUp() && !ifc.isVirtual() && ifc.getName().equals(ifName)) { - for (InetAddress addr : IteratorUtil.enumerationAsIterable(ifc.getInetAddresses())) { - addrList.add(addr); - } - } - } - } catch (SocketException e) { - s_logger.warn("SocketException in getAllLocalInetAddresses().", e); - } - - InetAddress[] addrs = new InetAddress[addrList.size()]; - if (addrList.size() > 0) { - System.arraycopy(addrList.toArray(), 0, addrs, 0, addrList.size()); - } - return addrs; - } - - public static String getLocalIPString() { - InetAddress addr = getLocalInetAddress(); - if (addr != null) { - return ipFromInetAddress(addr); - } - - return new String("127.0.0.1"); - } - - public static String ipFromInetAddress(InetAddress addr) { - assert (addr != null); - - byte[] ipBytes = addr.getAddress(); - StringBuffer sb = new StringBuffer(); - sb.append(ipBytes[0] & 0xff).append("."); - sb.append(ipBytes[1] & 0xff).append("."); - sb.append(ipBytes[2] & 0xff).append("."); - sb.append(ipBytes[3] & 0xff); - - return sb.toString(); - } - - public static boolean isLocalAddress(InetAddress addr) { - InetAddress[] addrs = getAllLocalInetAddresses(); - - if (addrs != null) { - for (InetAddress self : addrs) { - if (self.equals(addr)) { - return true; - } - } - } - return false; - } - - public static boolean isLocalAddress(String strAddress) { - - InetAddress addr; - try { - addr = InetAddress.getByName(strAddress); - return isLocalAddress(addr); - } catch (UnknownHostException e) { - } - return false; - } - - public static String getMacAddress(InetAddress address) { - StringBuffer sb = new StringBuffer(); - Formatter formatter = new Formatter(sb); - try { - NetworkInterface ni = NetworkInterface.getByInetAddress(address); - byte[] mac = ni.getHardwareAddress(); - - for (int i = 0; i < mac.length; i++) { - formatter.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""); - } - } catch (SocketException e) { - s_logger.error("SocketException when trying to retrieve MAC address", e); - } - return sb.toString(); - } - - public static long getMacAddressAsLong(InetAddress address) { - long macAddressAsLong = 0; - try { - NetworkInterface ni = NetworkInterface.getByInetAddress(address); - byte[] mac = ni.getHardwareAddress(); - - for (int i = 0; i < mac.length; i++) { - macAddressAsLong |= ((long) (mac[i] & 0xff) << (mac.length - i - 1) * 8); - } - - } catch (SocketException e) { - s_logger.error("SocketException when trying to retrieve MAC address", e); - } - - return macAddressAsLong; - } - - public static boolean ipRangesOverlap(String startIp1, String endIp1, String startIp2, String endIp2) { - long startIp1Long = ip2Long(startIp1); - long endIp1Long = startIp1Long; - if (endIp1 != null) { - endIp1Long = ip2Long(endIp1); - } - long startIp2Long = ip2Long(startIp2); - long endIp2Long = startIp2Long; - if (endIp2 != null) { - endIp2Long = ip2Long(endIp2); - } - - if (startIp1Long == startIp2Long || startIp1Long == endIp2Long || endIp1Long == startIp2Long || endIp1Long == endIp2Long) { - return true; - } else if (startIp1Long > startIp2Long && startIp1Long < endIp2Long) { - return true; - } else if (endIp1Long > startIp2Long && endIp1Long < endIp2Long) { - return true; - } else if (startIp2Long > startIp1Long && startIp2Long < endIp1Long) { - return true; - } else if (endIp2Long > startIp1Long && endIp2Long < endIp1Long) { - return true; - } else { - return false; - } - } - - public static long ip2Long(String ip) { - String[] tokens = ip.split("[.]"); - assert (tokens.length == 4); - long result = 0; - for (int i = 0; i < tokens.length; i++) { - try { - result = (result << 8) | Integer.parseInt(tokens[i]); - } catch (NumberFormatException e) { - throw new RuntimeException("Incorrect number", e); - } - } - - return result; - } - - public static String long2Ip(long ip) { - StringBuilder result = new StringBuilder(15); - result.append((ip >> 24 & 0xff)).append("."); - result.append((ip >> 16 & 0xff)).append("."); - result.append((ip >> 8 & 0xff)).append("."); - result.append(ip & 0xff); - - return result.toString(); - } - - public static long mac2Long(String macAddress) { - String[] tokens = macAddress.split(":"); - assert (tokens.length == 6); - long result = 0; - for (int i = 0; i < tokens.length; i++) { - result = result << 8; - result |= Integer.parseInt(tokens[i], 16); - } - return result; - } - - public static String[] getNicParams(String nicName) { - try { - NetworkInterface nic = NetworkInterface.getByName(nicName); - return getNetworkParams(nic); - } catch (SocketException e) { - return null; - } - } - - public static String[] getNetworkParams(NetworkInterface nic) { - List addrs = nic.getInterfaceAddresses(); - if (addrs == null || addrs.size() == 0) { - return null; - } - InterfaceAddress addr = null; - for (InterfaceAddress iaddr : addrs) { - InetAddress inet = iaddr.getAddress(); - if (!inet.isLinkLocalAddress() && !inet.isLoopbackAddress() && !inet.isMulticastAddress() && inet.getAddress().length == 4) { - addr = iaddr; - break; - } - } - if (addr == null) { - return null; - } - String[] result = new String[3]; - result[0] = addr.getAddress().getHostAddress(); - try { - byte[] mac = nic.getHardwareAddress(); - result[1] = byte2Mac(mac); - } catch (Exception e) { - } - - result[2] = prefix2Netmask(addr.getNetworkPrefixLength()); - return result; - } - - public static String prefix2Netmask(short prefix) { - long addr = 0; - for (int i = 0; i < prefix; i++) { - addr = addr | (1 << (31 - i)); - } - - return long2Ip(addr); - } - - public static String byte2Mac(byte[] m) { - StringBuilder result = new StringBuilder(17); - Formatter formatter = new Formatter(result); - formatter.format("%02x:%02x:%02x:%02x:%02x:%02x", m[0], m[1], m[2], m[3], m[4], m[5]); - return result.toString(); - } - - public static String long2Mac(long macAddress) { - StringBuilder result = new StringBuilder(17); - Formatter formatter = new Formatter(result); - formatter.format("%02x:%02x:%02x:%02x:%02x:%02x", (macAddress >> 40) & 0xff, (macAddress >> 32) & 0xff, (macAddress >> 24) & 0xff, (macAddress >> 16) & 0xff, (macAddress >> 8) & 0xff, - (macAddress & 0xff)); - - return result.toString(); - } - - public static boolean isValidPrivateIp(String ipAddress, String guestIPAddress) { - - InetAddress privIp = parseIpAddress(ipAddress); - if (privIp == null) { - return false; - } - if (!privIp.isSiteLocalAddress()) { - return false; - } - - String firstGuestOctet = "10"; - if (guestIPAddress != null && !guestIPAddress.isEmpty()) { - String[] guestIPList = guestIPAddress.split("\\."); - firstGuestOctet = guestIPList[0]; - } - - String[] ipList = ipAddress.split("\\."); - if (!ipList[0].equals(firstGuestOctet)) { - return false; - } - - return true; - } - - public static boolean isSiteLocalAddress(String ipAddress) { - if (ipAddress == null) { - return false; - } else { - InetAddress ip = parseIpAddress(ipAddress); - return ip.isSiteLocalAddress(); - } - } - - public static boolean validIpRange(String startIP, String endIP) { - if (endIP == null || endIP.isEmpty()) { - return true; - } - - long startIPLong = NetUtils.ip2Long(startIP); - long endIPLong = NetUtils.ip2Long(endIP); - return (startIPLong <= endIPLong); - } - - public static boolean isValidIp(final String ip) { - final String[] ipAsList = ip.split("\\."); - - // The IP address must have four octets - if (Array.getLength(ipAsList) != 4) { - return false; - } - - for (int i = 0; i < 4; i++) { - // Each octet must be an integer - final String octetString = ipAsList[i]; - int octet; - try { - octet = Integer.parseInt(octetString); - } catch (final Exception e) { - return false; - } - // Each octet must be between 0 and 255, inclusive - if (octet < 0 || octet > 255) { - return false; - } - - // Each octetString must have between 1 and 3 characters - if (octetString.length() < 1 || octetString.length() > 3) { - return false; - } - } - - // IP is good, return true - return true; - } - - public static boolean isValidCIDR(final String cidr) { - if (cidr == null || cidr.isEmpty()) { - return false; - } - String[] cidrPair = cidr.split("\\/"); - if (cidrPair.length != 2) { - return false; - } - String cidrAddress = cidrPair[0]; - String cidrSize = cidrPair[1]; - if (!isValidIp(cidrAddress)) { - return false; - } - int cidrSizeNum = -1; - - try { - cidrSizeNum = Integer.parseInt(cidrSize); - } catch (Exception e) { - return false; - } - - if (cidrSizeNum < 0 || cidrSizeNum > 32) { - return false; - } - - return true; - } - - public static boolean isValidNetmask(String netmask) { - if (!isValidIp(netmask)) { - return false; - } - - long ip = ip2Long(netmask); - int count = 0; - boolean finished = false; - for (int i = 31; i >= 0; i--) { - if (((ip >> i) & 0x1) == 0) { - finished = true; - } else { - if (finished) { - return false; - } - count += 1; - } - } - - if (count == 0) { - return false; - } - - return true; - } - - private static InetAddress parseIpAddress(String address) { - StringTokenizer st = new StringTokenizer(address, "."); - byte[] bytes = new byte[4]; - - if (st.countTokens() == 4) { - try { - for (int i = 0; i < 4; i++) { - bytes[i] = (byte) Integer.parseInt(st.nextToken()); - } - return InetAddress.getByAddress(address, bytes); - } catch (NumberFormatException nfe) { - return null; - } catch (UnknownHostException uhe) { - return null; - } - } - return null; - } - - public static String getCidrFromGatewayAndNetmask(String gatewayStr, String netmaskStr) { - long netmask = ip2Long(netmaskStr); - long gateway = ip2Long(gatewayStr); - long firstPart = gateway & netmask; - long size = getCidrSize(netmaskStr); - return long2Ip(firstPart) + "/" + size; - } - - public static String[] getIpRangeFromCidr(String cidr, long size) { - assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; - String[] result = new String[2]; - long ip = ip2Long(cidr); - long startNetMask = ip2Long(getCidrNetmask(size)); - long start = (ip & startNetMask) + 1; - long end = start; - - end = end >> (32 - size); - - end++; - end = (end << (32 - size)) - 2; - - result[0] = long2Ip(start); - result[1] = long2Ip(end); - - return result; - } - - public static Set getAllIpsFromCidr(String cidr, long size) { - assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; - Set result = new TreeSet(); - long ip = ip2Long(cidr); - long startNetMask = ip2Long(getCidrNetmask(size)); - long start = (ip & startNetMask) + 2; - long end = start; - - end = end >> (32 - size); - - end++; - end = (end << (32 - size)) - 2; - while (start <= end) { - result.add(start); - start++; - } - - return result; - } - - /** - * Given a cidr, this method returns an ip address within the range but - * is not in the avoid list. - * - * @param startIp ip that the cidr starts with - * @param size size of the cidr - * @param avoid set of ips to avoid - * @return ip that is within the cidr range but not in the avoid set. -1 if unable to find one. - */ - public static long getRandomIpFromCidr(String startIp, int size, Set avoid) { - return getRandomIpFromCidr(ip2Long(startIp), size, avoid); - - } - - /** - * Given a cidr, this method returns an ip address within the range but - * is not in the avoid list. - * - * @param startIp ip that the cidr starts with - * @param size size of the cidr - * @param avoid set of ips to avoid - * @return ip that is within the cidr range but not in the avoid set. -1 if unable to find one. - */ - public static long getRandomIpFromCidr(long cidr, int size, Set avoid) { - assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; - - long startNetMask = ip2Long(getCidrNetmask(size)); - long startIp = (cidr & startNetMask) + 2; - int range = 1 << (32 - size); - - if (avoid.size() > range) { - return -1; - } - - for (int i = 0; i < range; i++) { - int next = _rand.nextInt(range); - if (!avoid.contains(startIp + next)) { - return startIp + next; - } - } - - return -1; - } - - public static String getIpRangeStartIpFromCidr(String cidr, long size) { - long ip = ip2Long(cidr); - long startNetMask = ip2Long(getCidrNetmask(size)); - long start = (ip & startNetMask) + 1; - return long2Ip(start); - } - - public static String getIpRangeEndIpFromCidr(String cidr, long size) { - long ip = ip2Long(cidr); - long startNetMask = ip2Long(getCidrNetmask(size)); - long start = (ip & startNetMask) + 1; - long end = start; - end = end >> (32 - size); - - end++; - end = (end << (32 - size)) - 2; - return long2Ip(end); - } - - public static boolean sameSubnet(final String ip1, final String ip2, final String netmask) { - if (ip1 == null || ip1.isEmpty() || ip2 == null || ip2.isEmpty()) { - return true; - } - String subnet1 = NetUtils.getSubNet(ip1, netmask); - String subnet2 = NetUtils.getSubNet(ip2, netmask); - - return (subnet1.equals(subnet2)); - } - - public static boolean sameSubnetCIDR(final String ip1, final String ip2, final long cidrSize) { - if (ip1 == null || ip1.isEmpty() || ip2 == null || ip2.isEmpty()) { - return true; - } - String subnet1 = NetUtils.getCidrSubNet(ip1, cidrSize); - String subnet2 = NetUtils.getCidrSubNet(ip2, cidrSize); - - return (subnet1.equals(subnet2)); - } - - public static String getSubNet(String ip, String netmask) { - long ipAddr = ip2Long(ip); - long subnet = ip2Long(netmask); - long result = ipAddr & subnet; - return long2Ip(result); - } - - public static String getBroadcastIp(String ip, String netmask) { - long ipAddr = ip2Long(ip); - long subnet = ip2Long(netmask); - long result = ipAddr | (~subnet); - return long2Ip(result); - } - - public static String getCidrSubNet(String ip, long cidrSize) { - long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); - String netmask = NetUtils.long2Ip(numericNetmask); - return getSubNet(ip, netmask); - } - - public static String ipAndNetMaskToCidr(String ip, String netmask) { - long ipAddr = ip2Long(ip); - long subnet = ip2Long(netmask); - long result = ipAddr & subnet; - int bits = (subnet == 0) ? 0 : 1; - long subnet2 = subnet; - while ((subnet2 = (subnet2 >> 1) & subnet) != 0) { - bits++; - } - - return long2Ip(result) + "/" + Integer.toString(bits); - } - - public static String[] ipAndNetMaskToRange(String ip, String netmask) { - long ipAddr = ip2Long(ip); - long subnet = ip2Long(netmask); - long start = (ipAddr & subnet) + 1; - long end = start; - int bits = (subnet == 0) ? 0 : 1; - while ((subnet = (subnet >> 1) & subnet) != 0) { - bits++; - } - end = end >> (32 - bits); - - end++; - end = (end << (32 - bits)) - 2; - - return new String[] { long2Ip(start), long2Ip(end) }; - - } - - public static Pair getCidr(String cidr) { - String[] tokens = cidr.split("/"); - return new Pair(tokens[0], Integer.parseInt(tokens[1])); - } - - public static boolean isNetworkAWithinNetworkB(String cidrA, String cidrB) { - Long[] cidrALong = cidrToLong(cidrA); - Long[] cidrBLong = cidrToLong(cidrB); - if (cidrALong == null || cidrBLong == null) { - return false; - } - long shift = 32 - cidrBLong[1]; - return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); - } - - public static boolean isNetworksOverlap(String cidrA, String cidrB) { - Long[] cidrALong = cidrToLong(cidrA); - Long[] cidrBLong = cidrToLong(cidrB); - if (cidrALong == null || cidrBLong == null) { - return false; - } - long shift = 32 - (cidrALong[1] > cidrBLong[1] ? cidrBLong[1] : cidrALong[1]); - return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); - } - - public static Long[] cidrToLong(String cidr) { - if (cidr == null || cidr.isEmpty()) { - return null; - } - String[] cidrPair = cidr.split("\\/"); - if (cidrPair.length != 2) { - return null; - } - String cidrAddress = cidrPair[0]; - String cidrSize = cidrPair[1]; - if (!isValidIp(cidrAddress)) { - return null; - } - int cidrSizeNum = -1; - - try { - cidrSizeNum = Integer.parseInt(cidrSize); - } catch (Exception e) { - return null; - } - long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); - long ipAddr = ip2Long(cidrAddress); - Long[] cidrlong = { ipAddr & numericNetmask, (long) cidrSizeNum }; - return cidrlong; - - } - - public static String getCidrSubNet(String cidr) { - if (cidr == null || cidr.isEmpty()) { - return null; - } - String[] cidrPair = cidr.split("\\/"); - if (cidrPair.length != 2) { - return null; - } - String cidrAddress = cidrPair[0]; - String cidrSize = cidrPair[1]; - if (!isValidIp(cidrAddress)) { - return null; - } - int cidrSizeNum = -1; - - try { - cidrSizeNum = Integer.parseInt(cidrSize); - } catch (Exception e) { - return null; - } - long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); - String netmask = NetUtils.long2Ip(numericNetmask); - return getSubNet(cidrAddress, netmask); - } - - public static String getCidrBroadcastIp(String cidr) { - if (cidr == null || cidr.isEmpty()) { - return null; - } - String[] cidrPair = cidr.split("\\/"); - if (cidrPair.length != 2) { - return null; - } - String cidrAddress = cidrPair[0]; - String cidrSize = cidrPair[1]; - if (!isValidIp(cidrAddress)) { - return null; - } - int cidrSizeNum = -1; - - try { - cidrSizeNum = Integer.parseInt(cidrSize); - } catch (Exception e) { - return null; - } - long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); - String netmask = NetUtils.long2Ip(numericNetmask); - return getBroadcastIp(cidrAddress, netmask); - } - - public static String getCidrNetmask(long cidrSize) { - long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); - return long2Ip(numericNetmask); - } - - public static String getCidrNetmask(String cidr) { - String[] cidrPair = cidr.split("\\/"); - long guestCidrSize = Long.parseLong(cidrPair[1]); - return getCidrNetmask(guestCidrSize); - } - - public static String cidr2Netmask(String cidr) { - String[] tokens = cidr.split("\\/"); - return getCidrNetmask(Integer.parseInt(tokens[1])); - } - - public static long getCidrSize(String netmask) { - long ip = ip2Long(netmask); - int count = 0; - for (int i = 0; i < 32; i++) { - if (((ip >> i) & 0x1) == 0) { - count++; - } else { - break; - } - } - - return 32 - count; - } - - public static boolean isValidPort(String p) { - try { - int port = Integer.parseInt(p); - return !(port > 65535 || port < 1); - } catch (NumberFormatException e) { - return false; - } - } - - public static boolean isValidPort(int p) { - return !(p > 65535 || p < 1); - } - - public static boolean isValidLBPort(String p) { - try { - int port = Integer.parseInt(p); - return !(port > 65535 || port < 1); - } catch (NumberFormatException e) { - return false; - } - } - - public static boolean isValidProto(String p) { - String proto = p.toLowerCase(); - return (proto.equals(TCP_PROTO) || proto.equals(UDP_PROTO) || proto.equals(ICMP_PROTO)); - } - - public static boolean isValidSecurityGroupProto(String p) { - String proto = p.toLowerCase(); - return (proto.equals(TCP_PROTO) || proto.equals(UDP_PROTO) || proto.equals(ICMP_PROTO) || proto.equals(ALL_PROTO)); - } - - public static boolean isValidAlgorithm(String p) { - String algo = p.toLowerCase(); - return (algo.equals("roundrobin") || algo.equals("leastconn") || algo.equals("source")); - } - - public static String getLinkLocalNetMask() { - return "255.255.0.0"; - } - - public static String getLinkLocalGateway() { - return "169.254.0.1"; - } - - public static String getLinkLocalCIDR() { - return "169.254.0.0/16"; - } - - public static String[] getLinkLocalIPRange(int size) { - if (size > 16 || size <= 0) { - return null; - } - /* reserve gateway */ - String[] range = getIpRangeFromCidr(getLinkLocalGateway(), 32 - size); - - if (range[0].equalsIgnoreCase(getLinkLocalGateway())) { - /* remove the gateway */ - long ip = ip2Long(range[0]); - ip += 1; - range[0] = long2Ip(ip); - } - return range; - } - - public static String getLinkLocalIpEnd() { - String[] cidrPair = getLinkLocalCIDR().split("\\/"); - String cidr = cidrPair[0]; - - return getIpRangeEndIpFromCidr(cidr, 32 - Long.parseLong(cidrPair[1])); - } - - public static String portRangeToString(int portRange[]) { - return Integer.toString(portRange[0]) + ":" + Integer.toString(portRange[1]); - } - - // test only - private static void configLog4j() { - URL configUrl = System.class.getResource("/conf/log4j-cloud.xml"); - if (configUrl != null) { - System.out.println("Configure log4j using log4j-cloud.xml"); - - try { - File file = new File(configUrl.toURI()); - - System.out.println("Log4j configuration from : " + file.getAbsolutePath()); - DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); - } catch (URISyntaxException e) { - System.out.println("Unable to convert log4j configuration Url to URI"); - } - // DOMConfigurator.configure(configUrl); - } else { - System.out.println("Configure log4j with default properties"); - } - } - - - public static boolean verifyDomainNameLabel(String hostName, boolean isHostName) { - // must be between 1 and 63 characters long and may contain only the ASCII letters 'a' through 'z' (in a - // case-insensitive manner), - // the digits '0' through '9', and the hyphen ('-'). - // Can not start with a hyphen and digit, and must not end with a hyphen - // If it's a host name, don't allow to start with digit - - if (hostName.length() > 63 || hostName.length() < 1) { - s_logger.warn("Domain name label must be between 1 and 63 characters long"); - return false; - } else if (!hostName.toLowerCase().matches("[a-z0-9-]*")) { - s_logger.warn("Domain name label may contain only the ASCII letters 'a' through 'z' (in a case-insensitive manner)"); - return false; - } else if (hostName.startsWith("-") || hostName.endsWith("-")) { - s_logger.warn("Domain name label can not start with a hyphen and digit, and must not end with a hyphen"); - return false; - } else if (isHostName && hostName.matches("^[0-9-].*")) { - s_logger.warn("Host name can't start with digit"); - return false; - } - - return true; - } - - public static boolean verifyDomainName(String domainName) { - // don't allow domain name length to exceed 190 chars (190 + 63 (max host name length) = 253 = max domainName length - if (domainName.length() < 1 || domainName.length() > 190) { - s_logger.trace("Domain name must be between 1 and 190 characters long"); - return false; - } - - if (domainName.startsWith(".") || domainName.endsWith(".")) { - s_logger.trace("Domain name can't start or end with ."); - return false; - } - - String[] domainNameLabels = domainName.split("\\."); - - for (int i = 0; i < domainNameLabels.length; i++) { - if (!verifyDomainNameLabel(domainNameLabels[i], false)) { - s_logger.warn("Domain name label " + domainNameLabels[i] + " is incorrect"); - return false; - } - } - - return true; - } - - public static String getDhcpRange(String cidr) { - String[] splitResult = cidr.split("\\/"); - long size = Long.valueOf(splitResult[1]); - return NetUtils.getIpRangeStartIpFromCidr(splitResult[0], size); - } - - public static boolean validateGuestCidr(String cidr) { - // RFC 1918 - The Internet Assigned Numbers Authority (IANA) has reserved the - // following three blocks of the IP address space for private internets: - // 10.0.0.0 - 10.255.255.255 (10/8 prefix) - // 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) - // 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) - - String cidr1 = "10.0.0.0/8"; - String cidr2 = "172.16.0.0/12"; - String cidr3 = "192.168.0.0/16"; - - if (!isValidCIDR(cidr)) { - s_logger.warn("Cidr " + cidr + " is not valid"); - return false; - } - - if (isNetworkAWithinNetworkB(cidr, cidr1) || isNetworkAWithinNetworkB(cidr, cidr2) || isNetworkAWithinNetworkB(cidr, cidr3)) { - return true; - } else { - s_logger.warn("cidr " + cidr + " is not RFC 1918 compliant"); - return false; - } - } - - public static boolean verifyInstanceName(String instanceName) { - //instance name for cloudstack vms shouldn't contain - and spaces - if (instanceName.contains("-") || instanceName.contains(" ") || instanceName.contains("+")) { - s_logger.warn("Instance name can not contain hyphen, spaces and \"+\" char"); - return false; - } - - return true; - } - - public static boolean isValidS2SVpnPolicy(String policys) { - if (policys == null || policys.isEmpty()) { - return false; - } - for (String policy : policys.split(",")) { - if (policy.isEmpty()) { - return false; - } - //String cipherHash = policy.split(";")[0]; - String cipherHash = policy; - if (cipherHash.isEmpty()) { - return false; - } - String[] list = cipherHash.split("-"); - if (list.length != 2) { - return false; - } - String cipher = list[0]; - String hash = list[1]; - if (!cipher.matches("3des|aes|aes128|aes256")) { - return false; - } - if (!hash.matches("md5|sha1")) { - return false; - } - /* Disable pfsGroup support, see CS-15511 - String pfsGroup = null; - if (!policy.equals(cipherHash)) { - pfsGroup = policy.split(";")[1]; - } - if (pfsGroup != null && !pfsGroup.matches("modp1024|modp1536")) { - return false; - } - */ - } - return true; - } - - public static boolean validateGuestCidrList(String guestCidrList) { - for (String guestCidr : guestCidrList.split(";")) { - if (!validateGuestCidr(guestCidr)) { - return false; - } - } - return true; - } -} +// Copyright 2012 Citrix Systems, Inc. Licensed under the +// Apache License, Version 2.0 (the "License"); you may not use this +// file except in compliance with the License. Citrix Systems, Inc. +// reserves all rights not expressly granted by 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. +// +// Automatically generated by addcopyright.py at 04/03/2012 +package com.cloud.utils.net; + +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStreamReader; +import java.lang.reflect.Array; +import java.net.InetAddress; +import java.net.InterfaceAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Formatter; +import java.util.List; +import java.util.Random; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeSet; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; +import org.apache.log4j.xml.DOMConfigurator; + +import com.cloud.utils.IteratorUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.script.Script; + +public class NetUtils { + protected final static Logger s_logger = Logger.getLogger(NetUtils.class); + public final static String HTTP_PORT = "80"; + public final static int VPN_PORT = 500; + public final static int VPN_NATT_PORT = 4500; + public final static int VPN_L2TP_PORT = 1701; + + public final static String UDP_PROTO = "udp"; + public final static String TCP_PROTO = "tcp"; + public final static String ANY_PROTO = "any"; + public final static String ICMP_PROTO = "icmp"; + public final static String ALL_PROTO = "all"; + + public final static String ALL_CIDRS = "0.0.0.0/0"; + + public final static String DEFAULT_SNMP_COMMUNITY = "public"; + public final static int DEFAULT_SNMP_PORT = 161; + + public final static int DEFAULT_AUTOSCALE_VM_DESTROY_TIME = 2 * 60; // Grace period before Vm is destroyed + public final static int DEFAULT_AUTOSCALE_POLICY_INTERVAL_TIME = 30; + public final static int DEFAULT_AUTOSCALE_POLICY_QUIET_TIME = 5 * 60; + + private final static Random _rand = new Random(System.currentTimeMillis()); + + public static long createSequenceBasedMacAddress(long macAddress) { + return macAddress | 0x060000000000l | (((long) _rand.nextInt(32768) << 25) & 0x00fffe000000l); + } + + public static String getHostName() { + try { + InetAddress localAddr = InetAddress.getLocalHost(); + if (localAddr != null) { + return localAddr.getHostName(); + } + } catch (UnknownHostException e) { + s_logger.warn("UnknownHostException when trying to get host name. ", e); + } + return "localhost"; + } + + public static InetAddress getLocalInetAddress() { + try { + return InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + s_logger.warn("UnknownHostException in getLocalInetAddress().", e); + return null; + } + } + + public static String resolveToIp(String host) { + try { + InetAddress addr = InetAddress.getByName(host); + return ipFromInetAddress(addr); + } catch (UnknownHostException e) { + s_logger.warn("Unable to resolve " + host + " to IP due to UnknownHostException"); + return null; + } + } + + public static InetAddress[] getAllLocalInetAddresses() { + List addrList = new ArrayList(); + try { + for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { + if (ifc.isUp() && !ifc.isVirtual()) { + for (InetAddress addr : IteratorUtil.enumerationAsIterable(ifc.getInetAddresses())) { + addrList.add(addr); + } + } + } + } catch (SocketException e) { + s_logger.warn("SocketException in getAllLocalInetAddresses().", e); + } + + InetAddress[] addrs = new InetAddress[addrList.size()]; + if (addrList.size() > 0) { + System.arraycopy(addrList.toArray(), 0, addrs, 0, addrList.size()); + } + return addrs; + } + + public static String[] getLocalCidrs() { + String defaultHostIp = getDefaultHostIp(); + + List cidrList = new ArrayList(); + try { + for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { + if (ifc.isUp() && !ifc.isVirtual() && !ifc.isLoopback()) { + for (InterfaceAddress address : ifc.getInterfaceAddresses()) { + InetAddress addr = address.getAddress(); + int prefixLength = address.getNetworkPrefixLength(); + if (prefixLength < 32 && prefixLength > 0) { + String ip = ipFromInetAddress(addr); + if(ip.equalsIgnoreCase(defaultHostIp)) + cidrList.add(ipAndNetMaskToCidr(ip, getCidrNetmask(prefixLength))); + } + } + } + } + } catch (SocketException e) { + s_logger.warn("UnknownHostException in getLocalCidrs().", e); + } + + return cidrList.toArray(new String[0]); + } + + private static boolean isWindows() { + String os = System.getProperty("os.name"); + if(os != null && os.startsWith("Windows")) + return true; + + return false; + } + + public static String getDefaultHostIp() { + if(isWindows()) { + Pattern pattern = Pattern.compile("\\s*0.0.0.0\\s*0.0.0.0\\s*(\\S*)\\s*(\\S*)\\s*"); + try { + Process result = Runtime.getRuntime().exec("route print -4"); + BufferedReader output = new BufferedReader + (new InputStreamReader(result.getInputStream())); + + String line = output.readLine(); + while(line != null){ + Matcher matcher = pattern.matcher(line); + if (matcher.find()) { + return matcher.group(2); + } + line = output.readLine(); + } + } catch( Exception e ) { + } + return null; + } else { + NetworkInterface nic = null; + String pubNic = getDefaultEthDevice(); + + if (pubNic == null) { + return null; + } + + try { + nic = NetworkInterface.getByName(pubNic); + } catch (final SocketException e) { + return null; + } + + String[] info = NetUtils.getNetworkParams(nic); + return info[0]; + } + } + + public static String getDefaultEthDevice() { + String defaultRoute = Script.runSimpleBashScript("/sbin/route | grep default"); + + if (defaultRoute == null) { + return null; + } + + String[] defaultRouteList = defaultRoute.split("\\s+"); + + if (defaultRouteList.length != 8) { + return null; + } + + return defaultRouteList[7]; + } + + public static InetAddress getFirstNonLoopbackLocalInetAddress() { + InetAddress[] addrs = getAllLocalInetAddresses(); + if (addrs != null) { + for (InetAddress addr : addrs) { + if (s_logger.isInfoEnabled()) { + s_logger.info("Check local InetAddress : " + addr.toString() + ", total count :" + addrs.length); + } + + if (!addr.isLoopbackAddress()) { + return addr; + } + } + } + + s_logger.warn("Unable to determine a non-loopback address, local inet address count :" + addrs.length); + return null; + } + + public static InetAddress[] getInterfaceInetAddresses(String ifName) { + List addrList = new ArrayList(); + try { + for (NetworkInterface ifc : IteratorUtil.enumerationAsIterable(NetworkInterface.getNetworkInterfaces())) { + if (ifc.isUp() && !ifc.isVirtual() && ifc.getName().equals(ifName)) { + for (InetAddress addr : IteratorUtil.enumerationAsIterable(ifc.getInetAddresses())) { + addrList.add(addr); + } + } + } + } catch (SocketException e) { + s_logger.warn("SocketException in getAllLocalInetAddresses().", e); + } + + InetAddress[] addrs = new InetAddress[addrList.size()]; + if (addrList.size() > 0) { + System.arraycopy(addrList.toArray(), 0, addrs, 0, addrList.size()); + } + return addrs; + } + + public static String getLocalIPString() { + InetAddress addr = getLocalInetAddress(); + if (addr != null) { + return ipFromInetAddress(addr); + } + + return new String("127.0.0.1"); + } + + public static String ipFromInetAddress(InetAddress addr) { + assert (addr != null); + + byte[] ipBytes = addr.getAddress(); + StringBuffer sb = new StringBuffer(); + sb.append(ipBytes[0] & 0xff).append("."); + sb.append(ipBytes[1] & 0xff).append("."); + sb.append(ipBytes[2] & 0xff).append("."); + sb.append(ipBytes[3] & 0xff); + + return sb.toString(); + } + + public static boolean isLocalAddress(InetAddress addr) { + InetAddress[] addrs = getAllLocalInetAddresses(); + + if (addrs != null) { + for (InetAddress self : addrs) { + if (self.equals(addr)) { + return true; + } + } + } + return false; + } + + public static boolean isLocalAddress(String strAddress) { + + InetAddress addr; + try { + addr = InetAddress.getByName(strAddress); + return isLocalAddress(addr); + } catch (UnknownHostException e) { + } + return false; + } + + public static String getMacAddress(InetAddress address) { + StringBuffer sb = new StringBuffer(); + Formatter formatter = new Formatter(sb); + try { + NetworkInterface ni = NetworkInterface.getByInetAddress(address); + byte[] mac = ni.getHardwareAddress(); + + for (int i = 0; i < mac.length; i++) { + formatter.format("%02X%s", mac[i], (i < mac.length - 1) ? ":" : ""); + } + } catch (SocketException e) { + s_logger.error("SocketException when trying to retrieve MAC address", e); + } + return sb.toString(); + } + + public static long getMacAddressAsLong(InetAddress address) { + long macAddressAsLong = 0; + try { + NetworkInterface ni = NetworkInterface.getByInetAddress(address); + byte[] mac = ni.getHardwareAddress(); + + for (int i = 0; i < mac.length; i++) { + macAddressAsLong |= ((long) (mac[i] & 0xff) << (mac.length - i - 1) * 8); + } + + } catch (SocketException e) { + s_logger.error("SocketException when trying to retrieve MAC address", e); + } + + return macAddressAsLong; + } + + public static boolean ipRangesOverlap(String startIp1, String endIp1, String startIp2, String endIp2) { + long startIp1Long = ip2Long(startIp1); + long endIp1Long = startIp1Long; + if (endIp1 != null) { + endIp1Long = ip2Long(endIp1); + } + long startIp2Long = ip2Long(startIp2); + long endIp2Long = startIp2Long; + if (endIp2 != null) { + endIp2Long = ip2Long(endIp2); + } + + if (startIp1Long == startIp2Long || startIp1Long == endIp2Long || endIp1Long == startIp2Long || endIp1Long == endIp2Long) { + return true; + } else if (startIp1Long > startIp2Long && startIp1Long < endIp2Long) { + return true; + } else if (endIp1Long > startIp2Long && endIp1Long < endIp2Long) { + return true; + } else if (startIp2Long > startIp1Long && startIp2Long < endIp1Long) { + return true; + } else if (endIp2Long > startIp1Long && endIp2Long < endIp1Long) { + return true; + } else { + return false; + } + } + + public static long ip2Long(String ip) { + String[] tokens = ip.split("[.]"); + assert (tokens.length == 4); + long result = 0; + for (int i = 0; i < tokens.length; i++) { + try { + result = (result << 8) | Integer.parseInt(tokens[i]); + } catch (NumberFormatException e) { + throw new RuntimeException("Incorrect number", e); + } + } + + return result; + } + + public static String long2Ip(long ip) { + StringBuilder result = new StringBuilder(15); + result.append((ip >> 24 & 0xff)).append("."); + result.append((ip >> 16 & 0xff)).append("."); + result.append((ip >> 8 & 0xff)).append("."); + result.append(ip & 0xff); + + return result.toString(); + } + + public static long mac2Long(String macAddress) { + String[] tokens = macAddress.split(":"); + assert (tokens.length == 6); + long result = 0; + for (int i = 0; i < tokens.length; i++) { + result = result << 8; + result |= Integer.parseInt(tokens[i], 16); + } + return result; + } + + public static String[] getNicParams(String nicName) { + try { + NetworkInterface nic = NetworkInterface.getByName(nicName); + return getNetworkParams(nic); + } catch (SocketException e) { + return null; + } + } + + public static String[] getNetworkParams(NetworkInterface nic) { + List addrs = nic.getInterfaceAddresses(); + if (addrs == null || addrs.size() == 0) { + return null; + } + InterfaceAddress addr = null; + for (InterfaceAddress iaddr : addrs) { + InetAddress inet = iaddr.getAddress(); + if (!inet.isLinkLocalAddress() && !inet.isLoopbackAddress() && !inet.isMulticastAddress() && inet.getAddress().length == 4) { + addr = iaddr; + break; + } + } + if (addr == null) { + return null; + } + String[] result = new String[3]; + result[0] = addr.getAddress().getHostAddress(); + try { + byte[] mac = nic.getHardwareAddress(); + result[1] = byte2Mac(mac); + } catch (Exception e) { + } + + result[2] = prefix2Netmask(addr.getNetworkPrefixLength()); + return result; + } + + public static String prefix2Netmask(short prefix) { + long addr = 0; + for (int i = 0; i < prefix; i++) { + addr = addr | (1 << (31 - i)); + } + + return long2Ip(addr); + } + + public static String byte2Mac(byte[] m) { + StringBuilder result = new StringBuilder(17); + Formatter formatter = new Formatter(result); + formatter.format("%02x:%02x:%02x:%02x:%02x:%02x", m[0], m[1], m[2], m[3], m[4], m[5]); + return result.toString(); + } + + public static String long2Mac(long macAddress) { + StringBuilder result = new StringBuilder(17); + Formatter formatter = new Formatter(result); + formatter.format("%02x:%02x:%02x:%02x:%02x:%02x", (macAddress >> 40) & 0xff, (macAddress >> 32) & 0xff, (macAddress >> 24) & 0xff, (macAddress >> 16) & 0xff, (macAddress >> 8) & 0xff, + (macAddress & 0xff)); + + return result.toString(); + } + + public static boolean isValidPrivateIp(String ipAddress, String guestIPAddress) { + + InetAddress privIp = parseIpAddress(ipAddress); + if (privIp == null) { + return false; + } + if (!privIp.isSiteLocalAddress()) { + return false; + } + + String firstGuestOctet = "10"; + if (guestIPAddress != null && !guestIPAddress.isEmpty()) { + String[] guestIPList = guestIPAddress.split("\\."); + firstGuestOctet = guestIPList[0]; + } + + String[] ipList = ipAddress.split("\\."); + if (!ipList[0].equals(firstGuestOctet)) { + return false; + } + + return true; + } + + public static boolean isSiteLocalAddress(String ipAddress) { + if (ipAddress == null) { + return false; + } else { + InetAddress ip = parseIpAddress(ipAddress); + return ip.isSiteLocalAddress(); + } + } + + public static boolean validIpRange(String startIP, String endIP) { + if (endIP == null || endIP.isEmpty()) { + return true; + } + + long startIPLong = NetUtils.ip2Long(startIP); + long endIPLong = NetUtils.ip2Long(endIP); + return (startIPLong <= endIPLong); + } + + public static boolean isValidIp(final String ip) { + final String[] ipAsList = ip.split("\\."); + + // The IP address must have four octets + if (Array.getLength(ipAsList) != 4) { + return false; + } + + for (int i = 0; i < 4; i++) { + // Each octet must be an integer + final String octetString = ipAsList[i]; + int octet; + try { + octet = Integer.parseInt(octetString); + } catch (final Exception e) { + return false; + } + // Each octet must be between 0 and 255, inclusive + if (octet < 0 || octet > 255) { + return false; + } + + // Each octetString must have between 1 and 3 characters + if (octetString.length() < 1 || octetString.length() > 3) { + return false; + } + } + + // IP is good, return true + return true; + } + + public static boolean isValidCIDR(final String cidr) { + if (cidr == null || cidr.isEmpty()) { + return false; + } + String[] cidrPair = cidr.split("\\/"); + if (cidrPair.length != 2) { + return false; + } + String cidrAddress = cidrPair[0]; + String cidrSize = cidrPair[1]; + if (!isValidIp(cidrAddress)) { + return false; + } + int cidrSizeNum = -1; + + try { + cidrSizeNum = Integer.parseInt(cidrSize); + } catch (Exception e) { + return false; + } + + if (cidrSizeNum < 0 || cidrSizeNum > 32) { + return false; + } + + return true; + } + + public static boolean isValidNetmask(String netmask) { + if (!isValidIp(netmask)) { + return false; + } + + long ip = ip2Long(netmask); + int count = 0; + boolean finished = false; + for (int i = 31; i >= 0; i--) { + if (((ip >> i) & 0x1) == 0) { + finished = true; + } else { + if (finished) { + return false; + } + count += 1; + } + } + + if (count == 0) { + return false; + } + + return true; + } + + private static InetAddress parseIpAddress(String address) { + StringTokenizer st = new StringTokenizer(address, "."); + byte[] bytes = new byte[4]; + + if (st.countTokens() == 4) { + try { + for (int i = 0; i < 4; i++) { + bytes[i] = (byte) Integer.parseInt(st.nextToken()); + } + return InetAddress.getByAddress(address, bytes); + } catch (NumberFormatException nfe) { + return null; + } catch (UnknownHostException uhe) { + return null; + } + } + return null; + } + + public static String getCidrFromGatewayAndNetmask(String gatewayStr, String netmaskStr) { + long netmask = ip2Long(netmaskStr); + long gateway = ip2Long(gatewayStr); + long firstPart = gateway & netmask; + long size = getCidrSize(netmaskStr); + return long2Ip(firstPart) + "/" + size; + } + + public static String[] getIpRangeFromCidr(String cidr, long size) { + assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; + String[] result = new String[2]; + long ip = ip2Long(cidr); + long startNetMask = ip2Long(getCidrNetmask(size)); + long start = (ip & startNetMask) + 1; + long end = start; + + end = end >> (32 - size); + + end++; + end = (end << (32 - size)) - 2; + + result[0] = long2Ip(start); + result[1] = long2Ip(end); + + return result; + } + + public static Set getAllIpsFromCidr(String cidr, long size) { + assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; + Set result = new TreeSet(); + long ip = ip2Long(cidr); + long startNetMask = ip2Long(getCidrNetmask(size)); + long start = (ip & startNetMask) + 2; + long end = start; + + end = end >> (32 - size); + + end++; + end = (end << (32 - size)) - 2; + while (start <= end) { + result.add(start); + start++; + } + + return result; + } + + /** + * Given a cidr, this method returns an ip address within the range but + * is not in the avoid list. + * + * @param startIp ip that the cidr starts with + * @param size size of the cidr + * @param avoid set of ips to avoid + * @return ip that is within the cidr range but not in the avoid set. -1 if unable to find one. + */ + public static long getRandomIpFromCidr(String startIp, int size, Set avoid) { + return getRandomIpFromCidr(ip2Long(startIp), size, avoid); + + } + + /** + * Given a cidr, this method returns an ip address within the range but + * is not in the avoid list. + * + * @param startIp ip that the cidr starts with + * @param size size of the cidr + * @param avoid set of ips to avoid + * @return ip that is within the cidr range but not in the avoid set. -1 if unable to find one. + */ + public static long getRandomIpFromCidr(long cidr, int size, Set avoid) { + assert (size < 32) : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size; + + long startNetMask = ip2Long(getCidrNetmask(size)); + long startIp = (cidr & startNetMask) + 2; + int range = 1 << (32 - size); + + if (avoid.size() > range) { + return -1; + } + + for (int i = 0; i < range; i++) { + int next = _rand.nextInt(range); + if (!avoid.contains(startIp + next)) { + return startIp + next; + } + } + + return -1; + } + + public static String getIpRangeStartIpFromCidr(String cidr, long size) { + long ip = ip2Long(cidr); + long startNetMask = ip2Long(getCidrNetmask(size)); + long start = (ip & startNetMask) + 1; + return long2Ip(start); + } + + public static String getIpRangeEndIpFromCidr(String cidr, long size) { + long ip = ip2Long(cidr); + long startNetMask = ip2Long(getCidrNetmask(size)); + long start = (ip & startNetMask) + 1; + long end = start; + end = end >> (32 - size); + + end++; + end = (end << (32 - size)) - 2; + return long2Ip(end); + } + + public static boolean sameSubnet(final String ip1, final String ip2, final String netmask) { + if (ip1 == null || ip1.isEmpty() || ip2 == null || ip2.isEmpty()) { + return true; + } + String subnet1 = NetUtils.getSubNet(ip1, netmask); + String subnet2 = NetUtils.getSubNet(ip2, netmask); + + return (subnet1.equals(subnet2)); + } + + public static boolean sameSubnetCIDR(final String ip1, final String ip2, final long cidrSize) { + if (ip1 == null || ip1.isEmpty() || ip2 == null || ip2.isEmpty()) { + return true; + } + String subnet1 = NetUtils.getCidrSubNet(ip1, cidrSize); + String subnet2 = NetUtils.getCidrSubNet(ip2, cidrSize); + + return (subnet1.equals(subnet2)); + } + + public static String getSubNet(String ip, String netmask) { + long ipAddr = ip2Long(ip); + long subnet = ip2Long(netmask); + long result = ipAddr & subnet; + return long2Ip(result); + } + + public static String getBroadcastIp(String ip, String netmask) { + long ipAddr = ip2Long(ip); + long subnet = ip2Long(netmask); + long result = ipAddr | (~subnet); + return long2Ip(result); + } + + public static String getCidrSubNet(String ip, long cidrSize) { + long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); + String netmask = NetUtils.long2Ip(numericNetmask); + return getSubNet(ip, netmask); + } + + public static String ipAndNetMaskToCidr(String ip, String netmask) { + long ipAddr = ip2Long(ip); + long subnet = ip2Long(netmask); + long result = ipAddr & subnet; + int bits = (subnet == 0) ? 0 : 1; + long subnet2 = subnet; + while ((subnet2 = (subnet2 >> 1) & subnet) != 0) { + bits++; + } + + return long2Ip(result) + "/" + Integer.toString(bits); + } + + public static String[] ipAndNetMaskToRange(String ip, String netmask) { + long ipAddr = ip2Long(ip); + long subnet = ip2Long(netmask); + long start = (ipAddr & subnet) + 1; + long end = start; + int bits = (subnet == 0) ? 0 : 1; + while ((subnet = (subnet >> 1) & subnet) != 0) { + bits++; + } + end = end >> (32 - bits); + + end++; + end = (end << (32 - bits)) - 2; + + return new String[] { long2Ip(start), long2Ip(end) }; + + } + + public static Pair getCidr(String cidr) { + String[] tokens = cidr.split("/"); + return new Pair(tokens[0], Integer.parseInt(tokens[1])); + } + + public static boolean isNetworkAWithinNetworkB(String cidrA, String cidrB) { + Long[] cidrALong = cidrToLong(cidrA); + Long[] cidrBLong = cidrToLong(cidrB); + if (cidrALong == null || cidrBLong == null) { + return false; + } + long shift = 32 - cidrBLong[1]; + return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); + } + + public static boolean isNetworksOverlap(String cidrA, String cidrB) { + Long[] cidrALong = cidrToLong(cidrA); + Long[] cidrBLong = cidrToLong(cidrB); + if (cidrALong == null || cidrBLong == null) { + return false; + } + long shift = 32 - (cidrALong[1] > cidrBLong[1] ? cidrBLong[1] : cidrALong[1]); + return ((cidrALong[0] >> shift) == (cidrBLong[0] >> shift)); + } + + public static Long[] cidrToLong(String cidr) { + if (cidr == null || cidr.isEmpty()) { + return null; + } + String[] cidrPair = cidr.split("\\/"); + if (cidrPair.length != 2) { + return null; + } + String cidrAddress = cidrPair[0]; + String cidrSize = cidrPair[1]; + if (!isValidIp(cidrAddress)) { + return null; + } + int cidrSizeNum = -1; + + try { + cidrSizeNum = Integer.parseInt(cidrSize); + } catch (Exception e) { + return null; + } + long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); + long ipAddr = ip2Long(cidrAddress); + Long[] cidrlong = { ipAddr & numericNetmask, (long) cidrSizeNum }; + return cidrlong; + + } + + public static String getCidrSubNet(String cidr) { + if (cidr == null || cidr.isEmpty()) { + return null; + } + String[] cidrPair = cidr.split("\\/"); + if (cidrPair.length != 2) { + return null; + } + String cidrAddress = cidrPair[0]; + String cidrSize = cidrPair[1]; + if (!isValidIp(cidrAddress)) { + return null; + } + int cidrSizeNum = -1; + + try { + cidrSizeNum = Integer.parseInt(cidrSize); + } catch (Exception e) { + return null; + } + long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); + String netmask = NetUtils.long2Ip(numericNetmask); + return getSubNet(cidrAddress, netmask); + } + + public static String getCidrBroadcastIp(String cidr) { + if (cidr == null || cidr.isEmpty()) { + return null; + } + String[] cidrPair = cidr.split("\\/"); + if (cidrPair.length != 2) { + return null; + } + String cidrAddress = cidrPair[0]; + String cidrSize = cidrPair[1]; + if (!isValidIp(cidrAddress)) { + return null; + } + int cidrSizeNum = -1; + + try { + cidrSizeNum = Integer.parseInt(cidrSize); + } catch (Exception e) { + return null; + } + long numericNetmask = (0xffffffff >> (32 - cidrSizeNum)) << (32 - cidrSizeNum); + String netmask = NetUtils.long2Ip(numericNetmask); + return getBroadcastIp(cidrAddress, netmask); + } + + public static String getCidrNetmask(long cidrSize) { + long numericNetmask = (0xffffffff >> (32 - cidrSize)) << (32 - cidrSize); + return long2Ip(numericNetmask); + } + + public static String getCidrNetmask(String cidr) { + String[] cidrPair = cidr.split("\\/"); + long guestCidrSize = Long.parseLong(cidrPair[1]); + return getCidrNetmask(guestCidrSize); + } + + public static String cidr2Netmask(String cidr) { + String[] tokens = cidr.split("\\/"); + return getCidrNetmask(Integer.parseInt(tokens[1])); + } + + public static long getCidrSize(String netmask) { + long ip = ip2Long(netmask); + int count = 0; + for (int i = 0; i < 32; i++) { + if (((ip >> i) & 0x1) == 0) { + count++; + } else { + break; + } + } + + return 32 - count; + } + + public static boolean isValidPort(String p) { + try { + int port = Integer.parseInt(p); + return !(port > 65535 || port < 1); + } catch (NumberFormatException e) { + return false; + } + } + + public static boolean isValidPort(int p) { + return !(p > 65535 || p < 1); + } + + public static boolean isValidLBPort(String p) { + try { + int port = Integer.parseInt(p); + return !(port > 65535 || port < 1); + } catch (NumberFormatException e) { + return false; + } + } + + public static boolean isValidProto(String p) { + String proto = p.toLowerCase(); + return (proto.equals(TCP_PROTO) || proto.equals(UDP_PROTO) || proto.equals(ICMP_PROTO)); + } + + public static boolean isValidSecurityGroupProto(String p) { + String proto = p.toLowerCase(); + return (proto.equals(TCP_PROTO) || proto.equals(UDP_PROTO) || proto.equals(ICMP_PROTO) || proto.equals(ALL_PROTO)); + } + + public static boolean isValidAlgorithm(String p) { + String algo = p.toLowerCase(); + return (algo.equals("roundrobin") || algo.equals("leastconn") || algo.equals("source")); + } + + public static boolean isValidAutoScaleAction(String p) { + String action = p.toLowerCase(); + return (action.equals("scaleup") || action.equals("scaledown")); + } + + public static String getLinkLocalNetMask() { + return "255.255.0.0"; + } + + public static String getLinkLocalGateway() { + return "169.254.0.1"; + } + + public static String getLinkLocalCIDR() { + return "169.254.0.0/16"; + } + + public static String[] getLinkLocalIPRange(int size) { + if (size > 16 || size <= 0) { + return null; + } + /* reserve gateway */ + String[] range = getIpRangeFromCidr(getLinkLocalGateway(), 32 - size); + + if (range[0].equalsIgnoreCase(getLinkLocalGateway())) { + /* remove the gateway */ + long ip = ip2Long(range[0]); + ip += 1; + range[0] = long2Ip(ip); + } + return range; + } + + public static String getLinkLocalIpEnd() { + String[] cidrPair = getLinkLocalCIDR().split("\\/"); + String cidr = cidrPair[0]; + + return getIpRangeEndIpFromCidr(cidr, 32 - Long.parseLong(cidrPair[1])); + } + + public static String portRangeToString(int portRange[]) { + return Integer.toString(portRange[0]) + ":" + Integer.toString(portRange[1]); + } + + // test only + private static void configLog4j() { + URL configUrl = System.class.getResource("/conf/log4j-cloud.xml"); + if (configUrl != null) { + System.out.println("Configure log4j using log4j-cloud.xml"); + + try { + File file = new File(configUrl.toURI()); + + System.out.println("Log4j configuration from : " + file.getAbsolutePath()); + DOMConfigurator.configureAndWatch(file.getAbsolutePath(), 10000); + } catch (URISyntaxException e) { + System.out.println("Unable to convert log4j configuration Url to URI"); + } + // DOMConfigurator.configure(configUrl); + } else { + System.out.println("Configure log4j with default properties"); + } + } + + + public static boolean verifyDomainNameLabel(String hostName, boolean isHostName) { + // must be between 1 and 63 characters long and may contain only the ASCII letters 'a' through 'z' (in a + // case-insensitive manner), + // the digits '0' through '9', and the hyphen ('-'). + // Can not start with a hyphen and digit, and must not end with a hyphen + // If it's a host name, don't allow to start with digit + + if (hostName.length() > 63 || hostName.length() < 1) { + s_logger.warn("Domain name label must be between 1 and 63 characters long"); + return false; + } else if (!hostName.toLowerCase().matches("[a-z0-9-]*")) { + s_logger.warn("Domain name label may contain only the ASCII letters 'a' through 'z' (in a case-insensitive manner)"); + return false; + } else if (hostName.startsWith("-") || hostName.endsWith("-")) { + s_logger.warn("Domain name label can not start with a hyphen and digit, and must not end with a hyphen"); + return false; + } else if (isHostName && hostName.matches("^[0-9-].*")) { + s_logger.warn("Host name can't start with digit"); + return false; + } + + return true; + } + + public static boolean verifyDomainName(String domainName) { + // don't allow domain name length to exceed 190 chars (190 + 63 (max host name length) = 253 = max domainName length + if (domainName.length() < 1 || domainName.length() > 190) { + s_logger.trace("Domain name must be between 1 and 190 characters long"); + return false; + } + + if (domainName.startsWith(".") || domainName.endsWith(".")) { + s_logger.trace("Domain name can't start or end with ."); + return false; + } + + String[] domainNameLabels = domainName.split("\\."); + + for (int i = 0; i < domainNameLabels.length; i++) { + if (!verifyDomainNameLabel(domainNameLabels[i], false)) { + s_logger.warn("Domain name label " + domainNameLabels[i] + " is incorrect"); + return false; + } + } + + return true; + } + + public static String getDhcpRange(String cidr) { + String[] splitResult = cidr.split("\\/"); + long size = Long.valueOf(splitResult[1]); + return NetUtils.getIpRangeStartIpFromCidr(splitResult[0], size); + } + + public static boolean validateGuestCidr(String cidr) { + // RFC 1918 - The Internet Assigned Numbers Authority (IANA) has reserved the + // following three blocks of the IP address space for private internets: + // 10.0.0.0 - 10.255.255.255 (10/8 prefix) + // 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) + // 192.168.0.0 - 192.168.255.255 (192.168/16 prefix) + + String cidr1 = "10.0.0.0/8"; + String cidr2 = "172.16.0.0/12"; + String cidr3 = "192.168.0.0/16"; + + if (!isValidCIDR(cidr)) { + s_logger.warn("Cidr " + cidr + " is not valid"); + return false; + } + + if (isNetworkAWithinNetworkB(cidr, cidr1) || isNetworkAWithinNetworkB(cidr, cidr2) || isNetworkAWithinNetworkB(cidr, cidr3)) { + return true; + } else { + s_logger.warn("cidr " + cidr + " is not RFC 1918 compliant"); + return false; + } + } + + public static boolean verifyInstanceName(String instanceName) { + //instance name for cloudstack vms shouldn't contain - and spaces + if (instanceName.contains("-") || instanceName.contains(" ") || instanceName.contains("+")) { + s_logger.warn("Instance name can not contain hyphen, spaces and \"+\" char"); + return false; + } + + return true; + } + + public static boolean isValidS2SVpnPolicy(String policys) { + if (policys == null || policys.isEmpty()) { + return false; + } + for (String policy : policys.split(",")) { + if (policy.isEmpty()) { + return false; + } + //String cipherHash = policy.split(";")[0]; + String cipherHash = policy; + if (cipherHash.isEmpty()) { + return false; + } + String[] list = cipherHash.split("-"); + if (list.length != 2) { + return false; + } + String cipher = list[0]; + String hash = list[1]; + if (!cipher.matches("3des|aes|aes128|aes256")) { + return false; + } + if (!hash.matches("md5|sha1")) { + return false; + } + /* Disable pfsGroup support, see CS-15511 + String pfsGroup = null; + if (!policy.equals(cipherHash)) { + pfsGroup = policy.split(";")[1]; + } + if (pfsGroup != null && !pfsGroup.matches("modp1024|modp1536")) { + return false; + } + */ + } + return true; + } + + public static boolean validateGuestCidrList(String guestCidrList) { + for (String guestCidr : guestCidrList.split(";")) { + if (!validateGuestCidr(guestCidr)) { + return false; + } + } + return true; + } +}
  3. aOYx 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�+l~vF(}6DbY;6 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

  4. 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 DV6_XG delta 1459643 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�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