diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index 900508b1fbb..7f9d79c65bc 100644 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -183,7 +183,7 @@ import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.OutputInterpreter; import com.cloud.utils.script.Script; import com.cloud.vm.ConsoleProxyVO; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.DomainRouter; import com.cloud.vm.State; import com.cloud.vm.VirtualMachineName; @@ -1174,7 +1174,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv protected Answer execute(CreateCommand cmd) { StoragePoolTO pool = cmd.getPool(); - DiskCharacteristics dskch = cmd.getDiskCharacteristics(); + DiskProfile dskch = cmd.getDiskCharacteristics(); StorageVol tmplVol = null; StoragePool primaryPool = null; StorageVol vol = null; diff --git a/api/src/com/cloud/dc/Pod.java b/api/src/com/cloud/dc/Pod.java index fb325e02bdb..bdea8dd0679 100644 --- a/api/src/com/cloud/dc/Pod.java +++ b/api/src/com/cloud/dc/Pod.java @@ -15,5 +15,9 @@ public interface Pod extends Grouping { */ long getId(); + String getCidrAddress(); + int getCidrSize(); + public String getGateway(); + //String getUniqueName(); } diff --git a/api/src/com/cloud/deploy/DeployDestination.java b/api/src/com/cloud/deploy/DeployDestination.java new file mode 100644 index 00000000000..4417086c324 --- /dev/null +++ b/api/src/com/cloud/deploy/DeployDestination.java @@ -0,0 +1,56 @@ +/** + * + */ +package com.cloud.deploy; + +import java.util.Map; + +import com.cloud.dc.DataCenter; +import com.cloud.dc.Pod; +import com.cloud.host.Host; +import com.cloud.org.Cluster; +import com.cloud.storage.StoragePool; +import com.cloud.storage.Volume; +import com.cloud.utils.NumbersUtil; + +public class DeployDestination { + DataCenter _dc; + Pod _pod; + Cluster _cluster; + Host _host; + Map _storage; + + public DataCenter getDataCenter() { + return _dc; + } + + public Pod getPod() { + return _pod; + } + + public Cluster getCluster() { + return _cluster; + } + + public Host getHost() { + return _host; + } + + public Map getStorageForDisks() { + return _storage; + } + + public DeployDestination() { + } + + @Override + public int hashCode() { + return NumbersUtil.hash(_host.getId()); + } + + @Override + public boolean equals(Object obj) { + assert false : "Not implemented correctly yet."; + return false; + } +} diff --git a/api/src/com/cloud/deploy/DeploymentDispatcher.java b/api/src/com/cloud/deploy/DeploymentDispatcher.java new file mode 100644 index 00000000000..4265b559f62 --- /dev/null +++ b/api/src/com/cloud/deploy/DeploymentDispatcher.java @@ -0,0 +1,13 @@ +/** + * + */ +package com.cloud.deploy; + +import java.util.Set; + +import com.cloud.utils.component.Adapter; +import com.cloud.vm.VirtualMachineProfile; + +public interface DeploymentDispatcher extends Adapter { + DeployDestination plan(VirtualMachineProfile vm, DeploymentPlan plan, Set avoid); +} diff --git a/api/src/com/cloud/network/NetworkConfiguration.java b/api/src/com/cloud/network/NetworkConfiguration.java index f0193b6c25d..207997d49dd 100644 --- a/api/src/com/cloud/network/NetworkConfiguration.java +++ b/api/src/com/cloud/network/NetworkConfiguration.java @@ -12,6 +12,11 @@ import com.cloud.network.Network.TrafficType; * owned by an account. */ public interface NetworkConfiguration { + enum State { + Allocated, // Indicates the network configuration is in allocated but not setup. + Setup, // Indicates the network configuration is setup. + InUse; // Indicates the network configuration is in use. + } /** * @return id of the network profile. Null means the network profile is not from the database. @@ -28,7 +33,9 @@ public interface NetworkConfiguration { String getCidr(); - void setCidr(String cidr); + long getDataCenterId(); long getNetworkOfferingId(); + + State getState(); } diff --git a/api/src/com/cloud/network/NetworkProfiler.java b/api/src/com/cloud/network/NetworkProfiler.java deleted file mode 100644 index 6a3621a6856..00000000000 --- a/api/src/com/cloud/network/NetworkProfiler.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * - */ -package com.cloud.network; - -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import com.cloud.deploy.DeploymentPlan; -import com.cloud.exception.ConflictingNetworkSettingsException; -import com.cloud.offering.NetworkOffering; -import com.cloud.offering.ServiceOffering; -import com.cloud.user.Account; -import com.cloud.utils.component.Adapter; -import com.cloud.vm.VirtualMachine; - -/** - * NetworkProfiler takes the list of network offerings requested and figures - * out what are the additional network profiles that are needed to add - * to the account in order to support this network. - * - */ -public interface NetworkProfiler extends Adapter { - NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map params, Account owner); - - List convert(Collection networkOfferings, Account owner); - boolean check(VirtualMachine vm, ServiceOffering serviceOffering, Collection networkProfiles) throws ConflictingNetworkSettingsException; -} diff --git a/api/src/com/cloud/network/configuration/NetworkGuru.java b/api/src/com/cloud/network/configuration/NetworkGuru.java new file mode 100644 index 00000000000..2f7bb5cded2 --- /dev/null +++ b/api/src/com/cloud/network/configuration/NetworkGuru.java @@ -0,0 +1,24 @@ +/** + * + */ +package com.cloud.network.configuration; + +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.network.NetworkConfiguration; +import com.cloud.offering.NetworkOffering; +import com.cloud.user.Account; +import com.cloud.utils.component.Adapter; + +/** + * NetworkProfiler takes the list of network offerings requested and figures + * out what are the additional network profiles that are needed to add + * to the account in order to support this network. + * + */ +public interface NetworkGuru extends Adapter { + NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration config, Account owner); + NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination); + + +} diff --git a/api/src/com/cloud/network/element/NetworkElement.java b/api/src/com/cloud/network/element/NetworkElement.java new file mode 100644 index 00000000000..e89123d7e98 --- /dev/null +++ b/api/src/com/cloud/network/element/NetworkElement.java @@ -0,0 +1,32 @@ +/** + * + */ +package com.cloud.network.element; + +import com.cloud.network.NetworkConfiguration; +import com.cloud.offering.NetworkOffering; +import com.cloud.utils.component.Adapter; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachineProfile; + +/** + * Represents one network element that exists in a network. + */ +public interface NetworkElement extends Adapter { + /** + * Implement the network configuration as specified. + * @param config fully specified network configuration. + * @param offering network offering that originated the network configuration. + * @return true if network configuration is now usable; false if not. + */ + boolean implement(NetworkConfiguration config, NetworkOffering offering); + + /** + * Prepare the nic profile to be used within the network. + * @param config + * @param nic + * @param offering + * @return + */ + boolean prepare(NetworkConfiguration config, NicProfile nic, VirtualMachineProfile vm, NetworkOffering offering); +} diff --git a/api/src/com/cloud/org/RunningIn.java b/api/src/com/cloud/org/RunningIn.java new file mode 100644 index 00000000000..f8b93e3afa5 --- /dev/null +++ b/api/src/com/cloud/org/RunningIn.java @@ -0,0 +1,11 @@ +/** + * + */ +package com.cloud.org; + +public interface RunningIn { + long getDataCenterId(); + long getPodId(); + Long getClusterId(); + Long getHostId(); +} diff --git a/api/src/com/cloud/resource/Concierge.java b/api/src/com/cloud/resource/Concierge.java new file mode 100644 index 00000000000..04b1538ef5b --- /dev/null +++ b/api/src/com/cloud/resource/Concierge.java @@ -0,0 +1,10 @@ +/** + * + */ +package com.cloud.resource; + +import com.cloud.utils.component.Adapter; + +public interface Concierge extends Adapter { + +} diff --git a/api/src/com/cloud/resource/Resource.java b/api/src/com/cloud/resource/Resource.java new file mode 100644 index 00000000000..0ab66082ee4 --- /dev/null +++ b/api/src/com/cloud/resource/Resource.java @@ -0,0 +1,67 @@ +/** + * + */ +package com.cloud.resource; + +import java.util.Date; + +/** + * Indicates a resource in CloudStack. + * Any resource that requires an reservation and release system + * must implement this interface. + * + */ +public interface Resource { + enum State { + Allocated, // The resource is allocated but not re + Reserving, + Reserved, + Releasing, + } + + enum ReservationStrategy { + UserSpecified, + Create, + Start + } + + /** + * @return id in the CloudStack database + */ + long getId(); + + /** + * @return reservation id returned by the allocation source. This can be the + * String version of the database id if the allocation source does not need it's + * own implementation of the reservation id. This is passed back to the + * allocation source to release the resource. + */ + String getReservationId(); + + /** + * @return unique name for the allocation source. + */ + String getReserver(); + + /** + * @return the time a reservation request was made to the allocation source. + */ + Date getUpdateTime(); + + /** + * @return the expected reservation interval. -1 indicates + */ + int getExpectedReservationInterval(); + + /** + * @return the expected release interval. + */ + int getExpectedReleaseInterval(); + + /** + * @return the reservation state of the resource. + */ + State getState(); + + ReservationStrategy getReservationStrategy(); +} diff --git a/core/src/com/cloud/storage/StoragePool.java b/api/src/com/cloud/storage/StoragePool.java similarity index 100% rename from core/src/com/cloud/storage/StoragePool.java rename to api/src/com/cloud/storage/StoragePool.java diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java index 64c868412e3..75421e1880b 100755 --- a/api/src/com/cloud/storage/Volume.java +++ b/api/src/com/cloud/storage/Volume.java @@ -42,6 +42,8 @@ public interface Volume extends PartOf, OwnedBy, BasedOn { enum SourceType { Snapshot,DiskOffering,Template,Blank } + + long getId(); /** * @return the volume name */ diff --git a/api/src/com/cloud/vm/DiskCharacteristics.java b/api/src/com/cloud/vm/DiskProfile.java similarity index 82% rename from api/src/com/cloud/vm/DiskCharacteristics.java rename to api/src/com/cloud/vm/DiskProfile.java index acb30d14bef..cad858b9dad 100644 --- a/api/src/com/cloud/vm/DiskCharacteristics.java +++ b/api/src/com/cloud/vm/DiskProfile.java @@ -17,6 +17,7 @@ */ package com.cloud.vm; +import com.cloud.offering.DiskOffering; import com.cloud.storage.Volume; /** @@ -25,7 +26,7 @@ import com.cloud.storage.Volume; * and resources to allocate and create disks. There object is immutable once * it has been created. */ -public class DiskCharacteristics { +public class DiskProfile { private long size; private String[] tags; private Volume.VolumeType type; @@ -35,11 +36,13 @@ public class DiskCharacteristics { private long diskOfferingId; private Long templateId; private long volumeId; + private Volume vol; + private DiskOffering offering; - protected DiskCharacteristics() { + protected DiskProfile() { } - public DiskCharacteristics(long volumeId, Volume.VolumeType type, String name, long diskOfferingId, long size, String[] tags, boolean useLocalStorage, boolean recreatable, Long templateId) { + public DiskProfile(long volumeId, Volume.VolumeType type, String name, long diskOfferingId, long size, String[] tags, boolean useLocalStorage, boolean recreatable, Long templateId) { this.type = type; this.name = name; this.size = size; @@ -50,7 +53,13 @@ public class DiskCharacteristics { this.templateId = templateId; this.volumeId = volumeId; } - + + public DiskProfile(Volume vol, DiskOffering offering) { + this(vol.getId(), vol.getVolumeType(), vol.getName(), offering.getId(), vol.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.getUseLocalStorage(), vol.getSize()); + this.vol = vol; + this.offering = offering; + } + /** * @return size of the disk requested in bytes. */ diff --git a/api/src/com/cloud/vm/NetworkCharacteristics.java b/api/src/com/cloud/vm/NetworkCharacteristics.java deleted file mode 100644 index 7b8c3482797..00000000000 --- a/api/src/com/cloud/vm/NetworkCharacteristics.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * - */ -package com.cloud.vm; - -import com.cloud.network.Network.BroadcastDomainType; -import com.cloud.network.Network.Mode; - -public class NetworkCharacteristics { - long id; - BroadcastDomainType type; - String cidr; - Mode mode; - long vmId; - - public BroadcastDomainType getType() { - return type; - } - - public Mode getMode() { - return mode; - } - - public long getNetworkId() { - return id; - } - - public long getVirtualMachineId() { - return vmId; - } - - public NetworkCharacteristics() { - } - - public NetworkCharacteristics(long id, BroadcastDomainType type, String cidr, Mode mode, long vmId) { - this.id = id; - this.type = type; - this.cidr = cidr; - this.mode = mode; - this.vmId = vmId; - } -} diff --git a/api/src/com/cloud/vm/NetworkConcierge.java b/api/src/com/cloud/vm/NetworkConcierge.java index 665103ccfad..6611466e0f6 100644 --- a/api/src/com/cloud/vm/NetworkConcierge.java +++ b/api/src/com/cloud/vm/NetworkConcierge.java @@ -3,25 +3,27 @@ */ package com.cloud.vm; +import com.cloud.deploy.DeployDestination; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.network.NetworkConfiguration; -import com.cloud.utils.Pair; -import com.cloud.utils.component.Adapter; +import com.cloud.resource.Concierge; /** * NetworkConcierge reserves network settings for a VM based - * on the NetworkCharacteristics given. A Concierge must + * on the NetworkCharacteristics given. A concierge must * return a unique name so we know to call it to release * the reservation. * */ -public interface NetworkConcierge extends Adapter { +public interface NetworkConcierge extends Concierge { String getUniqueName(); - Nic allocate(VirtualMachine vm, NetworkConfiguration profile, Nic nic); + NicProfile allocate(VirtualMachine vm, NetworkConfiguration config, NicProfile nic) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException; - Pair reserve(long vmId, NetworkCharacteristics ch) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException; + boolean create(Nic nic) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException; + + String reserve(long vmId, NicProfile ch, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException; boolean release(String uniqueName, String uniqueId); } diff --git a/api/src/com/cloud/vm/Nic.java b/api/src/com/cloud/vm/Nic.java index d7d9f7c9292..621a7c1e43f 100644 --- a/api/src/com/cloud/vm/Nic.java +++ b/api/src/com/cloud/vm/Nic.java @@ -18,19 +18,13 @@ package com.cloud.vm; import com.cloud.network.Network.Mode; +import com.cloud.resource.Resource; /** * Nic represents one nic on the VM. */ -public interface Nic { - enum State { - Allocated, - AcquireIp, - IpAcquired, - } - - State getState(); +public interface Nic extends Resource { String getIp4Address(); @@ -39,19 +33,14 @@ public interface Nic { /** * @return network profile id that this */ - long getNetworkProfileId(); - - /** - * @return the unique id to reference this nic. - */ - long getId(); + long getNetworkConfigurationId(); /** * @return the vm instance id that this nic belongs to. */ long getInstanceId(); - long getDeviceId(); + int getDeviceId(); Mode getMode(); } diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java new file mode 100644 index 00000000000..70b7961c93f --- /dev/null +++ b/api/src/com/cloud/vm/NicProfile.java @@ -0,0 +1,157 @@ +/** + * + */ +package com.cloud.vm; + +import com.cloud.network.Network.AddressFormat; +import com.cloud.network.Network.BroadcastDomainType; +import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; +import com.cloud.network.NetworkConfiguration; + +public class NicProfile { + long id; + BroadcastDomainType broadcastType; + String cidr; + Mode mode; + long vmId; + String gateway; + int deviceId; + AddressFormat format; + TrafficType trafficType; + String ip4Address; + String ip6Address; + String macAddress; + + public BroadcastDomainType getType() { + return broadcastType; + } + + public void setBroadcastType(BroadcastDomainType broadcastType) { + this.broadcastType = broadcastType; + } + + public void setCidr(String cidr) { + this.cidr = cidr; + } + + public void setMode(Mode mode) { + this.mode = mode; + } + + public void setVmId(long vmId) { + this.vmId = vmId; + } + + public void setGateway(String gateway) { + this.gateway = gateway; + } + + public void setDeviceId(int deviceId) { + this.deviceId = deviceId; + } + + public void setFormat(AddressFormat format) { + this.format = format; + } + + public void setTrafficType(TrafficType trafficType) { + this.trafficType = trafficType; + } + + public void setIp6Address(String ip6Address) { + this.ip6Address = ip6Address; + } + + public Mode getMode() { + return mode; + } + + public long getNetworkId() { + return id; + } + + public long getVirtualMachineId() { + return vmId; + } + + public long getId() { + return id; + } + + public BroadcastDomainType getBroadcastType() { + return broadcastType; + } + + public String getCidr() { + return cidr; + } + + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + + public long getVmId() { + return vmId; + } + + public String getGateway() { + return gateway; + } + + public int getDeviceId() { + return deviceId; + } + + public AddressFormat getFormat() { + return format; + } + + public TrafficType getTrafficType() { + return trafficType; + } + + public String getIp4Address() { + return ip4Address; + } + + public String getIp6Address() { + return ip6Address; + } + + public String getMacAddress() { + return macAddress; + } + + public void setIp4Address(String ip4Address) { + this.ip4Address = ip4Address; + } + + public NicProfile(Nic nic, NetworkConfiguration network) { + this.id = nic.getId(); + this.deviceId = nic.getDeviceId(); + this.cidr = network.getCidr(); + this.gateway = network.getGateway(); + this.mode = network.getMode(); + this.format = null; + this.broadcastType = network.getBroadcastDomainType(); + this.trafficType = network.getTrafficType(); + this.ip4Address = nic.getIp4Address(); + this.ip6Address = null; + this.macAddress = nic.getMacAddress(); + } + + public NicProfile(long id, BroadcastDomainType type, String cidr, Mode mode, long vmId) { + this.id = id; + this.broadcastType = type; + this.cidr = cidr; + this.mode = mode; + this.vmId = vmId; + } + + public NicProfile(String ip4Address, String macAddress, String gateway) { + this.ip4Address = ip4Address; + this.macAddress = macAddress; + this.gateway = gateway; + } +} diff --git a/api/src/com/cloud/vm/State.java b/api/src/com/cloud/vm/State.java index 81692497d9f..53bd798818f 100644 --- a/api/src/com/cloud/vm/State.java +++ b/api/src/com/cloud/vm/State.java @@ -19,10 +19,13 @@ package com.cloud.vm; import java.util.List; +import java.util.Set; +import com.cloud.utils.fsm.FiniteState; import com.cloud.utils.fsm.StateMachine; +import com.cloud.vm.VirtualMachine.Event; -public enum State { +public enum State implements FiniteState { Creating(true), Starting(true), Running(false), @@ -44,22 +47,24 @@ public enum State { return _transitional; } - public static String[] toStrings(State... states) { - String[] strs = new String[states.length]; - for (int i = 0; i < states.length; i++) { - strs[i] = states[i].toString(); - } - - return strs; - } - + @Override public State getNextState(VirtualMachine.Event e) { return s_fsm.getNextState(this, e); } - public State[] getFromStates(VirtualMachine.Event e) { - List from = s_fsm.getFromStates(this, e); - return from.toArray(new State[from.size()]); + @Override + public List getFromStates(VirtualMachine.Event e) { + return s_fsm.getFromStates(this, e); + } + + @Override + public Set getPossibleEvents() { + return s_fsm.getPossibleEvents(this); + } + + @Override + public StateMachine getStateMachine() { + return s_fsm; } protected static final StateMachine s_fsm = new StateMachine(); diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java new file mode 100644 index 00000000000..6d97f5d21c1 --- /dev/null +++ b/api/src/com/cloud/vm/VirtualMachineProfile.java @@ -0,0 +1,115 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.vm; + +import java.util.List; +import java.util.Map; + +import com.cloud.hypervisor.Hypervisor; +import com.cloud.offering.ServiceOffering; + +public class VirtualMachineProfile { + VirtualMachine _vm; + int _cpus; + int _speed; // in mhz + long _ram; // in bytes + Hypervisor.Type _hypervisorType; + VirtualMachine.Type _type; + Map _params; + Long _templateId; + List _disks; + List _nics; + + public VirtualMachineProfile(VirtualMachine.Type type) { + this._type = type; + } + + public long getId() { + return _vm.getId(); + } + + public VirtualMachine.Type getType() { + return _type; + } + + public Long getTemplateId() { + return _templateId; + } + + public int getCpus() { + return _cpus; + } + + public int getSpeed() { + return _speed; + } + + public long getRam() { + return _ram; + } + + public void setNics(List profiles) { + this._nics = profiles; + } + + public List getNics() { + return _nics; + } + + public void setDisks(List profiles) { + this._disks = profiles; + } + + public List getDisks() { + return _disks; + } + + public Hypervisor.Type getHypervisorType() { + return _hypervisorType; + } + + public VirtualMachine getVm() { + return _vm; + } + + public VirtualMachineProfile(long id, int core, int speed, long ram, Long templateId, Hypervisor.Type type, Map params) { + this._cpus = core; + this._speed = speed; + this._ram = ram; + this._hypervisorType = type; + this._params = params; + this._templateId = templateId; + } + + public VirtualMachineProfile(VirtualMachine vm, ServiceOffering offering) { + this._cpus = offering.getCpu(); + this._speed = offering.getSpeed(); + this._ram = offering.getRamSize(); + this._templateId = vm.getTemplateId(); + this._type = vm.getType(); + this._vm = vm; + } + + protected VirtualMachineProfile() { + } + + @Override + public String toString() { + return "VM-" + _type + "-" + _vm.getId(); + } +} \ No newline at end of file diff --git a/api/src/com/cloud/vm/VirtualMachineProfiler.java b/api/src/com/cloud/vm/VirtualMachineProfiler.java index 09e1dcc7f11..1156346bb22 100644 --- a/api/src/com/cloud/vm/VirtualMachineProfiler.java +++ b/api/src/com/cloud/vm/VirtualMachineProfiler.java @@ -9,5 +9,5 @@ import com.cloud.utils.component.Adapter; public interface VirtualMachineProfiler extends Adapter { - VmCharacteristics convert(ServiceOffering offering, VirtualMachineTemplate template); + VirtualMachineProfile convert(ServiceOffering offering, VirtualMachineTemplate template); } diff --git a/api/src/com/cloud/vm/VmCharacteristics.java b/api/src/com/cloud/vm/VmCharacteristics.java deleted file mode 100644 index 4073ec2c393..00000000000 --- a/api/src/com/cloud/vm/VmCharacteristics.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * - * This software is licensed under the GNU General Public License v3 or later. - * - * It is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package com.cloud.vm; - -import java.util.Map; - -import com.cloud.hypervisor.Hypervisor; - -public class VmCharacteristics { - long id; - int core; - int speed; // in mhz - long ram; // in bytes - Hypervisor.Type hypervisorType; - VirtualMachine.Type type; - Map params; - Long templateId; - - public VmCharacteristics(VirtualMachine.Type type) { - this.type = type; - } - - public VirtualMachine.Type getType() { - return type; - } - - public Long getTemplateId() { - return templateId; - } - - public int getCores() { - return core; - } - - public int getSpeed() { - return speed; - } - - public long getRam() { - return ram; - } - - public Hypervisor.Type getHypervisorType() { - return hypervisorType; - } - - public VmCharacteristics(long id, int core, int speed, long ram, Long templateId, Hypervisor.Type type, Map params) { - this.core = core; - this.speed = speed; - this.ram = ram; - this.hypervisorType = type; - this.params = params; - this.id = id; - this.templateId = templateId; - } - - protected VmCharacteristics() { - } - - @Override - public String toString() { - return "VM-" + type + "-" + id; - } -} \ No newline at end of file diff --git a/core/src/com/cloud/agent/AgentManager.java b/core/src/com/cloud/agent/AgentManager.java index 49bda30e8b3..11740cdaa34 100755 --- a/core/src/com/cloud/agent/AgentManager.java +++ b/core/src/com/cloud/agent/AgentManager.java @@ -44,7 +44,7 @@ import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; /** * AgentManager manages hosts. It directly coordinates between the @@ -180,7 +180,7 @@ public interface AgentManager extends Manager { */ Pair findPod(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set avoids); - Host findHost(VmCharacteristics vm, Set avoids); + Host findHost(VirtualMachineProfile vm, Set avoids); /** * Put the agent in maintenance mode. diff --git a/core/src/com/cloud/agent/api/routing/IPAssocCommand.java b/core/src/com/cloud/agent/api/routing/IPAssocCommand.java index ec1761a6e5a..42122d16716 100644 --- a/core/src/com/cloud/agent/api/routing/IPAssocCommand.java +++ b/core/src/com/cloud/agent/api/routing/IPAssocCommand.java @@ -35,11 +35,12 @@ public class IPAssocCommand extends RoutingCommand { private String vlanGateway; private String vlanNetmask; private String vifMacAddress; + private String guestIp; protected IPAssocCommand() { } - public IPAssocCommand(String routerName, String privateIpAddress, String ipAddress, boolean add, boolean firstIP, boolean sourceNat, String vlanId, String vlanGateway, String vlanNetmask, String vifMacAddress) { + public IPAssocCommand(String routerName, String privateIpAddress, String ipAddress, boolean add, boolean firstIP, boolean sourceNat, String vlanId, String vlanGateway, String vlanNetmask, String vifMacAddress, String guestIp) { this.setRouterName(routerName); this.routerIp = privateIpAddress; this.publicIp = ipAddress; @@ -50,8 +51,13 @@ public class IPAssocCommand extends RoutingCommand { this.vlanGateway = vlanGateway; this.vlanNetmask = vlanNetmask; this.vifMacAddress = vifMacAddress; + this.guestIp = guestIp; } + public String getGuestIp(){ + return guestIp; + } + public String getRouterIp() { return routerIp; } diff --git a/core/src/com/cloud/agent/api/storage/CreateCommand.java b/core/src/com/cloud/agent/api/storage/CreateCommand.java index 48e53748f1e..d53e378aec7 100644 --- a/core/src/com/cloud/agent/api/storage/CreateCommand.java +++ b/core/src/com/cloud/agent/api/storage/CreateCommand.java @@ -21,13 +21,13 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.to.StoragePoolTO; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VolumeVO; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; public class CreateCommand extends Command { private long volId; private StoragePoolTO pool; - private DiskCharacteristics diskCharacteristics; + private DiskProfile diskCharacteristics; private String templateUrl; private long size; private String instanceName; @@ -45,7 +45,7 @@ public class CreateCommand extends Command { * @param templateUrl * @param pool */ - public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskCharacteristics diskCharacteristics, String templateUrl, StoragePoolVO pool) { + public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskProfile diskCharacteristics, String templateUrl, StoragePoolVO pool) { this(vol, vm, diskCharacteristics, pool, 0); this.templateUrl = templateUrl; } @@ -58,7 +58,7 @@ public class CreateCommand extends Command { * @param diskCharacteristics * @param pool */ - public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskCharacteristics diskCharacteristics, StoragePoolVO pool, long size) { + public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskProfile diskCharacteristics, StoragePoolVO pool, long size) { this.volId = vol.getId(); this.diskCharacteristics = diskCharacteristics; this.pool = new StoragePoolTO(pool); @@ -80,7 +80,7 @@ public class CreateCommand extends Command { return pool; } - public DiskCharacteristics getDiskCharacteristics() { + public DiskProfile getDiskCharacteristics() { return diskCharacteristics; } diff --git a/core/src/com/cloud/alert/dao/AlertDaoImpl.java b/core/src/com/cloud/alert/dao/AlertDaoImpl.java index c79c6c48b9c..bee71b47a73 100644 --- a/core/src/com/cloud/alert/dao/AlertDaoImpl.java +++ b/core/src/com/cloud/alert/dao/AlertDaoImpl.java @@ -40,7 +40,7 @@ public class AlertDaoImpl extends GenericDaoBase implements Alert sc.addAnd("podId", SearchCriteria.Op.EQ, podId); } - List alerts = listActiveBy(sc, searchFilter); + List alerts = listBy(sc, searchFilter); if ((alerts != null) && !alerts.isEmpty()) { return alerts.get(0); } diff --git a/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java b/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java index 24cacaa8cc3..13564f43961 100644 --- a/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java +++ b/core/src/com/cloud/async/dao/AsyncJobDaoImpl.java @@ -61,7 +61,7 @@ public class AsyncJobDaoImpl extends GenericDaoBase implements sc.setParameters("instanceId", instanceId); sc.setParameters("status", AsyncJobResult.STATUS_IN_PROGRESS); - List l = listBy(sc); + List l = listIncludingRemovedBy(sc); if(l != null && l.size() > 0) { if(l.size() > 1) { s_logger.warn("Instance " + instanceType + "-" + instanceId + " has multiple pending async-job"); @@ -76,6 +76,6 @@ public class AsyncJobDaoImpl extends GenericDaoBase implements SearchCriteria sc = expiringAsyncJobSearch.create(); sc.setParameters("created", cutTime); Filter filter = new Filter(AsyncJobVO.class, "created", true, 0L, (long)limit); - return listBy(sc, filter); + return listIncludingRemovedBy(sc, filter); } } diff --git a/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java b/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java index d009866e9e0..26026906c5f 100644 --- a/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java +++ b/core/src/com/cloud/async/dao/SyncQueueDaoImpl.java @@ -66,7 +66,7 @@ public class SyncQueueDaoImpl extends GenericDaoBase implemen SearchCriteria sc = TypeIdSearch.create(); sc.setParameters("syncObjType", syncObjType); sc.setParameters("syncObjId", syncObjId); - return findOneActiveBy(sc); + return findOneBy(sc); } protected SyncQueueDaoImpl() { diff --git a/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java b/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java index a0b4df70074..a8a3202be2b 100644 --- a/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java +++ b/core/src/com/cloud/async/dao/SyncQueueItemDaoImpl.java @@ -53,7 +53,7 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase sc.setParameters("queueId", queueId); Filter filter = new Filter(SyncQueueItemVO.class, "created", true, 0L, 1L); - List l = listActiveBy(sc, filter); + List l = listBy(sc, filter); if(l != null && l.size() > 0) return l.get(0); @@ -105,6 +105,6 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase sc.setParameters("lastProcessMsid", msid); Filter filter = new Filter(SyncQueueItemVO.class, "created", true, 0L, 1L); - return listActiveBy(sc, filter); + return listBy(sc, filter); } } diff --git a/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java index 8fb19e21942..ebef69d9e8d 100644 --- a/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java +++ b/core/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java @@ -44,7 +44,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase sc = MsIdSearch.create(); sc.setParameters("msid", msid); - List l = listBy(sc); + List l = listIncludingRemovedBy(sc); if(l != null && l.size() > 0) return l.get(0); @@ -101,7 +101,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase sc = activeSearch.create(); sc.setParameters("lastUpdateTime", cutTime); - return listBy(sc); + return listIncludingRemovedBy(sc); } public void increaseAlertCount(long id) { diff --git a/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java b/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java index 54930bcb1dc..84f95d76d73 100644 --- a/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java +++ b/core/src/com/cloud/configuration/dao/ConfigurationDaoImpl.java @@ -61,7 +61,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase sc = InstanceSearch.create(); sc.setParameters("instance", "DEFAULT"); - List configurations = listBy(sc); + List configurations = listIncludingRemovedBy(sc); for (ConfigurationVO config : configurations) { if (config.getValue() != null) @@ -71,7 +71,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase sc = NameSearch.create(); sc.setParameters("name", name); - List configurations = listBy(sc); + List configurations = listIncludingRemovedBy(sc); if (configurations.size() == 0) { return null; diff --git a/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java index e7921449ff2..e829cf7e2ef 100644 --- a/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java +++ b/core/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java @@ -52,7 +52,7 @@ public class ResourceCountDaoImpl extends GenericDaoBase sc.setParameters("accountId", accountId); sc.setParameters("type", type); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } private ResourceCountVO findByDomainIdAndType(long domainId, ResourceType type) { @@ -64,7 +64,7 @@ public class ResourceCountDaoImpl extends GenericDaoBase sc.setParameters("domainId", domainId); sc.setParameters("type", type); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override diff --git a/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java b/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java index d6b4a002f22..f266fadfee6 100644 --- a/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java +++ b/core/src/com/cloud/configuration/dao/ResourceLimitDaoImpl.java @@ -48,7 +48,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase sc.setParameters("domainId", domainId); sc.setParameters("type", type); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } public List listByDomainId(Long domainId) { @@ -58,7 +58,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("domainId", domainId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public ResourceLimitVO findByAccountIdAndType(Long accountId, ResourceCount.ResourceType type) { @@ -69,7 +69,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase sc.setParameters("accountId", accountId); sc.setParameters("type", type); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } public List listByAccountId(Long accountId) { @@ -79,7 +79,7 @@ public class ResourceLimitDaoImpl extends GenericDaoBase SearchCriteria sc = IdTypeSearch.create(); sc.setParameters("accountId", accountId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public boolean update(Long id, Long max) { diff --git a/core/src/com/cloud/dc/HostPodVO.java b/core/src/com/cloud/dc/HostPodVO.java index 724e4c7395e..b0ca1f4dd30 100644 --- a/core/src/com/cloud/dc/HostPodVO.java +++ b/core/src/com/cloud/dc/HostPodVO.java @@ -47,12 +47,12 @@ public class HostPodVO implements Pod { private String cidrAddress; @Column(name = "cidr_size") - private long cidrSize; + private int cidrSize; @Column(name = "description") private String description; - public HostPodVO(String name, long dcId, String gateway, String cidrAddress, long cidrSize, String description) { + public HostPodVO(String name, long dcId, String gateway, String cidrAddress, int cidrSize, String description) { this.name = name; this.dataCenterId = dcId; this.gateway = gateway; @@ -88,7 +88,8 @@ public class HostPodVO implements Pod { this.name = name; } - public String getCidrAddress() { + @Override + public String getCidrAddress() { return cidrAddress; } @@ -96,15 +97,17 @@ public class HostPodVO implements Pod { this.cidrAddress = cidrAddress; } - public long getCidrSize() { + @Override + public int getCidrSize() { return cidrSize; } - public void setCidrSize(long cidrSize) { + public void setCidrSize(int cidrSize) { this.cidrSize = cidrSize; } - public String getGateway() { + @Override + public String getGateway() { return gateway; } diff --git a/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java b/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java index a59d622090e..ed979d56afe 100644 --- a/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java +++ b/core/src/com/cloud/dc/dao/AccountVlanMapDaoImpl.java @@ -38,14 +38,14 @@ public class AccountVlanMapDaoImpl extends GenericDaoBase listAccountVlanMapsByAccount(long accountId) { SearchCriteria sc = AccountSearch.create(); sc.setParameters("accountId", accountId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listAccountVlanMapsByVlan(long vlanDbId) { SearchCriteria sc = VlanSearch.create(); sc.setParameters("vlanDbId", vlanDbId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -53,7 +53,7 @@ public class AccountVlanMapDaoImpl extends GenericDaoBase sc = AccountVlanSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("vlanDbId", vlanDbId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } public AccountVlanMapDaoImpl() { diff --git a/core/src/com/cloud/dc/dao/ClusterDaoImpl.java b/core/src/com/cloud/dc/dao/ClusterDaoImpl.java index e1d8ffe4b05..ffb4d2b6fc5 100644 --- a/core/src/com/cloud/dc/dao/ClusterDaoImpl.java +++ b/core/src/com/cloud/dc/dao/ClusterDaoImpl.java @@ -45,7 +45,7 @@ public class ClusterDaoImpl extends GenericDaoBase implements C SearchCriteria sc = PodSearch.create(); sc.setParameters("pod", podId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -54,6 +54,6 @@ public class ClusterDaoImpl extends GenericDaoBase implements C sc.setParameters("pod", podId); sc.setParameters("name", name); - return findOneActiveBy(sc); + return findOneBy(sc); } } diff --git a/core/src/com/cloud/dc/dao/DataCenterDao.java b/core/src/com/cloud/dc/dao/DataCenterDao.java index 8075e3b34bc..b66ace75bb5 100644 --- a/core/src/com/cloud/dc/dao/DataCenterDao.java +++ b/core/src/com/cloud/dc/dao/DataCenterDao.java @@ -18,8 +18,8 @@ package com.cloud.dc.dao; -import java.util.List; - +import java.util.List; + import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVnetVO; import com.cloud.utils.db.GenericDao; @@ -39,7 +39,10 @@ public interface DataCenterDao extends GenericDao { void releaseVnet(String vnet, long dcId, long accountId); void releasePrivateIpAddress(String ipAddress, long dcId, Long instanceId); - void releaseLinkLocalPrivateIpAddress(String ipAddress, long dcId, Long instanceId); + void releasePrivateIpAddress(long nicId); + void releaseLinkLocalPrivateIpAddress(String ipAddress, long dcId, Long instanceId); + void releaseLinkLocalPrivateIpAddress(long nicId); + boolean deletePrivateIpAddressByPod(long podId); boolean deleteLinkLocalPrivateIpAddressByPod(long podId); diff --git a/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java index a7d4b088ce8..9de84194ae9 100644 --- a/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/core/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -66,7 +66,7 @@ public class DataCenterDaoImpl extends GenericDaoBase implem public DataCenterVO findByName(String name) { SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -84,6 +84,16 @@ public class DataCenterDaoImpl extends GenericDaoBase implem _ipAllocDao.releaseIpAddress(ipAddress, dcId, instanceId); } + @Override + public void releasePrivateIpAddress(long nicId) { + _ipAllocDao.releaseIpAddress(nicId); + } + + @Override + public void releaseLinkLocalPrivateIpAddress(long nicId) { + _LinkLocalIpAllocDao.releaseIpAddress(nicId); + } + @Override public void releaseLinkLocalPrivateIpAddress(String ipAddress, long dcId, Long instanceId) { _LinkLocalIpAllocDao.releaseIpAddress(ipAddress, dcId, instanceId); diff --git a/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java b/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java index 06cb6726af8..5947d45fbeb 100755 --- a/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java +++ b/core/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java @@ -136,6 +136,16 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase sc = IpDcSearch.create(); + sc.setParameters("instance", nicId); + + DataCenterIpAddressVO vo = createForUpdate(); + vo.setTakenAt(null); + vo.setInstanceId(null); + update(vo, sc); + } + protected DataCenterIpAddressDaoImpl() { super(); FreeIpSearch = createSearchBuilder(); @@ -173,7 +183,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase sc = PodDcSearch.create(); sc.setParameters("podId", podId); sc.setParameters("dataCenterId", dcId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public List listByPodIdDcIdIpAddress(long podId, long dcId, String ipAddress) { @@ -181,7 +191,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase sc = IpDcSearch.create(); + sc.setParameters("instance", nicId); + + DataCenterLinkLocalIpAddressVO vo = createForUpdate(); + + vo.setTakenAt(null); + vo.setInstanceId(null); + update(vo, sc); + } + protected DataCenterLinkLocalIpAddressDaoImpl() { super(); FreeIpSearch = createSearchBuilder(); @@ -175,7 +186,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase sc = PodDcSearch.create(); sc.setParameters("podId", podId); sc.setParameters("dataCenterId", dcId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public List listByPodIdDcIdIpAddress(long podId, long dcId, String ipAddress) { @@ -183,7 +194,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase listAllocatedVnets(long dcId) { SearchCriteria sc = DcSearchAllocated.create(); sc.setParameters("dc", dcId); - return listActiveBy(sc); + return listBy(sc); } public List findVnet(long dcId, String vnet) { SearchCriteria sc = VnetDcSearch.create();; sc.setParameters("dc", dcId); sc.setParameters("vnet", vnet); - return listActiveBy(sc); + return listBy(sc); } public void add(long dcId, int start, int end) { @@ -114,7 +114,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase implements H SearchCriteria sc = DataCenterIdSearch.create(); sc.setParameters("dcId", id); - return listActiveBy(sc); + return listBy(sc); } public HostPodVO findByName(String name, long dcId) { @@ -68,7 +68,7 @@ public class HostPodDaoImpl extends GenericDaoBase implements H sc.setParameters("dc", dcId); sc.setParameters("name", name); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override diff --git a/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java b/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java index f29e7bd7070..cfe3375f884 100755 --- a/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java +++ b/core/src/com/cloud/dc/dao/PodVlanDaoImpl.java @@ -42,7 +42,7 @@ public class PodVlanDaoImpl extends GenericDaoBase implements G public List listAllocatedVnets(long podId) { SearchCriteria sc = PodSearchAllocated.create(); sc.setParameters("podId", podId); - return listActiveBy(sc); + return listBy(sc); } public void add(long podId, int start, int end) { @@ -106,7 +106,7 @@ public class PodVlanDaoImpl extends GenericDaoBase implements G sc.setParameters("podId", podId); sc.setParameters("account", accountId); - PodVlanVO vo = findOneBy(sc); + PodVlanVO vo = findOneIncludingRemovedBy(sc); if (vo == null) { return; } diff --git a/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java b/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java index 617a084a64b..00410a4002b 100644 --- a/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java +++ b/core/src/com/cloud/dc/dao/PodVlanMapDaoImpl.java @@ -38,14 +38,14 @@ public class PodVlanMapDaoImpl extends GenericDaoBase implem public List listPodVlanMapsByPod(long podId) { SearchCriteria sc = PodSearch.create(); sc.setParameters("podId", podId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listPodVlanMapsByVlan(long vlanDbId) { SearchCriteria sc = VlanSearch.create(); sc.setParameters("vlanDbId", vlanDbId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -53,7 +53,7 @@ public class PodVlanMapDaoImpl extends GenericDaoBase implem SearchCriteria sc = PodVlanSearch.create(); sc.setParameters("podId", podId); sc.setParameters("vlanDbId", vlanDbId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } public PodVlanMapDaoImpl() { diff --git a/core/src/com/cloud/dc/dao/VlanDaoImpl.java b/core/src/com/cloud/dc/dao/VlanDaoImpl.java index d98e04edc21..3d19ecd2949 100644 --- a/core/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/core/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -64,14 +64,14 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao SearchCriteria sc = ZoneVlanIdSearch.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("vlanId", vlanId); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override public List findByZone(long zoneId) { SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zoneId", zoneId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public VlanDaoImpl() { @@ -105,7 +105,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao SearchCriteria sc = ZoneTypeSearch.create(); sc.setParameters("zoneId", zoneId); sc.setParameters("vlanType", vlanType); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -248,7 +248,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao sc.setParameters("zoneId", zoneId); sc.setParameters("vlanType", VlanType.DirectAttached); - return listBy(sc).size() > 0; + return listIncludingRemovedBy(sc).size() > 0; } @@ -260,7 +260,7 @@ public class VlanDaoImpl extends GenericDaoBase implements VlanDao sc.setParameters("vlanType", VlanType.DirectAttached); sc.setJoinParameters("vlan", "podId", podId); - VlanVO vlan = findOneBy(sc); + VlanVO vlan = findOneIncludingRemovedBy(sc); if (vlan == null) { return null; } diff --git a/core/src/com/cloud/domain/dao/DomainDaoImpl.java b/core/src/com/cloud/domain/dao/DomainDaoImpl.java index 118c4c853dc..02284978839 100644 --- a/core/src/com/cloud/domain/dao/DomainDaoImpl.java +++ b/core/src/com/cloud/domain/dao/DomainDaoImpl.java @@ -188,7 +188,7 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom public DomainVO findDomainByPath(String domainPath) { SearchCriteria sc = createSearchCriteria(); sc.addAnd("path", SearchCriteria.Op.EQ, domainPath); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -205,7 +205,7 @@ public class DomainDaoImpl extends GenericDaoBase implements Dom SearchCriteria sc = DomainPairSearch.create(); sc.setParameters("id", parentId, childId); - List domainPair = listActiveBy(sc); + List domainPair = listBy(sc); if ((domainPair != null) && (domainPair.size() == 2)) { DomainVO d1 = domainPair.get(0); diff --git a/core/src/com/cloud/event/EventTypes.java b/core/src/com/cloud/event/EventTypes.java index b3707663dd6..de97d8dd864 100755 --- a/core/src/com/cloud/event/EventTypes.java +++ b/core/src/com/cloud/event/EventTypes.java @@ -74,23 +74,19 @@ public class EventTypes { //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_COPY = "TEMPLATE.COPY"; - 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_UPLOAD_FAILED = "TEMPLATE.UPLOAD.FAILED"; - public static final String EVENT_TEMPLATE_UPLOAD_START = "TEMPLATE.UPLOAD.START"; - public static final String EVENT_TEMPLATE_UPLOAD_SUCCESS = "TEMPLATE.UPLOAD.SUCCESS"; + 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_UPLOAD = "TEMPLATE.UPLOAD"; // 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_UPLOAD_START = "VOLUME.UPLOAD.START"; - public static final String EVENT_VOLUME_UPLOAD_SUCCESS = "VOLUME.UPLOAD.SUCCESS"; - public static final String EVENT_VOLUME_UPLOAD_FAILED = "VOLUME.UPLOAD.FAILED"; + public static final String EVENT_VOLUME_UPLOAD = "VOLUME.UPLOAD"; // Domains public static final String EVENT_DOMAIN_CREATE = "DOMAIN.CREATE"; @@ -110,9 +106,7 @@ public class EventTypes { 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_UPLOAD_FAILED = "ISO.UPLOAD.FAILED"; - public static final String EVENT_ISO_UPLOAD_START = "ISO.UPLOAD.START"; - public static final String EVENT_ISO_UPLOAD_SUCCESS = "ISO.UPLOAD.SUCCESS"; + public static final String EVENT_ISO_UPLOAD = "ISO.UPLOAD"; //SSVM public static final String EVENT_SSVM_CREATE = "SSVM.CREATE"; diff --git a/core/src/com/cloud/event/dao/EventDaoImpl.java b/core/src/com/cloud/event/dao/EventDaoImpl.java index 45b34d5c3e1..a50c37cbd4b 100644 --- a/core/src/com/cloud/event/dao/EventDaoImpl.java +++ b/core/src/com/cloud/event/dao/EventDaoImpl.java @@ -53,7 +53,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event @Override public List searchAllEvents(SearchCriteria sc, Filter filter) { - return listBy(sc, filter); + return listIncludingRemovedBy(sc, filter); } @Override @@ -61,7 +61,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event if (oldTime == null) return null; SearchCriteria sc = createSearchCriteria(); sc.addAnd("createDate", SearchCriteria.Op.LT, oldTime); - return listBy(sc, null); + return listIncludingRemovedBy(sc, null); } @@ -72,7 +72,7 @@ public class EventDaoImpl extends GenericDaoBase implements Event sc.setParameters("state", EventState.Completed); sc.setParameters("startId", 0); sc.setParameters("createDate", minTime, maxTime); - return listBy(sc, null); + return listIncludingRemovedBy(sc, null); } @Override @@ -80,6 +80,6 @@ public class EventDaoImpl extends GenericDaoBase implements Event SearchCriteria sc = CompletedEventSearch.create(); sc.setParameters("state", EventState.Completed); sc.setParameters("startId", startId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } } diff --git a/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java b/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java index db9000a82a1..8d9077c2704 100644 --- a/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java +++ b/core/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java @@ -120,7 +120,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem public List findPreviousHA(final long instanceId) { final SearchCriteria sc = PreviousInstanceSearch.create(); sc.setParameters("instance", instanceId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -152,7 +152,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem sc.setParameters("type", type); sc.setParameters("step", Step.Done, Step.Cancelled, Step.Error); - return listActiveBy(sc); + return listBy(sc); } @@ -169,6 +169,6 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase implem SearchCriteria sc = PreviousWorkSearch.create(); sc.setParameters("instance", instanceId); sc.setParameters("type", type); - return listActiveBy(sc, null).size() > 0; + return listBy(sc, null).size() > 0; } } \ No newline at end of file diff --git a/core/src/com/cloud/host/dao/DetailsDaoImpl.java b/core/src/com/cloud/host/dao/DetailsDaoImpl.java index 25392c2d320..f4c95e82d11 100644 --- a/core/src/com/cloud/host/dao/DetailsDaoImpl.java +++ b/core/src/com/cloud/host/dao/DetailsDaoImpl.java @@ -51,7 +51,7 @@ public class DetailsDaoImpl extends GenericDaoBase implements De sc.setParameters("hostId", hostId); sc.setParameters("name", name); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override diff --git a/core/src/com/cloud/host/dao/HostDaoImpl.java b/core/src/com/cloud/host/dao/HostDaoImpl.java index f858cdd0ef4..01e5c1e173d 100644 --- a/core/src/com/cloud/host/dao/HostDaoImpl.java +++ b/core/src/com/cloud/host/dao/HostDaoImpl.java @@ -219,7 +219,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao SearchCriteria sc = TypeDcSearch.create(); sc.setParameters("type", Host.Type.SecondaryStorage); sc.setParameters("dc", dcId); - List storageHosts = listActiveBy(sc); + List storageHosts = listBy(sc); if (storageHosts == null || storageHosts.size() != 1) { return null; @@ -232,7 +232,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao public List listSecondaryStorageHosts() { SearchCriteria sc = TypeSearch.create(); sc.setParameters("type", Host.Type.SecondaryStorage); - List secondaryStorageHosts = listBy(sc); + List secondaryStorageHosts = listIncludingRemovedBy(sc); return secondaryStorageHosts; } @@ -281,7 +281,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("dc", dcId); sc.setParameters("status", Status.Up.toString()); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -290,7 +290,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("cluster", clusterId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -300,7 +300,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("dc", dcId); sc.setParameters("status", Status.Up.toString()); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -309,7 +309,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("dc", dcId); sc.setParameters("privateIpAddress", privateIpAddress); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -318,7 +318,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("dc", dcId); sc.setParameters("storageIpAddress", privateIpAddress); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -416,7 +416,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao @Override public HostVO findByGuid(String guid) { SearchCriteria sc = GuidSearch.create("guid", guid); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -425,13 +425,13 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("ping", timeout); sc.setParameters("state", Status.Up.toString(), Status.Updating.toString(), Status.Disconnected.toString(), Status.Down.toString()); - return listActiveBy(sc); + return listBy(sc); } public List findHostsLike(String hostName) { SearchCriteria sc = NameLikeSearch.create(); sc.setParameters("name", "%" + hostName + "%"); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -439,25 +439,25 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao SearchCriteria sc = LastPingedSearch2.create(); sc.setParameters("ping", timeout); sc.setParameters("type", type.toString()); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByDataCenter(long dcId) { SearchCriteria sc = DcSearch.create("dc", dcId); - return listActiveBy(sc); + return listBy(sc); } public List listByHostPod(long podId) { SearchCriteria sc = PodSearch.create("pod", podId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByStatus(Status... status) { SearchCriteria sc = StatusSearch.create(); sc.setParameters("status", (Object[])status); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -466,7 +466,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("type", type.toString()); sc.setParameters("dc", dcId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -478,7 +478,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.addAnd("routing_capbable", SearchCriteria.Op.EQ, Integer.valueOf(1)); } - return listBy(sc); + return listIncludingRemovedBy(sc); } protected void saveDetails(HostVO host) { diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 2eeddb267dd..2aef2983f24 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -172,7 +172,7 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.Script; import com.cloud.vm.ConsoleProxyVO; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.DomainRouter; import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.State; @@ -1288,7 +1288,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } protected void assignPublicIpAddress(final String vmName, final String privateIpAddress, final String publicIpAddress, final boolean add, final boolean firstIP, - final boolean sourceNat, final String vlanId, final String vlanGateway, final String vlanNetmask, final String vifMacAddress) throws InternalErrorException { + final boolean sourceNat, final String vlanId, final String vlanGateway, final String vlanNetmask, final String vifMacAddress, String guestIp) throws InternalErrorException { try { Connection conn = getConnection(); @@ -1317,25 +1317,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR if (vifDeviceNum == null) { throw new InternalErrorException("There were no more available slots for a new VIF on router: " + router.getNameLabel(conn)); } - - VIF.Record vifr = new VIF.Record(); - vifr.VM = router; - vifr.device = vifDeviceNum; - vifr.MAC = vifMacAddress; - - if ("untagged".equalsIgnoreCase(vlanId)) { - vifr.network = Network.getByUuid(conn, _host.publicNetwork); - } else { - Network vlanNetwork = enableVlanNetwork(Long.valueOf(vlanId), _host.publicPif); - - if (vlanNetwork == null) { - throw new InternalErrorException("Failed to enable VLAN network with tag: " + vlanId); - } - - vifr.network = vlanNetwork; - } - - correctVif = VIF.create(conn, vifr); + + correctVif = createVIF(conn, router, vifMacAddress, vlanId, 0, vifDeviceNum, true); correctVif.plug(conn); // Add iptables rule for network usage networkUsage(privateIpAddress, "addVif", "eth" + correctVif.getDevice(conn)); @@ -1345,7 +1328,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR throw new InternalErrorException("Failed to find DomR VIF to associate/disassociate IP with."); } - String args; + String args = null; + if (add) { args = "-A"; } else { @@ -1363,6 +1347,11 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR args += " -g "; args += vlanGateway; + if(guestIp!=null){ + args += " -G "; + args += guestIp; + } + String result = callHostPlugin("vmops", "ipassoc", "args", args); if (result == null || result.isEmpty()) { throw new InternalErrorException("Xen plugin \"ipassoc\" failed."); @@ -1405,7 +1394,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR protected Answer execute(final IPAssocCommand cmd) { try { assignPublicIpAddress(cmd.getRouterName(), cmd.getRouterIp(), cmd.getPublicIp(), cmd.isAdd(), cmd.isFirstIP(), cmd.isSourceNat(), cmd.getVlanId(), - cmd.getVlanGateway(), cmd.getVlanNetmask(), cmd.getVifMacAddress()); + cmd.getVlanGateway(), cmd.getVlanNetmask(), cmd.getVifMacAddress(), cmd.getGuestIp()); } catch (InternalErrorException e) { return new Answer(cmd, false, e.getMessage()); } @@ -1685,8 +1674,15 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR try { doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(statsSource); } catch (Exception e) { + s_logger.warn("Exception caught whilst processing the document via document factory:"+e); + return null; } + if(doc==null){ + s_logger.warn("Null document found after tryinh to parse the stats source"); + return null; + } + NodeList firstLevelChildren = doc.getChildNodes(); NodeList secondLevelChildren = (firstLevelChildren.item(0)).getChildNodes(); Node metaNode = secondLevelChildren.item(0); @@ -1729,7 +1725,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR if(numRowsUsed == 0) { - if((!Double.isInfinite(value))&&(!Double.isInfinite(value))) + if((!Double.isInfinite(value))&&(!Double.isNaN(value))) { return value; } @@ -1741,7 +1737,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR } else { - if((!Double.isInfinite(value/numRowsUsed))&&(!Double.isInfinite(value/numRowsUsed))) + if((!Double.isInfinite(value/numRowsUsed))&&(!Double.isNaN(value/numRowsUsed))) { return (value/numRowsUsed); } @@ -2857,13 +2853,23 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR String msg = "Start VM failed"; return new StartAnswer(cmd, msg); } - - protected void createVIF(Connection conn, VM vm, String mac, String vlanTag, int rate, String devNum, boolean isPub) throws XenAPIException, XmlRpcException, - InternalErrorException { + + protected VIF createVIF(Connection conn, VM vm, String mac, int rate, String devNum, Network network) throws XenAPIException, XmlRpcException, + InternalErrorException { VIF.Record vifr = new VIF.Record(); vifr.VM = vm; vifr.device = devNum; vifr.MAC = mac; + vifr.network = network; + if ( rate == 0 ) rate = 200; + vifr.qosAlgorithmType = "ratelimit"; + vifr.qosAlgorithmParams = new HashMap(); + vifr.qosAlgorithmParams.put("kbps", Integer.toString(rate * 1000)); + return VIF.create(conn, vifr); + } + + protected VIF createVIF(Connection conn, VM vm, String mac, String vlanTag, int rate, String devNum, boolean isPub) throws XenAPIException, XmlRpcException, + InternalErrorException { String nwUuid = (isPub ? _host.publicNetwork : _host.guestNetwork); String pifUuid = (isPub ? _host.publicPif : _host.guestPif); @@ -2877,15 +2883,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR if (vlanNetwork == null) { throw new InternalErrorException("Failed to enable VLAN network with tag: " + vlanTag); } - - vifr.network = vlanNetwork; - if (rate != 0) { - vifr.qosAlgorithmType = "ratelimit"; - vifr.qosAlgorithmParams = new HashMap(); - vifr.qosAlgorithmParams.put("kbps", Integer.toString(rate * 1000)); - } - - VIF.create(conn, vifr); + return createVIF(conn, vm, mac, rate, devNum, vlanNetwork); } protected StopAnswer execute(final StopCommand cmd) { @@ -3187,44 +3185,35 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR cdromVBD.insert(conn, VDI.getByUuid(conn, _host.systemvmisouuid)); /* create VIF0 */ - VIF.Record vifr = new VIF.Record(); - vifr.VM = vm; - vifr.device = "0"; - vifr.MAC = guestMacAddr; + Network network = null; if (VirtualMachineName.isValidConsoleProxyName(vmName) || VirtualMachineName.isValidSecStorageVmName(vmName, null)) { - vifr.network = Network.getByUuid(conn, _host.linkLocalNetwork); - } else - vifr.network = nw0; - VIF.create(conn, vifr); + network = Network.getByUuid(conn, _host.linkLocalNetwork); + } else { + network = nw0; + } + createVIF(conn, vm, guestMacAddr, 0, "0", network); + /* create VIF1 */ /* For routing vm, set its network as link local bridge */ - vifr.VM = vm; - vifr.device = "1"; - vifr.MAC = privateMacAddr; if (VirtualMachineName.isValidRouterName(vmName) && privateIp.startsWith("169.254")) { - vifr.network = Network.getByUuid(conn, _host.linkLocalNetwork); + network = Network.getByUuid(conn, _host.linkLocalNetwork); } else { - vifr.network = Network.getByUuid(conn, _host.privateNetwork); + network = Network.getByUuid(conn, _host.privateNetwork); } - VIF.create(conn, vifr); + createVIF(conn, vm, privateMacAddr, 0, "1", network); + + /* create VIF2 */ if( !publicMacAddr.equalsIgnoreCase("FE:FF:FF:FF:FF:FF") ) { - /* create VIF2 */ - vifr.VM = vm; - vifr.device = "2"; - vifr.MAC = publicMacAddr; - vifr.network = Network.getByUuid(conn, _host.publicNetwork); + network = null; if ("untagged".equalsIgnoreCase(vlanId)) { - vifr.network = Network.getByUuid(conn, _host.publicNetwork); + network = Network.getByUuid(conn, _host.publicNetwork); } else { - Network vlanNetwork = enableVlanNetwork(Long.valueOf(vlanId), _host.publicPif); - - if (vlanNetwork == null) { + network = enableVlanNetwork(Long.valueOf(vlanId), _host.publicPif); + if (network == null) { throw new InternalErrorException("Failed to enable VLAN network with tag: " + vlanId); - } - - vifr.network = vlanNetwork; + } } - VIF.create(conn, vifr); + createVIF(conn, vm, publicMacAddr, 0, "2", network); } /* set up PV dom argument */ String pvargs = vm.getPVArgs(conn); @@ -4729,7 +4718,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR @Override public CreateAnswer execute(CreateCommand cmd) { StoragePoolTO pool = cmd.getPool(); - DiskCharacteristics dskch = cmd.getDiskCharacteristics(); + DiskProfile dskch = cmd.getDiskCharacteristics(); VDI vdi = null; Connection conn = getConnection(); diff --git a/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java b/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java index d975825c64a..d4ef72350a8 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java +++ b/core/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java @@ -159,10 +159,11 @@ public class XenServerConnectionPool { } protected synchronized void cleanup(String poolUuid) { + if( poolUuid == null ) { + return; + } ConnectionInfo info = _infos.remove(poolUuid); if (info == null) { - s_logger.debug("Unable to find any information for pool " - + poolUuid); return; } @@ -189,8 +190,10 @@ public class XenServerConnectionPool { protected synchronized void cleanup(String poolUuid, ConnectionInfo info) { ConnectionInfo info2 = _infos.get(poolUuid); - s_logger - .debug("Cleanup for Session " + info.conn.getSessionReference()); + if( info2 == null ) { + return; + } + s_logger.debug("Cleanup for Session " + info.conn.getSessionReference()); if (info != info2) { s_logger.debug("Session " + info.conn.getSessionReference() + " is already logged out."); @@ -573,6 +576,22 @@ public class XenServerConnectionPool { masterConn = null; masterIp = null; } + } else { + try { + Pool.Record pr = getPoolRecord(slaveConn); + masterIp = pr.master.getAddress(slaveConn); + masterUrl = new URL("http://" + masterIp);; + masterConn = new XenServerConnection(masterUrl, username, + password, _retries, _interval, wait); + Session.loginWithPassword(masterConn, username, password, + APIVersion.latest().toString()); + create_new_session = false; + + } catch (Exception e) { + cleanup(poolUuid); + masterConn = null; + masterIp = null; + } } if (create_new_session) { try{ @@ -782,18 +801,20 @@ public class XenServerConnectionPool { try { return super.dispatch(method_call, method_params); } catch (Types.SessionInvalid e) { + s_logger.debug("Session is invalid for method: " + method_call + " due to " + e.getMessage() + ". Reconnecting...retry=" + + retries); if (retries >= _retries) { if (_poolUuid != null) { cleanup(_poolUuid, _info); } throw e; } - s_logger.debug("Session is invalid. Reconnecting...retry=" - + retries); Session.loginWithPassword(this, _username, _password, APIVersion.latest().toString()); method_params[0] = getSessionReference(); } catch (XmlRpcException e) { + s_logger.debug("XmlRpcException for method: " + method_call + " due to " + e.getMessage() + ". Reconnecting...retry=" + + retries); if (retries >= _retries) { if (_poolUuid != null) { cleanup(_poolUuid, _info); @@ -807,9 +828,9 @@ public class XenServerConnectionPool { } throw e; } - s_logger.debug("Connection couldn't be made for method " + method_call - + " Reconnecting....retry=" + retries); } catch (Types.HostIsSlave e) { + s_logger.debug("HostIsSlave Exception for method: " + method_call + " due to " + e.getMessage() + ". Reconnecting...retry=" + + retries); if (_poolUuid != null) { cleanup(_poolUuid, _info); } diff --git a/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java b/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java index 9841b3ce85d..072ff6b50cd 100644 --- a/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java +++ b/core/src/com/cloud/maid/dao/StackMaidDaoImpl.java @@ -58,7 +58,7 @@ public class StackMaidDaoImpl extends GenericDaoBase implemen sc.setParameters("threadId", Thread.currentThread().getId()); Filter filter = new Filter(StackMaidVO.class, "seq", false, 0L, (long)1); - List l = listBy(sc, filter); + List l = listIncludingRemovedBy(sc, filter); if(l != null && l.size() > 0) { expunge(l.get(0).getId()); return l.get(0); diff --git a/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java index e714f351d22..55bce08b553 100644 --- a/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java +++ b/core/src/com/cloud/network/dao/FirewallRulesDaoImpl.java @@ -143,7 +143,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i SearchCriteria sc = FWByIPAndForwardingSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); sc.setParameters("forwarding", forwarding); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -199,14 +199,14 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i public List listIPForwarding(String publicIPAddress) { SearchCriteria sc = FWByIPSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); - return listActiveBy(sc); + return listBy(sc); } @Override public List listIPForwardingForUpdate(String publicIPAddress) { SearchCriteria sc = FWByIPSearch.create(); sc.setParameters("publicIpAddress", publicIPAddress); - return listActiveBy(sc, null); + return listBy(sc, null); } @Override @@ -234,7 +234,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i sc.setParameters("publicIpAddress", publicIp); sc.setParameters("publicPort", publicPort); sc.setParameters("algorithm", algo); - return listActiveBy(sc, null); + return listBy(sc, null); } @Override @@ -245,7 +245,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i sc.setParameters("publicPort", port); sc.setParameters("forwarding", forwarding); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -270,7 +270,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i sc.setParameters("publicIpAddress", publicIpAddress); sc.setParameters("groupId", securityGroupId); sc.setParameters("forwarding", false); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -278,7 +278,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i SearchCriteria sc = FWByGroupId.create(); sc.setParameters("groupId", securityGroupId); sc.setParameters("forwarding", Boolean.TRUE); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -287,7 +287,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i sc.setParameters("publicIpAddress", publicIPAddress); sc.setParameters("forwarding", forwarding); sc.addAnd("privateIpAddress", SearchCriteria.Op.EQ, privateIp); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -295,7 +295,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i SearchCriteria sc = FWByGroupId.create(); sc.setParameters("groupId", loadBalancerId); sc.setParameters("forwarding", Boolean.FALSE); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -304,7 +304,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i sc.setParameters("groupId", groupId); sc.setParameters("privateIpAddress", privateIp); sc.setParameters("forwarding", forwarding); - return findOneActiveBy(sc); + return findOneBy(sc); } } diff --git a/core/src/com/cloud/network/dao/IPAddressDaoImpl.java b/core/src/com/cloud/network/dao/IPAddressDaoImpl.java index cbb58710833..c7cefff591f 100644 --- a/core/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/core/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -172,14 +172,14 @@ public class IPAddressDaoImpl extends GenericDaoBase implem public List listByAccount(long accountId) { SearchCriteria sc = AccountSearch.create(); sc.setParameters("accountId", accountId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public List listByDcIdIpAddress(long dcId, String ipAddress) { SearchCriteria sc = DcIpSearch.create(); sc.setParameters("dataCenterId", dcId); sc.setParameters("ipAddress", ipAddress); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @DB diff --git a/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java index 25d5eb42b33..a9dcda58557 100644 --- a/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/core/src/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -89,7 +89,7 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im public List listByIpAddress(String ipAddress) { SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -97,7 +97,7 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im SearchCriteria sc = IpAndPublicPortSearch.create(); sc.setParameters("ipAddress", ipAddress); sc.setParameters("publicPort", publicPort); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -105,6 +105,6 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im SearchCriteria sc = AccountAndNameSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("name", name); - return findOneActiveBy(sc); + return findOneBy(sc); } } diff --git a/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java b/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java index 890f5cca4f0..ca9c6915dc4 100644 --- a/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java +++ b/core/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java @@ -54,7 +54,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase sc = createSearchCriteria(); sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -62,7 +62,7 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase sc = createSearchCriteria(); sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -71,6 +71,6 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase listBySecurityGroupId(long securityGroupId) { SearchCriteria sc = SecurityGroupIdSearch.create(); sc.setParameters("securityGroupId", securityGroupId); - return listActiveBy(sc); + return listBy(sc); } public void deleteBySecurityGroup(long securityGroupId) { diff --git a/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java b/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java index 3e3b68498a7..a865ce82273 100644 --- a/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java +++ b/core/src/com/cloud/network/dao/SecurityGroupDaoImpl.java @@ -49,7 +49,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase public List listByAccountId(long accountId) { SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -63,7 +63,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase sc.addAnd("accountId", SearchCriteria.Op.NULL); } - List securityGroups = listActiveBy(sc); + List securityGroups = listBy(sc); return ((securityGroups != null) && !securityGroups.isEmpty()); } @@ -74,7 +74,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase if (accountId != null) { SearchCriteria sc = createSearchCriteria(); sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); - List accountGroups = listActiveBy(sc); + List accountGroups = listBy(sc); availableGroups.addAll(accountGroups); } else if (domainId != null) { while (domainId != null) { @@ -83,7 +83,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.NEQ, accountId); // we added the account specific ones above } - List domainGroups = listActiveBy(sc); + List domainGroups = listBy(sc); availableGroups.addAll(domainGroups); // get the parent domain, repeat the loop diff --git a/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java b/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java index c8da6f4da18..05be43c5002 100644 --- a/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java +++ b/core/src/com/cloud/network/dao/SecurityGroupVMMapDaoImpl.java @@ -57,28 +57,28 @@ public class SecurityGroupVMMapDaoImpl extends GenericDaoBase sc = ListByIpAndVmId.create(); sc.setParameters("ipAddress", ipAddress); sc.setParameters("instanceId", vmId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listBySecurityGroup(long securityGroupId) { SearchCriteria sc = ListBySecurityGroup.create(); sc.setParameters("securityGroupId", securityGroupId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByIp(String ipAddress) { SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByInstanceId(long vmId) { SearchCriteria sc = ListByVmId.create(); sc.setParameters("instanceId", vmId); - return listActiveBy(sc); + return listBy(sc); } } diff --git a/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java b/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java index d2fcf4b147c..3966131a3fb 100644 --- a/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/IngressRuleDaoImpl.java @@ -73,7 +73,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl public List listByNetworkGroupId(long networkGroupId) { SearchCriteria sc = networkGroupIdSearch.create(); sc.setParameters("networkGroupId", networkGroupId); - return listActiveBy(sc); + return listBy(sc); } public int deleteByNetworkGroup(long networkGroupId) { @@ -86,7 +86,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl public List listByAllowedNetworkGroupId(long networkGroupId) { SearchCriteria sc = allowedNetworkGroupIdSearch.create(); sc.setParameters("allowedNetworkId", networkGroupId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -98,7 +98,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl sc.setParameters("startPort", startPort); sc.setParameters("endPort", endPort); sc.setParameters("cidr", cidr); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -109,7 +109,7 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl sc.setParameters("startPort", startPort); sc.setParameters("endPort", endPort); sc.setJoinParameters("groupName", "groupName", networkGroup); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -161,6 +161,6 @@ public class IngressRuleDaoImpl extends GenericDaoBase impl sc.setParameters("endPort", endPort); sc.setParameters("allowedNetworkId", allowedGroupId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } } diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java index 2513eba3b00..60459094412 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupDaoImpl.java @@ -62,7 +62,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im public List listByAccountId(long accountId) { SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -76,7 +76,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im sc.addAnd("accountId", SearchCriteria.Op.NULL); } - List securityGroups = listActiveBy(sc); + List securityGroups = listBy(sc); return ((securityGroups != null) && !securityGroups.isEmpty()); } @@ -87,7 +87,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im if (accountId != null) { SearchCriteria sc = createSearchCriteria(); sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); - List accountGroups = listActiveBy(sc); + List accountGroups = listBy(sc); availableGroups.addAll(accountGroups); } else if (domainId != null) { while (domainId != null) { @@ -96,7 +96,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.NEQ, accountId); // we added the account specific ones above } - List domainGroups = listActiveBy(sc); + List domainGroups = listBy(sc); availableGroups.addAll(domainGroups); // get the parent domain, repeat the loop @@ -114,7 +114,7 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im sc.setParameters("accountId", accountId); sc.setParameters("groupName", name); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -124,6 +124,6 @@ public class NetworkGroupDaoImpl extends GenericDaoBase im sc.setParameters("groupNames", (Object [])names); - return listActiveBy(sc); + return listBy(sc); } } diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java index 464cb5e31b6..924bfe23e12 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupRulesDaoImpl.java @@ -47,7 +47,7 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase sc = AccountSearch.create(); sc.setParameters("accountId", accountId); - return listActiveBy(sc, searchFilter); + return listBy(sc, searchFilter); } @Override @@ -86,6 +86,6 @@ public class NetworkGroupRulesDaoImpl extends GenericDaoBase sc = ListByIpAndVmId.create(); sc.setParameters("ipAddress", ipAddress); sc.setParameters("instanceId", vmId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByNetworkGroup(long networkGroupId) { SearchCriteria sc = ListByNetworkGroup.create(); sc.setParameters("networkGroupId", networkGroupId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByIp(String ipAddress) { SearchCriteria sc = ListByIp.create(); sc.setParameters("ipAddress", ipAddress); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByInstanceId(long vmId) { SearchCriteria sc = ListByVmId.create(); sc.setParameters("instanceId", vmId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -115,7 +115,7 @@ public class NetworkGroupVMMapDaoImpl extends GenericDaoBase sc = ListByNetworkGroupAndStates.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("states", (Object[])vmStates); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -130,7 +130,7 @@ public class NetworkGroupVMMapDaoImpl extends GenericDaoBase sc = ListByVmIdGroupId.create(); sc.setParameters("networkGroupId", networkGroupId); sc.setParameters("instanceId", instanceId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } } diff --git a/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java b/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java index 1e9f0b0b96e..75b2d2ec370 100644 --- a/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/NetworkGroupWorkDaoImpl.java @@ -89,7 +89,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = taken?VmIdTakenSearch.create():VmIdUnTakenSearch.create(); sc.setParameters("vmId", vmId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -161,7 +161,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase sc = VmIdStepSearch.create(); sc.setParameters("vmId", vmId); sc.setParameters("step", step); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -196,7 +196,7 @@ public class NetworkGroupWorkDaoImpl extends GenericDaoBase result = listBy(sc); + List result = listIncludingRemovedBy(sc); NetworkGroupWorkVO work = createForUpdate(); work.setStep(Step.Error); diff --git a/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java b/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java index 469012ed53b..cb536c2c421 100644 --- a/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java +++ b/core/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java @@ -42,7 +42,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase im public VmRulesetLogVO findByVmId(long vmId) { SearchCriteria sc = VmIdSearch.create(); sc.setParameters("vmId", vmId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } diff --git a/core/src/com/cloud/offerings/NetworkOfferingVO.java b/core/src/com/cloud/offerings/NetworkOfferingVO.java index 2b8404b78f1..6a0a4339501 100644 --- a/core/src/com/cloud/offerings/NetworkOfferingVO.java +++ b/core/src/com/cloud/offerings/NetworkOfferingVO.java @@ -164,4 +164,10 @@ public class NetworkOfferingVO implements NetworkOffering { public NetworkOfferingVO(String name, TrafficType trafficType, GuestIpType type) { this(name, "System Offering for " + name, trafficType, type, true, null, null, null); } + + @Override + public String toString() { + StringBuilder buf = new StringBuilder("[Network Offering ["); + return buf.append(id).append("-").append(trafficType).append("-").append(name).append("-").append(guestIpType).append("]").toString(); + } } diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java index 7f437bf0b08..f3973baa180 100755 --- a/core/src/com/cloud/server/ManagementServer.java +++ b/core/src/com/cloud/server/ManagementServer.java @@ -409,12 +409,13 @@ public interface ManagementServer { * @param accountId * @param domainId * @param zoneId + * @param vmId * @return allocated IP address in the zone specified * @throws InsufficientAddressCapacityException if no more addresses are available * @throws InvalidParameterValueException if no router for that user exists in the zone specified * @throws InternalErrorException if the new address could not be sent down to the router */ - String associateIpAddress(long userId, long accountId, long domainId, long zoneId) throws ResourceAllocationException, InsufficientAddressCapacityException, InvalidParameterValueException, InternalErrorException; + String associateIpAddress(long userId, long accountId, long domainId, long zoneId, long vmId) throws ResourceAllocationException, InsufficientAddressCapacityException, InvalidParameterValueException, InternalErrorException; long associateIpAddressAsync(long userId, long accountId, long domainId, long zoneId); @@ -1836,8 +1837,9 @@ public interface ManagementServer { * @param mirrored boolean value of whether or not the offering provides disk mirroring * @param tags Comma separated string to indicate special tags for the disk offering. * @return the created disk offering, null if failed to create + * @throws InternalErrorException */ - DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException; + DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException, InternalErrorException; /** * Delete a disk offering @@ -2194,7 +2196,7 @@ public interface ManagementServer { * @param template id - the id of the template * */ - void extractTemplate(String url, Long templateId, Long zoneId) throws URISyntaxException; + void extractTemplate(String url, Long templateId, Long zoneId, long eventId, long asyncJobId) throws URISyntaxException; Map listCapabilities(); GuestOSVO getGuestOs(Long guestOsId); @@ -2241,13 +2243,21 @@ public interface ManagementServer { * Extracts the volume to a particular location. * @param url - the url where the volume needs to be extracted to * @param zoneId - zone id of the volume + * @param asyncJobId + * @param eventId * @param volume id - the id of the volume * @throws URISyntaxException * @throws InternalErrorException * */ - void extractVolume(String url, Long volumeId, Long zoneId) throws + void extractVolume(String url, Long volumeId, Long zoneId, long eventId, Long asyncJobId) throws URISyntaxException, InternalErrorException; - + long extractTemplateAsync(String url, Long templateId, Long zoneId) throws URISyntaxException; + long extractVolumeAsync(String url, Long volumeId, Long zoneId) throws URISyntaxException; + + /* + * Fetches the version of cloud stack + */ + String getVersion(); } diff --git a/core/src/com/cloud/storage/StorageManager.java b/core/src/com/cloud/storage/StorageManager.java index 7c249afea6d..51bc28a72b9 100755 --- a/core/src/com/cloud/storage/StorageManager.java +++ b/core/src/com/cloud/storage/StorageManager.java @@ -39,31 +39,10 @@ import com.cloud.user.AccountVO; import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; import com.cloud.utils.exception.ExecutionException; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; public interface StorageManager extends Manager { - /** - * Convenience method for creating a VM with a data disk based on a template. - * @param vm VM to create disks for. - * @param template Template to based the root disk on. - * @param rootOffering Disk offering for the root disk. - * @param dataOffering Disk offering for the data disk. - * @param size size of the data disk if the data disk offering has variable size. - * @param dc data center to deploy in. - * @param account owner. - * @return List where the first disk is the root disk. - */ - List allocateTemplatedVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, DiskOfferingVO dataOffering, Long size, DataCenterVO dc, AccountVO account); - - /** - * Convenience method for allocating system VMs in the database. - * @param vm VM to create disks for. - * @param template template the root disk should be based on. - * @param rootOffering Disk offering for the root disk. - * @param dc data center to deploy in. - * @return VolumeVO volume allocated. - */ - VolumeVO allocateSystemVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, DataCenterVO dc); VolumeVO allocateIsoInstalledVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, Long size, DataCenterVO dc, AccountVO account); @@ -328,7 +307,8 @@ public interface StorageManager extends Manager { * @param account * @return VolumeVO a persisted volume. */ - VolumeVO allocate(VolumeType type, DiskOfferingVO offering, String name, Long size, VMTemplateVO template, T vm, AccountVO account); + DiskProfile allocateRawVolume(VolumeType type, String name, DiskOfferingVO offering, Long size, T vm, AccountVO owner); + DiskProfile allocateTemplatedVolume(VolumeType type, String name, DiskOfferingVO offering, VMTemplateVO template, T vm, AccountVO owner); void create(T vm); Long findHostIdForStoragePool(StoragePoolVO pool); diff --git a/core/src/com/cloud/storage/VolumeVO.java b/core/src/com/cloud/storage/VolumeVO.java index 0c145ffa70c..d5d23dea53d 100755 --- a/core/src/com/cloud/storage/VolumeVO.java +++ b/core/src/com/cloud/storage/VolumeVO.java @@ -553,5 +553,5 @@ public class VolumeVO implements Volume { public void setAttached(Date attached){ this.attached = attached; } - + } diff --git a/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java b/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java index 120d95cc743..ae6f587d5fa 100644 --- a/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java +++ b/core/src/com/cloud/storage/dao/DiskOfferingDaoImpl.java @@ -58,14 +58,14 @@ public class DiskOfferingDaoImpl extends GenericDaoBase im SearchCriteria sc = DomainIdSearch.create(); sc.setParameters("domainId", domainId); // FIXME: this should not be exact match, but instead should find all available disk offerings from parent domains - return listActiveBy(sc); + return listBy(sc); } @Override public List findPrivateDiskOffering() { SearchCriteria sc = PrivateDiskOfferingSearch.create(); sc.setParameters("diskSize", 0); - return listActiveBy(sc); + return listBy(sc); } @Override diff --git a/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java b/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java index 4b2a4b96ab0..7e0f68e75cf 100755 --- a/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java +++ b/core/src/com/cloud/storage/dao/DiskTemplateDaoImpl.java @@ -46,7 +46,7 @@ public class DiskTemplateDaoImpl extends GenericDaoBase im sc.setParameters("type", type); sc.setParameters("size", size); - List vos = listActiveBy(sc); + List vos = listBy(sc); assert(vos.size() <= 1); // Should only have one. If more than one something is wrong. return vos.size() == 0 ? null : vos.get(0); } diff --git a/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java b/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java index fca0636b289..990523bb6da 100644 --- a/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java +++ b/core/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java @@ -100,7 +100,7 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase sc = TemplateAndAccountSearch.create(); sc.setParameters("templateId", templateId); sc.setParameters("accountId", accountId); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -153,6 +153,6 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase findByTemplate(long templateId) { SearchCriteria sc = TemplateIdSearch.create(); sc.setParameters("templateId", templateId); - return listActiveBy(sc); + return listBy(sc); } } diff --git a/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java index da7157c90d9..67c59e2ed85 100644 --- a/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotDaoImpl.java @@ -40,7 +40,7 @@ public class SnapshotDaoImpl extends GenericDaoBase implements public SnapshotVO findNextSnapshot(long snapshotId) { SearchCriteria sc = ParentIdSearch.create(); sc.setParameters("prevSnapshotId", snapshotId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -52,7 +52,7 @@ public class SnapshotDaoImpl extends GenericDaoBase implements public List listByVolumeId(Filter filter, long volumeId ) { SearchCriteria sc = VolumeIdSearch.create(); sc.setParameters("volumeId", volumeId); - return listActiveBy(sc, filter); + return listBy(sc, filter); } protected SnapshotDaoImpl() { diff --git a/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java index 4a4091d52f3..56d839ddbd4 100644 --- a/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotPolicyDaoImpl.java @@ -40,7 +40,7 @@ public class SnapshotPolicyDaoImpl extends GenericDaoBase sc = VolumeIdIntervalSearch.create(); sc.setParameters("volumeId", volumeId); sc.setParameters("interval", interval); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -53,7 +53,7 @@ public class SnapshotPolicyDaoImpl extends GenericDaoBase sc = VolumeIdSearch.create(); sc.setParameters("volumeId", volumeId); sc.setParameters("active", true); - return listActiveBy(sc, filter); + return listBy(sc, filter); } protected SnapshotPolicyDaoImpl() { @@ -76,6 +76,6 @@ public class SnapshotPolicyDaoImpl extends GenericDaoBase listActivePolicies() { SearchCriteria sc = ActivePolicySearch.create(); sc.setParameters("active", true); - return listBy(sc); + return listIncludingRemovedBy(sc); } } \ No newline at end of file diff --git a/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java index bdcba8df61a..73479ad727e 100644 --- a/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotPolicyRefDaoImpl.java @@ -55,7 +55,7 @@ public class SnapshotPolicyRefDaoImpl extends GenericDaoBase sc = snapPolicy.create(); sc.setParameters("snapshotId", snapshotId); sc.setParameters("policyId", policyId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -70,7 +70,7 @@ public class SnapshotPolicyRefDaoImpl extends GenericDaoBase listBySnapshotId(long snapshotId) { SearchCriteria sc = snapSearch.create(); sc.setParameters("snapshotId", snapshotId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -78,6 +78,6 @@ public class SnapshotPolicyRefDaoImpl extends GenericDaoBase sc = policySearch.create(); sc.setParameters("policyId", policyId); sc.setParameters("volumeId", volumeId); - return listBy(sc); + return listIncludingRemovedBy(sc); } } \ No newline at end of file diff --git a/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java b/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java index dc31230cd5b..d358976b46d 100644 --- a/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java +++ b/core/src/com/cloud/storage/dao/SnapshotScheduleDaoImpl.java @@ -64,7 +64,7 @@ public class SnapshotScheduleDaoImpl extends GenericDaoBase snapshotSchedules = listActiveBy(sc); + List snapshotSchedules = listBy(sc); // This will return only one schedule because of a DB uniqueness constraint. assert (snapshotSchedules.size() <= 1); if (snapshotSchedules.isEmpty()) { diff --git a/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java index a5d716b16ae..23531318350 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDaoImpl.java @@ -139,7 +139,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp public List findPoolByName(String name) { SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); - return listBy(sc); + return listIncludingRemovedBy(sc); } @@ -147,14 +147,14 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp public StoragePoolVO findPoolByUUID(String uuid) { SearchCriteria sc = UUIDSearch.create(); sc.setParameters("uuid", uuid); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override public List findIfDuplicatePoolsExistByUUID(String uuid) { SearchCriteria sc = UUIDSearch.create(); sc.setParameters("uuid", uuid); - return listActiveBy(sc); + return listBy(sc); } @@ -162,7 +162,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp public List listByDataCenterId(long datacenterId) { SearchCriteria sc = DatacenterSearch.create(); sc.setParameters("datacenterId", datacenterId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @@ -186,7 +186,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp public List listByStorageHost(String hostFqdnOrIp) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostFqdnOrIp); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -204,7 +204,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -215,12 +215,12 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp sc.setParameters("podId", podId); sc.setParameters("cluster", clusterId); - return listActiveBy(sc); + return listBy(sc); } else { SearchCriteria sc = DcPodAnyClusterSearch.create(); sc.setParameters("datacenterId", datacenterId); sc.setParameters("podId", podId); - return listActiveBy(sc); + return listBy(sc); } } @@ -230,7 +230,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp sc.setParameters("hostAddress", host); sc.setParameters("path", path); - return listBy(sc); + return listIncludingRemovedBy(sc); } public StoragePoolVO listById(Integer id) @@ -238,7 +238,7 @@ public class StoragePoolDaoImpl extends GenericDaoBase imp SearchCriteria sc = HostSearch.create(); sc.setParameters("id", id); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @DB diff --git a/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java index 520ecbab3a2..97e3b19a529 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java @@ -61,7 +61,7 @@ public class StoragePoolDetailsDaoImpl extends GenericDaoBase sc = PoolSearch.create(); sc.setParameters("pool", poolId); - List details = listActiveBy(sc); + List details = listBy(sc); Map detailsMap = new HashMap(); for (StoragePoolDetailVO detail : details) { detailsMap.put(detail.getName(), detail.getValue()); diff --git a/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java b/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java index 35891cb95ca..6b1dbcb0d8e 100644 --- a/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java +++ b/core/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java @@ -91,14 +91,14 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase listByPoolId(long id) { SearchCriteria sc = PoolSearch.create(); sc.setParameters("pool_id", id); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listByHostId(long hostId) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host_id", hostId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -106,7 +106,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase sc = PoolHostSearch.create(); sc.setParameters("pool_id", poolId); sc.setParameters("host_id", hostId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override diff --git a/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index aee78a8e79b..ed62b751e5f 100644 --- a/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -74,35 +74,35 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem public List listByPublic() { SearchCriteria sc = PublicSearch.create(); sc.setParameters("public", 1); - return listActiveBy(sc); + return listBy(sc); } @Override public VMTemplateVO findByName(String templateName) { SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("uniqueName", templateName); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override public VMTemplateVO findByTemplateName(String templateName) { SearchCriteria sc = NameSearch.create(); sc.setParameters("name", templateName); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override public VMTemplateVO findRoutingTemplate() { SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("uniqueName", routerTmpltName); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override public VMTemplateVO findConsoleProxyTemplate() { SearchCriteria sc = UniqueNameSearch.create(); sc.setParameters("uniqueName", consoleProxyTmpltName); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -110,7 +110,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem SearchCriteria sc = createSearchCriteria(); sc.addAnd("ready", SearchCriteria.Op.EQ, true); sc.addAnd("format", SearchCriteria.Op.NEQ, Storage.ImageFormat.ISO); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -123,14 +123,14 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); if (path != null) sc.addAnd("path", SearchCriteria.Op.EQ, path); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listByAccountId(long accountId) { SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); - return listActiveBy(sc); + return listBy(sc); } @Override diff --git a/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java b/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java index c584539c99e..83d2a15a7de 100755 --- a/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java @@ -113,7 +113,8 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByHostId(long id) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host_id", id); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -146,14 +147,14 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); sc.setParameters("destroyed", false); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listByOnlyTemplateId(long templateId) { SearchCriteria sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -161,17 +162,15 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = HostTemplateSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("template_id", templateId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } - - @Override public List listByTemplateStatus(long templateId, VMTemplateHostVO.Status downloadState) { SearchCriteria sc = TemplateStatusSearch.create(); sc.setParameters("template_id", templateId); sc.setParameters("download_state", downloadState.toString()); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -257,7 +256,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = HostTemplateSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("template_id", templateId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -273,7 +272,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = PoolTemplateSearch.create(); sc.setParameters("pool_id", poolId); sc.setParameters("template_id", templateId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -281,7 +280,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase sc = HostDestroyedSearch.create(); sc.setParameters("host_id", hostId); sc.setParameters("destroyed", true); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -290,7 +289,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase listByPoolId(long id) { SearchCriteria sc = PoolSearch.create(); sc.setParameters("pool_id", id); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listByTemplateId(long templateId) { SearchCriteria sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -115,7 +115,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase sc = PoolTemplateSearch.create(); sc.setParameters("pool_id", hostId); sc.setParameters("template_id", templateId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -123,7 +123,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase sc = TemplateStatusSearch.create(); sc.setParameters("template_id", templateId); sc.setParameters("download_state", downloadState.toString()); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -132,7 +132,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase listByZoneId(long id) { SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zone_id", id); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listByTemplateId(long templateId) { SearchCriteria sc = TemplateSearch.create(); sc.setParameters("template_id", templateId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -73,7 +73,7 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase sc = ZoneTemplateSearch.create(); sc.setParameters("zone_id", zoneId); sc.setParameters("template_id", templateId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -81,7 +81,7 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase sc = ZoneTemplateSearch.create(); sc.setParameters("zone_id", zoneId); sc.setParameters("template_id", templateId); - return listBy(sc); + return listIncludingRemovedBy(sc); } } diff --git a/core/src/com/cloud/storage/dao/VolumeDaoImpl.java b/core/src/com/cloud/storage/dao/VolumeDaoImpl.java index 5af77d46cea..dc82102a1a5 100755 --- a/core/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/core/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -101,7 +101,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol SearchCriteria sc = DetachedAccountIdSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("destroyed", false); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -109,14 +109,14 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("destroyed", false); - return listActiveBy(sc); + return listBy(sc); } @Override public List findByInstance(long id) { SearchCriteria sc = InstanceIdSearch.create(); sc.setParameters("instanceId", id); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -124,14 +124,14 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol SearchCriteria sc = InstanceAndDeviceIdSearch.create(); sc.setParameters("instanceId", instanceId); sc.setParameters("deviceId", deviceId); - return listActiveBy(sc); + return listBy(sc); } @Override public List findByPoolId(long poolId) { SearchCriteria sc = PoolIdSearch.create(); sc.setParameters("poolId", poolId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -140,7 +140,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol sc.setParameters("instanceId", id); sc.setParameters("status", AsyncInstanceCreateStatus.Created); sc.setParameters("destroyed", false); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -148,7 +148,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol SearchCriteria sc = InstanceAndTypeSearch.create(); sc.setParameters("instanceId", id); sc.setParameters("vType", vType.toString()); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -156,14 +156,14 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol SearchCriteria sc = InstanceIdDestroyedSearch.create(); sc.setParameters("instanceId", vmId); sc.setParameters("destroyed", true); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List findByDetachedDestroyed() { SearchCriteria sc = DetachedDestroyedSearch.create(); sc.setParameters("destroyed", true); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -174,7 +174,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol sc.setParameters("destroyed", false); sc.setParameters("status", AsyncInstanceCreateStatus.Created); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -183,7 +183,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol sc.setParameters("template", templateId); sc.setParameters("zone", zoneId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @DB @@ -215,7 +215,7 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol SearchCriteria sc = MirrorSearch.create(); sc.setParameters("mirrorState", MirrorState.ACTIVE.toString()); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override diff --git a/core/src/com/cloud/storage/template/FtpTemplateUploader.java b/core/src/com/cloud/storage/template/FtpTemplateUploader.java old mode 100644 new mode 100755 index 736df550de1..aafb294a042 --- a/core/src/com/cloud/storage/template/FtpTemplateUploader.java +++ b/core/src/com/cloud/storage/template/FtpTemplateUploader.java @@ -19,7 +19,7 @@ public class FtpTemplateUploader implements TemplateUploader { public TemplateUploader.Status status = TemplateUploader.Status.NOT_STARTED; public String errorString = ""; public long totalBytes = 0; - public long templateSizeinBytes; + public long entitySizeinBytes; private String sourcePath; private String ftpUrl; private UploadCompleteCallback completionCallback; @@ -28,12 +28,12 @@ public class FtpTemplateUploader implements TemplateUploader { private BufferedOutputStream outputStream = null; private static final int CHUNK_SIZE = 1024*1024; //1M - public FtpTemplateUploader(String sourcePath, String url, UploadCompleteCallback callback, long templateSizeinBytes){ + public FtpTemplateUploader(String sourcePath, String url, UploadCompleteCallback callback, long entitySizeinBytes){ this.sourcePath = sourcePath; this.ftpUrl = url; this.completionCallback = callback; - this.templateSizeinBytes = templateSizeinBytes; + this.entitySizeinBytes = entitySizeinBytes; } @@ -51,7 +51,7 @@ public class FtpTemplateUploader implements TemplateUploader { Date start = new Date(); - StringBuffer sb = new StringBuffer(); + StringBuffer sb = new StringBuffer(ftpUrl); // check for authentication else assume its anonymous access. /* if (user != null && password != null) { @@ -59,11 +59,8 @@ public class FtpTemplateUploader implements TemplateUploader { sb.append( ':' ); sb.append( password ); sb.append( '@' ); - }*/ - sb.append( ftpUrl ); - /*sb.append( '/' ); - sb.append( fileName ); filename where u want to dld it */ - /*ftp://10.91.18.14/ + }*/ + /* * type ==> a=ASCII mode, i=image (binary) mode, d= file directory * listing */ @@ -73,9 +70,11 @@ public class FtpTemplateUploader implements TemplateUploader { { URL url = new URL( sb.toString() ); URLConnection urlc = url.openConnection(); + File sourceFile = new File(sourcePath); + entitySizeinBytes = sourceFile.length(); outputStream = new BufferedOutputStream( urlc.getOutputStream() ); - inputStream = new BufferedInputStream( new FileInputStream( new File(sourcePath) ) ); + inputStream = new BufferedInputStream( new FileInputStream(sourceFile) ); status = TemplateUploader.Status.IN_PROGRESS; @@ -146,20 +145,20 @@ public class FtpTemplateUploader implements TemplateUploader { @Override public String getUploadLocalPath() { - return null; + return sourcePath; } @Override public int getUploadPercent() { - if (templateSizeinBytes == 0) { + if (entitySizeinBytes == 0) { return 0; } - return (int)(100.0*totalBytes/templateSizeinBytes); + return (int)(100.0*totalBytes/entitySizeinBytes); } @Override public long getUploadTime() { - // TODO Auto-generated method stub + // TODO return 0; } @@ -168,11 +167,6 @@ public class FtpTemplateUploader implements TemplateUploader { return totalBytes; } - @Override - public boolean isInited() { - return false; - } - @Override public void setResume(boolean resume) { this.resume = resume; @@ -217,7 +211,6 @@ public class FtpTemplateUploader implements TemplateUploader { default: return true; } - } - + } } diff --git a/core/src/com/cloud/storage/template/TemplateUploader.java b/core/src/com/cloud/storage/template/TemplateUploader.java old mode 100644 new mode 100755 index feff934ff01..90ac2dee953 --- a/core/src/com/cloud/storage/template/TemplateUploader.java +++ b/core/src/com/cloud/storage/template/TemplateUploader.java @@ -69,9 +69,6 @@ public interface TemplateUploader extends Runnable{ public void setUploadError(String string); - public void setResume(boolean resume); - - public boolean isInited(); - + public void setResume(boolean resume); } diff --git a/core/src/com/cloud/storage/template/UploadManagerImpl.java b/core/src/com/cloud/storage/template/UploadManagerImpl.java old mode 100644 new mode 100755 index c0841e1489a..b6c8ffd128d --- a/core/src/com/cloud/storage/template/UploadManagerImpl.java +++ b/core/src/com/cloud/storage/template/UploadManagerImpl.java @@ -53,9 +53,9 @@ public class UploadManagerImpl implements UploadManager { } private static class UploadJob { - private final TemplateUploader td; + private final TemplateUploader tu; private final String jobId; - private final String tmpltName; + private final String name; private final ImageFormat format; private String tmpltPath; private String description; @@ -65,11 +65,11 @@ public class UploadManagerImpl implements UploadManager { private long templatesize; private long id; - public UploadJob(TemplateUploader td, String jobId, long id, String tmpltName, ImageFormat format, boolean hvm, Long accountId, String descr, String cksum, String installPathPrefix) { + public UploadJob(TemplateUploader tu, String jobId, long id, String name, ImageFormat format, boolean hvm, Long accountId, String descr, String cksum, String installPathPrefix) { super(); - this.td = td; + this.tu = tu; this.jobId = jobId; - this.tmpltName = tmpltName; + this.name = name; this.format = format; this.accountId = accountId; this.description = descr; @@ -80,7 +80,7 @@ public class UploadManagerImpl implements UploadManager { } public TemplateUploader getTd() { - return td; + return tu; } public String getDescription() { @@ -92,14 +92,14 @@ public class UploadManagerImpl implements UploadManager { } public UploadJob(TemplateUploader td, String jobId, UploadCommand cmd) { - this.td = td; + this.tu = td; this.jobId = jobId; - this.tmpltName = cmd.getName(); + this.name = cmd.getName(); this.format = cmd.getFormat(); } public TemplateUploader getTemplateUploader() { - return td; + return tu; } public String getJobId() { @@ -107,7 +107,7 @@ public class UploadManagerImpl implements UploadManager { } public String getTmpltName() { - return tmpltName; + return name; } public ImageFormat getFormat() { @@ -135,6 +135,13 @@ public class UploadManagerImpl implements UploadManager { } public void cleanup() { + if (tu != null) { + String upldPath = tu.getUploadLocalPath(); + if (upldPath != null) { + File f = new File(upldPath); + f.delete(); + } + } } public void setTemplatesize(long templatesize) { diff --git a/core/src/com/cloud/user/dao/AccountDaoImpl.java b/core/src/com/cloud/user/dao/AccountDaoImpl.java index b21096104b5..1b60f22d2b4 100644 --- a/core/src/com/cloud/user/dao/AccountDaoImpl.java +++ b/core/src/com/cloud/user/dao/AccountDaoImpl.java @@ -112,26 +112,26 @@ public class AccountDaoImpl extends GenericDaoBase implements A public List findAccountsLike(String accountName) { SearchCriteria sc = createSearchCriteria(); sc.addAnd("accountName", SearchCriteria.Op.LIKE, "%"+accountName+"%"); - return listActiveBy(sc); + return listBy(sc); } @Override public Account findActiveAccount(String accountName, Long domainId) { SearchCriteria sc = AccountNameSearch.create("accountName", accountName); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override public Account findAccount(String accountName, Long domainId) { SearchCriteria sc = AccountNameSearch.create("accountName", accountName); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } public Account findActiveAccountByName(String accountName) { SearchCriteria sc = AccountNameSearch.create("accountName", accountName); - return findOneActiveBy(sc); + return findOneBy(sc); } public List findActiveAccounts(Long maxAccountId, Filter filter) { @@ -140,7 +140,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A SearchCriteria sc = createSearchCriteria(); sc.addAnd("id", SearchCriteria.Op.LTEQ, maxAccountId); - return listActiveBy(sc, filter); + return listBy(sc, filter); } public List findRecentlyDeletedAccounts(Long maxAccountId, Date earliestRemovedDate, Filter filter) { @@ -152,7 +152,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A sc.addAnd("removed", SearchCriteria.Op.NNULL); sc.addAnd("removed", SearchCriteria.Op.GTEQ, earliestRemovedDate); - return listBy(sc, filter); + return listIncludingRemovedBy(sc, filter); } public List findNewAccounts(Long minAccountId, Filter filter) { @@ -161,7 +161,7 @@ public class AccountDaoImpl extends GenericDaoBase implements A SearchCriteria sc = createSearchCriteria(); sc.addAnd("id", SearchCriteria.Op.GT, minAccountId); - return listBy(sc, filter); + return listIncludingRemovedBy(sc, filter); } @Override diff --git a/core/src/com/cloud/user/dao/UserAccountDaoImpl.java b/core/src/com/cloud/user/dao/UserAccountDaoImpl.java index 175f5ca3c7e..8e147389a7e 100644 --- a/core/src/com/cloud/user/dao/UserAccountDaoImpl.java +++ b/core/src/com/cloud/user/dao/UserAccountDaoImpl.java @@ -36,7 +36,7 @@ public class UserAccountDaoImpl extends GenericDaoBase impl SearchCriteria sc = createSearchCriteria(); sc.addAnd("username", SearchCriteria.Op.EQ, username); sc.addAnd("domainId", SearchCriteria.Op.EQ, domainId); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override diff --git a/core/src/com/cloud/user/dao/UserDaoImpl.java b/core/src/com/cloud/user/dao/UserDaoImpl.java index 7fefd2e3c24..4b4a53b11a8 100644 --- a/core/src/com/cloud/user/dao/UserDaoImpl.java +++ b/core/src/com/cloud/user/dao/UserDaoImpl.java @@ -75,41 +75,41 @@ public class UserDaoImpl extends GenericDaoBase implements UserDao SearchCriteria sc = UsernamePasswordSearch.create(); sc.setParameters("username", username); sc.setParameters("password", password); - return findOneActiveBy(sc); + return findOneBy(sc); } public List listByAccount(long accountId) { SearchCriteria sc = AccountIdSearch.create(); sc.setParameters("account", accountId); - return listActiveBy(sc, null); + return listBy(sc, null); } @Override public UserVO getUser(String username) { SearchCriteria sc = UsernameSearch.create(); sc.setParameters("username", username); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override public UserVO getUser(long userId) { SearchCriteria sc = UserIdSearch.create(); sc.setParameters("id", userId); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override public List findUsersLike(String username) { SearchCriteria sc = UsernameLikeSearch.create(); sc.setParameters("username", "%" + username + "%"); - return listActiveBy(sc); + return listBy(sc); } @Override public UserVO findUserBySecretKey(String secretKey) { SearchCriteria sc = SecretKeySearch.create(); sc.setParameters("secretKey", secretKey); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override diff --git a/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java b/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java index 72298ba8848..956fe6e1761 100644 --- a/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java +++ b/core/src/com/cloud/user/dao/UserStatisticsDaoImpl.java @@ -62,7 +62,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase sc = UserDcSearch.create(); sc.setParameters("account", accountId); sc.setParameters("dc", dcId); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/core/src/com/cloud/vm/VMInstanceVO.java index 84c91116737..6b109c1ad95 100644 --- a/core/src/com/cloud/vm/VMInstanceVO.java +++ b/core/src/com/cloud/vm/VMInstanceVO.java @@ -36,12 +36,14 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.StateMachine; +import com.cloud.utils.fsm.FiniteStateObject; @Entity @Table(name="vm_instance") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING, length=32) -public class VMInstanceVO implements VirtualMachine { +public class VMInstanceVO implements VirtualMachine, FiniteStateObject { @Id @TableGenerator(name="vm_instance_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_instance_seq", allocationSize=1) @Column(name="id", updatable=false, nullable = false) @@ -65,7 +67,8 @@ public class VMInstanceVO implements VirtualMachine { * the state machine needs to go through the DAO object because someone * else could be updating it as well. */ - @Enumerated(value=EnumType.STRING) + @Enumerated(value=EnumType.STRING) + @StateMachine(state=State.class, event=Event.class) @Column(name="state", updatable=true, nullable=false, length=32) private State state = null; @@ -128,6 +131,7 @@ public class VMInstanceVO implements VirtualMachine { Type type, Long vmTemplateId, long guestOSId, + boolean haEnabled) { this.id = id; this.name = name; @@ -138,6 +142,9 @@ public class VMInstanceVO implements VirtualMachine { this.type = type; this.guestOSId = guestOSId; this.haEnabled = haEnabled; + this.mirroredVols = false; + this.vncPassword = Long.toHexString(new Random().nextLong()); + this.state = State.Creating; } @@ -193,11 +200,13 @@ public class VMInstanceVO implements VirtualMachine { return updated; } - public long getId() { + @Override + public long getId() { return id; } - public Date getCreated() { + @Override + public Date getCreated() { return created; } @@ -205,7 +214,8 @@ public class VMInstanceVO implements VirtualMachine { return updateTime; } - public long getDataCenterId() { + @Override + public long getDataCenterId() { return dataCenterId; } @@ -242,7 +252,8 @@ public class VMInstanceVO implements VirtualMachine { } // don't use this directly, use VM state machine instead, this method is added for migration tool only - public void setState(State state) { + @Override + public void setState(State state) { this.state = state; } @@ -292,7 +303,8 @@ public class VMInstanceVO implements VirtualMachine { this.templateId = templateId; } - public long getGuestOSId() { + @Override + public long getGuestOSId() { return guestOSId; } diff --git a/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java b/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java index 2d33f98aeb4..7936c22a370 100644 --- a/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java +++ b/core/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java @@ -231,21 +231,21 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im SearchCriteria sc = DataCenterStatusSearch.create(); sc.setParameters("states", (Object[])states); sc.setParameters("dc", dataCenterId); - return listActiveBy(sc); + return listBy(sc); } @Override public List getProxyListInStates(State... states) { SearchCriteria sc = StateSearch.create(); sc.setParameters("states", (Object[])states); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByHostId(long hostId) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -253,7 +253,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase im SearchCriteria sc = HostUpSearch.create(); sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); - return listActiveBy(sc); + return listBy(sc); } @Override diff --git a/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java index 2a12035ded4..c6589d48715 100755 --- a/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java +++ b/core/src/com/cloud/vm/dao/DomainRouterDaoImpl.java @@ -123,7 +123,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im public DomainRouterVO findByPublicIpAddress(String ipAddress) { SearchCriteria sc = IpSearch.create(); sc.setParameters("ip", ipAddress); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -196,7 +196,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im public List listByDataCenter(long dcId) { SearchCriteria sc = DcSearch.create(); sc.setParameters("dc", dcId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -205,7 +205,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im sc.setParameters("account", accountId); sc.setParameters("dc", dcId); sc.setParameters("role", Role.DHCP_FIREWALL_LB_PASSWD_USERDATA); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -214,21 +214,21 @@ public class DomainRouterDaoImpl extends GenericDaoBase im sc.setParameters("account", accountId); sc.setParameters("dc", dcId); sc.setParameters("role", role); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override public List listBy(long accountId) { SearchCriteria sc = AccountSearch.create(); sc.setParameters("account", accountId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByHostId(Long hostId) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -238,7 +238,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase im sc.setParameters("host", hostId); } sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -287,13 +287,13 @@ public class DomainRouterDaoImpl extends GenericDaoBase im public List listByDomain(Long domainId) { SearchCriteria sc = DomainIdSearch.create(); sc.setParameters("domainId", domainId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override public List listByVlanDbId(Long vlanDbId) { SearchCriteria sc = VlanDbIdSearch.create(); sc.setParameters("vlanDbId", vlanDbId); - return listBy(sc); + return listIncludingRemovedBy(sc); } } diff --git a/core/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java b/core/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java index fa1581e93c6..ad38184c6e8 100644 --- a/core/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java +++ b/core/src/com/cloud/vm/dao/InstanceGroupDaoImpl.java @@ -33,7 +33,7 @@ public class InstanceGroupDaoImpl extends GenericDaoBase if (accountId != null) { sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); } - List vmGroups = listActiveBy(sc); + List vmGroups = listBy(sc); return ((vmGroups != null) && !vmGroups.isEmpty()); } @@ -42,7 +42,7 @@ public class InstanceGroupDaoImpl extends GenericDaoBase SearchCriteria sc = AccountIdNameSearch.create(); sc.setParameters("accountId", accountId); sc.setParameters("groupName", name); - return findOneActiveBy(sc); + return findOneBy(sc); } @Override @@ -56,6 +56,6 @@ public class InstanceGroupDaoImpl extends GenericDaoBase public List listByAccountId(long id) { SearchCriteria sc = AccountSearch.create(); sc.setParameters("account", id); - return listActiveBy(sc); + return listBy(sc); } } diff --git a/core/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java b/core/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java index f64e3201714..7e61dad390a 100644 --- a/core/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java +++ b/core/src/com/cloud/vm/dao/InstanceGroupVMMapDaoImpl.java @@ -35,14 +35,14 @@ public class InstanceGroupVMMapDaoImpl extends GenericDaoBase listByInstanceId(long vmId) { SearchCriteria sc = ListByVmId.create(); sc.setParameters("instanceId", vmId); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByGroupId(long groupId) { SearchCriteria sc = ListByGroupId.create(); sc.setParameters("groupId", groupId); - return listActiveBy(sc); + return listBy(sc); } @Override diff --git a/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java index 2005b324888..d5ff13312b8 100644 --- a/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java +++ b/core/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java @@ -158,21 +158,21 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase sc = DataCenterStatusSearch.create(); sc.setParameters("states", (Object[])states); sc.setParameters("dc", dataCenterId); - return listActiveBy(sc); + return listBy(sc); } @Override public List getSecStorageVmListInStates(State... states) { SearchCriteria sc = StateSearch.create(); sc.setParameters("states", (Object[])states); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByHostId(long hostId) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -180,7 +180,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase sc = HostUpSearch.create(); sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -208,6 +208,6 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase listByZoneId(long zoneId) { SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zone", zoneId); - return listActiveBy(sc); + return listBy(sc); } } diff --git a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java index 92d7894f08c..5172f337c73 100755 --- a/core/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/core/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -127,7 +127,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("account", accountId); sc.setParameters("pod", podId); - return listBy(sc); + return listIncludingRemovedBy(sc); } public List listByAccountAndDataCenter(long accountId, long dcId) { @@ -135,7 +135,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("account", accountId); sc.setParameters("dc", dcId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -148,7 +148,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use ssc.addOr("state", SearchCriteria.Op.EQ, state.toString()); } sc.addAnd("state", SearchCriteria.Op.SC, ssc); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -165,7 +165,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("router", routerId); - return listBy(sc); + return listIncludingRemovedBy(sc); } @Override @@ -225,20 +225,20 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("state", State.Destroyed, State.Expunging); sc.setParameters("updateTime", date); - return listActiveBy(sc); + return listBy(sc); } public List listByAccountId(long id) { SearchCriteria sc = AccountSearch.create(); sc.setParameters("account", id); - return listActiveBy(sc); + return listBy(sc); } public List listByHostId(Long id) { SearchCriteria sc = HostSearch.create(); sc.setParameters("host", id); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -246,7 +246,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use SearchCriteria sc = HostUpSearch.create(); sc.setParameters("host", hostId); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); - return listActiveBy(sc); + return listBy(sc); } public List listRunningByHostId(long hostId) { @@ -254,13 +254,13 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("host", hostId); sc.setParameters("state", State.Running); - return listActiveBy(sc); + return listBy(sc); } public UserVmVO findByName(String name) { SearchCriteria sc = NameSearch.create(); sc.setParameters("name", name); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } @Override @@ -282,7 +282,7 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("dc", dcId); sc.setJoinParameters("offeringSearch", "guestIpType", NetworkOffering.GuestIpType.Virtualized); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -292,6 +292,6 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use sc.setParameters("ip", ipAddress); sc.setParameters("states", new Object[] {State.Destroyed, State.Expunging}); - return listActiveBy(sc); + return listBy(sc); } } diff --git a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index d625db08bf7..813e056c2ea 100644 --- a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -136,7 +136,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem public List findVMInstancesLike(String name) { SearchCriteria sc = NameLikeSearch.create(); sc.setParameters("name", "%" + name + "%"); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -180,7 +180,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem SearchCriteria sc = HostSearch.create(); sc.setParameters("host", hostid); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -188,7 +188,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem SearchCriteria sc = LastHostSearch.create(); sc.setParameters("lastHost", hostId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -196,7 +196,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem SearchCriteria sc = ZoneSearch.create(); sc.setParameters("zone", zoneId); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -204,7 +204,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem SearchCriteria sc = ZoneVmTypeSearch.create(); sc.setParameters("zone", zoneId); sc.setParameters("type", type.toString()); - return listActiveBy(sc); + return listBy(sc); } @@ -216,7 +216,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem sc.setParameters("template", templateId); sc.setParameters("state", State.Expunging); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -255,7 +255,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem SearchCriteria sc = HostIdTypesSearch.create(); sc.setParameters("hostid", hostid); sc.setParameters("types", (Object[]) types); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -264,14 +264,14 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem sc.setParameters("hostid", hostid); sc.setParameters("types", (Object[]) types); sc.setParameters("states", new Object[] {State.Destroyed, State.Stopped, State.Expunging}); - return listActiveBy(sc); + return listBy(sc); } @Override public List listByTypes(Type... types) { SearchCriteria sc = TypesSearch.create(); sc.setParameters("types", (Object[]) types); - return listActiveBy(sc); + return listBy(sc); } @Override @@ -279,7 +279,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem SearchCriteria sc = IdTypesSearch.create(); sc.setParameters("id", id); sc.setParameters("types", (Object[]) types); - return findOneBy(sc); + return findOneIncludingRemovedBy(sc); } diff --git a/patches/systemvm/root/clearUsageRules.sh b/patches/systemvm/root/clearUsageRules.sh index 2517d42e2e0..1582612fd99 100755 --- a/patches/systemvm/root/clearUsageRules.sh +++ b/patches/systemvm/root/clearUsageRules.sh @@ -16,6 +16,8 @@ then # remove rules iptables -D NETWORK_STATS -i eth0 -o $i > /dev/null; iptables -D NETWORK_STATS -i $i -o eth0 > /dev/null; + iptables -D NETWORK_STATS -o $pubIf ! -i eth0 -p tcp > /dev/null; + iptables -D NETWORK_STATS -i $pubIf ! -o eth0 -p tcp > /dev/null; fi done rm /root/removedVifs diff --git a/python/lib/cloud_utils.py b/python/lib/cloud_utils.py index 86d2471b336..27fed1f86c6 100644 --- a/python/lib/cloud_utils.py +++ b/python/lib/cloud_utils.py @@ -892,6 +892,7 @@ def prompt_for_hostpods(zonespods): for n,(z,p) in enumerate(zonespods): print "%3d) %s, %s"%(n,z,p) print "================" + print "> ", zoneandpod = raw_input().strip() if not zoneandpod: @@ -930,6 +931,7 @@ def setup_agent_config(configfile, host, zone, pod, cluster, guid): try: host = confopts["host"] except KeyError: host = "localhost" stderr("Please enter the host name of the management server that this agent will connect to: (just hit ENTER to go with %s)",host) + print "> ", newhost = raw_input().strip() if newhost: host = newhost @@ -977,6 +979,7 @@ def setup_consoleproxy_config(configfile, host, zone, pod): try: host = confopts["host"] except KeyError: host = "localhost" stderr("Please enter the host name of the management server that this console-proxy will connect to: (just hit ENTER to go with %s)",host) + print "> ", newhost = raw_input().strip() if newhost: host = newhost confopts["host"] = host diff --git a/scripts/network/domr/ipassoc.sh b/scripts/network/domr/ipassoc.sh index 14d932c5308..1988d4c73f1 100755 --- a/scripts/network/domr/ipassoc.sh +++ b/scripts/network/domr/ipassoc.sh @@ -50,6 +50,22 @@ check_gw() { return $?; } +#Add 1:1 NAT entry +add_one_to_one_nat_entry() { + local guestIp=$1 + local publicIp=$2 + local dIp=$3 + ssh -p 3922 -o StrictHostKeyChecking=no -i $cert root@$dIp "\ + iptables -t nat -A PREROUTING -i eth2 -d $publicIp -j DNAT --to-destination $guestIp + iptables -t nat -A POSTROUTING -o $eth2 -s $guestIp -j SNAT --to-source $publicIp + iptables -P FORWARD DROP + iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT + iptables -A FORWARD -i $eth2 -o $eth1 -d $guestIp -m state --state NEW -j ACCEPT + iptables -A FORWARD -i $eth1 -o $eth2 -s $guestIp -m state --state NEW -j ACCEPT + " + return $? +} + #Add the NAT entries into iptables in the routing domain add_nat_entry() { local dRIp=$1 @@ -120,9 +136,10 @@ vflag= gflag= nflag= cflag= +Gflag= op="" -while getopts 'fADr:i:a:l:v:g:n:c:' OPTION +while getopts 'fADr:i:a:l:v:g:n:c:G:' OPTION do case $OPTION in A) Aflag=1 @@ -157,12 +174,23 @@ do c) cflag=1 correctVif="$OPTARG" ;; + G) Gflag=1 + guestIp="$OPTARG" + ;; ?) usage exit 2 ;; esac done +#1:1 NAT +if [ "$Gflag" == "1" ] && [ "$fflag" == "1" ] && [ "$Aflag" == "1" ] +then + add_nat_entry $domRIp $publicIp + add_one_to_one_nat_entry $guestIp $publicIp $domRIp + exit $? +fi + #Either the A flag or the D flag but not both if [ "$Aflag$Dflag" != "1" ] then @@ -182,7 +210,6 @@ then exit 3 fi - if [ "$fflag" == "1" ] && [ "$Aflag" == "1" ] then add_nat_entry $domRIp $publicIp @@ -208,4 +235,3 @@ then fi exit 0 - diff --git a/scripts/network/domr/networkUsage.sh b/scripts/network/domr/networkUsage.sh index 66b2e6a44ef..2aa76fe2d8c 100755 --- a/scripts/network/domr/networkUsage.sh +++ b/scripts/network/domr/networkUsage.sh @@ -25,8 +25,12 @@ create_usage_rules () { ssh -p 3922 -o StrictHostKeyChecking=no -i $cert root@$dRIp "\ iptables -N NETWORK_STATS > /dev/null; iptables -I FORWARD -j NETWORK_STATS > /dev/null; + iptables -I INPUT -j NETWORK_STATS > /dev/null; + iptables -I OUTPUT -j NETWORK_STATS > /dev/null; iptables -A NETWORK_STATS -i eth0 -o eth2 > /dev/null; iptables -A NETWORK_STATS -i eth2 -o eth0 > /dev/null; + iptables -A NETWORK_STATS -o eth2 ! -i eth0 -p tcp > /dev/null; + iptables -A NETWORK_STATS -i eth2 ! -o eth0 -p tcp > /dev/null; " return 1 } @@ -37,6 +41,8 @@ add_public_interface () { ssh -p 3922 -o StrictHostKeyChecking=no -i $cert root@$dRIp "\ iptables -A NETWORK_STATS -i eth0 -o $pubIf > /dev/null; iptables -A NETWORK_STATS -i $pubIf -o eth0 > /dev/null; + iptables -A NETWORK_STATS -o $pubIf ! -i eth0 -p tcp > /dev/null; + iptables -A NETWORK_STATS -i $pubIf ! -o eth0 -p tcp > /dev/null; " return 1 } diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index ffa53b5b53d..1a38bd33155 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -144,7 +144,7 @@ import com.cloud.utils.nio.NioServer; import com.cloud.utils.nio.Task; import com.cloud.vm.State; import com.cloud.vm.VMInstanceVO; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.VMInstanceDao; /** @@ -400,7 +400,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { public Host findHost(final Host.Type type, final DataCenterVO dc, final HostPodVO pod, final StoragePoolVO sp, final ServiceOffering offering, final VMTemplateVO template, VMInstanceVO vm, Host currentHost, final Set avoid) { - VmCharacteristics vmc = new VmCharacteristics(vm.getType()); + VirtualMachineProfile vmc = new VirtualMachineProfile(vm.getType()); Enumeration en = _hostAllocators.enumeration(); while (en.hasMoreElements()) { final HostAllocator allocator = en.nextElement(); @@ -1065,7 +1065,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { return null; } - public Pod findPod(VmCharacteristics vm, DataCenter dc, Set avoids) { + public Pod findPod(VirtualMachineProfile vm, DataCenter dc, Set avoids) { for (PodAllocator allocator : _podAllocators) { Pod pod = allocator.allocateTo(vm, dc, avoids); if (pod != null) { @@ -1774,7 +1774,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory { } @Override - public Host findHost(VmCharacteristics vm, Set avoids) { + public Host findHost(VirtualMachineProfile vm, Set avoids) { return null; } diff --git a/server/src/com/cloud/agent/manager/allocator/HostAllocator.java b/server/src/com/cloud/agent/manager/allocator/HostAllocator.java index 0cd8b462043..b4c0dd66b1e 100755 --- a/server/src/com/cloud/agent/manager/allocator/HostAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/HostAllocator.java @@ -27,10 +27,10 @@ import com.cloud.offering.ServiceOffering; import com.cloud.storage.VMTemplateVO; import com.cloud.uservm.UserVm; import com.cloud.utils.component.Adapter; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; public interface HostAllocator extends Adapter { boolean isVirtualMachineUpgradable(final UserVm vm, final ServiceOffering offering); - Host allocateTo(VmCharacteristics vm, ServiceOffering offering, Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid); + Host allocateTo(VirtualMachineProfile vm, ServiceOffering offering, Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid); } diff --git a/server/src/com/cloud/agent/manager/allocator/PodAllocator.java b/server/src/com/cloud/agent/manager/allocator/PodAllocator.java index 3c7bdcbb387..f4775ac2c5d 100755 --- a/server/src/com/cloud/agent/manager/allocator/PodAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/PodAllocator.java @@ -27,10 +27,10 @@ import com.cloud.service.ServiceOfferingVO; import com.cloud.template.VirtualMachineTemplate; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapter; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; public interface PodAllocator extends Adapter { Pair allocateTo(VirtualMachineTemplate template, ServiceOfferingVO offering, DataCenterVO dc, long userId, Set avoids); - Pod allocateTo(VmCharacteristics vm, DataCenter dc, Set avoids); + Pod allocateTo(VirtualMachineProfile vm, DataCenter dc, Set avoids); } diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java index 2570cb94aef..77ce0e5a121 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitAllocator.java @@ -56,7 +56,7 @@ import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.UserVmVO; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.SecondaryStorageVmDao; @@ -83,7 +83,7 @@ public class FirstFitAllocator implements HostAllocator { protected String _allocationAlgorithm = "random"; @Override - public Host allocateTo(VmCharacteristics vm, ServiceOffering offering, Type type, DataCenterVO dc, + public Host allocateTo(VirtualMachineProfile vm, ServiceOffering offering, Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid) { diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java index aa34dea5437..2c54bc46099 100644 --- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java @@ -31,12 +31,12 @@ import com.cloud.host.Host; import com.cloud.offering.ServiceOffering; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; @Local(value={HostAllocator.class}) public class FirstFitRoutingAllocator extends FirstFitAllocator { @Override - public Host allocateTo(VmCharacteristics vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, + public Host allocateTo(VirtualMachineProfile vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid) { try { NDC.push("FirstFitRoutingAllocator"); diff --git a/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java index cf43fd40e96..f4c4ac35e30 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/RandomAllocator.java @@ -36,7 +36,7 @@ import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.uservm.UserVm; import com.cloud.utils.component.ComponentLocator; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; @Local(value=HostAllocator.class) public class RandomAllocator implements HostAllocator { @@ -45,7 +45,7 @@ public class RandomAllocator implements HostAllocator { private HostDao _hostDao; @Override - public Host allocateTo(VmCharacteristics vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, + public Host allocateTo(VirtualMachineProfile vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid) { if (type == Host.Type.Storage) { return null; diff --git a/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java index 430747aff30..ccb0a5ff0a1 100644 --- a/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/RecreateHostAllocator.java @@ -41,7 +41,7 @@ import com.cloud.storage.dao.StoragePoolDao; import com.cloud.utils.Pair; import com.cloud.utils.component.Inject; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; @Local(value=HostAllocator.class) public class RecreateHostAllocator extends FirstFitRoutingAllocator { @@ -53,7 +53,7 @@ public class RecreateHostAllocator extends FirstFitRoutingAllocator { @Inject AgentManager _agentMgr; @Override - public Host allocateTo(VmCharacteristics vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, + public Host allocateTo(VirtualMachineProfile vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid) { Host host = super.allocateTo(vm, offering, type, dc, pod, clusterId, template, avoid); if (host != null) { diff --git a/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java index 05c59ba4996..51d8d8afe43 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/TestingAllocator.java @@ -32,7 +32,7 @@ import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; import com.cloud.uservm.UserVm; import com.cloud.utils.component.ComponentLocator; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; /** * @author ahuang @@ -47,7 +47,7 @@ public class TestingAllocator implements HostAllocator { String _name; @Override - public Host allocateTo(VmCharacteristics vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, + public Host allocateTo(VirtualMachineProfile vm, ServiceOffering offering, Host.Type type, DataCenterVO dc, HostPodVO pod, Long clusterId, VMTemplateVO template, Set avoid) { if (type == Host.Type.Routing && _routingHost != null) { return _hostDao.findById(_routingHost); diff --git a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java index aa89678d2dc..434cd04778a 100755 --- a/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java +++ b/server/src/com/cloud/agent/manager/allocator/impl/UserConcentratedAllocator.java @@ -56,7 +56,7 @@ import com.cloud.vm.State; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @@ -352,7 +352,7 @@ public class UserConcentratedAllocator implements PodAllocator { } @Override - public Pod allocateTo(VmCharacteristics vm, DataCenter dc, Set avoids) { + public Pod allocateTo(VirtualMachineProfile vm, DataCenter dc, Set avoids) { return null; } } diff --git a/server/src/com/cloud/api/BaseCmd.java b/server/src/com/cloud/api/BaseCmd.java index f5fc17f9ab8..cf34dfd65ac 100755 --- a/server/src/com/cloud/api/BaseCmd.java +++ b/server/src/com/cloud/api/BaseCmd.java @@ -281,7 +281,6 @@ public abstract class BaseCmd { OS_TYPE_ID("ostypeid", BaseCmd.TYPE_LONG, "osTypeId"), OS_TYPE_NAME("ostypename", BaseCmd.TYPE_STRING, "osTypeName"), OP("op", BaseCmd.TYPE_STRING, "op"), - ONE_TO_ONE_NAT("onetoonenat",BaseCmd.TYPE_BOOLEAN,"oneToOneNat"), PAGE("page", BaseCmd.TYPE_INT, "page"), PAGESIZE("pagesize", BaseCmd.TYPE_INT, "pagesize"), PARENT_ID("parentid", BaseCmd.TYPE_LONG, "parentId"), @@ -625,13 +624,14 @@ public abstract class BaseCmd { StringBuffer sb = new StringBuffer(); if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { // JSON response - sb.append("{ \"" + getName() + "\" : { \"errorcode\" : \"" + apiException.getErrorCode() + "\", \"description\" : \"" + apiException.getDescription() + "\" } }"); + sb.append("{ \"" + getName() + "\" : { " + "\"@attributes\":{\"cloud-stack-version\":\""+getManagementServer().getVersion()+"\"},"); + sb.append("\"errorcode\" : \"" + apiException.getErrorCode() + "\", \"description\" : \"" + apiException.getDescription() + "\" } }"); } else { sb.append(""); sb.append("<" + getName() + ">"); sb.append("" + apiException.getErrorCode() + ""); sb.append("" + escapeXml(apiException.getDescription()) + ""); - sb.append(""); + sb.append(""); } return sb.toString(); } @@ -641,10 +641,10 @@ public abstract class BaseCmd { // set up the return value with the name of the response if (RESPONSE_TYPE_JSON.equalsIgnoreCase(responseType)) { - sb.append("{ \"" + getName() + "\" : { "); + sb.append("{ \"" + getName() + "\" : { \"@attributes\":{\"cloud-stack-version\":\""+getManagementServer().getVersion()+"\"},"); } else { sb.append(""); - sb.append("<" + getName() + ">"); + sb.append("<" + getName() + " cloud-stack-version=\""+getManagementServer().getVersion()+ "\">"); } int i = 0; diff --git a/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java b/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java index c4a2da97eae..8755e42a1eb 100644 --- a/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java +++ b/server/src/com/cloud/api/commands/AssociateIPAddrCmd.java @@ -49,7 +49,7 @@ public class AssociateIPAddrCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ZONE_ID, Boolean.TRUE)); - s_properties.add(new Pair(BaseCmd.Properties.ONE_TO_ONE_NAT, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.VIRTUAL_MACHINE_ID, Boolean.FALSE)); } public String getName() { @@ -70,7 +70,12 @@ public class AssociateIPAddrCmd extends BaseCmd { Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); String accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); - Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); + Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); + Long vmId = (Long)params.get(BaseCmd.Properties.VIRTUAL_MACHINE_ID.getName()); + + //todo REMOVE + //vmId = new Long(3); + String newIpAddr = null; String errorDesc = null; Long accountId = null; @@ -105,9 +110,15 @@ public class AssociateIPAddrCmd extends BaseCmd { if (userId == null) { userId = Long.valueOf(1); } - + + //vmId == 0 => general flow + //vmId != 0 => 1:1 NAT + if(vmId == null){ + vmId = Long.valueOf(0); + } + try { - newIpAddr = getManagementServer().associateIpAddress(userId.longValue(), accountId.longValue(), domainId.longValue(), zoneId.longValue()); + newIpAddr = getManagementServer().associateIpAddress(userId.longValue(), accountId.longValue(), domainId.longValue(), zoneId.longValue(), vmId.longValue()); } catch (ResourceAllocationException rae) { if (rae.getResourceType().equals("vm")) throw new ServerApiException (BaseCmd.VM_ALLOCATION_ERROR, rae.getMessage()); else if (rae.getResourceType().equals("ip")) throw new ServerApiException (BaseCmd.IP_ALLOCATION_ERROR, rae.getMessage()); diff --git a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java old mode 100644 new mode 100755 index b77c51ba7bb..88ee9f94529 --- a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java +++ b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java @@ -27,6 +27,7 @@ import org.apache.log4j.Logger; import com.cloud.api.BaseCmd; import com.cloud.api.ServerApiException; import com.cloud.domain.DomainVO; +import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.storage.DiskOfferingVO; import com.cloud.user.User; @@ -42,7 +43,6 @@ public class CreateDiskOfferingCmd extends BaseCmd { s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT, Boolean.TRUE)); s_properties.add(new Pair(BaseCmd.Properties.DISK_SIZE, Boolean.TRUE)); -// s_properties.add(new Pair(BaseCmd.Properties.IS_MIRRORED, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); @@ -61,31 +61,24 @@ public class CreateDiskOfferingCmd extends BaseCmd { @Override public List> execute(Map params) { // FIXME: add domain-private disk offerings -// Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName()); + Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName()); - Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName()); String name = (String)params.get(BaseCmd.Properties.NAME.getName()); String displayText = (String)params.get(BaseCmd.Properties.DISPLAY_TEXT.getName()); - Long numGB = (Long) params.get(BaseCmd.Properties.DISK_SIZE.getName()); -// Boolean isMirrored = (Boolean)params.get(BaseCmd.Properties.IS_MIRRORED.getName()); + Long numGB = (Long) params.get(BaseCmd.Properties.DISK_SIZE.getName()); String tags = (String)params.get(BaseCmd.Properties.TAGS.getName()); - -// if (isMirrored == null) { -// isMirrored = Boolean.FALSE; -// } - if (domainId == null) { - domainId = DomainVO.ROOT_DOMAIN; - } - + if (userId == null) { userId = Long.valueOf(User.UID_SYSTEM); } DiskOfferingVO diskOffering = null; try { - diskOffering = getManagementServer().createDiskOffering(userId, domainId.longValue(), name, displayText, numGB.intValue(),tags); + diskOffering = getManagementServer().createDiskOffering(userId, DomainVO.ROOT_DOMAIN, name, displayText, numGB.intValue(),tags); } catch (InvalidParameterValueException ex) { throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, ex.getMessage()); + } catch (InternalErrorException ex) { + throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, ex.getMessage()); } if (diskOffering == null) { @@ -99,7 +92,6 @@ public class CreateDiskOfferingCmd extends BaseCmd { returnValues.add(new Pair(BaseCmd.Properties.NAME.getName(), diskOffering.getName())); returnValues.add(new Pair(BaseCmd.Properties.DISPLAY_TEXT.getName(), diskOffering.getDisplayText())); returnValues.add(new Pair(BaseCmd.Properties.DISK_SIZE.getName(), diskOffering.getDiskSizeInBytes())); -// returnValues.add(new Pair(BaseCmd.Properties.IS_MIRRORED.getName(), diskOffering.isMirrored())); returnValues.add(new Pair(BaseCmd.Properties.CREATED.getName(), diskOffering.getCreated())); returnValues.add(new Pair(BaseCmd.Properties.TAGS.getName(), diskOffering.getTags())); return returnValues; diff --git a/server/src/com/cloud/api/commands/CreateVolumeCmd.java b/server/src/com/cloud/api/commands/CreateVolumeCmd.java index 360c7e45087..9e63a551ee4 100644 --- a/server/src/com/cloud/api/commands/CreateVolumeCmd.java +++ b/server/src/com/cloud/api/commands/CreateVolumeCmd.java @@ -117,6 +117,14 @@ public class CreateVolumeCmd extends BaseCmd { size = Long.valueOf(0); } + if(diskOfferingId != null){ + DiskOfferingVO dOffering = getManagementServer().findDiskOfferingById(diskOfferingId.longValue()); + + if(dOffering == null){ + throw new ServerApiException(BaseCmd.PARAM_ERROR,"Diskoffering id:"+diskOfferingId+" is invalid"); + } + } + boolean useSnapshot = false; if (snapshotId == null) { @@ -147,7 +155,7 @@ public class CreateVolumeCmd extends BaseCmd { //this is the case of creating var size vol with private disk offering List privateTemplateList = getManagementServer().findPrivateDiskOffering(); - diskOfferingId = privateTemplateList.get(0).getId(); //we use this id for creating volume + diskOfferingId = privateTemplateList.get(0).getId(); //we use this id for creating volume, randomly tagging it to a pool with an offering } } else diff --git a/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java b/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java index 5c00750146f..05d12a0ea00 100644 --- a/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java +++ b/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java @@ -62,7 +62,12 @@ public class DeleteDiskOfferingCmd extends BaseCmd { if (disk == null) { throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to find a disk offering with id " + id); } - + + if(disk.getDiskSize()==0){ + //block deletion of these disks + throw new ServerApiException(BaseCmd.INTERNAL_ERROR,"Cannot delete this diskoffering as it is private"); + } + boolean result = getManagementServer().deleteDiskOffering(userId, id); List> returnValues = new ArrayList>(); diff --git a/server/src/com/cloud/api/commands/ExtractIsoCmd.java b/server/src/com/cloud/api/commands/ExtractIsoCmd.java old mode 100644 new mode 100755 index 6ef13c121ea..87096bdd5c6 --- a/server/src/com/cloud/api/commands/ExtractIsoCmd.java +++ b/server/src/com/cloud/api/commands/ExtractIsoCmd.java @@ -60,9 +60,9 @@ public class ExtractIsoCmd extends BaseCmd { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract ISO " + templateId + " to " + url + ", permission denied."); } } - + Long jobId; try { - managementServer.extractTemplate(url, templateId, zoneId); + jobId = managementServer.extractTemplateAsync(url, templateId, zoneId); } catch (Exception e) { s_logger.error(e.getMessage(), e); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the ISO " + e.getMessage()); @@ -75,7 +75,7 @@ public class ExtractIsoCmd extends BaseCmd { response.add(new Pair(BaseCmd.Properties.URL.getName(), url)); response.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), zoneId)); response.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName())); - response.add(new Pair(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing")); + response.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), jobId)); return response; } @@ -89,4 +89,8 @@ public class ExtractIsoCmd extends BaseCmd { public List> getProperties() { return s_properties; } + + public static String getStaticName() { + return "ExtractIso"; + } } diff --git a/server/src/com/cloud/api/commands/ExtractTemplateCmd.java b/server/src/com/cloud/api/commands/ExtractTemplateCmd.java index a7a5d55799a..bf8d6b756c7 100755 --- a/server/src/com/cloud/api/commands/ExtractTemplateCmd.java +++ b/server/src/com/cloud/api/commands/ExtractTemplateCmd.java @@ -59,9 +59,9 @@ public class ExtractTemplateCmd extends BaseCmd { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract template " + templateId + " to " + url + ", permission denied."); } } - + Long jobId; try { - managementServer.extractTemplate(url, templateId, zoneId); + jobId = managementServer.extractTemplateAsync(url, templateId, zoneId); } catch (Exception e) { s_logger.error(e.getMessage(), e); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the template " + e.getMessage()); @@ -74,7 +74,7 @@ public class ExtractTemplateCmd extends BaseCmd { response.add(new Pair(BaseCmd.Properties.URL.getName(), url)); response.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), zoneId)); response.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName())); - response.add(new Pair(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing")); + response.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), jobId)); return response; } @@ -82,6 +82,10 @@ public class ExtractTemplateCmd extends BaseCmd { public String getName() { return s_name; } + + public static String getStaticName() { + return "ExtractTemplate"; + } @Override public List> getProperties() { diff --git a/server/src/com/cloud/api/commands/ExtractVolumeCmd.java b/server/src/com/cloud/api/commands/ExtractVolumeCmd.java old mode 100644 new mode 100755 index 6ae13327925..db0577f8f61 --- a/server/src/com/cloud/api/commands/ExtractVolumeCmd.java +++ b/server/src/com/cloud/api/commands/ExtractVolumeCmd.java @@ -55,9 +55,9 @@ public class ExtractVolumeCmd extends BaseCmd { throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract volume " + volumeId + " to " + url + ", permission denied."); } } - + long jobId; try { - managementServer.extractVolume(url, volumeId, zoneId); + jobId = managementServer.extractVolumeAsync(url, volumeId, zoneId); } catch (Exception e) { s_logger.error(e.getMessage(), e); throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the volume " + e.getMessage()); @@ -69,7 +69,7 @@ public class ExtractVolumeCmd extends BaseCmd { response.add(new Pair(BaseCmd.Properties.URL.getName(), url)); response.add(new Pair(BaseCmd.Properties.ZONE_ID.getName(), zoneId)); response.add(new Pair(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName())); - response.add(new Pair(BaseCmd.Properties.STATUS.getName(), "Processing")); + response.add(new Pair(BaseCmd.Properties.JOB_ID.getName(), jobId)); return response; } @@ -83,4 +83,8 @@ public class ExtractVolumeCmd extends BaseCmd { return s_properties; } + public static String getStaticName() { + return "ExtractVolume"; + } + } diff --git a/server/src/com/cloud/api/commands/ListVolumesCmd.java b/server/src/com/cloud/api/commands/ListVolumesCmd.java index 006f1565ca2..29959ba3935 100755 --- a/server/src/com/cloud/api/commands/ListVolumesCmd.java +++ b/server/src/com/cloud/api/commands/ListVolumesCmd.java @@ -131,9 +131,9 @@ public class ListVolumesCmd extends BaseCmd{ } else { c.addCriteria(Criteria.ID, id); c.addCriteria(Criteria.INSTANCEID, vmId); - c.addCriteria(Criteria.NAME, name); - if (isAdmin) { - c.addCriteria(Criteria.VTYPE, type); + c.addCriteria(Criteria.NAME, name); + c.addCriteria(Criteria.VTYPE, type); + if (isAdmin) { c.addCriteria(Criteria.DATACENTERID, zoneId); c.addCriteria(Criteria.PODID, podId); c.addCriteria(Criteria.HOSTID, hostId); diff --git a/server/src/com/cloud/async/executor/AssociateIpAddressExecutor.java b/server/src/com/cloud/async/executor/AssociateIpAddressExecutor.java index cc807d8a437..7ec72e863b5 100644 --- a/server/src/com/cloud/async/executor/AssociateIpAddressExecutor.java +++ b/server/src/com/cloud/async/executor/AssociateIpAddressExecutor.java @@ -62,7 +62,7 @@ public class AssociateIpAddressExecutor extends BaseAsyncJobExecutor { } else { try { String ipAddress = managementServer.associateIpAddress(param.getUserId(), param.getAccountId(), - param.getDomainId(), param.getZoneId()); + param.getDomainId(), param.getZoneId(), 0); asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_SUCCEEDED, 0, composeResultObject(managementServer, param, ipAddress)); } catch (ResourceAllocationException e) { diff --git a/server/src/com/cloud/async/executor/ExtractJobResultObject.java b/server/src/com/cloud/async/executor/ExtractJobResultObject.java new file mode 100644 index 00000000000..813aa8705a2 --- /dev/null +++ b/server/src/com/cloud/async/executor/ExtractJobResultObject.java @@ -0,0 +1,151 @@ +package com.cloud.async.executor; + +import java.util.Date; + +import com.cloud.async.AsyncInstanceCreateStatus; +import com.cloud.serializer.Param; +import com.cloud.storage.Volume.VolumeType; +import com.cloud.storage.upload.UploadState; + +public class ExtractJobResultObject { + + public ExtractJobResultObject(Long accountId, String typeName, UploadState currState, int i, Long uploadId){ + this.accountId = accountId; + this.name = typeName; + this.state = currState.toString(); + } + + public ExtractJobResultObject(){ + } + + @Param(name="id") + private long id; + + @Param(name="name") + private String name; + + @Param(name="uploadPercentage") + private int uploadPercent; + + @Param(name="uploadStatus") + private String uploadStatus; + + @Param(name="accountid") + long accountId; + + @Param(name="result_string") + String result_string; + + public int getUploadPercent() { + return uploadPercent; + } + + public void setUploadPercent(int i) { + this.uploadPercent = i; + } + + public String getUploadStatus() { + return uploadStatus; + } + + public void setUploadStatus(String uploadStatus) { + this.uploadStatus = uploadStatus; + } + + public String getResult_string() { + return result_string; + } + + public void setResult_string(String resultString) { + result_string = resultString; + } + + @Param(name="created") + private Date createdDate; + + @Param(name="state") + private String state; + + @Param(name="storagetype") + String storageType; + + @Param(name="storage") + private String storage; + + @Param(name="zoneid") + private Long zoneId; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(Long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(String zoneName) { + this.zoneName = zoneName; + } + + @Param(name="zonename") + private String zoneName; + + private long size; + + public String getStorage() { + return storage; + } + + public void setStorage(String storage) { + this.storage = storage; + } + + public void setId(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setSize(long size) { + this.size = size; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public Date getCreatedDate() { + return createdDate; + } + + public void setState(String status) { + this.state = status; + } + + public String getState() { + return state; + } + + public void setStorageType (String storageType) { + this.storageType = storageType; + } + + public String getStorageType() { + return storageType; + } + +} diff --git a/server/src/com/cloud/async/executor/ExtractTemplateExecutor.java b/server/src/com/cloud/async/executor/ExtractTemplateExecutor.java new file mode 100644 index 00000000000..5a76e95ed74 --- /dev/null +++ b/server/src/com/cloud/async/executor/ExtractTemplateExecutor.java @@ -0,0 +1,37 @@ +package com.cloud.async.executor; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.async.AsyncJobManager; +import com.cloud.async.AsyncJobResult; +import com.cloud.async.AsyncJobVO; +import com.cloud.async.BaseAsyncJobExecutor; +import com.cloud.serializer.GsonHelper; +import com.cloud.server.ManagementServer; +import com.google.gson.Gson; + +public class ExtractTemplateExecutor extends BaseAsyncJobExecutor { + + public static final Logger s_logger = Logger.getLogger(ExtractTemplateExecutor.class.getName()); + @Override + public boolean execute() { + Gson gson = GsonHelper.getBuilder().create(); + AsyncJobManager asyncMgr = getAsyncJobMgr(); + AsyncJobVO job = getJob(); + + ExtractTemplateParam param = gson.fromJson(job.getCmdInfo(), ExtractTemplateParam.class); + ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); + + try { + managementServer.extractTemplate(param.getUrl(), param.getTemplateId(), param.getZoneId(), param.getEventId(), getJob().getId()); + + } catch (Exception e) { + s_logger.warn("Unable to extract template: " + e.getMessage(), e); + asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); + } + + return true; + } + +} diff --git a/server/src/com/cloud/async/executor/ExtractTemplateParam.java b/server/src/com/cloud/async/executor/ExtractTemplateParam.java new file mode 100644 index 00000000000..b42242e39c8 --- /dev/null +++ b/server/src/com/cloud/async/executor/ExtractTemplateParam.java @@ -0,0 +1,50 @@ +package com.cloud.async.executor; + +public class ExtractTemplateParam { + + private long userId; + private long templateId; + private Long zoneId; + private long eventId; + private String url; + + public ExtractTemplateParam() { + } + + public ExtractTemplateParam(long userId, long templateId, Long zoneId, long eventId, String url) { + this.userId = userId; + this.templateId = templateId; + this.zoneId = zoneId; + this.eventId = eventId; + this.url = url; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public long getUserId() { + return userId; + } + + public long getTemplateId() { + return templateId; + } + + public Long getZoneId() { + return zoneId; + } + + public void setEventId(long eventId) { + this.eventId = eventId; + } + + public long getEventId() { + return eventId; + } + +} diff --git a/server/src/com/cloud/async/executor/ExtractVolumeExecutor.java b/server/src/com/cloud/async/executor/ExtractVolumeExecutor.java new file mode 100644 index 00000000000..34cde577654 --- /dev/null +++ b/server/src/com/cloud/async/executor/ExtractVolumeExecutor.java @@ -0,0 +1,38 @@ +package com.cloud.async.executor; + +import org.apache.log4j.Logger; + +import com.cloud.api.BaseCmd; +import com.cloud.async.AsyncJobManager; +import com.cloud.async.AsyncJobResult; +import com.cloud.async.AsyncJobVO; +import com.cloud.async.BaseAsyncJobExecutor; +import com.cloud.serializer.GsonHelper; +import com.cloud.server.ManagementServer; +import com.google.gson.Gson; + +public class ExtractVolumeExecutor extends BaseAsyncJobExecutor { + + public static final Logger s_logger = Logger.getLogger(ExtractVolumeExecutor.class.getName()); + + @Override + public boolean execute() { + Gson gson = GsonHelper.getBuilder().create(); + AsyncJobManager asyncMgr = getAsyncJobMgr(); + AsyncJobVO job = getJob(); + + ExtractTemplateParam param = gson.fromJson(job.getCmdInfo(), ExtractTemplateParam.class); + ManagementServer managementServer = asyncMgr.getExecutorContext().getManagementServer(); + + try { + managementServer.extractVolume(param.getUrl(), param.getTemplateId(), param.getZoneId(), param.getEventId(), getJob().getId()); + + } catch (Exception e) { + s_logger.warn("Unable to extract volume: " + e.getMessage(), e); + asyncMgr.completeAsyncJob(getJob().getId(), AsyncJobResult.STATUS_FAILED, BaseCmd.INTERNAL_ERROR, e.getMessage()); + } + + return true; + } + +} diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 03b24c200fb..738921ac271 100644 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -47,7 +47,7 @@ public enum Config { StorageOverprovisioningFactor("Storage", StoragePoolAllocator.class, String.class, "storage.overprovisioning.factor", "2", "Used for storage overprovisioning calculation; available storage will be (actualStorageSize * storage.overprovisioning.factor)", null), StorageStatsInterval("Storage", ManagementServer.class, String.class, "storage.stats.interval", "60000", "The interval in milliseconds when storage stats (per host) are retrieved from agents.", null), - MaxVolumeSize("Storage", ManagementServer.class, Integer.class, "max.volume.size.gb", "2097152000", "The maximum size for a volume in Gb.", null), + MaxVolumeSize("Storage", ManagementServer.class, Integer.class, "max.volume.size.gb", "2093049000000", "The maximum size for a volume in bytes (2TB).", null), TotalRetries("Storage", AgentManager.class, Integer.class, "total.retries", "4", "The number of times each command sent to a host should be retried in case of failure.", null), // Network @@ -148,6 +148,10 @@ public enum Config { CheckPodCIDRs("Advanced", ManagementServer.class, String.class, "check.pod.cidrs", "true", "If true, different pods must belong to different CIDR subnets.", "true,false"), MD5Hashed("Advanced", ManagementServer.class, Boolean.class, "security.password.md5hashed", "true", "If set to false password is sent in clear text or else md5hashed", null), + ControlCidr("Advanced", ManagementServer.class, String.class, "control.cidr", "169.254.0.0/16", "Changes the cidr for the control network traffic. Defaults to using link local. Must be unique within pods", null), + ControlGateway("Advanced", ManagementServer.class, String.class, "control.gateway", "169.254.0.1", "gateway for the control network traffic", null), + + // XenServer VmAllocationAlgorithm("Advanced", ManagementServer.class, String.class, "vm.allocation.algorithm", "random", "If 'random', hosts within a pod will be randomly considered for VM/volume allocation. If 'firstfit', they will be considered on a first-fit basis.", null), XenPublicNetwork("Network", ManagementServer.class, String.class, "xen.public.network.device", null, "[ONLY IF THE PUBLIC NETWORK IS ON A DEDICATED NIC]:The network name label of the physical device dedicated to the public network on a XenServer host", null), diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 16cb9712fed..bf6f06e668f 100644 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -401,7 +401,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { checkPodAttributes(podId, newPodName, pod.getDataCenterId(), gateway, cidr, startIp, endIp, checkForDuplicates); String cidrAddress = getCidrAddress(cidr); - long cidrSize = getCidrSize(cidr); + int cidrSize = getCidrSize(cidr); if (startIp != null && endIp == null) { endIp = NetUtils.getIpRangeEndIpFromCidr(cidrAddress, cidrSize); @@ -457,7 +457,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { checkPodAttributes(-1, podName, zoneId, gateway, cidr, startIp, endIp, true); String cidrAddress = getCidrAddress(cidr); - long cidrSize = getCidrSize(cidr); + int cidrSize = getCidrSize(cidr); if (startIp != null) { if (endIp == null) { @@ -1562,9 +1562,9 @@ public class ConfigurationManagerImpl implements ConfigurationManager { return cidrPair[0]; } - private long getCidrSize(String cidr) { + private int getCidrSize(String cidr) { String[] cidrPair = cidr.split("\\/"); - return Long.parseLong(cidrPair[1]); + return Integer.parseInt(cidrPair[1]); } private String getCidrAddress(long podId) { diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 1c72bdd2905..fbfa7847e36 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -72,6 +72,7 @@ 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.deploy.DataCenterDeployment; import com.cloud.domain.DomainVO; import com.cloud.event.EventState; import com.cloud.event.EventTypes; @@ -140,6 +141,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VmManager; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.VMInstanceDao; @@ -592,8 +594,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach if (routingHost == null) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find a routing host for " + proxy.toString()); - continue; + String msg = "Unable to find a routing host for " + proxy.toString() + " in pod " + pod.getId(); + s_logger.debug(msg); + throw new CloudRuntimeException(msg); } } // to ensure atomic state transition to Starting state @@ -620,9 +623,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach String privateIpAddress = allocPrivateIpAddress(proxy.getDataCenterId(), routingHost.getPodId(), proxy.getId(), proxy.getPrivateMacAddress()); if (privateIpAddress == null && (_IpAllocator != null && !_IpAllocator.exteralIpAddressAllocatorEnabled())) { - s_logger.debug("Not enough ip addresses in " + routingHost.getPodId()); - avoid.add(routingHost); - continue; + String msg = "Unable to allocate private ip addresses for " + proxy.getName() + " in pod " + pod.getId(); + s_logger.debug(msg); + throw new CloudRuntimeException(msg); } proxy.setPrivateIpAddress(privateIpAddress); @@ -633,10 +636,10 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach proxy = _consoleProxyDao.findById(proxy.getId()); List vols = _storageMgr.prepare(proxy, routingHost); - if (vols == null) { - s_logger.debug("Unable to prepare storage for " + routingHost); - avoid.add(routingHost); - continue; + if (vols == null || vols.size() == 0) { + String msg = "Unable to prepare storage for " + proxy.getName() + " in pod " + pod.getId(); + s_logger.debug(msg); + throw new CloudRuntimeException(msg); } // _storageMgr.share(proxy, vols, null, true); @@ -953,10 +956,9 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach } if (pod == null || publicIpAndVlan == null) { - s_logger.warn("Unable to allocate pod for console proxy vm in data center : " + dataCenterId); - - context.put("proxyVmId", (long) 0); - return context; + String msg = "Unable to allocate pod for console proxy vm in data center : " + dataCenterId; + s_logger.warn(msg); + throw new CloudRuntimeException(msg); } long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); @@ -1007,118 +1009,39 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, VirtualMach } } - @DB protected Map createProxyInstance2(long dataCenterId) { long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); String name = VirtualMachineName.getConsoleProxyName(id, _instance); - DataCenterVO dc = _dcDao.findById(dataCenterId); - ConsoleProxyVO proxy = new ConsoleProxyVO(id, name, _template.getId(), _template.getGuestOSId(), dataCenterId, 0); - proxy = _consoleProxyDao.persist(proxy); + DataCenterDeployment plan = new DataCenterDeployment(dataCenterId, 1); + List offerings = _networkMgr.getSystemAccountNetworkOfferings(NetworkOfferingVO.SystemVmControlNetwork, NetworkOfferingVO.SystemVmManagementNetwork, NetworkOfferingVO.SystemVmPublicNetwork); List profiles = new ArrayList(offerings.size()); + for (NetworkOfferingVO offering : offerings) { + profiles.add(_networkMgr.setupNetworkConfiguration(_accountMgr.getSystemAccount(), offering, plan)); + } + ConsoleProxyVO proxy = new ConsoleProxyVO(id, name, _template.getId(), _template.getGuestOSId(), dataCenterId, 0); + proxy = _consoleProxyDao.persist(proxy); try { - proxy = _vmMgr.allocate(proxy, _template, _serviceOffering, profiles, dc, _accountMgr.getSystemAccount()); - proxy = _vmMgr.create(proxy); + VirtualMachineProfile vmProfile = _vmMgr.allocate(proxy, _template, _serviceOffering, profiles, plan, _accountMgr.getSystemAccount()); } catch (InsufficientCapacityException e) { s_logger.warn("InsufficientCapacity", e); - throw new CloudRuntimeException("Insufficient capcity exception", e); + throw new CloudRuntimeException("Insufficient capacity exception", e); } catch (StorageUnavailableException e) { s_logger.warn("Unable to contact storage", e); throw new CloudRuntimeException("Unable to contact storage", e); } - return null; - - -/* - Transaction txn = Transaction.currentTxn(); - try { - DataCenterVO dc = _dcDao.findById(dataCenterId); - assert (dc != null); - context.put("dc", dc); + Map context = new HashMap(); + context.put("dc", dc); +// context.put("publicIpAddress", publicIpAndVlan._ipAddr); + HostPodVO pod = _podDao.findById(proxy.getPodId()); + context.put("pod", pod); + context.put("proxyVmId", proxy.getId()); - // this will basically allocate the pod based on data center id as - // we use system user id here - Set avoidPods = new HashSet(); - Pair pod = null; - networkInfo publicIpAndVlan = null; - - // About MAC address allocation - // MAC address used by User VM is inherited from DomR MAC address, - // with the least 16 bits overrided. to avoid - // potential conflicts, domP will mask bit 31 - // - String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(dataCenterId, (1L << 31)); - String privateMacAddress = macAddresses[0]; - String publicMacAddress = macAddresses[1]; - macAddresses = _dcDao.getNextAvailableMacAddressPair(dataCenterId, (1L << 31)); - String guestMacAddress = macAddresses[0]; - while ((pod = _agentMgr.findPod(_template, _serviceOffering, dc, Account.ACCOUNT_ID_SYSTEM, avoidPods)) != null) { - publicIpAndVlan = allocPublicIpAddress(dataCenterId, pod.first().getId(), publicMacAddress); - if (publicIpAndVlan == null) { - s_logger.warn("Unable to allocate public IP address for console proxy vm in data center : " + dataCenterId + ", pod=" - + pod.first().getId()); - avoidPods.add(pod.first().getId()); - } else { - break; - } - } - - if (pod == null || publicIpAndVlan == null) { - s_logger.warn("Unable to allocate pod for console proxy vm in data center : " + dataCenterId); - - context.put("proxyVmId", (long) 0); - return context; - } - long id = _consoleProxyDao.getNextInSequence(Long.class, "id"); - - context.put("publicIpAddress", publicIpAndVlan._ipAddr); - context.put("pod", pod); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Pod allocated " + pod.first().getName()); - } - - String cidrNetmask = NetUtils.getCidrNetmask(pod.first().getCidrSize()); - - // Find the VLAN ID, VLAN gateway, and VLAN netmask for - // publicIpAddress - publicIpAddress = publicIpAndVlan._ipAddr; - - String vlanGateway = publicIpAndVlan._gateWay; - String vlanNetmask = publicIpAndVlan._netMask; - - txn.start(); - ConsoleProxyVO proxy; - String name = VirtualMachineName.getConsoleProxyName(id, _instance).intern(); - proxy = new ConsoleProxyVO(id, name, guestMacAddress, null, NetUtils.getLinkLocalNetMask(), privateMacAddress, null, cidrNetmask, - _template.getId(), _template.getGuestOSId(), publicMacAddress, publicIpAddress, vlanNetmask, publicIpAndVlan._vlanDbId, - publicIpAndVlan._vlanid, pod.first().getId(), dataCenterId, vlanGateway, null, dc.getDns1(), dc.getDns2(), _domain, - _proxyRamSize, 0); - - proxy.setLastHostId(pod.second()); - proxy = _consoleProxyDao.persist(proxy); - long proxyVmId = proxy.getId(); - - final EventVO event = new EventVO(); - event.setUserId(User.UID_SYSTEM); - event.setAccountId(Account.ACCOUNT_ID_SYSTEM); - event.setType(EventTypes.EVENT_PROXY_CREATE); - event.setLevel(EventVO.LEVEL_INFO); - event.setDescription("New console proxy created - " + proxy.getName()); - _eventDao.persist(event); - txn.commit(); - - context.put("proxyVmId", proxyVmId); - return context; - } catch (Throwable e) { - s_logger.error("Unexpected exception : ", e); - - context.put("proxyVmId", (long) 0); - return context; - }*/ + return context; } @DB diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index bd20eb9bdc1..678bea851ad 100644 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -400,7 +400,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager { if (alive== null && !fenced) { s_logger.debug("We were unable to fence off the VM " + vm.toString()); - _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "Insufficient capcity to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); + _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "Insufficient capacity to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); return (System.currentTimeMillis() >> 10) + _restartRetryInterval; } @@ -453,7 +453,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager { return (System.currentTimeMillis() >> 10) + _restartRetryInterval; } catch (final InsufficientCapacityException e) { s_logger.warn("Unable to restart " + vm.toString() + " due to " + e.getMessage()); - _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "Insufficient capcity to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); + _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to restart " + vm.getName() + " which was running on host " + hostDesc, "Insufficient capacity to restart VM, name: " + vm.getName() + ", id: " + vmId + " which was running on host " + hostDesc); return null; } catch (final StorageUnavailableException e) { s_logger.warn("Unable to restart " + vm.toString() + " due to " + e.getMessage()); @@ -722,7 +722,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager { _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to migrate vm " + vm.getName() + " from host " + fromHostName + " in zone " + dcVO.getName() + " and pod " + podVO.getName(), "Unable to find a suitable host"); } } catch(final InsufficientCapacityException e) { - s_logger.warn("Unable to mgirate due to insufficient capcity " + vm.toString()); + s_logger.warn("Unable to mgirate due to insufficient capacity " + vm.toString()); _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodId(), "Unable to migrate vm " + vm.getName() + " from host " + fromHostName + " in zone " + dcVO.getName() + " and pod " + podVO.getName(), "Insufficient capacity"); } catch(final StorageUnavailableException e) { s_logger.warn("Storage is unavailable: " + vm.toString()); diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 0f5ff922677..527d1ee1f1a 100644 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -137,9 +137,11 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } Set pools = Pool.getAll(conn); Pool pool = pools.iterator().next(); - String poolUuid = pool.getUuid(conn); + Pool.Record pr = pool.getRecord(conn); + String poolUuid = pr.uuid; Map hosts = Host.getAllRecords(conn); - + Host master = pr.master; + if (_checkHvm) { for (Map.Entry entry : hosts.entrySet()) { Host.Record record = entry.getValue(); @@ -150,7 +152,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L support_hvm = true; break; } - } + } if( !support_hvm ) { String msg = "Unable to add host " + record.address + " because it doesn't support hvm"; _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); @@ -159,8 +161,8 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } } } + for (Map.Entry entry : hosts.entrySet()) { - Host host = entry.getKey(); Host.Record record = entry.getValue(); String hostAddr = record.address; diff --git a/server/src/com/cloud/network/NetworkConfigurationVO.java b/server/src/com/cloud/network/NetworkConfigurationVO.java index 5f3326ad6e8..0605aeb4516 100644 --- a/server/src/com/cloud/network/NetworkConfigurationVO.java +++ b/server/src/com/cloud/network/NetworkConfigurationVO.java @@ -29,7 +29,8 @@ import javax.persistence.Table; import com.cloud.network.Network.BroadcastDomainType; import com.cloud.network.Network.Mode; import com.cloud.network.Network.TrafficType; -import com.cloud.vm.NetworkCharacteristics; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.net.NetUtils; /** * NetworkProfileVO contains information about a specific network. @@ -69,18 +70,38 @@ public class NetworkConfigurationVO implements NetworkConfiguration { @Column(name="data_center_id") long dataCenterId; + @Column(name="handler_name") + String handlerName; + + @Column(name="state") + @Enumerated(value=EnumType.STRING) + State state; + public NetworkConfigurationVO() { } - public NetworkConfigurationVO(NetworkConfiguration that, long accountId, long offeringId) { - this(that.getTrafficType(), that.getMode(), that.getBroadcastDomainType(), offeringId); + public NetworkConfigurationVO(NetworkConfiguration that, long offeringId, long dataCenterId, String handlerName) { + this(that.getTrafficType(), that.getMode(), that.getBroadcastDomainType(), offeringId, dataCenterId); + this.handlerName = handlerName; + this.state = that.getState(); } - public NetworkConfigurationVO(TrafficType trafficType, Mode mode, BroadcastDomainType broadcastDomainType, long networkOfferingId) { + public NetworkConfigurationVO(TrafficType trafficType, Mode mode, BroadcastDomainType broadcastDomainType, long networkOfferingId, long dataCenterId) { this.trafficType = trafficType; this.mode = mode; this.broadcastDomainType = broadcastDomainType; this.networkOfferingId = networkOfferingId; + this.dataCenterId = dataCenterId; + this.state = State.Allocated; + } + + @Override + public State getState() { + return state; + } + + public void setState(State state) { + this.state = state; } @Override @@ -106,6 +127,14 @@ public class NetworkConfigurationVO implements NetworkConfiguration { public BroadcastDomainType getBroadcastDomainType() { return broadcastDomainType; } + + public String getHandlerName() { + return handlerName; + } + + public void setHandlerName(String handlerName) { + this.handlerName = handlerName; + } public void setBroadcastDomainType(BroadcastDomainType broadcastDomainType) { this.broadcastDomainType = broadcastDomainType; @@ -134,7 +163,6 @@ public class NetworkConfigurationVO implements NetworkConfiguration { return cidr; } - @Override public void setCidr(String cidr) { this.cidr = cidr; } @@ -147,7 +175,42 @@ public class NetworkConfigurationVO implements NetworkConfiguration { this.vlanId = vlanId; } - public NetworkCharacteristics toCharacteristics() { - return new NetworkCharacteristics(id, broadcastDomainType, cidr, mode, 0); + @Override + public int hashCode() { + return NumbersUtil.hash(id); + } + + @Override + public long getDataCenterId() { + return dataCenterId; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof NetworkConfigurationVO)) { + return false; + } + NetworkConfigurationVO that = (NetworkConfigurationVO)obj; + if (this.trafficType != that.trafficType) { + return false; + } + + if (this.vlanId != null && that.vlanId != null && this.vlanId.longValue() != that.vlanId.longValue()) { + return false; + } + + if (this.vlanId != that.vlanId) { + return false; + } + + if ((this.cidr == null && that.cidr != null) || (this.cidr != null && that.cidr == null)) { + return false; + } + + if (this.cidr == null && that.cidr == null) { + return true; + } + + return NetUtils.isNetworkAWithinNetworkB(this.cidr, that.cidr); } } diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 4aec20e783a..f47d133f3e8 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -26,8 +26,12 @@ import com.cloud.async.executor.LoadBalancerParam; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.VlanVO; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.exception.ResourceAllocationException; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.service.ServiceOfferingVO; @@ -36,9 +40,11 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.Manager; import com.cloud.vm.DomainRouter; import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachineProfile; /** * NetworkManager manages the network for the different end users. @@ -170,9 +176,10 @@ public interface NetworkManager extends Manager { * @param router router object to send the association to * @param ipAddrList list of public IP addresses * @param add true if associate, false if disassociate + * @param vmId * @return */ - boolean associateIP(DomainRouterVO router, List ipAddrList, boolean add) throws ResourceAllocationException; + boolean associateIP(DomainRouterVO router, List ipAddrList, boolean add, long vmId) throws ResourceAllocationException; boolean updateFirewallRule(FirewallRuleVO fwRule, String oldPrivateIP, String oldPrivatePort); boolean executeAssignToLoadBalancer(AssignToLoadBalancerExecutor executor, LoadBalancerParam param); @@ -213,15 +220,17 @@ public interface NetworkManager extends Manager { */ List listPublicIpAddressesInVirtualNetwork(long accountId, long dcId, Boolean sourceNat); - NetworkConfigurationVO setupNetworkProfile(AccountVO account, NetworkOfferingVO offering); - NetworkConfigurationVO setupNetworkProfile(AccountVO account, NetworkOfferingVO offering, Map params); - List setupNetworkProfiles(AccountVO account, List offerings); + NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, DeploymentPlan plan); + NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, NetworkConfiguration predefined, DeploymentPlan plan); + List setupNetworkConfigurations(AccountVO owner, List offerings, DeploymentPlan plan); List getSystemAccountNetworkOfferings(String... offeringNames); - List allocate(K vm, List> networks) throws InsufficientCapacityException; + List allocate(K vm, List> networks) throws InsufficientCapacityException; - List prepare(K vm); + List prepare(VirtualMachineProfile profile, DeployDestination dest) throws InsufficientAddressCapacityException, InsufficientVirtualNetworkCapcityException; void create(K vm); + + List getNics(K vm); } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 2c96fef5b8c..f40f4717c9c 100644 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -79,6 +79,7 @@ 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.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -88,7 +89,9 @@ import com.cloud.event.EventVO; import com.cloud.event.dao.EventDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.NetworkRuleConflictException; @@ -102,6 +105,7 @@ import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; import com.cloud.network.Network.TrafficType; +import com.cloud.network.configuration.NetworkGuru; import com.cloud.network.dao.FirewallRulesDao; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; @@ -111,6 +115,8 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.GuestIpType; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.resource.Resource; +import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.StorageManager; @@ -148,7 +154,7 @@ import com.cloud.vm.DomainRouter; import com.cloud.vm.DomainRouter.Role; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NetworkConcierge; -import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; import com.cloud.vm.State; import com.cloud.vm.UserVmVO; @@ -157,6 +163,7 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineName; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.UserVmDao; @@ -205,7 +212,9 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Inject NetworkConfigurationDao _networkProfileDao = null; @Inject NicDao _nicDao; - Adapters _networkProfilers; + @Inject(adapter=NetworkGuru.class) + Adapters _networkGurus; + @Inject(adapter=NetworkConcierge.class) Adapters _networkConcierges; long _routerTemplateId = -1; @@ -1109,7 +1118,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager ipAddrList.add(ipVO.getAddress()); } if (!ipAddrList.isEmpty()) { - final boolean success = associateIP(router, ipAddrList, true); + final boolean success = associateIP(router, ipAddrList, true, 0); if (!success) { return false; } @@ -1344,7 +1353,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } @Override - public boolean associateIP(final DomainRouterVO router, final List ipAddrList, final boolean add) { + public boolean associateIP(final DomainRouterVO router, final List ipAddrList, final boolean add, long vmId) { final Command [] cmds = new Command[ipAddrList.size()]; int i=0; boolean sourceNat = false; @@ -1365,7 +1374,12 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager vifMacAddress = macAddresses[1]; } - cmds[i++] = new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ipAddress, add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress); + String vmGuestAddress = null; + if(vmId!=0){ + vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); + } + + cmds[i++] = new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ipAddress, add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress); sourceNat = false; } @@ -1708,7 +1722,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager s_logger.debug("Disassociate ip " + router.getName()); } - if (associateIP(router, ipAddrs, false)) { + if (associateIP(router, ipAddrs, false, 0)) { _ipAddressDao.unassignIpAddress(ipAddress); } else { if (s_logger.isDebugEnabled()) { @@ -1792,7 +1806,7 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterMonitor")); final ComponentLocator locator = ComponentLocator.getCurrentLocator(); - _networkProfilers = locator.getAdapters(NetworkProfiler.class); + _networkGurus = locator.getAdapters(NetworkGuru.class); _networkConcierges = locator.getAdapters(NetworkConcierge.class); final Map configs = _configDao.getConfiguration("AgentManager", params); @@ -2342,14 +2356,22 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } @Override - public NetworkConfigurationVO setupNetworkProfile(AccountVO owner, NetworkOfferingVO offering) { - return setupNetworkProfile(owner, offering, new HashMap()); + public NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, DeploymentPlan plan) { + return setupNetworkConfiguration(owner, offering, null, plan); } @Override - public NetworkConfigurationVO setupNetworkProfile(AccountVO owner, NetworkOfferingVO offering, Map params) { - for (NetworkProfiler profiler : _networkProfilers) { - NetworkConfiguration profile = profiler.convert(offering, null, params, owner); + public NetworkConfigurationVO setupNetworkConfiguration(AccountVO owner, NetworkOfferingVO offering, NetworkConfiguration predefined, DeploymentPlan plan) { + List configs = _networkProfileDao.listBy(owner.getId(), offering.getId(), plan.getDataCenterId()); + if (configs.size() > 0) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Found existing network configuration for offering " + offering + ": " + configs.get(0)); + } + return configs.get(0); + } + + for (NetworkGuru guru : _networkGurus) { + NetworkConfiguration profile = guru.design(offering, plan, predefined, owner); if (profile == null) { continue; } @@ -2362,18 +2384,18 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager } } - NetworkConfigurationVO vo = new NetworkConfigurationVO(profile, owner.getId(), offering.getId()); - return _networkProfileDao.persist(vo); + NetworkConfigurationVO vo = new NetworkConfigurationVO(profile, offering.getId(), plan.getDataCenterId(), guru.getName()); + return _networkProfileDao.persist(vo, owner.getId()); } throw new CloudRuntimeException("Unable to convert network offering to network profile: " + offering.getId()); } @Override - public List setupNetworkProfiles(AccountVO owner, List offerings) { + public List setupNetworkConfigurations(AccountVO owner, List offerings, DeploymentPlan plan) { List profiles = new ArrayList(offerings.size()); for (NetworkOfferingVO offering : offerings) { - profiles.add(setupNetworkProfile(owner, offering)); + profiles.add(setupNetworkConfiguration(owner, offering, plan)); } return profiles; } @@ -2397,49 +2419,78 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager @Override @DB - public List allocate(K vm, List> networks) throws InsufficientCapacityException { - List nics = new ArrayList(networks.size()); + public List allocate(K vm, List> networks) throws InsufficientCapacityException { + List nicProfiles = new ArrayList(networks.size()); Transaction txn = Transaction.currentTxn(); txn.start(); - for (Pair network : networks) { + int deviceId = 0; + + for (Pair network : networks) { for (NetworkConcierge concierge : _networkConcierges) { - Nic nic = concierge.allocate(vm, network.first(), network.second()); - if (nic == null) { + NicProfile profile = concierge.allocate(vm, network.first(), network.second()); + if (profile == null) { continue; } NicVO vo = new NicVO(concierge.getUniqueName(), vm.getId(), network.first().getId()); - - if (nic.getIp4Address() != null) { - vo.setIp4Address(nic.getIp4Address()); - vo.setState(NicVO.State.IpAcquired); + vo.setDeviceId(deviceId++); + vo.setMode(network.first().getMode()); + if (profile.getIp4Address() != null) { + vo.setIp4Address(profile.getIp4Address()); + vo.setState(NicVO.State.Reserved); } - if (nic.getMacAddress() != null) { - vo.setMacAddress(nic.getMacAddress()); + if (profile.getMacAddress() != null) { + vo.setMacAddress(profile.getMacAddress()); } - if (nic.getMode() != null) { - vo.setMode(nic.getMode()); + if (profile.getMode() != null) { + vo.setMode(profile.getMode()); } vo = _nicDao.persist(vo); - nics.add(vo); + nicProfiles.add(new NicProfile(vo, network.first())); } } txn.commit(); - return nics; + return nicProfiles; } @Override - public List prepare(K vm) { + public List prepare(VirtualMachineProfile vmProfile, DeployDestination dest) throws InsufficientAddressCapacityException, InsufficientVirtualNetworkCapcityException { + List nics = _nicDao.listBy(vmProfile.getId()); + for (NicVO nic : nics) { + NetworkConfigurationVO config = _networkProfileDao.findById(nic.getNetworkConfigurationId()); + + if (nic.getReservationStrategy() == ReservationStrategy.Start) { + NetworkConcierge concierge = _networkConcierges.get(nic.getReserver()); + nic.setState(Resource.State.Reserving); + _nicDao.update(nic.getId(), nic); + concierge.reserve(vmProfile.getId(), toNicProfile(nic), dest); + } else { + + } + } return null; } + NicProfile toNicProfile(NicVO nic) { + NetworkConfiguration config = _networkProfileDao.findById(nic.getNetworkConfigurationId()); + NicProfile profile = new NicProfile(nic, config); + return profile; + } + @Override public void create(K vm) { + for (NetworkConcierge concierge : _networkConcierges) { + } + } + + @Override + public List getNics(K vm) { + return _nicDao.listBy(vm.getId()); } protected class NetworkUsageTask implements Runnable { diff --git a/server/src/com/cloud/network/configuration/ControlNetworkGuru.java b/server/src/com/cloud/network/configuration/ControlNetworkGuru.java new file mode 100644 index 00000000000..6daa2b8d035 --- /dev/null +++ b/server/src/com/cloud/network/configuration/ControlNetworkGuru.java @@ -0,0 +1,127 @@ +/** + * + */ +package com.cloud.network.configuration; + +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +import org.apache.log4j.Logger; + +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; +import com.cloud.network.Network.BroadcastDomainType; +import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; +import com.cloud.network.NetworkConfiguration; +import com.cloud.network.NetworkConfigurationVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.user.Account; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.ComponentLocator; +import com.cloud.utils.component.Inject; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.NetworkConcierge; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; + +@Local(value={NetworkGuru.class, NetworkConcierge.class}) +public class ControlNetworkGuru extends AdapterBase implements NetworkGuru, NetworkConcierge { + private static final Logger s_logger = Logger.getLogger(ControlNetworkGuru.class); + @Inject DataCenterDao _dcDao; + String _cidr; + String _gateway; + + @Override + public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration specifiedConfig, Account owner) { + if (offering.getTrafficType() != TrafficType.Control) { + return null; + } + + NetworkConfigurationVO config = new NetworkConfigurationVO(offering.getTrafficType(), Mode.Static, BroadcastDomainType.LinkLocal, offering.getId(), plan.getDataCenterId()); + config.setCidr(_cidr); + config.setGateway(_gateway); + + return config; + } + + protected ControlNetworkGuru() { + super(); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + super.configure(name, params); + + ComponentLocator locator = ComponentLocator.getCurrentLocator(); + + ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); + Map dbParams = configDao.getConfiguration(params); + + _cidr = dbParams.get(Config.ControlCidr); + if (_cidr == null) { + _cidr = "169.254.0.0/16"; + } + + _gateway = dbParams.get(Config.ControlGateway); + if (_gateway == null) { + _gateway = "169.254.0.1"; + } + + s_logger.info("Control network setup: cidr=" + _cidr + "; gateway = " + _gateway); + + return true; + } + + @Override + public String getUniqueName() { + return getName(); + } + + @Override + public NicProfile allocate(VirtualMachine vm, NetworkConfiguration config, NicProfile nic) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException { + if (config.getTrafficType() != TrafficType.Control) { + return null; + } + + if (nic != null) { + throw new CloudRuntimeException("Does not support nic specification at this time: " + nic); + } + + return new NicProfile(null, null, null); + } + + @Override + public boolean create(Nic nic) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + return true; + } + + @Override + public String reserve(long vmId, NicProfile nic, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException { + String ip = _dcDao.allocateLinkLocalPrivateIpAddress(dest.getDataCenter().getId(), dest.getPod().getId(), vmId); + nic.setIp4Address(ip); + nic.setMacAddress("FE:FF:FF:FF:FF:FF"); + return Long.toString(nic.getId()); + } + + @Override + public boolean release(String uniqueName, String uniqueId) { + _dcDao.releaseLinkLocalPrivateIpAddress(Long.parseLong(uniqueId)); + return true; + } + + @Override + public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) { + return config; + } +} diff --git a/server/src/com/cloud/network/NetworkProfilerImpl.java b/server/src/com/cloud/network/configuration/GuestNetworkGuru.java similarity index 50% rename from server/src/com/cloud/network/NetworkProfilerImpl.java rename to server/src/com/cloud/network/configuration/GuestNetworkGuru.java index ff346a5d778..1f76612cadd 100644 --- a/server/src/com/cloud/network/NetworkProfilerImpl.java +++ b/server/src/com/cloud/network/configuration/GuestNetworkGuru.java @@ -1,45 +1,41 @@ /** * */ -package com.cloud.network; - -import java.util.Collection; -import java.util.List; -import java.util.Map; +package com.cloud.network.configuration; import javax.ejb.Local; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; -import com.cloud.exception.ConflictingNetworkSettingsException; import com.cloud.network.Network.BroadcastDomainType; import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; +import com.cloud.network.NetworkConfiguration; +import com.cloud.network.NetworkConfigurationVO; import com.cloud.network.dao.NetworkConfigurationDao; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.GuestIpType; -import com.cloud.offering.ServiceOffering; import com.cloud.user.Account; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.Inject; -import com.cloud.vm.VirtualMachine; -@Local(value=NetworkProfiler.class) -public class NetworkProfilerImpl extends AdapterBase implements NetworkProfiler { +@Local(value=NetworkGuru.class) +public class GuestNetworkGuru extends AdapterBase implements NetworkGuru { @Inject protected NetworkConfigurationDao _profileDao; @Inject protected DataCenterDao _dcDao; + @Inject protected VlanDao _vlanDao; - protected NetworkProfilerImpl() { + protected GuestNetworkGuru() { super(); - } + } @Override - public NetworkConfiguration convert(NetworkOffering offering, DeploymentPlan plan, Map params, Account owner) { - List profiles = _profileDao.listBy(owner.getId(), offering.getId()); - - for (NetworkConfigurationVO profile : profiles) { - // FIXME: We should do more comparisons such as if the specific cidr matches. - return profile; + public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration userSpecified, Account owner) { + if (offering.getTrafficType() != TrafficType.Guest) { + return null; } GuestIpType ipType = offering.getGuestIpType(); @@ -53,22 +49,16 @@ public class NetworkProfilerImpl extends AdapterBase implements NetworkProfiler mode = Mode.Dhcp; } - NetworkConfigurationVO profile = new NetworkConfigurationVO(offering.getTrafficType(), mode, broadcastType, offering.getId()); + NetworkConfigurationVO profile = new NetworkConfigurationVO(offering.getTrafficType(), mode, broadcastType, offering.getId(), plan.getDataCenterId()); DataCenterVO dc = _dcDao.findById(plan.getDataCenterId()); + return profile; } @Override - public List convert(Collection networkOfferings, Account owner) { - List profiles = _profileDao.listBy(owner.getId()); - for (NetworkOffering offering : networkOfferings) { - } + public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) { + // TODO Auto-generated method stub return null; } - @Override - public boolean check(VirtualMachine vm, ServiceOffering serviceOffering, Collection networkProfiles) throws ConflictingNetworkSettingsException { - return false; - } - } diff --git a/server/src/com/cloud/network/configuration/GuruUtils.java b/server/src/com/cloud/network/configuration/GuruUtils.java new file mode 100644 index 00000000000..1b6c9c04bff --- /dev/null +++ b/server/src/com/cloud/network/configuration/GuruUtils.java @@ -0,0 +1,9 @@ +/** + * + */ +package com.cloud.network.configuration; + +public final class GuruUtils { + + +} diff --git a/server/src/com/cloud/network/configuration/PodBasedNetworkGuru.java b/server/src/com/cloud/network/configuration/PodBasedNetworkGuru.java new file mode 100644 index 00000000000..3b446ccbb9a --- /dev/null +++ b/server/src/com/cloud/network/configuration/PodBasedNetworkGuru.java @@ -0,0 +1,102 @@ +/** + * + */ +package com.cloud.network.configuration; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + +import com.cloud.dc.Pod; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; +import com.cloud.network.Network.BroadcastDomainType; +import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; +import com.cloud.network.NetworkConfiguration; +import com.cloud.network.NetworkConfigurationVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.user.Account; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.Inject; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.NetworkConcierge; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; + +@Local(value={NetworkGuru.class, NetworkConcierge.class}) +public class PodBasedNetworkGuru extends AdapterBase implements NetworkGuru, NetworkConcierge { + private static final Logger s_logger = Logger.getLogger(PodBasedNetworkGuru.class); + @Inject DataCenterDao _dcDao; + + @Override + public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration userSpecified, Account owner) { + TrafficType type = offering.getTrafficType(); + + if (type != TrafficType.Management && type != TrafficType.Storage) { + return null; + } + + NetworkConfigurationVO config = new NetworkConfigurationVO(type, Mode.Static, BroadcastDomainType.Native, offering.getId(), plan.getDataCenterId()); + + return config; + } + + protected PodBasedNetworkGuru() { + super(); + } + + @Override + public String getUniqueName() { + return getName(); + } + + @Override + public NicProfile allocate(VirtualMachine vm, NetworkConfiguration config, NicProfile nic) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException { + TrafficType trafficType = config.getTrafficType(); + if (trafficType != TrafficType.Storage && trafficType != TrafficType.Management) { + return null; + } + + if (nic != null) { + throw new CloudRuntimeException("Does not support nic configuration"); + } + + NicProfile profile = new NicProfile(null, null, null); + return profile; + } + + @Override + public boolean create(Nic nic) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + return true; + } + + @Override + public String reserve(long vmId, NicProfile nic, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException { + Pod pod = dest.getPod(); + String ip = _dcDao.allocatePrivateIpAddress(dest.getDataCenter().getId(), dest.getPod().getId(), nic.getId()); + nic.setIp4Address(ip); + nic.setCidr(pod.getCidrAddress() + "/" + pod.getCidrSize()); + + return Long.toString(nic.getId()); + } + + @Override + public boolean release(String uniqueName, String uniqueId) { + _dcDao.releasePrivateIpAddress(Long.parseLong(uniqueId)); + return true; + } + + @Override + public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/server/src/com/cloud/network/configuration/PublicNetworkGuru.java b/server/src/com/cloud/network/configuration/PublicNetworkGuru.java new file mode 100644 index 00000000000..64e2aa7519c --- /dev/null +++ b/server/src/com/cloud/network/configuration/PublicNetworkGuru.java @@ -0,0 +1,87 @@ +/** + * + */ +package com.cloud.network.configuration; + +import javax.ejb.Local; + +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapcityException; +import com.cloud.network.Network.BroadcastDomainType; +import com.cloud.network.Network.Mode; +import com.cloud.network.Network.TrafficType; +import com.cloud.network.NetworkConfiguration; +import com.cloud.network.NetworkConfigurationVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.user.Account; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.component.Inject; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.NetworkConcierge; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.VirtualMachine; + +@Local(value={NetworkGuru.class, NetworkConcierge.class}) +public class PublicNetworkGuru extends AdapterBase implements NetworkGuru, NetworkConcierge { + @Inject DataCenterDao _dcDao; + + @Override + public NetworkConfiguration design(NetworkOffering offering, DeploymentPlan plan, NetworkConfiguration config, Account owner) { + if (offering.getTrafficType() != TrafficType.Public) { + return null; + } + + return new NetworkConfigurationVO(offering.getTrafficType(), Mode.Static, BroadcastDomainType.Vlan, offering.getId(), plan.getDataCenterId()); + } + + protected PublicNetworkGuru() { + super(); + } + + @Override + public String getUniqueName() { + return getName(); + } + + @Override + public NicProfile allocate(VirtualMachine vm, NetworkConfiguration config, NicProfile nic) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException { + if (config.getTrafficType() != TrafficType.Public) { + return null; + } + + if (nic != null) { + throw new CloudRuntimeException("Unsupported nic settings"); + } + + return new NicProfile(null, null, null); + } + + @Override + public boolean create(Nic nic) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { + return true; + } + + @Override + public String reserve(long vmId, NicProfile ch, DeployDestination dest) throws InsufficientVirtualNetworkCapcityException, + InsufficientAddressCapacityException { + + return null; + } + + @Override + public boolean release(String uniqueName, String uniqueId) { + return false; + } + + @Override + public NetworkConfiguration implement(NetworkConfiguration config, NetworkOffering offering, DeployDestination destination) { + + // TODO Auto-generated method stub + return null; + } +} diff --git a/server/src/com/cloud/network/dao/NetworkConfigurationDao.java b/server/src/com/cloud/network/dao/NetworkConfigurationDao.java index f5f3b0cd640..a842a38d4f2 100644 --- a/server/src/com/cloud/network/dao/NetworkConfigurationDao.java +++ b/server/src/com/cloud/network/dao/NetworkConfigurationDao.java @@ -24,5 +24,7 @@ import com.cloud.utils.db.GenericDao; public interface NetworkConfigurationDao extends GenericDao { List listBy(long accountId); - List listBy(long accountId, long offeringId); + List listBy(long accountId, long offeringId, long dataCenterId); + NetworkConfigurationVO persist(NetworkConfigurationVO config, long accountId); + void addAccountToNetworkConfiguration(long configId, long accountId); } diff --git a/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java b/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java index 3bfee58ef6c..f8b5b7e6ecb 100644 --- a/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java +++ b/server/src/com/cloud/network/dao/NetworkConfigurationDaoImpl.java @@ -27,14 +27,18 @@ import com.cloud.network.Network.TrafficType; import com.cloud.network.NetworkAccountDaoImpl; import com.cloud.network.NetworkAccountVO; import com.cloud.network.NetworkConfigurationVO; +import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; -@Local(value=NetworkConfigurationDao.class) +@Local(value=NetworkConfigurationDao.class) @DB(txn=false) public class NetworkConfigurationDaoImpl extends GenericDaoBase implements NetworkConfigurationDao { final SearchBuilder ProfileSearch; final SearchBuilder AccountSearch; + final SearchBuilder OfferingSearch; + NetworkAccountDaoImpl _accountsDao = new NetworkAccountDaoImpl(); protected NetworkConfigurationDaoImpl() { @@ -44,29 +48,31 @@ public class NetworkConfigurationDaoImpl extends GenericDaoBase join = _accountsDao.createSearchBuilder(); - join.and("account", join.entity().getAccountId(), SearchCriteria.Op.EQ); - ProfileSearch.join("accounts", join, ProfileSearch.entity().getId(), join.entity().getNetworkConfigurationId()); + ProfileSearch.and("offering", ProfileSearch.entity().getNetworkOfferingId(), SearchCriteria.Op.EQ); + ProfileSearch.and("datacenter", ProfileSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); ProfileSearch.done(); AccountSearch = createSearchBuilder(); AccountSearch.and("offering", AccountSearch.entity().getNetworkOfferingId(), SearchCriteria.Op.EQ); - join = _accountsDao.createSearchBuilder(); + SearchBuilder join = _accountsDao.createSearchBuilder(); join.and("account", join.entity().getAccountId(), SearchCriteria.Op.EQ); AccountSearch.join("accounts", join, AccountSearch.entity().getId(), join.entity().getNetworkConfigurationId()); + AccountSearch.and("datacenter", AccountSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); AccountSearch.done(); - - + + OfferingSearch = createSearchBuilder(); + OfferingSearch.and("offering", OfferingSearch.entity().getNetworkOfferingId(), SearchCriteria.Op.EQ); + OfferingSearch.and("datacenter", OfferingSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); } - public NetworkConfigurationVO findBy(TrafficType trafficType, Mode mode, BroadcastDomainType broadcastType, long accountId) { + public List findBy(TrafficType trafficType, Mode mode, BroadcastDomainType broadcastType, long networkOfferingId, long dataCenterId) { SearchCriteria sc = ProfileSearch.create(); sc.setParameters("trafficType", trafficType); sc.setParameters("broadcastType", broadcastType); - sc.setJoinParameters("accounts", "account", accountId); - - return null; + sc.setParameters("offering", networkOfferingId); + sc.setParameters("datacenter", dataCenterId); + return search(sc, null); } @Override @@ -75,15 +81,37 @@ public class NetworkConfigurationDaoImpl extends GenericDaoBase listBy(long accountId, long offeringId) { + public List listBy(long accountId, long offeringId, long dataCenterId) { SearchCriteria sc = AccountSearch.create(); sc.setParameters("offering", offeringId); sc.setJoinParameters("accounts", "account", accountId); + sc.setParameters("datacenter", dataCenterId); - return listActiveBy(sc); + return listBy(sc); + } + + @Override + public NetworkConfigurationVO persist(NetworkConfigurationVO config) { + throw new UnsupportedOperationException("Use the persist for NetworkConfigurationDao"); + } + + @Override @DB + public NetworkConfigurationVO persist(NetworkConfigurationVO config, long accountId) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + config = super.persist(config); + addAccountToNetworkConfiguration(config.getId(), accountId); + txn.commit(); + return config; + } + + @Override + public void addAccountToNetworkConfiguration(long configurationId, long accountId) { + NetworkAccountVO account = new NetworkAccountVO(configurationId, accountId); + _accountsDao.persist(account); } } diff --git a/server/src/com/cloud/network/router/DomainRouterManager.java b/server/src/com/cloud/network/router/DomainRouterManager.java new file mode 100644 index 00000000000..e8ec0add3f3 --- /dev/null +++ b/server/src/com/cloud/network/router/DomainRouterManager.java @@ -0,0 +1,10 @@ +/** + * + */ +package com.cloud.network.router; + +import com.cloud.utils.component.Manager; + +public interface DomainRouterManager extends Manager { + +} diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java new file mode 100644 index 00000000000..6374652e535 --- /dev/null +++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java @@ -0,0 +1,35 @@ +/** + * + */ +package com.cloud.network.router; + +import java.util.Map; + +import javax.ejb.Local; +import javax.naming.ConfigurationException; + +@Local(value=DomainRouterManager.class) +public class DomainRouterManagerImpl implements DomainRouterManager { + String _name; + + @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; + } +} diff --git a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java index 95bfae9cc00..dc63e8dd0a8 100644 --- a/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java +++ b/server/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -29,7 +29,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase _availableIdsMap; private boolean _networkGroupsEnabled = false; @@ -442,6 +451,7 @@ public class ManagementServerImpl implements ManagementServer { _snapMgr = locator.getManager(SnapshotManager.class); _snapshotScheduler = locator.getManager(SnapshotScheduler.class); _networkGroupMgr = locator.getManager(NetworkGroupManager.class); + _uploadMonitor = locator.getManager(UploadMonitor.class); _userAuthenticators = locator.getAdapters(UserAuthenticator.class); if (_userAuthenticators == null || !_userAuthenticators.isSet()) { @@ -462,10 +472,10 @@ public class ManagementServerImpl implements ManagementServer { // Parse the max number of UserVMs and public IPs from server-setup.xml, // and set them in the right places - String maxVolumeSizeInGbString = _configs.get("max.volume.size.gb"); - int maxVolumeSizeGb = NumbersUtil.parseInt(maxVolumeSizeInGbString, 2097152000); + String maxVolumeSizeInTbString = _configs.get("max.volume.size.gb"); + long maxVolumeSizeBytes = NumbersUtil.parseLong(maxVolumeSizeInTbString, new Long("2093049000000")); - _maxVolumeSizeInGb = maxVolumeSizeGb; + _maxVolumeSizeInGb = maxVolumeSizeBytes/1000000000; _routerRamSize = NumbersUtil.parseInt(_configs.get("router.ram.size"),NetworkManager.DEFAULT_ROUTER_VM_RAMSIZE); _proxyRamSize = NumbersUtil.parseInt(_configs.get("consoleproxy.ram.size"), ConsoleProxyManager.DEFAULT_PROXY_VM_RAMSIZE); @@ -1478,7 +1488,7 @@ public class ManagementServerImpl implements ManagementServer { boolean success = true; String params = "\nsourceNat=" + false + "\ndcId=" + zoneId; ArrayList dummyipAddrList = new ArrayList(); - success = _networkMgr.associateIP(router,ipAddrsList, true); + success = _networkMgr.associateIP(router,ipAddrsList, true, 0); String errorMsg = "Unable to assign public IP address pool"; if (!success) { s_logger.debug(errorMsg); @@ -1509,7 +1519,7 @@ public class ManagementServerImpl implements ManagementServer { @Override @DB - public String associateIpAddress(long userId, long accountId, long domainId, long zoneId) throws ResourceAllocationException, InsufficientAddressCapacityException, + public String associateIpAddress(long userId, long accountId, long domainId, long zoneId, long vmId) throws ResourceAllocationException, InsufficientAddressCapacityException, InvalidParameterValueException, InternalErrorException { Transaction txn = Transaction.currentTxn(); AccountVO account = null; @@ -1561,7 +1571,7 @@ public class ManagementServerImpl implements ManagementServer { ipAddrs.add(ipAddress); if (router.getState() == State.Running) { - success = _networkMgr.associateIP(router, ipAddrs, true); + success = _networkMgr.associateIP(router, ipAddrs, true, vmId); if (!success) { errorMsg = "Unable to assign public IP address."; } @@ -4803,9 +4813,9 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public void extractVolume(String url, Long volumeId, Long zoneId) throws URISyntaxException, InternalErrorException{ - - URI uri = new URI(url); + public long extractVolumeAsync(String url, Long volumeId, Long zoneId) throws URISyntaxException{ + + URI uri = new URI(url); if ( (uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp") )) { throw new IllegalArgumentException("Unsupported scheme for url: " + url); } @@ -4827,6 +4837,31 @@ public class ManagementServerImpl implements ManagementServer { throw new IllegalArgumentException("Please specify a valid zone."); } + VolumeVO volume = findVolumeById(volumeId); + if ( _uploadMonitor.isTypeUploadInProgress(volumeId, Type.VOLUME) ){ + throw new IllegalArgumentException(volume.getName() + " upload is in progress. Please wait for some time to schedule another upload for the same"); + } + + long userId = UserContext.current().getUserId(); + long accountId = volume.getAccountId(); + long eventId = saveScheduledEvent(userId, accountId, EventTypes.EVENT_VOLUME_UPLOAD, "Extraction job"); + + ExtractTemplateParam param = new ExtractTemplateParam(userId, volumeId, zoneId, eventId , url); + Gson gson = GsonHelper.getBuilder().create(); + + AsyncJobVO job = new AsyncJobVO(); + job.setUserId(userId); + job.setAccountId(accountId); + job.setCmd("ExtractVolume"); + job.setCmdInfo(gson.toJson(param)); + job.setCmdOriginator(ExtractVolumeCmd.getStaticName()); + return _asyncMgr.submitAsyncJob(job); + + } + + @Override + public void extractVolume(String url, Long volumeId, Long zoneId, long eventId, Long asyncJobId) throws URISyntaxException, InternalErrorException{ + VolumeVO volume = findVolumeById(volumeId); String secondaryStorageURL = _storageMgr.getSecondaryStorageURL(zoneId); StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId()); @@ -4837,16 +4872,15 @@ public class ManagementServerImpl implements ManagementServer { CopyVolumeAnswer cvAnswer = (CopyVolumeAnswer) _agentMgr.easySend(sourceHostId, cvCmd); if (cvAnswer == null || !cvAnswer.getResult()) { - throw new InternalErrorException("Failed to copy the volume from the source primary storage pool to secondary storage."); + throw new InternalErrorException("Failed to copy the volume from the source primary storage pool to secondary storage."); } - - + + _uploadMonitor.extractVolume(volume, url, zoneId, "volumes/"+volume.getId()+"/"+cvAnswer.getVolumePath()+".vhd", eventId, asyncJobId, _asyncMgr); } @Override - public void extractTemplate(String url, Long templateId, Long zoneId) throws URISyntaxException{ - + public long extractTemplateAsync(String url, Long templateId, Long zoneId) throws URISyntaxException{ URI uri = new URI(url); if ( (uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp") )) { throw new IllegalArgumentException("Unsupported scheme for url: " + url); @@ -4876,7 +4910,38 @@ public class ManagementServerImpl implements ManagementServer { throw new IllegalArgumentException("The template hasnt been downloaded "); } - _tmpltMgr.extract(template, url, tmpltHostRef, zoneId); + boolean isISO = template.getFormat() == ImageFormat.ISO; + if ( _uploadMonitor.isTypeUploadInProgress(templateId, isISO ? Type.ISO : Type.TEMPLATE) ){ + throw new IllegalArgumentException(template.getName() + " upload is in progress. Please wait for some time to schedule another upload for the same"); + } + + long userId = UserContext.current().getUserId(); + long accountId = template.getAccountId(); + String event = isISO ? EventTypes.EVENT_ISO_UPLOAD : EventTypes.EVENT_TEMPLATE_UPLOAD; + long eventId = saveScheduledEvent(userId, accountId, event, "Extraction job"); + + ExtractTemplateParam param = new ExtractTemplateParam(userId, templateId, zoneId, eventId , url); + Gson gson = GsonHelper.getBuilder().create(); + + AsyncJobVO job = new AsyncJobVO(); + job.setUserId(userId); + job.setAccountId(accountId); + job.setCmd("ExtractTemplate"); + job.setCmdInfo(gson.toJson(param)); + job.setCmdOriginator(isISO ? ExtractIsoCmd.getStaticName() : ExtractTemplateCmd.getStaticName()); + + return _asyncMgr.submitAsyncJob(job); + + } + + @Override + public void extractTemplate(String url, Long templateId, Long zoneId, long eventId, long asyncJobId) throws URISyntaxException{ + + VMTemplateVO template = findTemplateById(templateId); + VMTemplateHostVO tmpltHostRef = findTemplateHostRef(templateId, zoneId); + String event = template.getFormat() == ImageFormat.ISO ? EventTypes.EVENT_ISO_UPLOAD : EventTypes.EVENT_TEMPLATE_UPLOAD; + saveStartedEvent(template.getAccountId(), template.getAccountId(), event, "Starting upload of " +template.getName()+ " to " +url, eventId); + _tmpltMgr.extract(template, url, tmpltHostRef, zoneId, eventId, asyncJobId, _asyncMgr); } @@ -7065,13 +7130,16 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException { - if (numGibibytes!=0 && numGibibytes < 1) { - throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb."); - } else if (numGibibytes > _maxVolumeSizeInGb) { - throw new InvalidParameterValueException("The maximum size for a disk is " + _maxVolumeSizeInGb + " Gb."); + public DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException, InternalErrorException { + + if(numGibibytes!=0 && numGibibytes<1){ + throw new InvalidParameterValueException("The minimum disk offering size is 1 GB"); + } + + if (numGibibytes > _maxVolumeSizeInGb) { + throw new InvalidParameterValueException("The maximum allowed size for a disk is " + _maxVolumeSizeInGb + " Gb."); } - + return _configMgr.createDiskOffering(userId, domainId, name, description, numGibibytes, tags); } @@ -8792,10 +8860,10 @@ public class ManagementServerImpl implements ManagementServer { @Override public boolean validateCustomVolumeSizeRange(long size) throws InvalidParameterValueException { - if (size<0 || (size>0 && size < 1)) { - throw new InvalidParameterValueException("Please specify a size of at least 1 Gb."); - } else if (size > _maxVolumeSizeInGb) { - throw new InvalidParameterValueException("The maximum size allowed is " + _maxVolumeSizeInGb + " Gb."); + if (size<0 || (size>0 && size < 2097152)) { + throw new InvalidParameterValueException("Please specify a size (in bytes) of at least 2 MB or above."); + } else if (size > (_maxVolumeSizeInGb*1000000000)) { + throw new InvalidParameterValueException("The maximum size allowed is 2 TB"); } return true; @@ -8831,15 +8899,8 @@ public class ManagementServerImpl implements ManagementServer { if(networkGroupsEnabled == null) networkGroupsEnabled = "false"; - capabilities.put("networkGroupsEnabled", networkGroupsEnabled); - - final Class c = this.getClass(); - String fullVersion = c.getPackage().getImplementationVersion(); - String version = "unknown"; - if(fullVersion.length() > 0){ - version = fullVersion.substring(0,fullVersion.lastIndexOf(".")); - } - capabilities.put("cloudStackVersion", version); + capabilities.put("networkGroupsEnabled", networkGroupsEnabled); + capabilities.put("cloudStackVersion", getVersion()); return capabilities; } @@ -8981,6 +9042,17 @@ public class ManagementServerImpl implements ManagementServer { public List searchForZoneWideVlans(long dcId, String vlanType, String vlanId){ return _vlanDao.searchForZoneWideVlans(dcId, vlanType, vlanId); } + + @Override + public String getVersion(){ + final Class c = this.getClass(); + String fullVersion = c.getPackage().getImplementationVersion(); + String version = "unknown"; + if(fullVersion.length() > 0){ + version = fullVersion.substring(0,fullVersion.lastIndexOf(".")); + } + return version; + } } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 944f632518a..5dec8807cbb 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -89,9 +89,9 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceInUseException; import com.cloud.exception.StorageUnavailableException; import com.cloud.host.Host; +import com.cloud.host.Host.Type; import com.cloud.host.HostVO; import com.cloud.host.Status; -import com.cloud.host.Host.Type; import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.HostDao; import com.cloud.hypervisor.Hypervisor; @@ -138,7 +138,7 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExecutionException; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.State; import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmVO; @@ -229,7 +229,7 @@ public class StorageManagerImpl implements StorageManager { } @DB - public List allocate(DiskCharacteristics rootDisk, List dataDisks, VMInstanceVO vm, DataCenterVO dc, AccountVO account) { + public List allocate(DiskProfile rootDisk, List dataDisks, VMInstanceVO vm, DataCenterVO dc, AccountVO account) { ArrayList vols = new ArrayList(dataDisks.size() + 1); VolumeVO dataVol = null; VolumeVO rootVol = null; @@ -244,7 +244,7 @@ public class StorageManagerImpl implements StorageManager { rootVol.setDeviceId(deviceId++); rootVol = _volsDao.persist(rootVol); vols.add(rootVol); - for (DiskCharacteristics dataDisk : dataDisks) { + for (DiskProfile dataDisk : dataDisks) { dataVol = new VolumeVO(VolumeType.DATADISK, dataDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), dataDisk.getDiskOfferingId(), dataDisk.getSize()); dataVol.setDeviceId(deviceId++); dataVol.setInstanceId(vm.getId()); @@ -256,41 +256,17 @@ public class StorageManagerImpl implements StorageManager { return vols; } - @Override - public List allocateTemplatedVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, DiskOfferingVO diskOffering, Long size, DataCenterVO dc, AccountVO account) { - assert (template.getFormat() != ImageFormat.ISO) : "You can't create user vm based on ISO with this format"; - - DiskCharacteristics rootDisk = null; - List dataDisks = new ArrayList(diskOffering != null ? 1 : 0); - - long rootId = _volsDao.getNextInSequence(Long.class, "volume_seq"); - - rootDisk = new DiskCharacteristics(rootId, VolumeType.ROOT, "ROOT-" + vm.getId() + " rootId", rootOffering.getId(), 0, rootOffering.getTagsArray(), rootOffering.getUseLocalStorage(), rootOffering.isRecreatable(), template.getId()); - if (diskOffering != null) { - long dataId = _volsDao.getNextInSequence(Long.class, "volume_seq"); - dataDisks.add(new DiskCharacteristics(dataId, VolumeType.DATADISK, "DATA-" + vm.getId() + "-" + dataId, diskOffering.getId(), size != null ? size : diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null)); - } - - return allocate(rootDisk, dataDisks, vm, dc, account); - } - @Override public VolumeVO allocateIsoInstalledVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, Long size, DataCenterVO dc, AccountVO account) { assert (template.getFormat() == ImageFormat.ISO) : "The template has to be ISO"; long rootId = _volsDao.getNextInSequence(Long.class, "volume_seq"); - DiskCharacteristics rootDisk = new DiskCharacteristics(rootId, VolumeType.ROOT, "ROOT-" + vm.getId() + "-" + rootId, rootOffering.getId(), size != null ? size : rootOffering.getDiskSizeInBytes(), rootOffering.getTagsArray(), rootOffering.getUseLocalStorage(), rootOffering.isRecreatable(), null); + DiskProfile rootDisk = new DiskProfile(rootId, VolumeType.ROOT, "ROOT-" + vm.getId() + "-" + rootId, rootOffering.getId(), size != null ? size : rootOffering.getDiskSizeInBytes(), rootOffering.getTagsArray(), rootOffering.getUseLocalStorage(), rootOffering.isRecreatable(), null); List vols = allocate(rootDisk, null, vm, dc, account); return vols.get(0); } - @Override - public VolumeVO allocateSystemVm(VMInstanceVO vm, VMTemplateVO template, DiskOfferingVO rootOffering, DataCenterVO dc) { - List vols = allocateTemplatedVm(vm, template, rootOffering, null, null, dc, _accountMgr.getSystemAccount()); - return vols.get(0); - } - @Override public List prepare(VMInstanceVO vm, HostVO host) { List vols = _volsDao.findCreatedByInstance(vm.getId()); @@ -411,7 +387,7 @@ public class StorageManagerImpl implements StorageManager { return unshare(vm, vols, host) ? vols : null; } - protected StoragePoolVO findStoragePool(DiskCharacteristics dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, final ServiceOffering offering, final VMInstanceVO vm, final VMTemplateVO template, final Set avoid) { + protected StoragePoolVO findStoragePool(DiskProfile dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, final ServiceOffering offering, final VMInstanceVO vm, final VMTemplateVO template, final Set avoid) { Enumeration en = _storagePoolAllocators.enumeration(); while (en.hasMoreElements()) { final StoragePoolAllocator allocator = en.nextElement(); @@ -466,7 +442,7 @@ public class StorageManagerImpl implements StorageManager { return answers[0]; } - protected DiskCharacteristics createDiskCharacteristics(VolumeVO volume, VMTemplateVO template, DataCenterVO dc, DiskOfferingVO diskOffering) { + protected DiskProfile createDiskCharacteristics(VolumeVO volume, VMTemplateVO template, DataCenterVO dc, DiskOfferingVO diskOffering) { if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) { SearchCriteria sc = HostTemplateStatesSearch.create(); sc.setParameters("id", template.getId()); @@ -479,9 +455,9 @@ public class StorageManagerImpl implements StorageManager { } VMTemplateHostVO ss = sss.get(0); - return new DiskCharacteristics(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), ss.getSize(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), Storage.ImageFormat.ISO != template.getFormat() ? template.getId() : null); + return new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), ss.getSize(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), Storage.ImageFormat.ISO != template.getFormat() ? template.getId() : null); } else { - return new DiskCharacteristics(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); + return new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); } } @@ -545,7 +521,7 @@ public class StorageManagerImpl implements StorageManager { String volumeUUID = null; String details = null; - DiskCharacteristics dskCh = createDiskCharacteristics(volume, template, dc, diskOffering); + DiskProfile dskCh = createDiskCharacteristics(volume, template, dc, diskOffering); // Determine what pod to store the volume in @@ -771,7 +747,7 @@ public class StorageManagerImpl implements StorageManager { StoragePoolVO pool = null; final HashSet avoidPools = new HashSet(avoids); - DiskCharacteristics dskCh = null; + DiskProfile dskCh = null; if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) { dskCh = createDiskCharacteristics(volume, template, dc, offering); } else { @@ -1564,7 +1540,7 @@ public class StorageManagerImpl implements StorageManager { public VolumeVO moveVolume(VolumeVO volume, long destPoolDcId, Long destPoolPodId, Long destPoolClusterId) throws InternalErrorException { // Find a destination storage pool with the specified criteria DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId()); - DiskCharacteristics dskCh = new DiskCharacteristics(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); + DiskProfile dskCh = new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); DataCenterVO destPoolDataCenter = _dcDao.findById(destPoolDcId); HostPodVO destPoolPod = _podDao.findById(destPoolPodId); StoragePoolVO destPool = findStoragePool(dskCh, destPoolDataCenter, destPoolPod, destPoolClusterId, null, null, null, new HashSet()); @@ -2292,26 +2268,56 @@ public class StorageManagerImpl implements StorageManager { } } + protected DiskProfile toDiskProfile(VolumeVO vol, DiskOfferingVO offering) { + return new DiskProfile(vol.getId(), vol.getVolumeType(), vol.getName(), offering.getId(), vol.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable(), vol.getTemplateId()); + } + @Override - public VolumeVO allocate(VolumeType type, DiskOfferingVO offering, String name, Long size, VMTemplateVO template, T vm, AccountVO account) { - VolumeVO vol = new VolumeVO(VolumeType.ROOT, name, vm.getDataCenterId(), account.getDomainId(), account.getId(), offering.getId(), size); + public DiskProfile allocateRawVolume(VolumeType type, String name, DiskOfferingVO offering, Long size, T vm, AccountVO owner) { + if (size == null) { + size = offering.getDiskSizeInBytes(); + } + VolumeVO vol = new VolumeVO(type, name, vm.getDataCenterId(), owner.getDomainId(), owner.getId(), offering.getId(), size); if (vm != null) { vol.setInstanceId(vm.getId()); } - if (template != null && template.getFormat() != ImageFormat.ISO) { - vol.setTemplateId(template.getId()); - } vol = _volsDao.persist(vol); - return vol; + return toDiskProfile(vol, offering); } - final protected DiskCharacteristics createDiskCharacteristics(VolumeVO volume, DiskOfferingVO offering) { - return new DiskCharacteristics(volume.getId(), volume.getVolumeType(), volume.getName(), offering.getId(), volume.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable(), volume.getTemplateId()); + @Override + public DiskProfile allocateTemplatedVolume(VolumeType type, String name, DiskOfferingVO offering, VMTemplateVO template, T vm, AccountVO owner) { + assert (template.getFormat() != ImageFormat.ISO) : "ISO is not a template really...."; + + SearchCriteria sc = HostTemplateStatesSearch.create(); + sc.setParameters("id", template.getId()); + sc.setParameters("state", com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED); + sc.setJoinParameters("host", "dcId", vm.getDataCenterId()); + + List sss = _vmTemplateHostDao.search(sc, null); + if (sss.size() == 0) { + throw new CloudRuntimeException("Template " + template.getName() + " has not been completely downloaded to zone " + vm.getDataCenterId()); + } + VMTemplateHostVO ss = sss.get(0); + + VolumeVO vol = new VolumeVO(type, name, vm.getDataCenterId(), owner.getDomainId(), owner.getId(), offering.getId(), ss.getSize()); + if (vm != null) { + vol.setInstanceId(vm.getId()); + } + vol.setTemplateId(template.getId()); + + vol = _volsDao.persist(vol); + + return toDiskProfile(vol, offering); } - final protected DiskCharacteristics createDiskCharacteristics(VolumeVO volume) { + final protected DiskProfile createDiskCharacteristics(VolumeVO volume, DiskOfferingVO offering) { + return new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), offering.getId(), volume.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable(), volume.getTemplateId()); + } + + final protected DiskProfile createDiskCharacteristics(VolumeVO volume) { DiskOfferingVO offering = _diskOfferingDao.findById(volume.getDiskOfferingId()); return createDiskCharacteristics(volume, offering); } @@ -2321,7 +2327,7 @@ public class StorageManagerImpl implements StorageManager { List vols = _volsDao.findByInstance(vm.getId()); assert vols.size() >= 1 : "Come on, what's with the zero volumes for " + vm; for (VolumeVO vol : vols) { - DiskCharacteristics dskCh = createDiskCharacteristics(vol); + DiskProfile dskCh = createDiskCharacteristics(vol); int retry = _retry; while (--retry >= 0) { diff --git a/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java index 500c927c70c..782f01b17d6 100644 --- a/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/AbstractStoragePoolAllocator.java @@ -55,7 +55,7 @@ import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.Inject; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; @@ -100,7 +100,7 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement return true; } - abstract boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering); + abstract boolean allocatorIsCorrectType(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering); protected boolean templateAvailable(long templateId, long poolId) { VMTemplateStorageResourceAssoc thvo = _templatePoolDao.findByPoolTemplate(poolId, templateId); @@ -114,7 +114,7 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement } } - protected boolean localStorageAllocationNeeded(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) { + protected boolean localStorageAllocationNeeded(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering) { if (vm == null) { // We are finding a pool for a volume, so we need a shared storage allocator return false; @@ -128,12 +128,12 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement } } - protected boolean poolIsCorrectType(DiskCharacteristics dskCh, StoragePool pool, VMInstanceVO vm, ServiceOffering offering) { + protected boolean poolIsCorrectType(DiskProfile dskCh, StoragePool pool, VMInstanceVO vm, ServiceOffering offering) { boolean localStorageAllocationNeeded = localStorageAllocationNeeded(dskCh, vm, offering); return ((!localStorageAllocationNeeded && pool.getPoolType().isShared()) || (localStorageAllocationNeeded && !pool.getPoolType().isShared())); } - protected boolean checkPool(Set avoid, StoragePoolVO pool, DiskCharacteristics dskCh, VMTemplateVO template, List templatesInPool, ServiceOffering offering, + protected boolean checkPool(Set avoid, StoragePoolVO pool, DiskProfile dskCh, VMTemplateVO template, List templatesInPool, ServiceOffering offering, VMInstanceVO vm, StatsCollector sc) { if (avoid.contains(pool)) { return false; diff --git a/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java index 24bc8a3e6c9..944653a452d 100644 --- a/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/FirstFitStoragePoolAllocator.java @@ -32,7 +32,7 @@ import com.cloud.server.StatsCollector; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; @Local(value=StoragePoolAllocator.class) @@ -40,12 +40,12 @@ public class FirstFitStoragePoolAllocator extends AbstractStoragePoolAllocator { private static final Logger s_logger = Logger.getLogger(FirstFitStoragePoolAllocator.class); @Override - public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) { + public boolean allocatorIsCorrectType(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering) { return !localStorageAllocationNeeded(dskCh, vm, offering); } @Override - public StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, + public StoragePool allocateToPool(DiskProfile dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, VMTemplateVO template, Set avoid) { // Check that the allocator type is correct if (!allocatorIsCorrectType(dskCh, vm, offering)) { diff --git a/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java index ca49b197d89..7a39f4d164f 100644 --- a/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/GarbageCollectingStoragePoolAllocator.java @@ -34,7 +34,7 @@ import com.cloud.storage.StorageManager; import com.cloud.storage.StoragePool; import com.cloud.storage.VMTemplateVO; import com.cloud.utils.component.ComponentLocator; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; @Local(value=StoragePoolAllocator.class) @@ -48,7 +48,7 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl boolean _storagePoolCleanupEnabled; @Override - public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) { + public boolean allocatorIsCorrectType(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering) { return true; } @@ -61,7 +61,7 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl } @Override - public StoragePool allocateToPool(DiskCharacteristics dskCh, + public StoragePool allocateToPool(DiskProfile dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, diff --git a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java index 2fb07a5a7e7..1ea7ef7ecfd 100644 --- a/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/LocalStoragePoolAllocator.java @@ -49,12 +49,12 @@ import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.State; import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; -import com.cloud.vm.VmCharacteristics; +import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @@ -84,12 +84,12 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { @Override - public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) { + public boolean allocatorIsCorrectType(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering) { return localStorageAllocationNeeded(dskCh, vm, offering); } @Override - public StoragePool allocateToPool(DiskCharacteristics dskCh, + public StoragePool allocateToPool(DiskProfile dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, @@ -104,7 +104,7 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator { } Set myAvoids = new HashSet(avoid); - VmCharacteristics vmc = new VmCharacteristics(vm.getType()); + VirtualMachineProfile vmc = new VirtualMachineProfile(vm.getType()); StoragePool pool = null; while ((pool = super.allocateToPool(dskCh, offering, dc, pod, clusterId, vm, template, myAvoids)) != null) { myAvoids.add(pool); diff --git a/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java index 7937372ec79..0ffb5f99826 100644 --- a/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/RandomStoragePoolAllocator.java @@ -32,7 +32,7 @@ import com.cloud.server.StatsCollector; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.VMTemplateVO; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; @Local(value=StoragePoolAllocator.class) @@ -40,12 +40,12 @@ public class RandomStoragePoolAllocator extends AbstractStoragePoolAllocator { private static final Logger s_logger = Logger.getLogger(RandomStoragePoolAllocator.class); @Override - public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) { + public boolean allocatorIsCorrectType(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering) { return true; } @Override - public StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, + public StoragePool allocateToPool(DiskProfile dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, VMTemplateVO template, Set avoid) { diff --git a/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java b/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java index 8972d2418e7..b2b5be426ff 100644 --- a/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java +++ b/server/src/com/cloud/storage/allocator/StoragePoolAllocator.java @@ -26,7 +26,7 @@ import com.cloud.offering.ServiceOffering; import com.cloud.storage.StoragePool; import com.cloud.storage.VMTemplateVO; import com.cloud.utils.component.Adapter; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; @@ -36,7 +36,7 @@ import com.cloud.vm.VirtualMachine; */ public interface StoragePoolAllocator extends Adapter { - StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long cluster, VMInstanceVO vm, VMTemplateVO template, Set avoids); + StoragePool allocateToPool(DiskProfile dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long cluster, VMInstanceVO vm, VMTemplateVO template, Set avoids); String chooseStorageIp(VirtualMachine vm, Host host, Host storage); } diff --git a/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java b/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java index 6d9c1adfdef..06adab2bffc 100644 --- a/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java +++ b/server/src/com/cloud/storage/allocator/UseLocalForRootAllocator.java @@ -33,7 +33,7 @@ import com.cloud.storage.StoragePool; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume.VolumeType; import com.cloud.utils.component.ComponentLocator; -import com.cloud.vm.DiskCharacteristics; +import com.cloud.vm.DiskProfile; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; @@ -42,7 +42,7 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen boolean _useLocalStorage; @Override - public StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, VMTemplateVO template, Set avoids) { + public StoragePool allocateToPool(DiskProfile dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, VMTemplateVO template, Set avoids) { if (!_useLocalStorage) { return null; } @@ -69,7 +69,7 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen } @Override - protected boolean localStorageAllocationNeeded(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) { + protected boolean localStorageAllocationNeeded(DiskProfile dskCh, VMInstanceVO vm, ServiceOffering offering) { if (dskCh.getType() == VolumeType.ROOT) { return true; } else if (dskCh.getType() == VolumeType.DATADISK) { diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 029915bd5aa..c80502fce48 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -318,8 +318,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V if (routingHost == null) { if (s_logger.isDebugEnabled()) { - s_logger.debug("Unable to find a routing host for " + secStorageVm.toString()); - continue; + String msg = "Unable to find a routing host for " + secStorageVm.toString() + " in pod " + pod.getId(); + s_logger.debug(msg); + throw new CloudRuntimeException(msg); } } // to ensure atomic state transition to Starting state @@ -350,9 +351,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V secStorageVm.getDataCenterId(), routingHost.getPodId(), secStorageVm.getId(), secStorageVm.getPrivateMacAddress()); if (privateIpAddress == null && (_IpAllocator != null && !_IpAllocator.exteralIpAddressAllocatorEnabled())) { - s_logger.debug("Not enough ip addresses in " + routingHost.getPodId()); - avoid.add(routingHost); - continue; + String msg = "Unable to allocate private ip addresses for " + secStorageVm.getName() + " in pod " + pod.getId(); + s_logger.debug(msg); + throw new CloudRuntimeException(msg); } secStorageVm.setPrivateIpAddress(privateIpAddress); @@ -363,9 +364,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V List vols = _storageMgr.prepare(secStorageVm, routingHost); if (vols == null || vols.size() == 0) { - s_logger.warn("Can not share " + secStorageVm.getName()); - avoid.add(routingHost); - continue; + String msg = "Unable to prepare storage for " + secStorageVm.getName() + " in pod " + pod.getId(); + s_logger.debug(msg); + throw new CloudRuntimeException(msg); } VolumeVO vol = vols.get(0); @@ -716,10 +717,9 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } if (pod == null || publicIpAndVlan == null) { - s_logger.warn("Unable to allocate pod for secondary storage vm in data center : " + dataCenterId); - - context.put("secStorageVmId", (long) 0); - return context; + String msg = "Unable to allocate pod for secondary storage vm in data center : " + dataCenterId; + s_logger.warn(msg); + throw new CloudRuntimeException(msg); } long id = _secStorageVmDao.getNextInSequence(Long.class, "id"); diff --git a/server/src/com/cloud/storage/upload/UploadListener.java b/server/src/com/cloud/storage/upload/UploadListener.java index 8fd0279dfc2..8ca72691153 100755 --- a/server/src/com/cloud/storage/upload/UploadListener.java +++ b/server/src/com/cloud/storage/upload/UploadListener.java @@ -17,24 +17,21 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupStorageCommand; -import com.cloud.agent.api.storage.DownloadCommand; -import com.cloud.agent.api.storage.DownloadProgressCommand; import com.cloud.agent.api.storage.UploadAnswer; import com.cloud.agent.api.storage.UploadCommand; import com.cloud.agent.api.storage.UploadProgressCommand; import com.cloud.agent.api.storage.UploadProgressCommand.RequestType; +import com.cloud.async.AsyncJobManager; +import com.cloud.async.AsyncJobResult; +import com.cloud.async.executor.ExtractJobResultObject; import com.cloud.event.EventTypes; import com.cloud.event.EventVO; import com.cloud.host.HostVO; import com.cloud.storage.Storage; import com.cloud.storage.UploadVO; -import com.cloud.storage.VMTemplateHostVO; -import com.cloud.storage.VMTemplateVO; import com.cloud.storage.dao.UploadDao; -import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.Upload.Status; import com.cloud.storage.Upload.Type; -import com.cloud.storage.download.DownloadState.DownloadEvent; import com.cloud.storage.upload.UploadMonitorImpl; import com.cloud.storage.upload.UploadState.UploadEvent; import com.cloud.utils.exception.CloudRuntimeException; @@ -103,13 +100,41 @@ public class UploadListener implements Listener { private Long accountId; private String typeName; private Type type; + private long asyncJobId; + private long eventId; + private AsyncJobManager asyncMgr; + private ExtractJobResultObject resultObj; + public AsyncJobManager getAsyncMgr() { + return asyncMgr; + } + + public void setAsyncMgr(AsyncJobManager asyncMgr) { + this.asyncMgr = asyncMgr; + } + + public long getAsyncJobId() { + return asyncJobId; + } + + public void setAsyncJobId(long asyncJobId) { + this.asyncJobId = asyncJobId; + } + + public long getEventId() { + return eventId; + } + + public void setEventId(long eventId) { + this.eventId = eventId; + } + private final Map stateMap = new HashMap(); private Long uploadId; public UploadListener(HostVO host, Timer _timer, UploadDao uploadDao, Long uploadId, UploadMonitorImpl uploadMonitor, UploadCommand cmd, - Long accountId, String typeName, Type type) { + Long accountId, String typeName, Type type, long eventId, long asyncJobId, AsyncJobManager asyncMgr) { this.sserver = host; this.uploadDao = uploadDao; this.uploadMonitor = uploadMonitor; @@ -123,6 +148,10 @@ public class UploadListener implements Listener { this.timer = _timer; this.timeoutTask = new TimeoutTask(this); this.timer.schedule(timeoutTask, 3*STATUS_POLL_INTERVAL); + this.eventId = eventId; + this.asyncJobId = asyncJobId; + this.asyncMgr = asyncMgr; + this.resultObj = new ExtractJobResultObject(accountId, typeName, currState, 0, uploadId); updateDatabase(Status.NOT_UPLOADED, cmd.getUrl(),""); } @@ -212,19 +241,12 @@ public class UploadListener implements Listener { public void setUploadInactive(Status reason) { uploadActive=false; - uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason); + uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason, eventId); } public void logUploadStart() { - String event; - if (type == Type.TEMPLATE){ - event = EventTypes.EVENT_TEMPLATE_UPLOAD_START; - }else if (type == Type.ISO){ - event = EventTypes.EVENT_ISO_UPLOAD_START; - }else{ - event = EventTypes.EVENT_VOLUME_UPLOAD_START; - } - uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO); + String event = uploadMonitor.getEvent(type); + uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO,eventId); } public void cancelTimeoutTask() { @@ -310,6 +332,10 @@ public class UploadListener implements Listener { } public void updateDatabase(Status state, String uploadErrorString) { + resultObj.setResult_string(uploadErrorString); + resultObj.setState(state.toString()); + asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); + asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); UploadVO vo = uploadDao.createForUpdate(); vo.setUploadState(state); @@ -319,6 +345,11 @@ public class UploadListener implements Listener { } public void updateDatabase(Status state, String uploadUrl,String uploadErrorString) { + resultObj.setResult_string(uploadErrorString); + resultObj.setState(state.toString()); + asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); + asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); + UploadVO vo = uploadDao.createForUpdate(); vo.setUploadState(state); @@ -341,6 +372,18 @@ public class UploadListener implements Listener { public synchronized void updateDatabase(UploadAnswer answer) { + resultObj.setResult_string(answer.getErrorString()); + resultObj.setState(answer.getUploadStatus().toString()); + resultObj.setUploadPercent(answer.getUploadPct()); + + if (answer.getUploadStatus() == Status.UPLOAD_IN_PROGRESS){ + asyncMgr.updateAsyncJobAttachment(asyncJobId, type.toString(), 1L); + asyncMgr.updateAsyncJobStatus(asyncJobId, AsyncJobResult.STATUS_IN_PROGRESS, resultObj); + }else if(answer.getUploadStatus() == Status.UPLOADED){ + asyncMgr.completeAsyncJob(asyncJobId, AsyncJobResult.STATUS_SUCCEEDED, 0, resultObj); + }else{ + asyncMgr.completeAsyncJob(asyncJobId, AsyncJobResult.STATUS_FAILED, 0, resultObj); + } UploadVO updateBuilder = uploadDao.createForUpdate(); updateBuilder.setUploadPercent(answer.getUploadPct()); updateBuilder.setUploadState(answer.getUploadStatus()); @@ -371,14 +414,8 @@ public class UploadListener implements Listener { public void logDisconnect() { s_logger.warn("Unable to monitor upload progress of " + typeName + " at host " + sserver.getName()); String event; - if (type == Type.TEMPLATE){ - event = EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED; - }else if (type == Type.ISO){ - event = EventTypes.EVENT_ISO_UPLOAD_FAILED; - }else{ - event = EventTypes.EVENT_VOLUME_UPLOAD_FAILED; - } - uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " disconnected during upload of " + typeName, EventVO.LEVEL_WARN); + event = uploadMonitor.getEvent(type); + uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " disconnected during upload of " + typeName, EventVO.LEVEL_WARN, eventId); } public void scheduleImmediateStatusCheck(RequestType request) { diff --git a/server/src/com/cloud/storage/upload/UploadMonitor.java b/server/src/com/cloud/storage/upload/UploadMonitor.java index 9967900c172..5000a5adff6 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitor.java +++ b/server/src/com/cloud/storage/upload/UploadMonitor.java @@ -20,13 +20,16 @@ package com.cloud.storage.upload; import java.util.Map; +import com.cloud.async.AsyncJobManager; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.Upload.Type; import com.cloud.storage.template.TemplateInfo; import com.cloud.utils.component.Manager; /** - * Monitor upload progress of all templates. + * Monitor upload progress of all entities. * @author nitin * */ @@ -35,9 +38,15 @@ public interface UploadMonitor extends Manager{ public void cancelAllUploads(Long templateId); public void extractTemplate(VMTemplateVO template, String url, - VMTemplateHostVO tmpltHostRef,Long dataCenterId); + VMTemplateHostVO tmpltHostRef,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr); void handleUploadTemplateSync(long sserverId, Map templateInfo); + void extractVolume(VolumeVO volume, String url, Long dataCenterId, + String installPath, long eventId, long asyncJobId, + AsyncJobManager asyncMgr); + + boolean isTypeUploadInProgress(Long typeId, Type type); + } \ No newline at end of file diff --git a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java index 759c30b0fdf..689f26fbb4a 100755 --- a/server/src/com/cloud/storage/upload/UploadMonitorImpl.java +++ b/server/src/com/cloud/storage/upload/UploadMonitorImpl.java @@ -20,6 +20,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.storage.UploadCommand; import com.cloud.agent.api.storage.UploadProgressCommand; import com.cloud.agent.api.storage.UploadProgressCommand.RequestType; +import com.cloud.async.AsyncJobManager; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.dao.DataCenterDao; import com.cloud.event.EventTypes; @@ -94,22 +95,20 @@ public class UploadMonitorImpl implements UploadMonitor { @Override public void cancelAllUploads(Long templateId) { - // TODO Auto-generated method stub + // TODO } - private boolean isTypeUploadInProgress(Long typeId, Type type) { + @Override + public boolean isTypeUploadInProgress(Long typeId, Type type) { List uploadsInProgress = _uploadDao.listByTypeUploadStatus(typeId, type, UploadVO.Status.UPLOAD_IN_PROGRESS); return (uploadsInProgress.size() != 0); } - public void extractVolume(VolumeVO volume, String url, Long dataCenterId, String installPath){ - - if ( isTypeUploadInProgress(volume.getId(), Type.VOLUME) ){ - return; - } + @Override + public void extractVolume(VolumeVO volume, String url, Long dataCenterId, String installPath, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ List storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId); HostVO sserver = storageServers.get(0); @@ -117,13 +116,11 @@ public class UploadMonitorImpl implements UploadMonitor { UploadVO uploadVolumeObj = new UploadVO(sserver.getId(), volume.getId(), new Date(), Upload.Status.NOT_UPLOADED, 0, Type.VOLUME, null, "jobid0000", url); - _uploadDao.persist(uploadVolumeObj); - - //_vmTemplateHostDao.updateUploadStatus(sserver.getId(), template.getId(), 0, VMTemplateStorageResourceAssoc.Status.NOT_UPLOADED, "jobid0000", url); + _uploadDao.persist(uploadVolumeObj); start(); UploadCommand ucmd = new UploadCommand(url, volume.getId(), volume.getSize(), installPath, Type.VOLUME); - UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadVolumeObj.getId(), this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME); + UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadVolumeObj.getId(), this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME, eventId, asyncJobId, asyncMgr); _listenerMap.put(uploadVolumeObj, ul); long result = send(sserver.getId(), ucmd, ul); @@ -137,14 +134,10 @@ public class UploadMonitorImpl implements UploadMonitor { @Override public void extractTemplate( VMTemplateVO template, String url, - VMTemplateHostVO vmTemplateHost,Long dataCenterId){ + VMTemplateHostVO vmTemplateHost,Long dataCenterId, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ; - - if (isTypeUploadInProgress(template.getId(), type) ){ - return; // TO DO raise an exception. - } - + List storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId); HostVO sserver = storageServers.get(0); @@ -156,7 +149,7 @@ public class UploadMonitorImpl implements UploadMonitor { if(vmTemplateHost != null) { start(); UploadCommand ucmd = new UploadCommand(template, url, vmTemplateHost); - UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj.getId(), this, ucmd, template.getAccountId(), template.getName(), type);//TO DO - remove template + UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj.getId(), this, ucmd, template.getAccountId(), template.getName(), type, eventId, asyncJobId, asyncMgr); _listenerMap.put(uploadTemplateObj, ul); long result = send(sserver.getId(), ucmd, ul); @@ -211,23 +204,16 @@ public class UploadMonitorImpl implements UploadMonitor { return true; } - public String getEvent(Upload.Status status, Type type){ - if (status == Upload.Status.UPLOADED){ - if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD_SUCCESS; - if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD_SUCCESS; - if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD_SUCCESS; - } - - if (status == Upload.Status.UPLOAD_ERROR || status == Upload.Status.ABANDONED){ - if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED; - if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD_FAILED; - if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD_FAILED; - } + public String getEvent(Type type){ + + if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD; + if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD; + if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD; return null; } - public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason) { + public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason, long eventId) { if ((reason == Upload.Status.UPLOADED) || (reason==Upload.Status.ABANDONED)){ UploadVO uploadObj = new UploadVO(uploadId); @@ -237,13 +223,13 @@ public class UploadMonitorImpl implements UploadMonitor { } } if (reason == Upload.Status.UPLOADED) { - logEvent(accountId, getEvent(reason, type), typeName + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO); + logEvent(accountId, getEvent(type), typeName + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO, eventId); } if (reason == Upload.Status.UPLOAD_ERROR) { - logEvent(accountId, getEvent(reason, type), typeName + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR); + logEvent(accountId, getEvent(type), typeName + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR, eventId); } if (reason == Upload.Status.ABANDONED) { - logEvent(accountId, getEvent(reason, type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN); + logEvent(accountId, getEvent(type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN, eventId); } /*VMTemplateHostVO vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId()); @@ -306,13 +292,14 @@ public class UploadMonitorImpl implements UploadMonitor { } - public void logEvent(long accountId, String evtType, String description, String level) { + public void logEvent(long accountId, String evtType, String description, String level, long eventId) { EventVO event = new EventVO(); event.setUserId(1); event.setAccountId(accountId); event.setType(evtType); event.setDescription(description); event.setLevel(level); + event.setStartId(eventId); _eventDao.persist(event); } diff --git a/server/src/com/cloud/template/TemplateManager.java b/server/src/com/cloud/template/TemplateManager.java old mode 100644 new mode 100755 index a4f67f3a0da..7644e5bb22e --- a/server/src/com/cloud/template/TemplateManager.java +++ b/server/src/com/cloud/template/TemplateManager.java @@ -20,6 +20,7 @@ package com.cloud.template; import java.net.URI; import java.util.List; +import com.cloud.async.AsyncJobManager; import com.cloud.exception.InternalErrorException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.StorageUnavailableException; @@ -98,7 +99,34 @@ public interface TemplateManager extends Manager { * @param sourceZoneId * @param destZoneId * @return true if success - * @throws InternalErrorException + * @throws InternalErrorException URI uri = new URI(url); + if ( (uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp") )) { + throw new IllegalArgumentException("Unsupported scheme for url: " + url); + } + String host = uri.getHost(); + + try { + InetAddress hostAddr = InetAddress.getByName(host); + if (hostAddr.isAnyLocalAddress() || hostAddr.isLinkLocalAddress() || hostAddr.isLoopbackAddress() || hostAddr.isMulticastAddress() ) { + throw new IllegalArgumentException("Illegal host specified in url"); + } + if (hostAddr instanceof Inet6Address) { + throw new IllegalArgumentException("IPV6 addresses not supported (" + hostAddr.getHostAddress() + ")"); + } + } catch (UnknownHostException uhe) { + throw new IllegalArgumentException("Unable to resolve " + host); + } + + if (_dcDao.findById(zoneId) == null) { + throw new IllegalArgumentException("Please specify a valid zone."); + } + + VMTemplateVO template = findTemplateById(templateId); + + VMTemplateHostVO tmpltHostRef = findTemplateHostRef(templateId, zoneId); + if (tmpltHostRef != null && tmpltHostRef.getDownloadState() != com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOADED){ + throw new IllegalArgumentException("The template hasnt been downloaded "); + } * @throws StorageUnavailableException * @throws InvalidParameterValueException */ @@ -128,6 +156,6 @@ public interface TemplateManager extends Manager { boolean templateIsDeleteable(VMTemplateHostVO templateHostRef); - void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId); + void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId, long eventId, long asyncJobId, AsyncJobManager asyncMgr); } diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 5a473617158..5b5b8a7ddba 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -32,6 +32,7 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; +import com.cloud.async.AsyncJobManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; @@ -148,8 +149,8 @@ public class TemplateManagerImpl implements TemplateManager { } @Override - public void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId){ - _uploadMonitor.extractTemplate(template, url, tmpltHostRef, zoneId); + public void extract(VMTemplateVO template, String url, VMTemplateHostVO tmpltHostRef, Long zoneId, long eventId, long asyncJobId, AsyncJobManager asyncMgr){ + _uploadMonitor.extractTemplate(template, url, tmpltHostRef, zoneId, eventId, asyncJobId, asyncMgr); } @Override @DB diff --git a/server/src/com/cloud/vm/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java index 63fcc2dae55..3e9fb6b0c53 100644 --- a/server/src/com/cloud/vm/MauriceMoss.java +++ b/server/src/com/cloud/vm/MauriceMoss.java @@ -18,8 +18,10 @@ package com.cloud.vm; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -27,28 +29,34 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; +import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.DataCenterVO; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentDispatcher; +import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.InsufficientCapacityException; -import com.cloud.network.NetworkManager; import com.cloud.network.NetworkConfigurationVO; +import com.cloud.network.NetworkManager; 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.VMTemplateVO; import com.cloud.storage.Volume.VolumeType; -import com.cloud.storage.VolumeVO; import com.cloud.user.AccountVO; import com.cloud.utils.Journal; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; +import com.cloud.utils.component.Adapters; import com.cloud.utils.component.ComponentLocator; 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.vm.VirtualMachine.Event; import com.cloud.vm.dao.VMInstanceDao; @Local(value=VmManager.class) @@ -60,70 +68,129 @@ public class MauriceMoss implements VmManager { @Inject private NetworkManager _networkMgr; @Inject private AgentManager _agentMgr; @Inject private VMInstanceDao _vmDao; + @Inject private ServiceOfferingDao _offeringDao; + + @Inject(adapter=DeploymentDispatcher.class) + private Adapters _dispatchers; + private int _retry; @Override @DB - public T allocate(T vm, + public VirtualMachineProfile allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Pair rootDiskOffering, List> dataDiskOfferings, - List> networks, - DataCenterVO dc, + List> networks, + DeploymentPlan plan, AccountVO owner) throws InsufficientCapacityException { if (s_logger.isDebugEnabled()) { s_logger.debug("Allocating entries for VM: " + vm); } + //VMInstanceVO vm = _vmDao.findById(vm.getId()); + VirtualMachineProfile vmProfile = new VirtualMachineProfile(vm, serviceOffering); + Transaction txn = Transaction.currentTxn(); txn.start(); - List nics = _networkMgr.allocate(vm, networks); + vm.setDataCenterId(plan.getDataCenterId()); + _vmDao.update(vm.getId(), vm); - VolumeVO volume = _storageMgr.allocate(VolumeType.ROOT, rootDiskOffering.first(), "ROOT-" + vm.getId(), rootDiskOffering.second(), template.getFormat() != ImageFormat.ISO ? template : null, vm, owner); - for (Pair offering : dataDiskOfferings) { - volume = _storageMgr.allocate(VolumeType.DATADISK, offering.first(), "DATA-" + vm.getId(), offering.second(), null, vm, owner); + List nics = _networkMgr.allocate(vm, networks); + vmProfile.setNics(nics); + + if (dataDiskOfferings == null) { + dataDiskOfferings = new ArrayList>(0); } + List disks = new ArrayList(dataDiskOfferings.size() + 1); + if (template.getFormat() == ImageFormat.ISO) { + disks.add(_storageMgr.allocateRawVolume(VolumeType.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner)); + } else { + disks.add(_storageMgr.allocateTemplatedVolume(VolumeType.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner)); + } + for (Pair offering : dataDiskOfferings) { + disks.add(_storageMgr.allocateRawVolume(VolumeType.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner)); + } + vmProfile.setDisks(disks); + + _vmDao.updateIf(vm, Event.OperationSucceeded, null); txn.commit(); if (s_logger.isDebugEnabled()) { s_logger.debug("Allocation completed for VM: " + vm); } - return vm; + + return vmProfile; } - + @Override - public T allocate(T vm, + public VirtualMachineProfile allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Long rootSize, Pair dataDiskOffering, - List> networks, - DataCenterVO dc, + List> networks, + DeploymentPlan plan, AccountVO 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, dc, owner); + return allocate(vm, template, serviceOffering, new Pair(serviceOffering, rootSize), diskOfferings, networks, plan, owner); } @Override - public T allocate(T vm, + public VirtualMachineProfile allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, List networkProfiles, - DataCenterVO dc, AccountVO owner) throws InsufficientCapacityException { - List> networks = new ArrayList>(networkProfiles.size()); + DeploymentPlan plan, + AccountVO owner) throws InsufficientCapacityException { + List> networks = new ArrayList>(networkProfiles.size()); for (NetworkConfigurationVO profile : networkProfiles) { - networks.add(new Pair(profile, null)); + networks.add(new Pair(profile, null)); } - return allocate(vm, template, serviceOffering, new Pair(serviceOffering, null), null, networks, dc, owner); + return allocate(vm, template, serviceOffering, new Pair(serviceOffering, null), null, networks, plan, owner); } - - @Override - public void create(VmCharacteristics vm, List disks, List networks) { - // TODO Auto-generated method stub + protected VirtualMachineProfile create(VirtualMachineProfile vmProfile, DeploymentPlan plan) throws InsufficientCapacityException { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating actual resources for VM " + vmProfile); + } + + Journal journal = new Journal.LogJournal("Creating " + vmProfile, s_logger); + Set avoids = new HashSet(); + int retry = _retry; + while (_retry-- > 0) { + DeployDestination context = null; + for (DeploymentDispatcher dispatcher : _dispatchers) { + context = dispatcher.plan(vmProfile, plan, avoids); + if (context != null) { + journal.record("Deployment found ", vmProfile, context); + break; + } + } + + if (context == null) { + throw new CloudRuntimeException("Unable to create a deployment for " + vmProfile); + } + + VMInstanceVO vm = _vmDao.findById(vmProfile.getId()); + + vm.setDataCenterId(context.getDataCenter().getId()); + vm.setPodId(context.getPod().getId()); + vm.setHostId(context.getHost().getId()); + _vmDao.update(vm.getId(), vm); + + _networkMgr.create(vm); + _storageMgr.create(vm); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creation complete for VM " + vmProfile); + } + + return vmProfile; } @Override @@ -150,6 +217,8 @@ public class MauriceMoss implements VmManager { ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); Map params = configDao.getConfiguration(xmlParams); + _dispatchers = locator.getAdapters(DeploymentDispatcher.class); + _retry = NumbersUtil.parseInt(params.get(Config.StartRetry.key()), 2); return true; } @@ -163,30 +232,45 @@ public class MauriceMoss implements VmManager { } @Override - public T create(T v) { + public T start(VirtualMachineProfile vmProfile, DeploymentPlan plan) throws InsufficientCapacityException { if (s_logger.isDebugEnabled()) { - s_logger.debug("Creating actual resources for VM " + v); + s_logger.debug("Creating actual resources for VM " + vmProfile); } - Journal journal = new Journal.LogJournal("Creating " + v, s_logger); - VMInstanceVO vm = _vmDao.findById(v.getId()); + Journal journal = new Journal.LogJournal("Creating " + vmProfile, s_logger); + Set avoids = new HashSet(); int retry = _retry; while (_retry-- > 0) { -// Pod pod = _agentMgr.findPod(f); + DeployDestination context = null; + for (DeploymentDispatcher dispatcher : _dispatchers) { + context = dispatcher.plan(vmProfile, plan, avoids); + if (context != null) { + avoids.add(context); + journal.record("Deployment found ", vmProfile, context); + break; + } + } + + if (context == null) { + throw new CloudRuntimeException("Unable to create a deployment for " + vmProfile); + } + + VMInstanceVO vm = _vmDao.findById(vmProfile.getId()); + + vm.setDataCenterId(context.getDataCenter().getId()); + vm.setPodId(context.getPod().getId()); + _vmDao.updateIf(vm, Event.StartRequested, context.getHost().getId()); + + VirtualMachineTO vmTO = new VirtualMachineTO(); +// _networkMgr.prepare(vmProfile); +// _storageMgr.prepare(vm); } - _networkMgr.create(vm); - _storageMgr.create(vm); if (s_logger.isDebugEnabled()) { - s_logger.debug("Creation complete for VM " + vm); + s_logger.debug("Creation complete for VM " + vmProfile); } - return null; - } - - @Override - public T start(T vm) { - // TODO Auto-generated method stub + return null; } diff --git a/server/src/com/cloud/vm/NicVO.java b/server/src/com/cloud/vm/NicVO.java index 6a56cd4ff7f..3ce09fd7313 100644 --- a/server/src/com/cloud/vm/NicVO.java +++ b/server/src/com/cloud/vm/NicVO.java @@ -17,6 +17,8 @@ */ package com.cloud.vm; +import java.util.Date; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; @@ -27,7 +29,6 @@ import javax.persistence.Id; import javax.persistence.Table; import com.cloud.network.Network.Mode; -import com.cloud.network.Network.TrafficType; @Entity @Table(name="nics") @@ -43,46 +44,39 @@ public class NicVO implements Nic { @Column(name="instance_id") long instanceId; - @Column(name="type") - @Enumerated(value=EnumType.STRING) - TrafficType trafficType; - @Column(name="ip4_address") String ip4Address; @Column(name="mac_address") String macAddress; - @Column(name="netmask") - String netMask; - @Column(name="mode") @Enumerated(value=EnumType.STRING) Mode mode; - @Column(name="network_profile_id") - long networkProfileId; - - @Column(name="String") - String vlan; + @Column(name="network_configuration_id") + long networkConfigurationId; @Column(name="state") @Enumerated(value=EnumType.STRING) State state; - @Column(name="name") - String conciergeName; + @Column(name="reserver_name") + String reserver; @Column(name="reservation_id") String reservationId; @Column(name="device_id") int deviceId; + + @Column(name="update_time") + Date updateTime; - public NicVO(String conciergeName, long instanceId, long profileId) { - this.conciergeName = conciergeName; + public NicVO(String reserver, long instanceId, long configurationId) { + this.reserver = reserver; this.instanceId = instanceId; - this.networkProfileId = profileId; + this.networkConfigurationId = configurationId; this.state = State.Allocated; } @@ -124,19 +118,16 @@ public class NicVO implements Nic { } @Override - public long getNetworkProfileId() { - return networkProfileId; + public long getNetworkConfigurationId() { + return networkConfigurationId; } @Override - public long getDeviceId() { + public int getDeviceId() { return deviceId; } - public String getConciergeName() { - return conciergeName; - } - + @Override public String getReservationId() { return reservationId; } @@ -145,10 +136,6 @@ public class NicVO implements Nic { this.reservationId = id; } - public void setConciergeName(String conciergeName) { - this.conciergeName = conciergeName; - } - public void setDeviceId(int deviceId) { this.deviceId = deviceId; } @@ -161,4 +148,33 @@ public class NicVO implements Nic { public void setMode(Mode mode) { this.mode = mode; } + + @Override + public String getReserver() { + return reserver; + } + + public void setReserver(String reserver) { + this.reserver = reserver; + } + + @Override + public ReservationStrategy getReservationStrategy() { + return ReservationStrategy.Start; + } + + @Override + public int getExpectedReservationInterval() { + return -1; + } + + @Override + public int getExpectedReleaseInterval() { + return -1; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index bc41517624e..25771648030 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2777,6 +2777,8 @@ public class UserVmManagerImpl implements UserVmManager { throw new InternalErrorException("We could not find a suitable pool for creating this directly attached vm"); } + _accountMgr.decrementResourceCount(account.getId(), ResourceType.user_vm); + _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); return null; } @@ -2837,6 +2839,9 @@ public class UserVmManagerImpl implements UserVmManager { throw new InternalErrorException("No template or ISO was specified for the VM."); } + boolean isIso = Storage.ImageFormat.ISO.equals(template.getFormat()); + long numVolumes = (isIso || (diskOffering == null)) ? 1 : 2; + Transaction txn = Transaction.currentTxn(); try { UserVmVO vm = null; @@ -2893,8 +2898,6 @@ public class UserVmManagerImpl implements UserVmManager { _networkGroupManager.addInstanceToGroups(vmId, networkGroups); _accountMgr.incrementResourceCount(account.getId(), ResourceType.user_vm); - boolean isIso = Storage.ImageFormat.ISO.equals(template.getFormat()); - long numVolumes = (isIso || (diskOffering == null)) ? 1 : 2; _accountMgr.incrementResourceCount(account.getId(), ResourceType.volume, numVolumes); txn.commit(); @@ -2926,7 +2929,9 @@ public class UserVmManagerImpl implements UserVmManager { { s_logger.debug("failed to create VM instance : " + name); } - + + _accountMgr.decrementResourceCount(account.getId(), ResourceType.user_vm); + _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); txn.commit(); return null; } @@ -2955,11 +2960,15 @@ public class UserVmManagerImpl implements UserVmManager { return _vmDao.findById(vmId); } catch (ResourceAllocationException rae) { + _accountMgr.decrementResourceCount(account.getId(), ResourceType.user_vm); + _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); if (s_logger.isInfoEnabled()) { s_logger.info("Failed to create VM for account " + accountId + " due to maximum number of virtual machines exceeded."); } throw rae; } catch (Throwable th) { + _accountMgr.decrementResourceCount(account.getId(), ResourceType.user_vm); + _accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes); s_logger.error("Unable to create vm", th); throw new CloudRuntimeException("Unable to create vm", th); } diff --git a/server/src/com/cloud/vm/VmManager.java b/server/src/com/cloud/vm/VmManager.java index 53de68f9522..fabf4b65ffd 100644 --- a/server/src/com/cloud/vm/VmManager.java +++ b/server/src/com/cloud/vm/VmManager.java @@ -19,7 +19,7 @@ package com.cloud.vm; import java.util.List; -import com.cloud.dc.DataCenterVO; +import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -37,39 +37,35 @@ import com.cloud.utils.component.Manager; */ public interface VmManager extends Manager { - T allocate(T vm, + VirtualMachineProfile allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Pair rootDiskOffering, List> dataDiskOfferings, - List> networks, - DataCenterVO dc, - AccountVO owner) throws InsufficientCapacityException; + List> networks, + DeploymentPlan plan, + AccountVO owner) throws InsufficientCapacityException, StorageUnavailableException; - T allocate(T vm, + VirtualMachineProfile allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, Long rootSize, Pair dataDiskOffering, - List> networks, - DataCenterVO dc, - AccountVO owner) throws InsufficientCapacityException; + List> networks, + DeploymentPlan plan, + AccountVO owner) throws InsufficientCapacityException, StorageUnavailableException; - T allocate(T vm, + VirtualMachineProfile allocate(T vm, VMTemplateVO template, ServiceOfferingVO serviceOffering, List networkProfiles, - DataCenterVO dc, - AccountVO owner) throws InsufficientCapacityException; + DeploymentPlan plan, + AccountVO owner) throws InsufficientCapacityException, StorageUnavailableException; - T create(T vm) throws InsufficientCapacityException, StorageUnavailableException; - - T start(T vm) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException; + T start(VirtualMachineProfile p, DeploymentPlan plan) throws InsufficientCapacityException, StorageUnavailableException, ConcurrentOperationException; T stop(T vm) throws AgentUnavailableException, ConcurrentOperationException; - void create(VmCharacteristics vm, List disks, List networks); - void destroy(); } diff --git a/server/src/com/cloud/vm/dao/NicDao.java b/server/src/com/cloud/vm/dao/NicDao.java index dcd545eca1f..6f4e3616a3e 100644 --- a/server/src/com/cloud/vm/dao/NicDao.java +++ b/server/src/com/cloud/vm/dao/NicDao.java @@ -3,9 +3,12 @@ */ package com.cloud.vm.dao; +import java.util.List; + import com.cloud.utils.db.GenericDao; import com.cloud.vm.NicVO; public interface NicDao extends GenericDao { + List listBy(long instanceId); } diff --git a/server/src/com/cloud/vm/dao/NicDaoImpl.java b/server/src/com/cloud/vm/dao/NicDaoImpl.java index 8006755e781..c6b1eda5ac8 100644 --- a/server/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/server/src/com/cloud/vm/dao/NicDaoImpl.java @@ -3,15 +3,32 @@ */ package com.cloud.vm.dao; +import java.util.List; + import javax.ejb.Local; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; import com.cloud.vm.NicVO; @Local(value=NicDao.class) public class NicDaoImpl extends GenericDaoBase implements NicDao { + private final SearchBuilder InstanceSearch; + protected NicDaoImpl() { super(); + + InstanceSearch = createSearchBuilder(); + InstanceSearch.and("instance", InstanceSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); + InstanceSearch.done(); + } + + @Override + public List listBy(long instanceId) { + SearchCriteria sc = InstanceSearch.create(); + sc.setParameters("instance", instanceId); + return listIncludingRemovedBy(sc); } } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 3898c7fe3cf..9878ac4cd11 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -95,12 +95,14 @@ CREATE TABLE `cloud`.`network_configurations` ( `name` varchar(255) COMMENT 'name 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', - `gateway` varchar(15) NOT NULL COMMENT 'gateway for this network configuration', - `cidr` varchar(32) NOT NULL COMMENT 'network cidr', - `mode` varchar(32) NOT NULL COMMENT 'How to retrieve ip address in this network', + `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', `vlan_id` bigint unsigned NULL COMMENT 'vlan id if the broadcast_domain_type is the vlan', `network_offering_id` bigint unsigned NOT NULL COMMENT 'network offering id that this configuration is created from', - `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this configuration is used in', + `data_center_id` bigint unsigned NOT NULL COMMENT 'data center id that this configuration is used in', + `handler_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', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -116,12 +118,13 @@ CREATE TABLE `cloud`.`nics` ( `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance id', `ip4_address` varchar(15) COMMENT 'ip4 address', `mac_address` varchar(17) COMMENT 'mac address', - `network_configuration_id` bigint unsigned NOT NULL COMMENT 'network configuration id', - `vlan` varchar(64) COMMENT 'Virtualized network identifier', + `network_configuration_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', - `name` varchar(64) COMMENT 'Name of the component that reserved the ip address', + `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', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; @@ -679,10 +682,10 @@ CREATE TABLE `cloud`.`console_proxy` ( `dns1` varchar(15) COMMENT 'dns1', `dns2` varchar(15) COMMENT 'dns2', `domain` varchar(255) COMMENT 'domain', - `public_mac_address` varchar(17) NOT NULL unique COMMENT 'mac address of the public facing network card', + `public_mac_address` varchar(17) unique COMMENT 'mac address of the public facing network card', `public_ip_address` varchar(15) UNIQUE COMMENT 'public ip address for the console proxy', `public_netmask` varchar(15) COMMENT 'public netmask used for the console proxy', - `guest_mac_address` varchar(17) NOT NULL unique COMMENT 'mac address of the guest facing network card', + `guest_mac_address` varchar(17) unique COMMENT 'mac address of the guest facing network card', `guest_ip_address` varchar(15) UNIQUE COMMENT 'guest ip address for the console proxy', `guest_netmask` varchar(15) COMMENT 'guest netmask used for the console proxy', `vlan_db_id` bigint unsigned COMMENT 'Foreign key into vlan id table', diff --git a/setup/db/server-setup.xml b/setup/db/server-setup.xml index 7db947bee0b..9ca63ba9643 100755 --- a/setup/db/server-setup.xml +++ b/setup/db/server-setup.xml @@ -12,14 +12,14 @@ 1 - ZONE1 - 72.52.126.11 - 72.52.126.12 - 192.168.10.253 - 192.168.10.254 - 172.16.0.1 - 255.255.0.0 - 172.16.1.1-172.16.255.253 + NM + 4.2.2.2 + 10.10.10.14 + 4.2.2.2 + 4.2.2.2 + 10.91.28.1 + 255.255.255.0 + 560-579 10.1.1.0/24 @@ -35,24 +35,46 @@ 1 - POD1 + NM 1 - 192.168.2.1 - 192.168.2.0/24 - 192.168.2.20-192.168.2.170 + 10.91.28.1 + 10.91.28.0/24 + 10.91.28.160-10.91.28.179 - + + + 1 30 VirtualNetwork - 192.168.30.1 + 10.91.30.1 255.255.255.0 - 192.168.30.10-192.168.30.19 + 10.91.30.160-10.91.30.179 + +
-
+
  1. - +
Advanced +
+ -
+
@@ -261,7 +307,7 @@ long milliseconds = new Date().getTime();
-
+
-
- -

Alert -

-
-
- -
-
- <%=t.t("Details")%>
-
-
-
-
-
- <%=t.t("Type")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Description")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Sent")%>:
-
-
-
-
-
-
-
-
+<%@ page import="java.util.*" %> +<%@ page import="com.cloud.utils.*" %> + +<% + Locale browserLocale = request.getLocale(); + CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); +%> + + +
+ +
+ Alerts
+ +

Alerts +

+
+
+ +
+
+ <%=t.t("Details")%>
+
+
+
+
+
+ <%=t.t("Type")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Description")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Sent")%>:
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/ui/new/jsp/dashboard.jsp b/ui/new/jsp/dashboard.jsp new file mode 100644 index 00000000000..3f5be1504cf --- /dev/null +++ b/ui/new/jsp/dashboard.jsp @@ -0,0 +1,337 @@ +<%@ page import="java.util.*" %> +<%@ page import="com.cloud.utils.*" %> + +<% + Locale browserLocale = request.getLocale(); + CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); +%> + + +
+ +
+ Event
+ +

Dashboard +

+
+ + +
+ + +
+
+
+
System Wide Capacity
+
+
+
+ + +
+
+
+
+
+
+

Public IP Addresses

+
+

Used: 2 / 11

+
+
+
+
+
+
+
+
18.2 %
+
+
+ +
+
+
+

Private IP Addresses

+
+

Used: 2 / 10

+
+
+
+
+
+
+
+
20 %
+
+
+ +
+
+
+

Memory Allocated

+
+

Used: 2.12 GB / 3.22 GB

+
+
+
+
+
+
+
+
65.8 %
+
+
+ +
+
+
+

CPU

+
+

Used: 8 MHZ / 9.60 MHZ

+
+
+
+
+
+
+
+
83.3 %
+
+
+ +
+
+
+

Primary Storage Allocated

+
+

Used: Used: 4.00 GB / 3.50 TB

+
+
+
+
+
+
+
+
15.2 %
+
+
+ +
+
+
+

Primary Storage Used

+
+

Used: 999.17 GB / 1.75 TB

+
+
+
+
+
+
+
+
40.12 %
+
+
+ +
+
+
+

Secondary Storage Used

+
+

Used: 599.17 GB / 1.75 TB

+
+
+
+
+
+
+
+
20.12 %
+
+
+ +
+ + +
+
+
+
General Alerts
+
+
+
+
+
+
+
+
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+
+ + + +
+
+
+
General Alerts
+
+
+
+
+
+
+
+
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+ +
+
+
+
+ +
+
Alerts name
+
Details about the alert will appear here
+
+ +
+
09/17/2010 14:33:49
+
+
+
+ +
+ + diff --git a/ui/new/jsp/instance.jsp b/ui/new/jsp/instance.jsp index d464b3860a6..eabf476cf81 100644 --- a/ui/new/jsp/instance.jsp +++ b/ui/new/jsp/instance.jsp @@ -1,908 +1,916 @@ -<%@ page import="java.util.*" %> - -<%@ page import="com.cloud.utils.*" %> - -<% - Locale browserLocale = request.getLocale(); - CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); -%> - -
-
- Instance
-

- Instance -

-
-
- -
-
- <%=t.t("Details")%>
-
- <%=t.t("Volume")%>
-
- <%=t.t("Statistics")%>
-
- -
-
-
-
-
-
-
-
-
-

-

-
-
-
-
-
-
- <%=t.t("Zone")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Template")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Service")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("HA")%>:
-
-
-
-
-
-
-
-
-
-
-
- <%=t.t("Created")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Account")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Domain")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Host")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("ISO")%>:
-
-
-
-
-
-
-
-
-
-
-
- <%=t.t("Group")%>:
-
-
-
-
-
-
-
- - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - +<%@ page import="java.util.*" %> + +<%@ page import="com.cloud.utils.*" %> + +<% + Locale browserLocale = request.getLocale(); + CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); +%> + +
+
+ Instance
+

+ Instance +

+
+
+ +
+
+ <%=t.t("Details")%>
+
+ <%=t.t("Volume")%>
+
+ <%=t.t("Statistics")%>
+
+ +
+
+
+
+
+
+
+
+
+

+

+
+
+
+
+
+
+ <%=t.t("Zone")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Template")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Service")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("HA.Enabled")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Created")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Account")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Domain")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Host")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("ISO.attached")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Group")%>:
+
+
+
+
+
+
+
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui/new/jsp/ip_address.jsp b/ui/new/jsp/ip_address.jsp deleted file mode 100644 index ec5a18072e5..00000000000 --- a/ui/new/jsp/ip_address.jsp +++ /dev/null @@ -1,382 +0,0 @@ -<%@ page import="java.util.*" %> - -<%@ page import="com.cloud.utils.*" %> - -<% - Locale browserLocale = request.getLocale(); - CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); -%> - -
-
- IP Address
-

- IP Address -

-
-
- -
-
- <%=t.t("Details")%>
-
- <%=t.t("Port Forwarding")%>
-
- <%=t.t("Load Balancer")%>
-
-
-
- -
-
-
-
-
-

- Detaching Disk …

-
- -
-
-
-
-
- IP:
-
-
-
-
-
-
-
-
-
- Zone:
-
-
-
-
-
-
-
-
-
- VLAN:
-
-
-
-
-
-
-
-
-
- <%=t.t("Level")%>:
-
-
-
-
-
-
-
-
-
- Source NAT:
-
-
-
-
-
-
-
-
-
- Network Type:
-
-
-
-
-
-
-
-
-
- Domain:
-
-
-
-
-
-
-
-
-
- Account:
-
-
-
-
-
-
-
-
-
- Allocated:
-
-
-
-
-
-
-
-
- - - - - - - -
- diff --git a/ui/new/jsp/ipaddress.jsp b/ui/new/jsp/ipaddress.jsp new file mode 100644 index 00000000000..35a2b4e0f16 --- /dev/null +++ b/ui/new/jsp/ipaddress.jsp @@ -0,0 +1,445 @@ +<%@ page import="java.util.*" %> + +<%@ page import="com.cloud.utils.*" %> + +<% + Locale browserLocale = request.getLocale(); + CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); +%> + +
+
+ IP Address
+

+ IP Address +

+
+
+ +
+
+ <%=t.t("Details")%>
+
+ <%=t.t("Port Forwarding")%>
+
+ <%=t.t("Load Balancer")%>
+
+
+
+ +
+
+
+
+
+

+ Detaching Disk …

+
+ +
+
+
+
+
+ IP:
+
+
+
+
+
+
+
+
+
+ Zone:
+
+
+
+
+
+
+
+
+
+ VLAN:
+
+
+
+
+
+
+
+
+
+ Source NAT:
+
+
+
+
+
+
+
+
+
+ Network Type:
+
+
+
+
+
+
+
+
+
+ Domain:
+
+
+
+
+
+
+
+
+
+ Account:
+
+
+
+
+
+
+
+
+
+ Allocated:
+
+
+
+
+
+
+
+
+ + + + + + + +
+ + + + + + + + + + + + + + + diff --git a/ui/new/jsp/iso.jsp b/ui/new/jsp/iso.jsp index cb730cf7e7b..f6fcd0d4b48 100644 --- a/ui/new/jsp/iso.jsp +++ b/ui/new/jsp/iso.jsp @@ -35,7 +35,7 @@
-
+
@@ -89,6 +91,8 @@
+ +
@@ -107,9 +111,7 @@ <%=t.t("Bootable")%>:
-
-
-
+
@@ -142,8 +144,116 @@
-
-
+
+
+
+ + +
+ + + + + + + + + + + + diff --git a/ui/new/jsp/router.jsp b/ui/new/jsp/router.jsp index 26433f65969..7baa931b50b 100644 --- a/ui/new/jsp/router.jsp +++ b/ui/new/jsp/router.jsp @@ -1,159 +1,159 @@ -<%@ page import="java.util.*" %> - -<%@ page import="com.cloud.utils.*" %> - -<% - Locale browserLocale = request.getLocale(); - CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); -%> - -
- -

- Router -

-
-
- -
-
- <%=t.t("Details")%>
-
-
-
- -
-
-
-
-
-

- Detaching Disk …

-
- -
-
-
-
-
- <%=t.t("Status")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Zone")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Name")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Public IP")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Private IP")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Guest IP")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Host")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Network Domain")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Account")%>:
-
-
-
-
-
-
-
-
-
- <%=t.t("Created")%>:
-
-
-
-
-
-
-
-
-
- +<%@ page import="java.util.*" %> + +<%@ page import="com.cloud.utils.*" %> + +<% + Locale browserLocale = request.getLocale(); + CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale); +%> + +
+ +
+ Routers
+ +

+ Router +

+
+
+ +
+
+ <%=t.t("Details")%>
+
+
+
+ +
+
+
+
+
+

+ Detaching Disk …

+
+ +
+
+
+
+
+ <%=t.t("Status")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Zone")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Name")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Public IP")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Private IP")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Guest IP")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Host")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Network Domain")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Account")%>:
+
+
+
+
+
+
+
+
+
+ <%=t.t("Created")%>:
+
+
+
+
+
+
+
+
+
+ diff --git a/ui/new/jsp/template.jsp b/ui/new/jsp/template.jsp index 5d1b92a84fa..0c3e9538a40 100644 --- a/ui/new/jsp/template.jsp +++ b/ui/new/jsp/template.jsp @@ -25,8 +25,8 @@
-