mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Sync master to javelin one more time
This commit is contained in:
commit
7b75f0d990
@ -59,4 +59,8 @@ public interface Domain extends OwnedBy, Identity, InternalIdentity {
|
|||||||
void setState(State state);
|
void setState(State state);
|
||||||
|
|
||||||
String getNetworkDomain();
|
String getNetworkDomain();
|
||||||
|
|
||||||
|
public String getUuid();
|
||||||
|
|
||||||
|
int getRegionId();
|
||||||
}
|
}
|
||||||
|
|||||||
55
api/src/com/cloud/event/EventCategory.java
Normal file
55
api/src/com/cloud/event/EventCategory.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.event;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class EventCategory {
|
||||||
|
private static List<EventCategory> eventCategories = new ArrayList<EventCategory>();
|
||||||
|
private String eventCategoryName;
|
||||||
|
|
||||||
|
public EventCategory(String categoryName) {
|
||||||
|
this.eventCategoryName = categoryName;
|
||||||
|
eventCategories.add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return eventCategoryName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<EventCategory> listAllEventCategories() {
|
||||||
|
return eventCategories;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EventCategory getEventCategory(String categoryName) {
|
||||||
|
for (EventCategory category : eventCategories) {
|
||||||
|
if (category.getName().equalsIgnoreCase(categoryName)) {
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final EventCategory ACTION_EVENT = new EventCategory("ActionEvent");
|
||||||
|
public static final EventCategory ALERT_EVENT = new EventCategory("AlertEvent");
|
||||||
|
public static final EventCategory USAGE_EVENT = new EventCategory("UsageEvent");
|
||||||
|
public static final EventCategory RESOURCE_STATE_CHANGE_EVENT = new EventCategory("ResourceStateEvent");
|
||||||
|
}
|
||||||
@ -16,7 +16,41 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.event;
|
package com.cloud.event;
|
||||||
|
|
||||||
|
import com.cloud.configuration.Configuration;
|
||||||
|
import com.cloud.dc.DataCenter;
|
||||||
|
import com.cloud.dc.Pod;
|
||||||
|
import com.cloud.dc.StorageNetworkIpRange;
|
||||||
|
import com.cloud.dc.Vlan;
|
||||||
|
import com.cloud.domain.Domain;
|
||||||
|
import com.cloud.host.Host;
|
||||||
|
import com.cloud.network.*;
|
||||||
|
import com.cloud.network.as.*;
|
||||||
|
import com.cloud.network.router.VirtualRouter;
|
||||||
|
import com.cloud.network.rules.LoadBalancer;
|
||||||
|
import com.cloud.network.rules.StaticNat;
|
||||||
|
import com.cloud.network.security.SecurityGroup;
|
||||||
|
import com.cloud.network.vpc.PrivateGateway;
|
||||||
|
import com.cloud.network.vpc.StaticRoute;
|
||||||
|
import com.cloud.network.vpc.Vpc;
|
||||||
|
import com.cloud.offering.DiskOffering;
|
||||||
|
import com.cloud.offering.NetworkOffering;
|
||||||
|
import com.cloud.offering.ServiceOffering;
|
||||||
|
import com.cloud.projects.Project;
|
||||||
|
import com.cloud.storage.Snapshot;
|
||||||
|
import com.cloud.storage.Volume;
|
||||||
|
import com.cloud.template.VirtualMachineTemplate;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.user.User;
|
||||||
|
import com.cloud.vm.VirtualMachine;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class EventTypes {
|
public class EventTypes {
|
||||||
|
|
||||||
|
//map of Event and corresponding entity for which Event is applicable
|
||||||
|
private static Map<String, String> entityEventDetails = null;
|
||||||
|
|
||||||
// VM Events
|
// VM Events
|
||||||
public static final String EVENT_VM_CREATE = "VM.CREATE";
|
public static final String EVENT_VM_CREATE = "VM.CREATE";
|
||||||
public static final String EVENT_VM_DESTROY = "VM.DESTROY";
|
public static final String EVENT_VM_DESTROY = "VM.DESTROY";
|
||||||
@ -320,9 +354,322 @@ public class EventTypes {
|
|||||||
public static final String EVENT_AUTOSCALEVMGROUP_ENABLE = "AUTOSCALEVMGROUP.ENABLE";
|
public static final String EVENT_AUTOSCALEVMGROUP_ENABLE = "AUTOSCALEVMGROUP.ENABLE";
|
||||||
public static final String EVENT_AUTOSCALEVMGROUP_DISABLE = "AUTOSCALEVMGROUP.DISABLE";
|
public static final String EVENT_AUTOSCALEVMGROUP_DISABLE = "AUTOSCALEVMGROUP.DISABLE";
|
||||||
|
|
||||||
|
|
||||||
public static final String EVENT_BAREMETAL_DHCP_SERVER_ADD = "PHYSICAL.DHCP.ADD";
|
public static final String EVENT_BAREMETAL_DHCP_SERVER_ADD = "PHYSICAL.DHCP.ADD";
|
||||||
public static final String EVENT_BAREMETAL_DHCP_SERVER_DELETE = "PHYSICAL.DHCP.DELETE";
|
public static final String EVENT_BAREMETAL_DHCP_SERVER_DELETE = "PHYSICAL.DHCP.DELETE";
|
||||||
|
|
||||||
public static final String EVENT_BAREMETAL_PXE_SERVER_ADD = "PHYSICAL.PXE.ADD";
|
public static final String EVENT_BAREMETAL_PXE_SERVER_ADD = "PHYSICAL.PXE.ADD";
|
||||||
public static final String EVENT_BAREMETAL_PXE_SERVER_DELETE = "PHYSICAL.PXE.DELETE";
|
public static final String EVENT_BAREMETAL_PXE_SERVER_DELETE = "PHYSICAL.PXE.DELETE";
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
// TODO: need a way to force author adding event types to declare the entity details as well, with out braking
|
||||||
|
// current ActionEvent annotation semantics
|
||||||
|
|
||||||
|
entityEventDetails = new HashMap<String, String>();
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_VM_CREATE, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_DESTROY, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_START, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_STOP, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_REBOOT, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_UPDATE, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_UPGRADE, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_RESETPASSWORD, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_MIGRATE, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_MOVE, VirtualMachine.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VM_RESTORE, VirtualMachine.class.getName());
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_CREATE, VirtualRouter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_DESTROY, VirtualRouter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_START, VirtualRouter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_STOP, VirtualRouter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_REBOOT, VirtualRouter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_HA, VirtualRouter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_UPGRADE, VirtualRouter.class.getName());
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_PROXY_CREATE, "ConsoleProxy");
|
||||||
|
entityEventDetails.put(EVENT_PROXY_DESTROY, "ConsoleProxy");
|
||||||
|
entityEventDetails.put(EVENT_PROXY_START, "ConsoleProxy");
|
||||||
|
entityEventDetails.put(EVENT_PROXY_STOP, "ConsoleProxy");
|
||||||
|
entityEventDetails.put(EVENT_PROXY_REBOOT, "ConsoleProxy");
|
||||||
|
entityEventDetails.put(EVENT_ROUTER_HA, "ConsoleProxy");
|
||||||
|
entityEventDetails.put(EVENT_PROXY_HA, "ConsoleProxy");
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_VNC_CONNECT, "VNC");
|
||||||
|
entityEventDetails.put(EVENT_VNC_DISCONNECT, "VNC");
|
||||||
|
|
||||||
|
// Network Events
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_CREATE, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_DELETE, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_UPDATE, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_RESTART, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NET_IP_ASSIGN, PublicIpAddress.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NET_IP_RELEASE, PublicIpAddress.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NET_RULE_ADD, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NET_RULE_DELETE, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NET_RULE_MODIFY, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_FIREWALL_OPEN, Network.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_FIREWALL_CLOSE, Network.class.getName());
|
||||||
|
|
||||||
|
// Load Balancers
|
||||||
|
entityEventDetails.put(EVENT_ASSIGN_TO_LOAD_BALANCER_RULE, LoadBalancer.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_REMOVE_FROM_LOAD_BALANCER_RULE, LoadBalancer.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_LOAD_BALANCER_CREATE, LoadBalancer.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_LOAD_BALANCER_DELETE, LoadBalancer.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_LB_STICKINESSPOLICY_CREATE, LoadBalancer.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_LB_STICKINESSPOLICY_DELETE, LoadBalancer.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_LOAD_BALANCER_UPDATE, LoadBalancer.class.getName());
|
||||||
|
|
||||||
|
// Account events
|
||||||
|
entityEventDetails.put(EVENT_ACCOUNT_DISABLE, Account.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ACCOUNT_CREATE, Account.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ACCOUNT_DELETE, Account.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ACCOUNT_MARK_DEFAULT_ZONE, Account.class.getName());
|
||||||
|
|
||||||
|
// UserVO Events
|
||||||
|
entityEventDetails.put(EVENT_USER_LOGIN, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_LOGOUT, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_CREATE, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_DELETE, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_DISABLE, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_UPDATE, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_ENABLE, User.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_USER_LOCK, User.class.getName());
|
||||||
|
|
||||||
|
// Template Events
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_CREATE, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_DELETE, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_UPDATE, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_DOWNLOAD_START, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_DOWNLOAD_SUCCESS, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_DOWNLOAD_FAILED, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_COPY, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_EXTRACT, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_UPLOAD, VirtualMachineTemplate.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TEMPLATE_CLEANUP, VirtualMachineTemplate.class.getName());
|
||||||
|
|
||||||
|
// Volume Events
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_CREATE, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_DELETE, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_ATTACH, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_DETACH, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_EXTRACT, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_UPLOAD, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_MIGRATE, Volume.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VOLUME_RESIZE, Volume.class.getName());
|
||||||
|
|
||||||
|
// Domains
|
||||||
|
entityEventDetails.put(EVENT_DOMAIN_CREATE, Domain.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_DOMAIN_DELETE, Domain.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_DOMAIN_UPDATE, Domain.class.getName());
|
||||||
|
|
||||||
|
// Snapshots
|
||||||
|
entityEventDetails.put(EVENT_SNAPSHOT_CREATE, Snapshot.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SNAPSHOT_DELETE, Snapshot.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SNAPSHOT_POLICY_CREATE, Snapshot.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SNAPSHOT_POLICY_UPDATE, Snapshot.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SNAPSHOT_POLICY_DELETE, Snapshot.class.getName());
|
||||||
|
|
||||||
|
// ISO
|
||||||
|
entityEventDetails.put(EVENT_ISO_CREATE, "Iso");
|
||||||
|
entityEventDetails.put(EVENT_ISO_DELETE, "Iso");
|
||||||
|
entityEventDetails.put(EVENT_ISO_COPY, "Iso");
|
||||||
|
entityEventDetails.put(EVENT_ISO_ATTACH, "Iso");
|
||||||
|
entityEventDetails.put(EVENT_ISO_DETACH, "Iso");
|
||||||
|
entityEventDetails.put(EVENT_ISO_EXTRACT, "Iso");
|
||||||
|
entityEventDetails.put(EVENT_ISO_UPLOAD, "Iso");
|
||||||
|
|
||||||
|
// SSVM
|
||||||
|
entityEventDetails.put(EVENT_SSVM_CREATE, "SecondaryStorageVm");
|
||||||
|
entityEventDetails.put(EVENT_SSVM_DESTROY, "SecondaryStorageVm");
|
||||||
|
entityEventDetails.put(EVENT_SSVM_START, "SecondaryStorageVm");
|
||||||
|
entityEventDetails.put(EVENT_SSVM_STOP, "SecondaryStorageVm");
|
||||||
|
entityEventDetails.put(EVENT_SSVM_REBOOT, "SecondaryStorageVm");
|
||||||
|
entityEventDetails.put(EVENT_SSVM_HA, "SecondaryStorageVm");
|
||||||
|
|
||||||
|
// Service Offerings
|
||||||
|
entityEventDetails.put(EVENT_SERVICE_OFFERING_CREATE, ServiceOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SERVICE_OFFERING_EDIT, ServiceOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SERVICE_OFFERING_DELETE, ServiceOffering.class.getName());
|
||||||
|
|
||||||
|
// Disk Offerings
|
||||||
|
entityEventDetails.put(EVENT_DISK_OFFERING_CREATE, DiskOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_DISK_OFFERING_EDIT, DiskOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_DISK_OFFERING_DELETE, DiskOffering.class.getName());
|
||||||
|
|
||||||
|
// Network offerings
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_OFFERING_CREATE, NetworkOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_OFFERING_ASSIGN, NetworkOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_OFFERING_EDIT, NetworkOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_OFFERING_REMOVE, NetworkOffering.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_OFFERING_DELETE, NetworkOffering.class.getName());
|
||||||
|
|
||||||
|
// Pods
|
||||||
|
entityEventDetails.put(EVENT_POD_CREATE, Pod.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_POD_EDIT, Pod.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_POD_DELETE, Pod.class.getName());
|
||||||
|
|
||||||
|
// Zones
|
||||||
|
entityEventDetails.put(EVENT_ZONE_CREATE, DataCenter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ZONE_EDIT, DataCenter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ZONE_DELETE, DataCenter.class.getName());
|
||||||
|
|
||||||
|
// VLANs/IP ranges
|
||||||
|
entityEventDetails.put(EVENT_VLAN_IP_RANGE_CREATE, Vlan.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VLAN_IP_RANGE_DELETE,Vlan.class.getName());
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_STORAGE_IP_RANGE_CREATE, StorageNetworkIpRange.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_STORAGE_IP_RANGE_DELETE, StorageNetworkIpRange.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_STORAGE_IP_RANGE_UPDATE, StorageNetworkIpRange.class.getName());
|
||||||
|
|
||||||
|
// Configuration Table
|
||||||
|
entityEventDetails.put(EVENT_CONFIGURATION_VALUE_EDIT, Configuration.class.getName());
|
||||||
|
|
||||||
|
// Security Groups
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_AUTHORIZE_INGRESS, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_REVOKE_INGRESS, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_AUTHORIZE_EGRESS, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_REVOKE_EGRESS, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_CREATE, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_DELETE, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_ASSIGN, SecurityGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SECURITY_GROUP_REMOVE, SecurityGroup.class.getName());
|
||||||
|
|
||||||
|
// Host
|
||||||
|
entityEventDetails.put(EVENT_HOST_RECONNECT, Host.class.getName());
|
||||||
|
|
||||||
|
// Maintenance
|
||||||
|
entityEventDetails.put(EVENT_MAINTENANCE_CANCEL, Host.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE, Host.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_MAINTENANCE_PREPARE, Host.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_MAINTENANCE_PREPARE_PRIMARY_STORAGE, Host.class.getName());
|
||||||
|
|
||||||
|
// VPN
|
||||||
|
entityEventDetails.put(EVENT_REMOTE_ACCESS_VPN_CREATE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_REMOTE_ACCESS_VPN_DESTROY, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPN_USER_ADD, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPN_USER_REMOVE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_GATEWAY_CREATE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_GATEWAY_DELETE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_CREATE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_DELETE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_CUSTOMER_GATEWAY_UPDATE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_CREATE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_DELETE, RemoteAccessVpn.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_S2S_VPN_CONNECTION_RESET, RemoteAccessVpn.class.getName());
|
||||||
|
|
||||||
|
// Custom certificates
|
||||||
|
entityEventDetails.put(EVENT_UPLOAD_CUSTOM_CERTIFICATE, "Certificate");
|
||||||
|
|
||||||
|
// OneToOnenat
|
||||||
|
entityEventDetails.put(EVENT_ENABLE_STATIC_NAT, StaticNat.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_DISABLE_STATIC_NAT, StaticNat.class.getName());
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_ZONE_VLAN_ASSIGN,Vlan.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_ZONE_VLAN_RELEASE,Vlan.class.getName());
|
||||||
|
|
||||||
|
// Projects
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_CREATE, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_UPDATE, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_DELETE, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_ACTIVATE, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_SUSPEND, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_ACCOUNT_ADD, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_INVITATION_UPDATE, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_INVITATION_REMOVE, Project.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PROJECT_ACCOUNT_REMOVE, Project.class.getName());
|
||||||
|
|
||||||
|
// Network as a Service
|
||||||
|
entityEventDetails.put(EVENT_NETWORK_ELEMENT_CONFIGURE,Network.class.getName());
|
||||||
|
|
||||||
|
// Physical Network Events
|
||||||
|
entityEventDetails.put(EVENT_PHYSICAL_NETWORK_CREATE, PhysicalNetwork.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PHYSICAL_NETWORK_DELETE, PhysicalNetwork.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PHYSICAL_NETWORK_UPDATE, PhysicalNetwork.class.getName());
|
||||||
|
|
||||||
|
// Physical Network Service Provider Events
|
||||||
|
entityEventDetails.put(EVENT_SERVICE_PROVIDER_CREATE, PhysicalNetworkServiceProvider.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SERVICE_PROVIDER_DELETE, PhysicalNetworkServiceProvider.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_SERVICE_PROVIDER_UPDATE, PhysicalNetworkServiceProvider.class.getName());
|
||||||
|
|
||||||
|
// Physical Network TrafficType Events
|
||||||
|
entityEventDetails.put(EVENT_TRAFFIC_TYPE_CREATE, PhysicalNetworkTrafficType.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TRAFFIC_TYPE_DELETE, PhysicalNetworkTrafficType.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_TRAFFIC_TYPE_UPDATE, PhysicalNetworkTrafficType.class.getName());
|
||||||
|
|
||||||
|
// external network device events
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_LB_DEVICE_ADD, PhysicalNetwork.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_LB_DEVICE_DELETE, PhysicalNetwork.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_LB_DEVICE_CONFIGURE, PhysicalNetwork.class.getName());
|
||||||
|
|
||||||
|
// external switch management device events (E.g.: Cisco Nexus 1000v Virtual Supervisor Module.
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ADD, "Nexus1000v");
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DELETE, "Nexus1000v");
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_CONFIGURE, "Nexus1000v");
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ENABLE, "Nexus1000v");
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DISABLE, "Nexus1000v");
|
||||||
|
|
||||||
|
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_FIREWALL_DEVICE_ADD, PhysicalNetwork.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_FIREWALL_DEVICE_DELETE, PhysicalNetwork.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_FIREWALL_DEVICE_CONFIGURE, PhysicalNetwork.class.getName());
|
||||||
|
|
||||||
|
// VPC
|
||||||
|
entityEventDetails.put(EVENT_VPC_CREATE, Vpc.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPC_UPDATE, Vpc.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPC_DELETE, Vpc.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPC_RESTART, Vpc.class.getName());
|
||||||
|
|
||||||
|
// VPC offerings
|
||||||
|
entityEventDetails.put(EVENT_VPC_OFFERING_CREATE, Vpc.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPC_OFFERING_UPDATE, Vpc.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_VPC_OFFERING_DELETE, Vpc.class.getName());
|
||||||
|
|
||||||
|
// Private gateway
|
||||||
|
entityEventDetails.put(EVENT_PRIVATE_GATEWAY_CREATE, PrivateGateway.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_PRIVATE_GATEWAY_DELETE, PrivateGateway.class.getName());
|
||||||
|
|
||||||
|
// Static routes
|
||||||
|
entityEventDetails.put(EVENT_STATIC_ROUTE_CREATE, StaticRoute.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_STATIC_ROUTE_DELETE, StaticRoute.class.getName());
|
||||||
|
|
||||||
|
// tag related events
|
||||||
|
entityEventDetails.put(EVENT_TAGS_CREATE, "Tag");
|
||||||
|
entityEventDetails.put(EVENT_TAGS_DELETE, "tag");
|
||||||
|
|
||||||
|
// external network device events
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_NVP_CONTROLLER_ADD, "NvpController");
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_NVP_CONTROLLER_DELETE, "NvpController");
|
||||||
|
entityEventDetails.put(EVENT_EXTERNAL_NVP_CONTROLLER_CONFIGURE, "NvpController");
|
||||||
|
|
||||||
|
// AutoScale
|
||||||
|
entityEventDetails.put(EVENT_COUNTER_CREATE, AutoScaleCounter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_COUNTER_DELETE, AutoScaleCounter.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_CONDITION_CREATE, Condition.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_CONDITION_DELETE, Condition.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEPOLICY_CREATE, AutoScalePolicy.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEPOLICY_UPDATE, AutoScalePolicy.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEPOLICY_DELETE, AutoScalePolicy.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMPROFILE_CREATE, AutoScaleVmProfile.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMPROFILE_DELETE, AutoScaleVmProfile.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMPROFILE_UPDATE, AutoScaleVmProfile.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_CREATE, AutoScaleVmGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_DELETE, AutoScaleVmGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_UPDATE, AutoScaleVmGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_ENABLE, AutoScaleVmGroup.class.getName());
|
||||||
|
entityEventDetails.put(EVENT_AUTOSCALEVMGROUP_DISABLE, AutoScaleVmGroup.class.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getEntityForEvent (String eventName) {
|
||||||
|
String entityClassName = entityEventDetails.get(eventName);
|
||||||
|
if (entityClassName == null || entityClassName.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
int index = entityClassName.lastIndexOf(".");
|
||||||
|
String entityName = entityClassName;
|
||||||
|
if (index != -1) {
|
||||||
|
entityName = entityClassName.substring(index+1);
|
||||||
|
}
|
||||||
|
return entityName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,13 +28,24 @@ import org.apache.cloudstack.api.InternalIdentity;
|
|||||||
import com.cloud.network.Networks.BroadcastDomainType;
|
import com.cloud.network.Networks.BroadcastDomainType;
|
||||||
import com.cloud.network.Networks.Mode;
|
import com.cloud.network.Networks.Mode;
|
||||||
import com.cloud.network.Networks.TrafficType;
|
import com.cloud.network.Networks.TrafficType;
|
||||||
import com.cloud.utils.fsm.FiniteState;
|
import com.cloud.network.Networks.BroadcastDomainType;
|
||||||
import com.cloud.utils.fsm.StateMachine;
|
import com.cloud.network.Networks.Mode;
|
||||||
|
import com.cloud.network.Networks.TrafficType;
|
||||||
|
import com.cloud.utils.fsm.StateMachine2;
|
||||||
|
import com.cloud.utils.fsm.StateObject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.acl.ControlledEntity;
|
||||||
|
import org.apache.cloudstack.api.Identity;
|
||||||
|
import org.apache.cloudstack.api.InternalIdentity;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* owned by an account.
|
* owned by an account.
|
||||||
*/
|
*/
|
||||||
public interface Network extends ControlledEntity, InternalIdentity, Identity {
|
public interface Network extends ControlledEntity, StateObject<Network.State>, InternalIdentity, Identity {
|
||||||
|
|
||||||
public enum GuestType {
|
public enum GuestType {
|
||||||
Shared,
|
Shared,
|
||||||
@ -205,7 +216,8 @@ public interface Network extends ControlledEntity, InternalIdentity, Identity {
|
|||||||
OperationFailed;
|
OperationFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum State implements FiniteState<State, Event> {
|
public enum State {
|
||||||
|
|
||||||
Allocated("Indicates the network configuration is in allocated but not setup"),
|
Allocated("Indicates the network configuration is in allocated but not setup"),
|
||||||
Setup("Indicates the network configuration is setup"),
|
Setup("Indicates the network configuration is setup"),
|
||||||
Implementing("Indicates the network configuration is being implemented"),
|
Implementing("Indicates the network configuration is being implemented"),
|
||||||
@ -213,39 +225,8 @@ public interface Network extends ControlledEntity, InternalIdentity, Identity {
|
|||||||
Shutdown("Indicates the network configuration is being destroyed"),
|
Shutdown("Indicates the network configuration is being destroyed"),
|
||||||
Destroy("Indicates that the network is destroyed");
|
Destroy("Indicates that the network is destroyed");
|
||||||
|
|
||||||
|
protected static final StateMachine2<State, Network.Event, Network> s_fsm = new StateMachine2<State, Network.Event, Network>();
|
||||||
|
|
||||||
@Override
|
|
||||||
public StateMachine<State, Event> getStateMachine() {
|
|
||||||
return s_fsm;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public State getNextState(Event event) {
|
|
||||||
return s_fsm.getNextState(this, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<State> getFromStates(Event event) {
|
|
||||||
return s_fsm.getFromStates(this, event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<Event> getPossibleEvents() {
|
|
||||||
return s_fsm.getPossibleEvents(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
String _description;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription() {
|
|
||||||
return _description;
|
|
||||||
}
|
|
||||||
|
|
||||||
private State(String description) {
|
|
||||||
_description = description;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static StateMachine<State, Event> s_fsm = new StateMachine<State, Event>();
|
|
||||||
static {
|
static {
|
||||||
s_fsm.addTransition(State.Allocated, Event.ImplementNetwork, State.Implementing);
|
s_fsm.addTransition(State.Allocated, Event.ImplementNetwork, State.Implementing);
|
||||||
s_fsm.addTransition(State.Implementing, Event.OperationSucceeded, State.Implemented);
|
s_fsm.addTransition(State.Implementing, Event.OperationSucceeded, State.Implemented);
|
||||||
@ -254,6 +235,15 @@ public interface Network extends ControlledEntity, InternalIdentity, Identity {
|
|||||||
s_fsm.addTransition(State.Shutdown, Event.OperationSucceeded, State.Allocated);
|
s_fsm.addTransition(State.Shutdown, Event.OperationSucceeded, State.Allocated);
|
||||||
s_fsm.addTransition(State.Shutdown, Event.OperationFailed, State.Implemented);
|
s_fsm.addTransition(State.Shutdown, Event.OperationFailed, State.Implemented);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static StateMachine2<State, Network.Event, Network> getStateMachine() {
|
||||||
|
return s_fsm;
|
||||||
|
}
|
||||||
|
|
||||||
|
String _description;
|
||||||
|
private State(String description) {
|
||||||
|
_description = description;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class IpAddresses {
|
public class IpAddresses {
|
||||||
|
|||||||
@ -18,13 +18,14 @@ package com.cloud.storage;
|
|||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
|
import com.cloud.utils.fsm.StateMachine2;
|
||||||
|
import com.cloud.utils.fsm.StateObject;
|
||||||
import org.apache.cloudstack.acl.ControlledEntity;
|
import org.apache.cloudstack.acl.ControlledEntity;
|
||||||
import org.apache.cloudstack.api.Identity;
|
import org.apache.cloudstack.api.Identity;
|
||||||
import org.apache.cloudstack.api.InternalIdentity;
|
import org.apache.cloudstack.api.InternalIdentity;
|
||||||
|
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
public interface Snapshot extends ControlledEntity, Identity, InternalIdentity, StateObject<Snapshot.State> {
|
||||||
|
|
||||||
public interface Snapshot extends ControlledEntity, Identity, InternalIdentity {
|
|
||||||
public enum Type {
|
public enum Type {
|
||||||
MANUAL,
|
MANUAL,
|
||||||
RECURRING,
|
RECURRING,
|
||||||
@ -53,14 +54,29 @@ public interface Snapshot extends ControlledEntity, Identity, InternalIdentity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Status {
|
public enum State {
|
||||||
Creating,
|
Creating,
|
||||||
CreatedOnPrimary,
|
CreatedOnPrimary,
|
||||||
BackingUp,
|
BackingUp,
|
||||||
BackedUp,
|
BackedUp,
|
||||||
Error;
|
Error;
|
||||||
|
|
||||||
@Override
|
private final static StateMachine2<State, Event, Snapshot> s_fsm = new StateMachine2<State, Event, Snapshot>();
|
||||||
|
|
||||||
|
public static StateMachine2<State, Event, Snapshot> getStateMachine() {
|
||||||
|
return s_fsm;
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
s_fsm.addTransition(null, Event.CreateRequested, Creating);
|
||||||
|
s_fsm.addTransition(Creating, Event.OperationSucceeded, CreatedOnPrimary);
|
||||||
|
s_fsm.addTransition(Creating, Event.OperationNotPerformed, BackedUp);
|
||||||
|
s_fsm.addTransition(Creating, Event.OperationFailed, Error);
|
||||||
|
s_fsm.addTransition(CreatedOnPrimary, Event.BackupToSecondary, BackingUp);
|
||||||
|
s_fsm.addTransition(BackingUp, Event.OperationSucceeded, BackedUp);
|
||||||
|
s_fsm.addTransition(BackingUp, Event.OperationFailed, Error);
|
||||||
|
}
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.name();
|
return this.name();
|
||||||
}
|
}
|
||||||
@ -70,6 +86,15 @@ public interface Snapshot extends ControlledEntity, Identity, InternalIdentity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Event {
|
||||||
|
CreateRequested,
|
||||||
|
OperationNotPerformed,
|
||||||
|
BackupToSecondary,
|
||||||
|
BackedupToSecondary,
|
||||||
|
OperationSucceeded,
|
||||||
|
OperationFailed
|
||||||
|
}
|
||||||
|
|
||||||
public static final long MANUAL_POLICY_ID = 0L;
|
public static final long MANUAL_POLICY_ID = 0L;
|
||||||
|
|
||||||
long getAccountId();
|
long getAccountId();
|
||||||
@ -84,7 +109,7 @@ public interface Snapshot extends ControlledEntity, Identity, InternalIdentity {
|
|||||||
|
|
||||||
Type getType();
|
Type getType();
|
||||||
|
|
||||||
Status getStatus();
|
State getState();
|
||||||
|
|
||||||
HypervisorType getHypervisorType();
|
HypervisorType getHypervisorType();
|
||||||
|
|
||||||
|
|||||||
@ -63,4 +63,7 @@ public interface Account extends ControlledEntity, InternalIdentity, Identity {
|
|||||||
|
|
||||||
public Long getDefaultZoneId();
|
public Long getDefaultZoneId();
|
||||||
|
|
||||||
|
public int getRegionId();
|
||||||
|
|
||||||
|
public String getUuid();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,10 +27,10 @@ import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
|
|||||||
import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
|
import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
|
import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
|
||||||
|
|
||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
import com.cloud.exception.PermissionDeniedException;
|
||||||
import com.cloud.exception.ResourceUnavailableException;
|
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
|
|
||||||
public interface AccountService {
|
public interface AccountService {
|
||||||
@ -62,35 +62,7 @@ public interface AccountService {
|
|||||||
* @return the user if created successfully, null otherwise
|
* @return the user if created successfully, null otherwise
|
||||||
*/
|
*/
|
||||||
UserAccount createUserAccount(String userName, String password, String firstName, String lastName, String email, String timezone, String accountName, short accountType, Long domainId, String networkDomain,
|
UserAccount createUserAccount(String userName, String password, String firstName, String lastName, String email, String timezone, String accountName, short accountType, Long domainId, String networkDomain,
|
||||||
Map<String, String> details);
|
Map<String, String> details, String accountUUID, String userUUID, Integer regionId);
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes a user by userId
|
|
||||||
*
|
|
||||||
* @param accountId
|
|
||||||
* - id of the account do delete
|
|
||||||
*
|
|
||||||
* @return true if delete was successful, false otherwise
|
|
||||||
*/
|
|
||||||
boolean deleteUserAccount(long accountId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disables a user by userId
|
|
||||||
*
|
|
||||||
* @param userId
|
|
||||||
* - the userId
|
|
||||||
* @return UserAccount object
|
|
||||||
*/
|
|
||||||
UserAccount disableUser(long userId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables a user
|
|
||||||
*
|
|
||||||
* @param userId
|
|
||||||
* - the userId
|
|
||||||
* @return UserAccount object
|
|
||||||
*/
|
|
||||||
UserAccount enableUser(long userId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Locks a user by userId. A locked user cannot access the API, but will still have running VMs/IP addresses
|
* Locks a user by userId. A locked user cannot access the API, but will still have running VMs/IP addresses
|
||||||
@ -101,71 +73,11 @@ public interface AccountService {
|
|||||||
*/
|
*/
|
||||||
UserAccount lockUser(long userId);
|
UserAccount lockUser(long userId);
|
||||||
|
|
||||||
/**
|
|
||||||
* Update a user by userId
|
|
||||||
*
|
|
||||||
* @param userId
|
|
||||||
* @return UserAccount object
|
|
||||||
*/
|
|
||||||
UserAccount updateUser(UpdateUserCmd cmd);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Disables an account by accountName and domainId
|
|
||||||
*
|
|
||||||
* @param accountName
|
|
||||||
* TODO
|
|
||||||
* @param domainId
|
|
||||||
* TODO
|
|
||||||
* @param accountId
|
|
||||||
* @param disabled
|
|
||||||
* account if success
|
|
||||||
* @return true if disable was successful, false otherwise
|
|
||||||
*/
|
|
||||||
Account disableAccount(String accountName, Long domainId, Long accountId) throws ConcurrentOperationException, ResourceUnavailableException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables an account by accountId
|
|
||||||
*
|
|
||||||
* @param accountName
|
|
||||||
* - the enableAccount command defining the accountId to be deleted.
|
|
||||||
* @param domainId
|
|
||||||
* TODO
|
|
||||||
* @param accountId
|
|
||||||
* @return account object
|
|
||||||
*/
|
|
||||||
Account enableAccount(String accountName, Long domainId, Long accountId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Locks an account by accountId. A locked account cannot access the API, but will still have running VMs/IP
|
|
||||||
* addresses
|
|
||||||
* allocated/etc.
|
|
||||||
*
|
|
||||||
* @param accountName
|
|
||||||
* - the LockAccount command defining the accountId to be locked.
|
|
||||||
* @param domainId
|
|
||||||
* TODO
|
|
||||||
* @param accountId
|
|
||||||
* @return account object
|
|
||||||
*/
|
|
||||||
Account lockAccount(String accountName, Long domainId, Long accountId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates an account name
|
|
||||||
*
|
|
||||||
* @param cmd
|
|
||||||
* - the parameter containing accountId
|
|
||||||
* @return updated account object
|
|
||||||
*/
|
|
||||||
|
|
||||||
Account updateAccount(UpdateAccountCmd cmd);
|
|
||||||
|
|
||||||
Account getSystemAccount();
|
Account getSystemAccount();
|
||||||
|
|
||||||
User getSystemUser();
|
User getSystemUser();
|
||||||
|
|
||||||
User createUser(String userName, String password, String firstName, String lastName, String email, String timeZone, String accountName, Long domainId);
|
User createUser(String userName, String password, String firstName, String lastName, String email, String timeZone, String accountName, Long domainId, String userUUID, Integer regionId);
|
||||||
|
|
||||||
boolean deleteUser(DeleteUserCmd deleteUserCmd);
|
|
||||||
|
|
||||||
boolean isAdmin(short accountType);
|
boolean isAdmin(short accountType);
|
||||||
|
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import com.cloud.utils.Pair;
|
|||||||
|
|
||||||
public interface DomainService {
|
public interface DomainService {
|
||||||
|
|
||||||
Domain createDomain(String name, Long parentId, String networkDomain);
|
Domain createDomain(String name, Long parentId, String networkDomain, String domainUUID, Integer regionId);
|
||||||
|
|
||||||
Domain getDomain(long id);
|
Domain getDomain(long id);
|
||||||
|
|
||||||
@ -41,12 +41,19 @@ public interface DomainService {
|
|||||||
*/
|
*/
|
||||||
boolean isChildDomain(Long parentId, Long childId);
|
boolean isChildDomain(Long parentId, Long childId);
|
||||||
|
|
||||||
boolean deleteDomain(long domainId, Boolean cleanup);
|
|
||||||
|
|
||||||
Pair<List<? extends Domain>, Integer> searchForDomains(ListDomainsCmd cmd)
|
Pair<List<? extends Domain>, Integer> searchForDomains(ListDomainsCmd cmd)
|
||||||
throws PermissionDeniedException;
|
throws PermissionDeniedException;
|
||||||
|
|
||||||
Pair<List<? extends Domain>, Integer> searchForDomainChildren(ListDomainChildrenCmd cmd)
|
Pair<List<? extends Domain>, Integer> searchForDomainChildren(ListDomainChildrenCmd cmd)
|
||||||
throws PermissionDeniedException;
|
throws PermissionDeniedException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* find the domain by its path
|
||||||
|
*
|
||||||
|
* @param domainPath
|
||||||
|
* the path to use to lookup a domain
|
||||||
|
* @return domainVO the domain with the matching path, or null if no domain with the given path exists
|
||||||
|
*/
|
||||||
|
Domain findDomainByPath(String domainPath);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,4 +73,5 @@ public interface User extends OwnedBy, InternalIdentity {
|
|||||||
|
|
||||||
boolean isRegistered();
|
boolean isRegistered();
|
||||||
|
|
||||||
|
public int getRegionId();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -373,6 +373,9 @@ public class ApiConstants {
|
|||||||
public static final String VSM_CONFIG_STATE = "vsmconfigstate";
|
public static final String VSM_CONFIG_STATE = "vsmconfigstate";
|
||||||
public static final String VSM_DEVICE_STATE = "vsmdevicestate";
|
public static final String VSM_DEVICE_STATE = "vsmdevicestate";
|
||||||
public static final String ADD_VSM_FLAG = "addvsmflag";
|
public static final String ADD_VSM_FLAG = "addvsmflag";
|
||||||
|
public static final String END_POINT = "endpoint";
|
||||||
|
public static final String REGION_ID = "regionid";
|
||||||
|
public static final String IS_PROPAGATE = "ispropagate";
|
||||||
public static final String VPC_OFF_ID = "vpcofferingid";
|
public static final String VPC_OFF_ID = "vpcofferingid";
|
||||||
public static final String NETWORK = "network";
|
public static final String NETWORK = "network";
|
||||||
public static final String VPC_ID = "vpcid";
|
public static final String VPC_ID = "vpcid";
|
||||||
|
|||||||
@ -28,6 +28,7 @@ import java.util.regex.Pattern;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.query.QueryService;
|
import org.apache.cloudstack.query.QueryService;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.configuration.ConfigurationService;
|
import com.cloud.configuration.ConfigurationService;
|
||||||
|
|||||||
@ -60,6 +60,7 @@ import org.apache.cloudstack.api.response.ProjectAccountResponse;
|
|||||||
import org.apache.cloudstack.api.response.ProjectInvitationResponse;
|
import org.apache.cloudstack.api.response.ProjectInvitationResponse;
|
||||||
import org.apache.cloudstack.api.response.ProjectResponse;
|
import org.apache.cloudstack.api.response.ProjectResponse;
|
||||||
import org.apache.cloudstack.api.response.ProviderResponse;
|
import org.apache.cloudstack.api.response.ProviderResponse;
|
||||||
|
import org.apache.cloudstack.api.response.RegionResponse;
|
||||||
import org.apache.cloudstack.api.response.RemoteAccessVpnResponse;
|
import org.apache.cloudstack.api.response.RemoteAccessVpnResponse;
|
||||||
import org.apache.cloudstack.api.response.ResourceCountResponse;
|
import org.apache.cloudstack.api.response.ResourceCountResponse;
|
||||||
import org.apache.cloudstack.api.response.ResourceLimitResponse;
|
import org.apache.cloudstack.api.response.ResourceLimitResponse;
|
||||||
@ -92,6 +93,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse;
|
|||||||
import org.apache.cloudstack.api.response.VpcResponse;
|
import org.apache.cloudstack.api.response.VpcResponse;
|
||||||
import org.apache.cloudstack.api.response.VpnUsersResponse;
|
import org.apache.cloudstack.api.response.VpnUsersResponse;
|
||||||
import org.apache.cloudstack.api.response.ZoneResponse;
|
import org.apache.cloudstack.api.response.ZoneResponse;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
import com.cloud.capacity.Capacity;
|
import com.cloud.capacity.Capacity;
|
||||||
@ -313,6 +315,8 @@ public interface ResponseGenerator {
|
|||||||
|
|
||||||
StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result);
|
StorageNetworkIpRangeResponse createStorageNetworkIpRangeResponse(StorageNetworkIpRange result);
|
||||||
|
|
||||||
|
RegionResponse createRegionResponse(Region region);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param resourceTag
|
* @param resourceTag
|
||||||
* @param keyValueOnly TODO
|
* @param keyValueOnly TODO
|
||||||
|
|||||||
@ -78,6 +78,19 @@ public class CreateAccountCmd extends BaseCmd {
|
|||||||
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
|
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
|
||||||
private Map<String, String> details;
|
private Map<String, String> details;
|
||||||
|
|
||||||
|
//@Parameter(name = ApiConstants.REGION_DETAILS, type = CommandType.MAP, description = "details for account used to store region specific parameters")
|
||||||
|
//private Map<String, String> regionDetails;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.ACCOUNT_ID, type=CommandType.STRING, description="Account UUID, required for adding account from another Region")
|
||||||
|
private String accountUUID;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.USER_ID, type=CommandType.STRING, description="User UUID, required for adding account from another Region")
|
||||||
|
private String userUUID;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.REGION_ID, type=CommandType.INTEGER, description="Id of the Region creating the account")
|
||||||
|
private Integer regionId;
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -132,6 +145,18 @@ public class CreateAccountCmd extends BaseCmd {
|
|||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getAccountUUID() {
|
||||||
|
return accountUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserUUID() {
|
||||||
|
return userUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRegionId() {
|
||||||
|
return regionId;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -149,7 +174,8 @@ public class CreateAccountCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("Account Name: "+getAccountName()+", Domain Id:"+getDomainId());
|
UserContext.current().setEventDetails("Account Name: "+getAccountName()+", Domain Id:"+getDomainId());
|
||||||
UserAccount userAccount = _accountService.createUserAccount(getUsername(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimeZone(), getAccountName(), getAccountType(), getDomainId(), getNetworkDomain(), getDetails());
|
UserAccount userAccount = _accountService.createUserAccount(getUsername(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimeZone(), getAccountName(), getAccountType(), getDomainId(), getNetworkDomain(), getDetails(),
|
||||||
|
getAccountUUID(), getUserUUID(), getRegionId());
|
||||||
if (userAccount != null) {
|
if (userAccount != null) {
|
||||||
AccountResponse response = _responseGenerator.createUserAccountResponse(userAccount);
|
AccountResponse response = _responseGenerator.createUserAccountResponse(userAccount);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.account;
|
package org.apache.cloudstack.api.command.admin.account;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -24,6 +26,7 @@ import org.apache.cloudstack.api.Parameter;
|
|||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.AccountResponse;
|
import org.apache.cloudstack.api.response.AccountResponse;
|
||||||
import org.apache.cloudstack.api.response.SuccessResponse;
|
import org.apache.cloudstack.api.response.SuccessResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
@ -45,14 +48,24 @@ public class DeleteAccountCmd extends BaseAsyncCmd {
|
|||||||
required=true, description="Account id")
|
required=true, description="Account id")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -90,7 +103,8 @@ public class DeleteAccountCmd extends BaseAsyncCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("Account Id: "+getId());
|
UserContext.current().setEventDetails("Account Id: "+getId());
|
||||||
boolean result = _accountService.deleteUserAccount(getId());
|
|
||||||
|
boolean result = _regionService.deleteUserAccount(this);
|
||||||
if (result) {
|
if (result) {
|
||||||
SuccessResponse response = new SuccessResponse(getCommandName());
|
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||||
this.setResponseObject(response);
|
this.setResponseObject(response);
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.account;
|
package org.apache.cloudstack.api.command.admin.account;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -24,6 +26,7 @@ import org.apache.cloudstack.api.Parameter;
|
|||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.AccountResponse;
|
import org.apache.cloudstack.api.response.AccountResponse;
|
||||||
import org.apache.cloudstack.api.response.DomainResponse;
|
import org.apache.cloudstack.api.response.DomainResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
@ -55,6 +58,11 @@ public class DisableAccountCmd extends BaseAsyncCmd {
|
|||||||
@Parameter(name=ApiConstants.LOCK, type=CommandType.BOOLEAN, required=true, description="If true, only lock the account; else disable the account")
|
@Parameter(name=ApiConstants.LOCK, type=CommandType.BOOLEAN, required=true, description="If true, only lock the account; else disable the account")
|
||||||
private Boolean lockRequested;
|
private Boolean lockRequested;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -71,6 +79,14 @@ public class DisableAccountCmd extends BaseAsyncCmd {
|
|||||||
return domainId;
|
return domainId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getLockRequested() {
|
||||||
|
return lockRequested;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -108,11 +124,7 @@ public class DisableAccountCmd extends BaseAsyncCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute() throws ConcurrentOperationException, ResourceUnavailableException{
|
public void execute() throws ConcurrentOperationException, ResourceUnavailableException{
|
||||||
UserContext.current().setEventDetails("Account Name: "+getAccountName()+", Domain Id:"+getDomainId());
|
UserContext.current().setEventDetails("Account Name: "+getAccountName()+", Domain Id:"+getDomainId());
|
||||||
Account result = null;
|
Account result = _regionService.disableAccount(this);
|
||||||
if(lockRequested)
|
|
||||||
result = _accountService.lockAccount(getAccountName(), getDomainId(), getId());
|
|
||||||
else
|
|
||||||
result = _accountService.disableAccount(getAccountName(), getDomainId(), getId());
|
|
||||||
if (result != null){
|
if (result != null){
|
||||||
AccountResponse response = _responseGenerator.createAccountResponse(result);
|
AccountResponse response = _responseGenerator.createAccountResponse(result);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.account;
|
package org.apache.cloudstack.api.command.admin.account;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -24,6 +26,7 @@ import org.apache.cloudstack.api.Parameter;
|
|||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.AccountResponse;
|
import org.apache.cloudstack.api.response.AccountResponse;
|
||||||
import org.apache.cloudstack.api.response.DomainResponse;
|
import org.apache.cloudstack.api.response.DomainResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
@ -47,6 +50,11 @@ public class EnableAccountCmd extends BaseCmd {
|
|||||||
description="Enables specified account in this domain.")
|
description="Enables specified account in this domain.")
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -63,6 +71,10 @@ public class EnableAccountCmd extends BaseCmd {
|
|||||||
return domainId;
|
return domainId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -89,7 +101,7 @@ public class EnableAccountCmd extends BaseCmd {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
Account result = _accountService.enableAccount(getAccountName(), getDomainId(), getId());
|
Account result = _regionService.enableAccount(this);
|
||||||
if (result != null){
|
if (result != null){
|
||||||
AccountResponse response = _responseGenerator.createAccountResponse(result);
|
AccountResponse response = _responseGenerator.createAccountResponse(result);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -19,6 +19,8 @@ package org.apache.cloudstack.api.command.admin.account;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -27,6 +29,7 @@ import org.apache.cloudstack.api.Parameter;
|
|||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.AccountResponse;
|
import org.apache.cloudstack.api.response.AccountResponse;
|
||||||
import org.apache.cloudstack.api.response.DomainResponse;
|
import org.apache.cloudstack.api.response.DomainResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
@ -60,6 +63,11 @@ public class UpdateAccountCmd extends BaseCmd{
|
|||||||
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
|
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
|
||||||
private Map details;
|
private Map details;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -94,6 +102,10 @@ public class UpdateAccountCmd extends BaseCmd{
|
|||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -119,7 +131,7 @@ public class UpdateAccountCmd extends BaseCmd{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
Account result = _accountService.updateAccount(this);
|
Account result = _regionService.updateAccount(this);
|
||||||
if (result != null){
|
if (result != null){
|
||||||
AccountResponse response = _responseGenerator.createAccountResponse(result);
|
AccountResponse response = _responseGenerator.createAccountResponse(result);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -49,6 +49,12 @@ public class CreateDomainCmd extends BaseCmd {
|
|||||||
@Parameter(name=ApiConstants.NETWORK_DOMAIN, type=CommandType.STRING, description="Network domain for networks in the domain")
|
@Parameter(name=ApiConstants.NETWORK_DOMAIN, type=CommandType.STRING, description="Network domain for networks in the domain")
|
||||||
private String networkDomain;
|
private String networkDomain;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.STRING, description="Domain UUID, required for adding domain from another Region")
|
||||||
|
private String domainUUID;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.REGION_ID, type=CommandType.INTEGER, description="Id of the Region creating the Domain")
|
||||||
|
private Integer regionId;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -65,6 +71,14 @@ public class CreateDomainCmd extends BaseCmd {
|
|||||||
return networkDomain;
|
return networkDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getDomainUUID() {
|
||||||
|
return domainUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRegionId() {
|
||||||
|
return regionId;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -82,7 +96,7 @@ public class CreateDomainCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("Domain Name: "+getDomainName()+((getParentDomainId()!=null)?", Parent DomainId :"+getParentDomainId():""));
|
UserContext.current().setEventDetails("Domain Name: "+getDomainName()+((getParentDomainId()!=null)?", Parent DomainId :"+getParentDomainId():""));
|
||||||
Domain domain = _domainService.createDomain(getDomainName(), getParentDomainId(), getNetworkDomain());
|
Domain domain = _domainService.createDomain(getDomainName(), getParentDomainId(), getNetworkDomain(), getDomainUUID(), getRegionId());
|
||||||
if (domain != null) {
|
if (domain != null) {
|
||||||
DomainResponse response = _responseGenerator.createDomainResponse(domain);
|
DomainResponse response = _responseGenerator.createDomainResponse(domain);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.domain;
|
package org.apache.cloudstack.api.command.admin.domain;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -24,6 +26,7 @@ import org.apache.cloudstack.api.Parameter;
|
|||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.DomainResponse;
|
import org.apache.cloudstack.api.response.DomainResponse;
|
||||||
import org.apache.cloudstack.api.response.SuccessResponse;
|
import org.apache.cloudstack.api.response.SuccessResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
@ -47,6 +50,10 @@ public class DeleteDomainCmd extends BaseAsyncCmd {
|
|||||||
@Parameter(name=ApiConstants.CLEANUP, type=CommandType.BOOLEAN, description="true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise")
|
@Parameter(name=ApiConstants.CLEANUP, type=CommandType.BOOLEAN, description="true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise")
|
||||||
private Boolean cleanup;
|
private Boolean cleanup;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean propagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
@ -60,6 +67,10 @@ public class DeleteDomainCmd extends BaseAsyncCmd {
|
|||||||
return cleanup;
|
return cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean isPropagate() {
|
||||||
|
return propagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -92,7 +103,7 @@ public class DeleteDomainCmd extends BaseAsyncCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("Domain Id: "+getId());
|
UserContext.current().setEventDetails("Domain Id: "+getId());
|
||||||
boolean result = _domainService.deleteDomain(id, cleanup);
|
boolean result = _regionService.deleteDomain(this);
|
||||||
if (result) {
|
if (result) {
|
||||||
SuccessResponse response = new SuccessResponse(getCommandName());
|
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||||
this.setResponseObject(response);
|
this.setResponseObject(response);
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.domain;
|
package org.apache.cloudstack.api.command.admin.domain;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -23,10 +25,12 @@ import org.apache.cloudstack.api.BaseCmd;
|
|||||||
import org.apache.cloudstack.api.Parameter;
|
import org.apache.cloudstack.api.Parameter;
|
||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.DomainResponse;
|
import org.apache.cloudstack.api.response.DomainResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.user.UserAccount;
|
||||||
import com.cloud.user.UserContext;
|
import com.cloud.user.UserContext;
|
||||||
|
|
||||||
@APICommand(name = "updateDomain", description="Updates a domain with a new name", responseObject=DomainResponse.class)
|
@APICommand(name = "updateDomain", description="Updates a domain with a new name", responseObject=DomainResponse.class)
|
||||||
@ -48,6 +52,11 @@ public class UpdateDomainCmd extends BaseCmd {
|
|||||||
@Parameter(name=ApiConstants.NETWORK_DOMAIN, type=CommandType.STRING, description="Network domain for the domain's networks; empty string will update domainName with NULL value")
|
@Parameter(name=ApiConstants.NETWORK_DOMAIN, type=CommandType.STRING, description="Network domain for the domain's networks; empty string will update domainName with NULL value")
|
||||||
private String networkDomain;
|
private String networkDomain;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -64,6 +73,10 @@ public class UpdateDomainCmd extends BaseCmd {
|
|||||||
return networkDomain;
|
return networkDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -81,7 +94,8 @@ public class UpdateDomainCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("Domain Id: "+getId());
|
UserContext.current().setEventDetails("Domain Id: "+getId());
|
||||||
Domain domain = _mgr.updateDomain(this);
|
Domain domain = _regionService.updateDomain(this);
|
||||||
|
|
||||||
if (domain != null) {
|
if (domain != null) {
|
||||||
DomainResponse response = _responseGenerator.createDomainResponse(domain);
|
DomainResponse response = _responseGenerator.createDomainResponse(domain);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -0,0 +1,109 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.api.command.admin.region;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.APICommand;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
|
import org.apache.cloudstack.api.BaseCmd;
|
||||||
|
import org.apache.cloudstack.api.Parameter;
|
||||||
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
|
import org.apache.cloudstack.api.response.RegionResponse;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
|
||||||
|
@APICommand(name = "addRegion", description="Adds a Region", responseObject=RegionResponse.class)
|
||||||
|
public class AddRegionCmd extends BaseCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(AddRegionCmd.class.getName());
|
||||||
|
|
||||||
|
private static final String s_name = "addregionresponse";
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
//////////////// API parameters /////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
@Parameter(name=ApiConstants.ID, type=CommandType.INTEGER, required=true, description="Id of the Region")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required=true, description="Name of the region")
|
||||||
|
private String regionName;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.END_POINT, type=CommandType.STRING, required=true, description="Region service endpoint")
|
||||||
|
private String endPoint;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.API_KEY, type=CommandType.STRING, description="API key of Admin user")
|
||||||
|
private String apiKey;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.SECRET_KEY, type=CommandType.STRING, description="Secret Key of Admin user")
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
@Inject public RegionService _regionService;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////////// Accessors ///////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionName() {
|
||||||
|
return regionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndPoint() {
|
||||||
|
return endPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApiKey() {
|
||||||
|
return apiKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecretKey() {
|
||||||
|
return secretKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////// API Implementation///////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEntityOwnerId() {
|
||||||
|
return Account.ACCOUNT_ID_SYSTEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(){
|
||||||
|
Region region = _regionService.addRegion(getId(), getRegionName(), getEndPoint(), getApiKey(), getSecretKey());
|
||||||
|
if (region != null) {
|
||||||
|
RegionResponse response = _responseGenerator.createRegionResponse(region);
|
||||||
|
response.setResponseName(getCommandName());
|
||||||
|
this.setResponseObject(response);
|
||||||
|
} else {
|
||||||
|
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Region");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,79 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.api.command.admin.region;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.APICommand;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
|
import org.apache.cloudstack.api.BaseCmd;
|
||||||
|
import org.apache.cloudstack.api.Parameter;
|
||||||
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
|
import org.apache.cloudstack.api.response.SuccessResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
|
||||||
|
@APICommand(name = "removeRegion", description="Removes specified region", responseObject=SuccessResponse.class)
|
||||||
|
public class RemoveRegionCmd extends BaseCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(RemoveRegionCmd.class.getName());
|
||||||
|
private static final String s_name = "updateregionresponse";
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
//////////////// API parameters /////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.ID, type=CommandType.INTEGER, required=true, description="ID of the region to delete")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////////// Accessors ///////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////// API Implementation///////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEntityOwnerId() {
|
||||||
|
return Account.ACCOUNT_ID_SYSTEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(){
|
||||||
|
boolean result = _regionService.removeRegion(id);
|
||||||
|
if (result) {
|
||||||
|
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||||
|
this.setResponseObject(response);
|
||||||
|
} else {
|
||||||
|
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove region");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.api.command.admin.region;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.APICommand;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
|
import org.apache.cloudstack.api.BaseCmd;
|
||||||
|
import org.apache.cloudstack.api.Parameter;
|
||||||
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
|
import org.apache.cloudstack.api.response.RegionResponse;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
|
||||||
|
@APICommand(name = "updateRegion", description="Updates a region", responseObject=RegionResponse.class)
|
||||||
|
public class UpdateRegionCmd extends BaseCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(UpdateRegionCmd.class.getName());
|
||||||
|
private static final String s_name = "updateregionresponse";
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
//////////////// API parameters /////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.ID, type=CommandType.INTEGER, required=true, description="Id of region to update")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="updates region with this name")
|
||||||
|
private String regionName;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.END_POINT, type=CommandType.STRING, description="updates region with this end point")
|
||||||
|
private String endPoint;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.API_KEY, type=CommandType.STRING, description="new API key for the Region")
|
||||||
|
private String apiKey;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.SECRET_KEY, type=CommandType.STRING, description="new Secret Key for the Region")
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////////// Accessors ///////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegionName() {
|
||||||
|
return regionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndPoint() {
|
||||||
|
return endPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApiKey() {
|
||||||
|
return apiKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecretKey() {
|
||||||
|
return secretKey;
|
||||||
|
}
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////// API Implementation///////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getEntityOwnerId() {
|
||||||
|
return Account.ACCOUNT_ID_SYSTEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(){
|
||||||
|
Region region = _regionService.updateRegion(getId(), getRegionName(), getEndPoint(), getApiKey(), getSecretKey());
|
||||||
|
if (region != null) {
|
||||||
|
RegionResponse response = _responseGenerator.createRegionResponse(region);
|
||||||
|
response.setResponseName(getCommandName());
|
||||||
|
this.setResponseObject(response);
|
||||||
|
} else {
|
||||||
|
throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update Region");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -65,6 +65,12 @@ public class CreateUserCmd extends BaseCmd {
|
|||||||
@Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required=true, description="Unique username.")
|
@Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required=true, description="Unique username.")
|
||||||
private String username;
|
private String username;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.USER_ID, type=CommandType.STRING, description="User UUID, required for adding account from another Region")
|
||||||
|
private String userUUID;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.REGION_ID, type=CommandType.INTEGER, description="Id of the Region creating the User")
|
||||||
|
private Integer regionId;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -101,6 +107,14 @@ public class CreateUserCmd extends BaseCmd {
|
|||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getUserUUID() {
|
||||||
|
return userUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getRegionId() {
|
||||||
|
return regionId;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -132,7 +146,7 @@ public class CreateUserCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("UserName: "+getUserName()+", FirstName :"+getFirstName()+", LastName: "+getLastName());
|
UserContext.current().setEventDetails("UserName: "+getUserName()+", FirstName :"+getFirstName()+", LastName: "+getLastName());
|
||||||
User user = _accountService.createUser(getUserName(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimezone(), getAccountName(), getDomainId());
|
User user = _accountService.createUser(getUserName(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimezone(), getAccountName(), getDomainId(), getUserUUID(), getRegionId());
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
UserResponse response = _responseGenerator.createUserResponse(user);
|
UserResponse response = _responseGenerator.createUserResponse(user);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.user;
|
package org.apache.cloudstack.api.command.admin.user;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -24,6 +26,7 @@ import org.apache.cloudstack.api.Parameter;
|
|||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.SuccessResponse;
|
import org.apache.cloudstack.api.response.SuccessResponse;
|
||||||
import org.apache.cloudstack.api.response.UserResponse;
|
import org.apache.cloudstack.api.response.UserResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
@ -42,6 +45,11 @@ public class DeleteUserCmd extends BaseCmd {
|
|||||||
@Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=UserResponse.class, required=true, description="Deletes a user")
|
@Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType=UserResponse.class, required=true, description="Deletes a user")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -50,6 +58,10 @@ public class DeleteUserCmd extends BaseCmd {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -72,7 +84,7 @@ public class DeleteUserCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("UserId: "+getId());
|
UserContext.current().setEventDetails("UserId: "+getId());
|
||||||
boolean result = _accountService.deleteUser(this);
|
boolean result = _regionService.deleteUser(this);
|
||||||
if (result) {
|
if (result) {
|
||||||
SuccessResponse response = new SuccessResponse(getCommandName());
|
SuccessResponse response = new SuccessResponse(getCommandName());
|
||||||
this.setResponseObject(response);
|
this.setResponseObject(response);
|
||||||
|
|||||||
@ -16,13 +16,17 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.user;
|
package org.apache.cloudstack.api.command.admin.user;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
import org.apache.cloudstack.api.BaseAsyncCmd;
|
import org.apache.cloudstack.api.BaseAsyncCmd;
|
||||||
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.Parameter;
|
import org.apache.cloudstack.api.Parameter;
|
||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.UserResponse;
|
import org.apache.cloudstack.api.response.UserResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
@ -45,6 +49,11 @@ public class DisableUserCmd extends BaseAsyncCmd {
|
|||||||
required=true, description="Disables user by user ID.")
|
required=true, description="Disables user by user ID.")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -53,6 +62,10 @@ public class DisableUserCmd extends BaseAsyncCmd {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -86,7 +99,8 @@ public class DisableUserCmd extends BaseAsyncCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("UserId: "+getId());
|
UserContext.current().setEventDetails("UserId: "+getId());
|
||||||
UserAccount user = _accountService.disableUser(getId());
|
UserAccount user = _regionService.disableUser(this);
|
||||||
|
|
||||||
if (user != null){
|
if (user != null){
|
||||||
UserResponse response = _responseGenerator.createUserResponse(user);
|
UserResponse response = _responseGenerator.createUserResponse(user);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.user;
|
package org.apache.cloudstack.api.command.admin.user;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -23,6 +25,7 @@ import org.apache.cloudstack.api.BaseCmd;
|
|||||||
import org.apache.cloudstack.api.Parameter;
|
import org.apache.cloudstack.api.Parameter;
|
||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.UserResponse;
|
import org.apache.cloudstack.api.response.UserResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
@ -43,6 +46,10 @@ public class EnableUserCmd extends BaseCmd {
|
|||||||
required=true, description="Enables user by user ID.")
|
required=true, description="Enables user by user ID.")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
@ -52,6 +59,10 @@ public class EnableUserCmd extends BaseCmd {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -74,7 +85,8 @@ public class EnableUserCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("UserId: "+getId());
|
UserContext.current().setEventDetails("UserId: "+getId());
|
||||||
UserAccount user = _accountService.enableUser(getId());
|
UserAccount user = _regionService.enableUser(this);
|
||||||
|
|
||||||
if (user != null){
|
if (user != null){
|
||||||
UserResponse response = _responseGenerator.createUserResponse(user);
|
UserResponse response = _responseGenerator.createUserResponse(user);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package org.apache.cloudstack.api.command.admin.user;
|
package org.apache.cloudstack.api.command.admin.user;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.APICommand;
|
import org.apache.cloudstack.api.APICommand;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
import org.apache.cloudstack.api.ApiErrorCode;
|
import org.apache.cloudstack.api.ApiErrorCode;
|
||||||
@ -23,6 +25,7 @@ import org.apache.cloudstack.api.BaseCmd;
|
|||||||
import org.apache.cloudstack.api.Parameter;
|
import org.apache.cloudstack.api.Parameter;
|
||||||
import org.apache.cloudstack.api.ServerApiException;
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
import org.apache.cloudstack.api.response.UserResponse;
|
import org.apache.cloudstack.api.response.UserResponse;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
@ -68,6 +71,11 @@ public class UpdateUserCmd extends BaseCmd {
|
|||||||
@Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, description="Unique username")
|
@Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, description="Unique username")
|
||||||
private String username;
|
private String username;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.IS_PROPAGATE, type=CommandType.BOOLEAN, description="True if command is sent from another Region")
|
||||||
|
private Boolean isPropagate;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////////// Accessors ///////////////////////
|
/////////////////// Accessors ///////////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -108,6 +116,10 @@ public class UpdateUserCmd extends BaseCmd {
|
|||||||
return username;
|
return username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean getIsPropagate() {
|
||||||
|
return isPropagate;
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
/////////////// API Implementation///////////////////
|
/////////////// API Implementation///////////////////
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
@ -130,7 +142,8 @@ public class UpdateUserCmd extends BaseCmd {
|
|||||||
@Override
|
@Override
|
||||||
public void execute(){
|
public void execute(){
|
||||||
UserContext.current().setEventDetails("UserId: "+getId());
|
UserContext.current().setEventDetails("UserId: "+getId());
|
||||||
UserAccount user = _accountService.updateUser(this);
|
UserAccount user = _regionService.updateUser(this);
|
||||||
|
|
||||||
if (user != null){
|
if (user != null){
|
||||||
UserResponse response = _responseGenerator.createUserResponse(user);
|
UserResponse response = _responseGenerator.createUserResponse(user);
|
||||||
response.setResponseName(getCommandName());
|
response.setResponseName(getCommandName());
|
||||||
|
|||||||
@ -0,0 +1,88 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.api.command.user.region;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.APICommand;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.BaseListCmd;
|
||||||
|
import org.apache.cloudstack.api.Parameter;
|
||||||
|
import org.apache.cloudstack.api.response.ListResponse;
|
||||||
|
import org.apache.cloudstack.api.response.RegionResponse;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
@APICommand(name = "listRegions", description="Lists Regions", responseObject=RegionResponse.class)
|
||||||
|
public class ListRegionsCmd extends BaseListCmd {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(ListRegionsCmd.class.getName());
|
||||||
|
|
||||||
|
private static final String s_name = "listregionsresponse";
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
//////////////// API parameters /////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.ID, type=CommandType.INTEGER, description="List Region by region ID.")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="List Region by region name.")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Inject RegionService _regionService;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////////// Accessors ///////////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
/////////////// API Implementation///////////////////
|
||||||
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCommandName() {
|
||||||
|
return s_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(){
|
||||||
|
List<? extends Region> result = _regionService.listRegions(this);
|
||||||
|
ListResponse<RegionResponse> response = new ListResponse<RegionResponse>();
|
||||||
|
List<RegionResponse> regionResponses = new ArrayList<RegionResponse>();
|
||||||
|
for (Region region : result) {
|
||||||
|
RegionResponse regionResponse = _responseGenerator.createRegionResponse(region);
|
||||||
|
regionResponse.setObjectName("region");
|
||||||
|
regionResponses.add(regionResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
response.setResponses(regionResponses);
|
||||||
|
response.setResponseName(getCommandName());
|
||||||
|
this.setResponseObject(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.api.response;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.BaseResponse;
|
||||||
|
import org.apache.cloudstack.api.EntityReference;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
|
||||||
|
import com.cloud.serializer.Param;
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
@EntityReference(value = Region.class)
|
||||||
|
public class RegionResponse extends BaseResponse {
|
||||||
|
@SerializedName(ApiConstants.ID) @Param(description="the ID of the region")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@SerializedName(ApiConstants.NAME) @Param(description="the name of the region")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@SerializedName(ApiConstants.END_POINT) @Param(description="the end point of the region")
|
||||||
|
private String endPoint;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEndPoint() {
|
||||||
|
return endPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndPoint(String endPoint) {
|
||||||
|
this.endPoint = endPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -26,6 +26,15 @@ import org.apache.cloudstack.api.EntityReference;
|
|||||||
import com.cloud.serializer.Param;
|
import com.cloud.serializer.Param;
|
||||||
import com.cloud.storage.Snapshot;
|
import com.cloud.storage.Snapshot;
|
||||||
import com.google.gson.annotations.SerializedName;
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
import com.cloud.serializer.Param;
|
||||||
|
import com.cloud.storage.Snapshot;
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
import org.apache.cloudstack.api.BaseResponse;
|
||||||
|
import org.apache.cloudstack.api.EntityReference;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@EntityReference(value=Snapshot.class)
|
@EntityReference(value=Snapshot.class)
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@ -82,7 +91,7 @@ public class SnapshotResponse extends BaseResponse implements ControlledEntityRe
|
|||||||
|
|
||||||
@SerializedName(ApiConstants.STATE)
|
@SerializedName(ApiConstants.STATE)
|
||||||
@Param(description = "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage")
|
@Param(description = "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage")
|
||||||
private Snapshot.Status state;
|
private Snapshot.State state;
|
||||||
|
|
||||||
@SerializedName(ApiConstants.TAGS) @Param(description="the list of resource tags associated with snapshot", responseObject = ResourceTagResponse.class)
|
@SerializedName(ApiConstants.TAGS) @Param(description="the list of resource tags associated with snapshot", responseObject = ResourceTagResponse.class)
|
||||||
private List<ResourceTagResponse> tags;
|
private List<ResourceTagResponse> tags;
|
||||||
@ -150,7 +159,7 @@ public class SnapshotResponse extends BaseResponse implements ControlledEntityRe
|
|||||||
this.intervalType = intervalType;
|
this.intervalType = intervalType;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setState(Snapshot.Status state) {
|
public void setState(Snapshot.State state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
35
api/src/org/apache/cloudstack/region/Region.java
Normal file
35
api/src/org/apache/cloudstack/region/Region.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.region;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface Region {
|
||||||
|
|
||||||
|
public int getId();
|
||||||
|
|
||||||
|
public String getName();
|
||||||
|
|
||||||
|
public void setName(String name);
|
||||||
|
|
||||||
|
public String getEndPoint();
|
||||||
|
|
||||||
|
public String getApiKey();
|
||||||
|
|
||||||
|
public String getSecretKey();
|
||||||
|
}
|
||||||
157
api/src/org/apache/cloudstack/region/RegionService.java
Normal file
157
api/src/org/apache/cloudstack/region/RegionService.java
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.region;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.command.admin.account.DeleteAccountCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.account.DisableAccountCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.account.EnableAccountCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.domain.DeleteDomainCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.DisableUserCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.EnableUserCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.region.ListRegionsCmd;
|
||||||
|
|
||||||
|
import com.cloud.domain.Domain;
|
||||||
|
import com.cloud.exception.ConcurrentOperationException;
|
||||||
|
import com.cloud.exception.ResourceUnavailableException;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.user.UserAccount;
|
||||||
|
|
||||||
|
|
||||||
|
public interface RegionService {
|
||||||
|
/**
|
||||||
|
* Adds a Region to the local Region
|
||||||
|
* @param id
|
||||||
|
* @param name
|
||||||
|
* @param endPoint
|
||||||
|
* @param apiKey
|
||||||
|
* @param secretKey
|
||||||
|
* @return Return added Region object
|
||||||
|
*/
|
||||||
|
public Region addRegion(int id, String name, String endPoint, String apiKey, String secretKey);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update details of the Region with specified Id
|
||||||
|
* @param id
|
||||||
|
* @param name
|
||||||
|
* @param endPoint
|
||||||
|
* @param apiKey
|
||||||
|
* @param secretKey
|
||||||
|
* @return Return updated Region object
|
||||||
|
*/
|
||||||
|
public Region updateRegion(int id, String name, String endPoint, String apiKey, String secretKey);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param id
|
||||||
|
* @return True if region is successfully removed
|
||||||
|
*/
|
||||||
|
public boolean removeRegion(int id);
|
||||||
|
|
||||||
|
/** List all Regions or by Id/Name
|
||||||
|
* @param id
|
||||||
|
* @param name
|
||||||
|
* @return List of Regions
|
||||||
|
*/
|
||||||
|
public List<? extends Region> listRegions(ListRegionsCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a user by userId
|
||||||
|
* isPopagate flag is set to true if sent from peer Region
|
||||||
|
* @param cmd
|
||||||
|
*
|
||||||
|
* @return true if delete was successful, false otherwise
|
||||||
|
*/
|
||||||
|
boolean deleteUserAccount(DeleteAccountCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates an account
|
||||||
|
* isPopagate falg is set to true if sent from peer Region
|
||||||
|
*
|
||||||
|
* @param cmd
|
||||||
|
* - the parameter containing accountId or account nameand domainId
|
||||||
|
* @return updated account object
|
||||||
|
*/
|
||||||
|
Account updateAccount(UpdateAccountCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables an account by accountName and domainId or accountId
|
||||||
|
* @param cmd
|
||||||
|
* @return
|
||||||
|
* @throws ResourceUnavailableException
|
||||||
|
* @throws ConcurrentOperationException
|
||||||
|
*/
|
||||||
|
Account disableAccount(DisableAccountCmd cmd) throws ConcurrentOperationException, ResourceUnavailableException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables an account by accountId
|
||||||
|
* @param cmd
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Account enableAccount(EnableAccountCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes user by Id
|
||||||
|
* @param deleteUserCmd
|
||||||
|
* @return true if delete was successful, false otherwise
|
||||||
|
*/
|
||||||
|
boolean deleteUser(DeleteUserCmd deleteUserCmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update an existing domain
|
||||||
|
*
|
||||||
|
* @param cmd
|
||||||
|
* - the command containing domainId and new domainName
|
||||||
|
* @return Domain object if the command succeeded
|
||||||
|
*/
|
||||||
|
public Domain updateDomain(UpdateDomainCmd updateDomainCmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes domain
|
||||||
|
* @param cmd
|
||||||
|
* @return true if delete was successful, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean deleteDomain(DeleteDomainCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update a user by userId
|
||||||
|
*
|
||||||
|
* @param userId
|
||||||
|
* @return UserAccount object
|
||||||
|
*/
|
||||||
|
public UserAccount updateUser(UpdateUserCmd updateUserCmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables a user by userId
|
||||||
|
*
|
||||||
|
* @param cmd
|
||||||
|
* @return UserAccount object
|
||||||
|
*/
|
||||||
|
public UserAccount disableUser(DisableUserCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables a user
|
||||||
|
*
|
||||||
|
* @param cmd
|
||||||
|
* @return UserAccount object
|
||||||
|
*/
|
||||||
|
public UserAccount enableUser(EnableUserCmd cmd);
|
||||||
|
}
|
||||||
33
api/src/org/apache/cloudstack/region/RegionSync.java
Normal file
33
api/src/org/apache/cloudstack/region/RegionSync.java
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.region;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface RegionSync {
|
||||||
|
|
||||||
|
public long getId();
|
||||||
|
|
||||||
|
public int getRegionId();
|
||||||
|
|
||||||
|
public String getApi();
|
||||||
|
|
||||||
|
Date getCreateDate();
|
||||||
|
}
|
||||||
@ -0,0 +1,104 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
package org.apache.cloudstack.api.command.test;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.api.ResponseGenerator;
|
||||||
|
import org.apache.cloudstack.api.ServerApiException;
|
||||||
|
import org.apache.cloudstack.api.command.admin.region.AddRegionCmd;
|
||||||
|
import org.apache.cloudstack.api.response.RegionResponse;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
import org.apache.cloudstack.region.RegionService;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.rules.ExpectedException;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
|
public class RegionCmdTest extends TestCase {
|
||||||
|
|
||||||
|
private AddRegionCmd addRegionCmd;
|
||||||
|
private ResponseGenerator responseGenerator;
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public ExpectedException expectedException = ExpectedException.none();
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
|
||||||
|
addRegionCmd = new AddRegionCmd() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Integer getId() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getRegionName() {
|
||||||
|
return "APAC";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateSuccess() {
|
||||||
|
|
||||||
|
RegionService regionService = Mockito.mock(RegionService.class);
|
||||||
|
|
||||||
|
Region region = Mockito.mock(Region.class);
|
||||||
|
Mockito.when(
|
||||||
|
regionService.addRegion(Mockito.anyInt(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
|
||||||
|
.thenReturn(region);
|
||||||
|
|
||||||
|
addRegionCmd._regionService = regionService;
|
||||||
|
responseGenerator = Mockito.mock(ResponseGenerator.class);
|
||||||
|
|
||||||
|
RegionResponse regionResponse = Mockito.mock(RegionResponse.class);
|
||||||
|
|
||||||
|
Mockito.when(responseGenerator.createRegionResponse(region)).thenReturn(
|
||||||
|
regionResponse);
|
||||||
|
|
||||||
|
addRegionCmd._responseGenerator = responseGenerator;
|
||||||
|
addRegionCmd.execute();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateFailure() {
|
||||||
|
|
||||||
|
RegionService regionService = Mockito.mock(RegionService.class);
|
||||||
|
|
||||||
|
Region region = Mockito.mock(Region.class);
|
||||||
|
Mockito.when(
|
||||||
|
regionService.addRegion(Mockito.anyInt(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString(), Mockito.anyString()))
|
||||||
|
.thenReturn(null);
|
||||||
|
|
||||||
|
addRegionCmd._regionService = regionService;
|
||||||
|
|
||||||
|
try {
|
||||||
|
addRegionCmd.execute();
|
||||||
|
} catch (ServerApiException exception) {
|
||||||
|
Assert.assertEquals("Failed to add Region",
|
||||||
|
exception.getDescription());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -116,6 +116,11 @@
|
|||||||
<artifactId>cloud-plugin-host-allocator-random</artifactId>
|
<artifactId>cloud-plugin-host-allocator-random</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloud-mom-rabbitmq</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>mysql</groupId>
|
<groupId>mysql</groupId>
|
||||||
<artifactId>mysql-connector-java</artifactId>
|
<artifactId>mysql-connector-java</artifactId>
|
||||||
|
|||||||
@ -525,3 +525,9 @@ listApis=15
|
|||||||
|
|
||||||
getApiLimit=15
|
getApiLimit=15
|
||||||
resetApiLimit=1
|
resetApiLimit=1
|
||||||
|
|
||||||
|
#### Region commands
|
||||||
|
addRegion=1
|
||||||
|
updateRegion=1
|
||||||
|
removeRegion=1
|
||||||
|
listRegions=15
|
||||||
|
|||||||
@ -50,6 +50,7 @@
|
|||||||
<bean id="premiumSecondaryStorageManagerImpl" class="com.cloud.secstorage.PremiumSecondaryStorageManagerImpl" />
|
<bean id="premiumSecondaryStorageManagerImpl" class="com.cloud.secstorage.PremiumSecondaryStorageManagerImpl" />
|
||||||
<bean id="randomlyIncreasingVMInstanceDaoImpl" class="com.cloud.vm.dao.RandomlyIncreasingVMInstanceDaoImpl" />
|
<bean id="randomlyIncreasingVMInstanceDaoImpl" class="com.cloud.vm.dao.RandomlyIncreasingVMInstanceDaoImpl" />
|
||||||
<bean id="ipv6AddressManagerImpl" class="com.cloud.network.Ipv6AddressManagerImpl" />
|
<bean id="ipv6AddressManagerImpl" class="com.cloud.network.Ipv6AddressManagerImpl" />
|
||||||
|
<bean id="RegionManagerImpl" class="org.apache.cloudstack.region.RegionManagerImpl" />
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Network Elements
|
Network Elements
|
||||||
|
|||||||
@ -271,6 +271,7 @@ under the License.
|
|||||||
<dao name="Site2SiteCustomerGatewayDao" class="com.cloud.network.dao.Site2SiteCustomerGatewayDaoImpl" singleton="false"/>
|
<dao name="Site2SiteCustomerGatewayDao" class="com.cloud.network.dao.Site2SiteCustomerGatewayDaoImpl" singleton="false"/>
|
||||||
<dao name="Site2SiteVpnGatewayDao" class="com.cloud.network.dao.Site2SiteVpnGatewayDaoImpl" singleton="false"/>
|
<dao name="Site2SiteVpnGatewayDao" class="com.cloud.network.dao.Site2SiteVpnGatewayDaoImpl" singleton="false"/>
|
||||||
<dao name="Site2SiteVpnConnectionDao" class="com.cloud.network.dao.Site2SiteVpnConnectionDaoImpl" singleton="false"/>
|
<dao name="Site2SiteVpnConnectionDao" class="com.cloud.network.dao.Site2SiteVpnConnectionDaoImpl" singleton="false"/>
|
||||||
|
<dao name="RegionDao" class="org.apache.cloudstack.region.dao.RegionDaoImpl" singleton="false"/>
|
||||||
<dao name="UserIpv6AddressDao" class="com.cloud.network.dao.UserIpv6AddressDaoImpl" singleton="false"/>
|
<dao name="UserIpv6AddressDao" class="com.cloud.network.dao.UserIpv6AddressDaoImpl" singleton="false"/>
|
||||||
</configuration-server>
|
</configuration-server>
|
||||||
|
|
||||||
|
|||||||
@ -19,6 +19,7 @@
|
|||||||
# in which the management server(Tomcat) is running
|
# in which the management server(Tomcat) is running
|
||||||
cluster.node.IP=127.0.0.1
|
cluster.node.IP=127.0.0.1
|
||||||
cluster.servlet.port=9090
|
cluster.servlet.port=9090
|
||||||
|
region.id=1
|
||||||
|
|
||||||
# CloudStack database settings
|
# CloudStack database settings
|
||||||
db.cloud.username=@DBUSER@
|
db.cloud.username=@DBUSER@
|
||||||
|
|||||||
@ -19,4 +19,4 @@
|
|||||||
|
|
||||||
paths.script=@COMMONLIBDIR@
|
paths.script=@COMMONLIBDIR@
|
||||||
mount.parent=@MSMNTDIR@
|
mount.parent=@MSMNTDIR@
|
||||||
cloud-stack-components-specification=@COMPONENTS-SPEC@
|
cloud-stack-components-specification=components.xml
|
||||||
|
|||||||
@ -16,23 +16,13 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.storage;
|
package com.cloud.storage;
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import javax.persistence.Column;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.EnumType;
|
|
||||||
import javax.persistence.Enumerated;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.GenerationType;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.api.Identity;
|
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
import com.google.gson.annotations.Expose;
|
import com.google.gson.annotations.Expose;
|
||||||
import org.apache.cloudstack.api.InternalIdentity;
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name="snapshots")
|
@Table(name="snapshots")
|
||||||
@ -69,7 +59,7 @@ public class SnapshotVO implements Snapshot {
|
|||||||
@Expose
|
@Expose
|
||||||
@Column(name="status", updatable = true, nullable=false)
|
@Column(name="status", updatable = true, nullable=false)
|
||||||
@Enumerated(value=EnumType.STRING)
|
@Enumerated(value=EnumType.STRING)
|
||||||
private Status status;
|
private State status;
|
||||||
|
|
||||||
@Column(name="snapshot_type")
|
@Column(name="snapshot_type")
|
||||||
short snapshotType;
|
short snapshotType;
|
||||||
@ -127,7 +117,7 @@ public class SnapshotVO implements Snapshot {
|
|||||||
this.snapshotType = snapshotType;
|
this.snapshotType = snapshotType;
|
||||||
this.typeDescription = typeDescription;
|
this.typeDescription = typeDescription;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.status = Status.Creating;
|
this.status = State.Creating;
|
||||||
this.prevSnapshotId = 0;
|
this.prevSnapshotId = 0;
|
||||||
this.hypervisorType = hypervisorType;
|
this.hypervisorType = hypervisorType;
|
||||||
this.version = "2.2";
|
this.version = "2.2";
|
||||||
@ -254,11 +244,11 @@ public class SnapshotVO implements Snapshot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Status getStatus() {
|
public State getState() {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(Status status) {
|
public void setStatus(State status) {
|
||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -28,9 +28,7 @@ import javax.persistence.GenerationType;
|
|||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.Identity;
|
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
import org.apache.cloudstack.api.InternalIdentity;
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name="account")
|
@Table(name="account")
|
||||||
@ -68,6 +66,9 @@ public class AccountVO implements Account {
|
|||||||
@Column(name="default_zone_id")
|
@Column(name="default_zone_id")
|
||||||
private Long defaultZoneId = null;
|
private Long defaultZoneId = null;
|
||||||
|
|
||||||
|
@Column(name="region_id")
|
||||||
|
private int regionId;
|
||||||
|
|
||||||
public AccountVO() {
|
public AccountVO() {
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
}
|
}
|
||||||
@ -77,13 +78,14 @@ public class AccountVO implements Account {
|
|||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public AccountVO(String accountName, long domainId, String networkDomain, short type) {
|
public AccountVO(String accountName, long domainId, String networkDomain, short type, String uuid, int regionId) {
|
||||||
this.accountName = accountName;
|
this.accountName = accountName;
|
||||||
this.domainId = domainId;
|
this.domainId = domainId;
|
||||||
this.networkDomain = networkDomain;
|
this.networkDomain = networkDomain;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.state = State.enabled;
|
this.state = State.enabled;
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = uuid;
|
||||||
|
this.regionId = regionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNeedsCleanup(boolean value) {
|
public void setNeedsCleanup(boolean value) {
|
||||||
@ -99,7 +101,11 @@ public class AccountVO implements Account {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void setId(long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String getAccountName() {
|
public String getAccountName() {
|
||||||
return accountName;
|
return accountName;
|
||||||
}
|
}
|
||||||
@ -176,4 +182,12 @@ public class AccountVO implements Account {
|
|||||||
public void setUuid(String uuid) {
|
public void setUuid(String uuid) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRegionId() {
|
||||||
|
return regionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegionId(int regionId) {
|
||||||
|
this.regionId = regionId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -93,6 +93,9 @@ public class UserVO implements User, Identity, InternalIdentity {
|
|||||||
@Column(name="uuid")
|
@Column(name="uuid")
|
||||||
private String uuid;
|
private String uuid;
|
||||||
|
|
||||||
|
@Column(name="region_id")
|
||||||
|
private int regionId;
|
||||||
|
|
||||||
public UserVO() {
|
public UserVO() {
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
}
|
}
|
||||||
@ -102,7 +105,7 @@ public class UserVO implements User, Identity, InternalIdentity {
|
|||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserVO(long accountId, String username, String password, String firstName, String lastName, String email, String timezone) {
|
public UserVO(long accountId, String username, String password, String firstName, String lastName, String email, String timezone, String uuid, int regionId) {
|
||||||
this.accountId = accountId;
|
this.accountId = accountId;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
this.password = password;
|
this.password = password;
|
||||||
@ -111,7 +114,8 @@ public class UserVO implements User, Identity, InternalIdentity {
|
|||||||
this.email = email;
|
this.email = email;
|
||||||
this.timezone = timezone;
|
this.timezone = timezone;
|
||||||
this.state = State.enabled;
|
this.state = State.enabled;
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = uuid;
|
||||||
|
this.regionId = regionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -261,4 +265,12 @@ public class UserVO implements User, Identity, InternalIdentity {
|
|||||||
public void setUuid(String uuid) {
|
public void setUuid(String uuid) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRegionId() {
|
||||||
|
return regionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegionId(int regionId) {
|
||||||
|
this.regionId = regionId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,7 @@ import javax.persistence.Id;
|
|||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
import com.cloud.storage.Snapshot.Status;
|
import com.cloud.storage.Snapshot.State;
|
||||||
import com.cloud.storage.Snapshot.Type;
|
import com.cloud.storage.Snapshot.Type;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
import com.google.gson.annotations.Expose;
|
import com.google.gson.annotations.Expose;
|
||||||
@ -68,7 +68,7 @@ public class SnapshotVO {
|
|||||||
@Expose
|
@Expose
|
||||||
@Column(name="status", updatable = true, nullable=false)
|
@Column(name="status", updatable = true, nullable=false)
|
||||||
@Enumerated(value=EnumType.STRING)
|
@Enumerated(value=EnumType.STRING)
|
||||||
private Status status;
|
private State status;
|
||||||
|
|
||||||
@Column(name="snapshot_type")
|
@Column(name="snapshot_type")
|
||||||
short snapshotType;
|
short snapshotType;
|
||||||
@ -126,7 +126,7 @@ public class SnapshotVO {
|
|||||||
this.snapshotType = snapshotType;
|
this.snapshotType = snapshotType;
|
||||||
this.typeDescription = typeDescription;
|
this.typeDescription = typeDescription;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
this.status = Status.Creating;
|
this.status = State.Creating;
|
||||||
this.prevSnapshotId = 0;
|
this.prevSnapshotId = 0;
|
||||||
this.hypervisorType = hypervisorType;
|
this.hypervisorType = hypervisorType;
|
||||||
this.version = "2.2";
|
this.version = "2.2";
|
||||||
@ -244,11 +244,11 @@ public class SnapshotVO {
|
|||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Status getStatus() {
|
public State getStatus() {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(Status status) {
|
public void setStatus(State status) {
|
||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -111,11 +111,6 @@ public class SnapshotEntityImpl implements SnapshotEntity {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Status getStatus() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HypervisorType getHypervisorType() {
|
public HypervisorType getHypervisorType() {
|
||||||
@ -189,4 +184,10 @@ public class SnapshotEntityImpl implements SnapshotEntity {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public State getState() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
47
framework/events/pom.xml
Normal file
47
framework/events/pom.xml
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>cloud-framework-events</artifactId>
|
||||||
|
<name>Apache CloudStack Event Notification Framework</name>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloudstack-framework</artifactId>
|
||||||
|
<version>4.1.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloud-utils</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>${cs.gson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<defaultGoal>install</defaultGoal>
|
||||||
|
<sourceDirectory>src</sourceDirectory>
|
||||||
|
<testSourceDirectory>test</testSourceDirectory>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.cloudstack.framework.events;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
|
public class Event {
|
||||||
|
|
||||||
|
String eventCategory;
|
||||||
|
String eventType;
|
||||||
|
String eventSource;
|
||||||
|
String resourceType;
|
||||||
|
String resourceUUID;
|
||||||
|
String description;
|
||||||
|
|
||||||
|
public Event(String eventSource, String eventCategory, String eventType, String resourceType,
|
||||||
|
String resourceUUID) {
|
||||||
|
this.eventCategory = eventCategory;
|
||||||
|
this.eventType = eventType;
|
||||||
|
this.eventSource = eventSource;
|
||||||
|
this.resourceType = resourceType;
|
||||||
|
this.resourceUUID = resourceUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEventCategory() {
|
||||||
|
return eventCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEventCategory(String category) {
|
||||||
|
eventCategory = category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEventType() {
|
||||||
|
return eventType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEventType(String type) {
|
||||||
|
eventType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEventSource() {
|
||||||
|
return eventSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setEventSource(String source) {
|
||||||
|
eventSource = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription (Object message) {
|
||||||
|
Gson gson = new Gson();
|
||||||
|
this.description = gson.toJson(message).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResourceType() {
|
||||||
|
return resourceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResourceType(String resourceType) {
|
||||||
|
this.resourceType = resourceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResourceUUID(String uuid) {
|
||||||
|
this.resourceUUID = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResourceUUID () {
|
||||||
|
return resourceUUID;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.cloudstack.framework.events;
|
||||||
|
|
||||||
|
import com.cloud.utils.component.Adapter;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface to publish and subscribe to CloudStack events
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public interface EventBus extends Adapter{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* publish an event on to the event bus
|
||||||
|
*
|
||||||
|
* @param event event that needs to be published on the event bus
|
||||||
|
*/
|
||||||
|
void publish(Event event) throws EventBusException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* subscribe to events that matches specified event topics
|
||||||
|
*
|
||||||
|
* @param topic defines category and type of the events being subscribed to
|
||||||
|
* @param subscriber subscriber that intends to receive event notification
|
||||||
|
* @return UUID returns the subscription ID
|
||||||
|
*/
|
||||||
|
UUID subscribe(EventTopic topic, EventSubscriber subscriber) throws EventBusException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unsubscribe to events of a category and a type
|
||||||
|
*
|
||||||
|
* @param subscriber subscriber that intends to unsubscribe from the event notification
|
||||||
|
*/
|
||||||
|
void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws EventBusException;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.cloudstack.framework.events;
|
||||||
|
|
||||||
|
public class EventBusException extends Exception{
|
||||||
|
public EventBusException (String msg) {
|
||||||
|
super(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package org.apache.cloudstack.framework.events;
|
||||||
|
|
||||||
|
public interface EventSubscriber {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback method. EventBus calls this method on occurrence of subscribed event
|
||||||
|
*
|
||||||
|
* @param event details of the event
|
||||||
|
*/
|
||||||
|
void onEvent(Event event);
|
||||||
|
}
|
||||||
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.cloudstack.framework.events;
|
||||||
|
|
||||||
|
public class EventTopic {
|
||||||
|
|
||||||
|
String eventCategory;
|
||||||
|
String eventType;
|
||||||
|
String resourceType;
|
||||||
|
String resourceUUID;
|
||||||
|
String eventSource;
|
||||||
|
|
||||||
|
public EventTopic(String eventCategory, String eventType, String resourceType, String resourceUUID, String eventSource) {
|
||||||
|
this.eventCategory = eventCategory;
|
||||||
|
this.eventType = eventType;
|
||||||
|
this.resourceType = resourceType;
|
||||||
|
this.resourceUUID = resourceUUID;
|
||||||
|
this.eventSource = eventSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEventCategory() {
|
||||||
|
return eventCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEventType() {
|
||||||
|
return eventType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResourceType() {
|
||||||
|
return resourceType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEventSource() {
|
||||||
|
return eventSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getResourceUUID() {
|
||||||
|
return resourceUUID;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -32,5 +32,6 @@
|
|||||||
<modules>
|
<modules>
|
||||||
<module>ipc</module>
|
<module>ipc</module>
|
||||||
<module>rest</module>
|
<module>rest</module>
|
||||||
|
<module>events</module>
|
||||||
</modules>
|
</modules>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
46
plugins/event-bus/rabbitmq/pom.xml
Normal file
46
plugins/event-bus/rabbitmq/pom.xml
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>cloud-mom-rabbitmq</artifactId>
|
||||||
|
<name>Apache CloudStack Plugin - RabbitMQ Event Bus</name>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloudstack-plugins</artifactId>
|
||||||
|
<version>4.1.0-SNAPSHOT</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.rabbitmq</groupId>
|
||||||
|
<artifactId>amqp-client</artifactId>
|
||||||
|
<version>2.8.7</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloud-framework-events</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<defaultGoal>install</defaultGoal>
|
||||||
|
<sourceDirectory>src</sourceDirectory>
|
||||||
|
</build>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,556 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.cloudstack.mom.rabbitmq;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.*;
|
||||||
|
import org.apache.cloudstack.framework.events.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.utils.Ternary;
|
||||||
|
import com.cloud.utils.component.ManagerBase;
|
||||||
|
|
||||||
|
import javax.ejb.Local;
|
||||||
|
import javax.naming.ConfigurationException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ConnectException;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
@Local(value=EventBus.class)
|
||||||
|
public class RabbitMQEventBus extends ManagerBase implements EventBus {
|
||||||
|
|
||||||
|
// details of AMQP server
|
||||||
|
private static String _amqpHost;
|
||||||
|
private static Integer _port;
|
||||||
|
private static String _username;
|
||||||
|
private static String _password;
|
||||||
|
|
||||||
|
// AMQP exchange name where all CloudStack events will be published
|
||||||
|
private static String _amqpExchangeName;
|
||||||
|
|
||||||
|
// hashmap to book keep the registered subscribers
|
||||||
|
private static ConcurrentHashMap<String, Ternary<String, Channel, EventSubscriber>> _subscribers;
|
||||||
|
|
||||||
|
// connection to AMQP server,
|
||||||
|
private static Connection _connection=null;
|
||||||
|
|
||||||
|
// AMQP server should consider messages acknowledged once delivered if _autoAck is true
|
||||||
|
private static boolean _autoAck = true;
|
||||||
|
|
||||||
|
private ExecutorService executorService;
|
||||||
|
private String _name;
|
||||||
|
private static DisconnectHandler disconnectHandler;
|
||||||
|
private static Integer _retryInterval;
|
||||||
|
private static final Logger s_logger = Logger.getLogger(RabbitMQEventBus.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
|
||||||
|
|
||||||
|
_amqpHost = (String) params.get("server");
|
||||||
|
if (_amqpHost == null || _amqpHost.isEmpty()) {
|
||||||
|
throw new ConfigurationException("Unable to get the AMQP server details");
|
||||||
|
}
|
||||||
|
|
||||||
|
_username = (String) params.get("username");
|
||||||
|
if (_username == null || _username.isEmpty()) {
|
||||||
|
throw new ConfigurationException("Unable to get the username details");
|
||||||
|
}
|
||||||
|
|
||||||
|
_password = (String) params.get("password");
|
||||||
|
if (_password == null || _password.isEmpty()) {
|
||||||
|
throw new ConfigurationException("Unable to get the password details");
|
||||||
|
}
|
||||||
|
|
||||||
|
_amqpExchangeName = (String) params.get("exchangename");
|
||||||
|
if (_amqpExchangeName == null || _amqpExchangeName.isEmpty()) {
|
||||||
|
throw new ConfigurationException("Unable to get the _exchange details on the AMQP server");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
String portStr = (String) params.get("port");
|
||||||
|
if (portStr == null || portStr.isEmpty()) {
|
||||||
|
throw new ConfigurationException("Unable to get the port details of AMQP server");
|
||||||
|
}
|
||||||
|
_port = Integer.parseInt(portStr);
|
||||||
|
|
||||||
|
String retryIntervalStr = (String) params.get("retryinterval");
|
||||||
|
if (retryIntervalStr == null || retryIntervalStr.isEmpty()) {
|
||||||
|
// default to 10s to try out reconnect
|
||||||
|
retryIntervalStr = "10000";
|
||||||
|
}
|
||||||
|
_retryInterval = Integer.parseInt(retryIntervalStr);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw new ConfigurationException("Invalid port number/retry interval");
|
||||||
|
}
|
||||||
|
|
||||||
|
_subscribers = new ConcurrentHashMap<String, Ternary<String, Channel, EventSubscriber>>();
|
||||||
|
|
||||||
|
executorService = Executors.newCachedThreadPool();
|
||||||
|
disconnectHandler = new DisconnectHandler();
|
||||||
|
_name = name;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Call to subscribe to interested set of events
|
||||||
|
*
|
||||||
|
* @param topic defines category and type of the events being subscribed to
|
||||||
|
* @param subscriber subscriber that intends to receive event notification
|
||||||
|
* @return UUID that represents the subscription with event bus
|
||||||
|
* @throws EventBusException
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public UUID subscribe(EventTopic topic, EventSubscriber subscriber) throws EventBusException {
|
||||||
|
|
||||||
|
if (subscriber == null || topic == null) {
|
||||||
|
throw new EventBusException("Invalid EventSubscriber/EventTopic object passed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a UUID, that will be used for managing subscriptions and also used as queue name
|
||||||
|
// for on the queue used for the subscriber on the AMQP broker
|
||||||
|
UUID queueId = UUID.randomUUID();
|
||||||
|
String queueName = queueId.toString();
|
||||||
|
|
||||||
|
try {
|
||||||
|
String bindingKey = createBindingKey(topic);
|
||||||
|
|
||||||
|
// store the subscriber details before creating channel
|
||||||
|
_subscribers.put(queueName, new Ternary(bindingKey, null, subscriber));
|
||||||
|
|
||||||
|
// create a channel dedicated for this subscription
|
||||||
|
Connection connection = getConnection();
|
||||||
|
Channel channel = createChannel(connection);
|
||||||
|
|
||||||
|
// create a queue and bind it to the exchange with binding key formed from event topic
|
||||||
|
createExchange(channel, _amqpExchangeName);
|
||||||
|
channel.queueDeclare(queueName, false, false, false, null);
|
||||||
|
channel.queueBind(queueName, _amqpExchangeName, bindingKey);
|
||||||
|
|
||||||
|
// register a callback handler to receive the events that a subscriber subscribed to
|
||||||
|
channel.basicConsume(queueName, _autoAck, queueName,
|
||||||
|
new DefaultConsumer(channel) {
|
||||||
|
@Override
|
||||||
|
public void handleDelivery(String queueName,
|
||||||
|
Envelope envelope,
|
||||||
|
AMQP.BasicProperties properties,
|
||||||
|
byte[] body)
|
||||||
|
throws IOException {
|
||||||
|
Ternary<String, Channel, EventSubscriber> queueDetails = _subscribers.get(queueName);
|
||||||
|
if (queueDetails != null) {
|
||||||
|
EventSubscriber subscriber = queueDetails.third();
|
||||||
|
String routingKey = envelope.getRoutingKey();
|
||||||
|
String eventSource = getEventSourceFromRoutingKey(routingKey);
|
||||||
|
String eventCategory = getEventCategoryFromRoutingKey(routingKey);
|
||||||
|
String eventType = getEventTypeFromRoutingKey(routingKey);
|
||||||
|
String resourceType = getResourceTypeFromRoutingKey(routingKey);
|
||||||
|
String resourceUUID = getResourceUUIDFromRoutingKey(routingKey);
|
||||||
|
Event event = new Event(eventSource, eventCategory, eventType,
|
||||||
|
resourceType, resourceUUID);
|
||||||
|
event.setDescription(new String(body));
|
||||||
|
|
||||||
|
// deliver the event to call back object provided by subscriber
|
||||||
|
subscriber.onEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// update the channel details for the subscription
|
||||||
|
Ternary<String, Channel, EventSubscriber> queueDetails = _subscribers.get(queueName);
|
||||||
|
queueDetails.second(channel);
|
||||||
|
_subscribers.put(queueName, queueDetails);
|
||||||
|
|
||||||
|
} catch (AlreadyClosedException closedException) {
|
||||||
|
s_logger.warn("Connection to AMQP service is lost. Subscription:" + queueName +
|
||||||
|
" will be active after reconnection");
|
||||||
|
} catch (ConnectException connectException) {
|
||||||
|
s_logger.warn("Connection to AMQP service is lost. Subscription:" + queueName +
|
||||||
|
" will be active after reconnection");
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new EventBusException("Failed to subscribe to event due to " + e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return queueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unsubscribe(UUID subscriberId, EventSubscriber subscriber) throws EventBusException {
|
||||||
|
try {
|
||||||
|
String classname = subscriber.getClass().getName();
|
||||||
|
String queueName = UUID.nameUUIDFromBytes(classname.getBytes()).toString();
|
||||||
|
Ternary<String, Channel, EventSubscriber> queueDetails = _subscribers.get(queueName);
|
||||||
|
Channel channel = queueDetails.second();
|
||||||
|
channel.basicCancel(queueName);
|
||||||
|
_subscribers.remove(queueName, queueDetails);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new EventBusException("Failed to unsubscribe from event bus due to " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// publish event on to the exchange created on AMQP server
|
||||||
|
@Override
|
||||||
|
public void publish(Event event) throws EventBusException {
|
||||||
|
|
||||||
|
String routingKey = createRoutingKey(event);
|
||||||
|
String eventDescription = event.getDescription();
|
||||||
|
|
||||||
|
try {
|
||||||
|
Connection connection = getConnection();
|
||||||
|
Channel channel = createChannel(connection);
|
||||||
|
createExchange(channel, _amqpExchangeName);
|
||||||
|
publishEventToExchange(channel, _amqpExchangeName, routingKey, eventDescription);
|
||||||
|
channel.close();
|
||||||
|
} catch (AlreadyClosedException e) {
|
||||||
|
closeConnection();
|
||||||
|
throw new EventBusException("Failed to publish event to message broker as connection to AMQP broker in lost");
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new EventBusException("Failed to publish event to message broker due to " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** creates a routing key from the event details.
|
||||||
|
* created routing key will be used while publishing the message to exchange on AMQP server
|
||||||
|
*/
|
||||||
|
private String createRoutingKey(Event event) {
|
||||||
|
|
||||||
|
StringBuilder routingKey = new StringBuilder();
|
||||||
|
|
||||||
|
String eventSource = replaceNullWithWildcard(event.getEventSource());
|
||||||
|
eventSource = eventSource.replace(".", "-");
|
||||||
|
|
||||||
|
String eventCategory = replaceNullWithWildcard(event.getEventCategory());
|
||||||
|
eventCategory = eventCategory.replace(".", "-");
|
||||||
|
|
||||||
|
String eventType = replaceNullWithWildcard(event.getEventType());
|
||||||
|
eventType = eventType.replace(".", "-");
|
||||||
|
|
||||||
|
String resourceType = replaceNullWithWildcard(event.getResourceType());
|
||||||
|
resourceType = resourceType.replace(".", "-");
|
||||||
|
|
||||||
|
String resourceUuid = replaceNullWithWildcard(event.getResourceUUID());
|
||||||
|
resourceUuid = resourceUuid.replace(".", "-");
|
||||||
|
|
||||||
|
// routing key will be of format: eventSource.eventCategory.eventType.resourceType.resourceUuid
|
||||||
|
routingKey.append(eventSource);
|
||||||
|
routingKey.append(".");
|
||||||
|
routingKey.append(eventCategory);
|
||||||
|
routingKey.append(".");
|
||||||
|
routingKey.append(eventType);
|
||||||
|
routingKey.append(".");
|
||||||
|
routingKey.append(resourceType);
|
||||||
|
routingKey.append(".");
|
||||||
|
routingKey.append(resourceUuid);
|
||||||
|
|
||||||
|
return routingKey.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** creates a binding key from the event topic that subscriber specified
|
||||||
|
* binding key will be used to bind the queue created for subscriber to exchange on AMQP server
|
||||||
|
*/
|
||||||
|
private String createBindingKey(EventTopic topic) {
|
||||||
|
|
||||||
|
StringBuilder bindingKey = new StringBuilder();
|
||||||
|
|
||||||
|
String eventSource = replaceNullWithWildcard(topic.getEventSource());
|
||||||
|
eventSource = eventSource.replace(".", "-");
|
||||||
|
|
||||||
|
String eventCategory = replaceNullWithWildcard(topic.getEventCategory());
|
||||||
|
eventCategory = eventCategory.replace(".", "-");
|
||||||
|
|
||||||
|
String eventType = replaceNullWithWildcard(topic.getEventType());
|
||||||
|
eventType = eventType.replace(".", "-");
|
||||||
|
|
||||||
|
String resourceType = replaceNullWithWildcard(topic.getResourceType());
|
||||||
|
resourceType = resourceType.replace(".", "-");
|
||||||
|
|
||||||
|
String resourceUuid = replaceNullWithWildcard(topic.getResourceUUID());
|
||||||
|
resourceUuid = resourceUuid.replace(".", "-");
|
||||||
|
|
||||||
|
// binding key will be of format: eventSource.eventCategory.eventType.resourceType.resourceUuid
|
||||||
|
bindingKey.append(eventSource);
|
||||||
|
bindingKey.append(".");
|
||||||
|
bindingKey.append(eventCategory);
|
||||||
|
bindingKey.append(".");
|
||||||
|
bindingKey.append(eventType);
|
||||||
|
bindingKey.append(".");
|
||||||
|
bindingKey.append(resourceType);
|
||||||
|
bindingKey.append(".");
|
||||||
|
bindingKey.append(resourceUuid);
|
||||||
|
|
||||||
|
return bindingKey.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized Connection getConnection() throws Exception {
|
||||||
|
if (_connection == null) {
|
||||||
|
try {
|
||||||
|
return createConnection();
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.error("Failed to create a connection to AMQP server due to " + e.getMessage());
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return _connection;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized Connection createConnection() throws Exception {
|
||||||
|
try {
|
||||||
|
ConnectionFactory factory = new ConnectionFactory();
|
||||||
|
factory.setUsername(_username);
|
||||||
|
factory.setPassword(_password);
|
||||||
|
factory.setVirtualHost("/");
|
||||||
|
factory.setHost(_amqpHost);
|
||||||
|
factory.setPort(_port);
|
||||||
|
Connection connection = factory.newConnection();
|
||||||
|
connection.addShutdownListener(disconnectHandler);
|
||||||
|
_connection = connection;
|
||||||
|
return _connection;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void closeConnection() {
|
||||||
|
try {
|
||||||
|
if (_connection != null) {
|
||||||
|
_connection.close();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.warn("Failed to close connection to AMQP server due to " + e.getMessage());
|
||||||
|
}
|
||||||
|
_connection = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void abortConnection () {
|
||||||
|
if (_connection == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
_connection.abort();
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.warn("Failed to abort connection due to " + e.getMessage());
|
||||||
|
}
|
||||||
|
_connection = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String replaceNullWithWildcard(String key) {
|
||||||
|
if (key == null || key.isEmpty()) {
|
||||||
|
return "*";
|
||||||
|
} else {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Channel createChannel(Connection connection) throws Exception {
|
||||||
|
try {
|
||||||
|
return connection.createChannel();
|
||||||
|
} catch (java.io.IOException exception) {
|
||||||
|
s_logger.warn("Failed to create a channel due to " + exception.getMessage());
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createExchange(Channel channel, String exchangeName) throws Exception {
|
||||||
|
try {
|
||||||
|
channel.exchangeDeclare(exchangeName, "topic", true);
|
||||||
|
} catch (java.io.IOException exception) {
|
||||||
|
s_logger.error("Failed to create exchange" + exchangeName + " on RabbitMQ server");
|
||||||
|
throw exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void publishEventToExchange(Channel channel, String exchangeName,
|
||||||
|
String routingKey, String eventDescription) throws Exception {
|
||||||
|
try {
|
||||||
|
byte[] messageBodyBytes = eventDescription.getBytes();
|
||||||
|
channel.basicPublish(exchangeName, routingKey, MessageProperties.PERSISTENT_TEXT_PLAIN, messageBodyBytes);
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.error("Failed to publish event " + routingKey + " on exchange " + exchangeName +
|
||||||
|
" of message broker due to " + e.getMessage());
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEventCategoryFromRoutingKey(String routingKey) {
|
||||||
|
String[] keyParts = routingKey.split("\\.");
|
||||||
|
return keyParts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEventTypeFromRoutingKey(String routingKey) {
|
||||||
|
String[] keyParts = routingKey.split("\\.");
|
||||||
|
return keyParts[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEventSourceFromRoutingKey(String routingKey) {
|
||||||
|
String[] keyParts = routingKey.split("\\.");
|
||||||
|
return keyParts[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getResourceTypeFromRoutingKey(String routingKey) {
|
||||||
|
String[] keyParts = routingKey.split("\\.");
|
||||||
|
return keyParts[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getResourceUUIDFromRoutingKey(String routingKey) {
|
||||||
|
String[] keyParts = routingKey.split("\\.");
|
||||||
|
return keyParts[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return _name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean start() {
|
||||||
|
ReconnectionTask reconnect = new ReconnectionTask(); // initiate connection to AMQP server
|
||||||
|
executorService.submit(reconnect);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stop() {
|
||||||
|
|
||||||
|
if (_connection.isOpen()) {
|
||||||
|
for (String subscriberId : _subscribers.keySet()) {
|
||||||
|
Ternary<String, Channel, EventSubscriber> subscriberDetails = _subscribers.get(subscriberId);
|
||||||
|
Channel channel = subscriberDetails.second();
|
||||||
|
String queueName = subscriberId;
|
||||||
|
try {
|
||||||
|
channel.queueDelete(queueName);
|
||||||
|
channel.abort();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
s_logger.warn("Failed to delete queue: " + queueName + " on AMQP server due to " + ioe.getMessage() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closeConnection();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// logic to deal with loss of connection to AMQP server
|
||||||
|
private class DisconnectHandler implements ShutdownListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shutdownCompleted(ShutdownSignalException shutdownSignalException) {
|
||||||
|
if (!shutdownSignalException.isInitiatedByApplication()) {
|
||||||
|
|
||||||
|
for (String subscriberId : _subscribers.keySet()) {
|
||||||
|
Ternary<String, Channel, EventSubscriber> subscriberDetails = _subscribers.get(subscriberId);
|
||||||
|
subscriberDetails.second(null);
|
||||||
|
_subscribers.put(subscriberId, subscriberDetails);
|
||||||
|
}
|
||||||
|
|
||||||
|
abortConnection(); // disconnected to AMQP server, so abort the connection and channels
|
||||||
|
s_logger.warn("Connection has been shutdown by AMQP server. Attempting to reconnect.");
|
||||||
|
|
||||||
|
// initiate re-connect process
|
||||||
|
ReconnectionTask reconnect = new ReconnectionTask();
|
||||||
|
executorService.submit(reconnect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// retry logic to connect back to AMQP server after loss of connection
|
||||||
|
private class ReconnectionTask implements Runnable {
|
||||||
|
|
||||||
|
boolean connected = false;
|
||||||
|
Connection connection = null;
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
while (!connected) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(_retryInterval);
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
// ignore timer interrupts
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
connection = createConnection();
|
||||||
|
connected = true;
|
||||||
|
} catch (IOException ie) {
|
||||||
|
continue; // can't establish connection to AMQP server yet, so continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepare consumer on AMQP server for each of subscriber
|
||||||
|
for (String subscriberId : _subscribers.keySet()) {
|
||||||
|
Ternary<String, Channel, EventSubscriber> subscriberDetails = _subscribers.get(subscriberId);
|
||||||
|
String bindingKey = subscriberDetails.first();
|
||||||
|
EventSubscriber subscriber = subscriberDetails.third();
|
||||||
|
|
||||||
|
/** create a queue with subscriber ID as queue name and bind it to the exchange
|
||||||
|
* with binding key formed from event topic
|
||||||
|
*/
|
||||||
|
Channel channel = createChannel(connection);
|
||||||
|
createExchange(channel, _amqpExchangeName);
|
||||||
|
channel.queueDeclare(subscriberId, false, false, false, null);
|
||||||
|
channel.queueBind(subscriberId, _amqpExchangeName, bindingKey);
|
||||||
|
|
||||||
|
// register a callback handler to receive the events that a subscriber subscribed to
|
||||||
|
channel.basicConsume(subscriberId, _autoAck, subscriberId,
|
||||||
|
new DefaultConsumer(channel) {
|
||||||
|
@Override
|
||||||
|
public void handleDelivery(String queueName,
|
||||||
|
Envelope envelope,
|
||||||
|
AMQP.BasicProperties properties,
|
||||||
|
byte[] body)
|
||||||
|
throws IOException {
|
||||||
|
|
||||||
|
Ternary<String, Channel, EventSubscriber> subscriberDetails
|
||||||
|
= _subscribers.get(queueName); // queue name == subscriber ID
|
||||||
|
|
||||||
|
if (subscriberDetails != null) {
|
||||||
|
EventSubscriber subscriber = subscriberDetails.third();
|
||||||
|
String routingKey = envelope.getRoutingKey();
|
||||||
|
String eventSource = getEventSourceFromRoutingKey(routingKey);
|
||||||
|
String eventCategory = getEventCategoryFromRoutingKey(routingKey);
|
||||||
|
String eventType = getEventTypeFromRoutingKey(routingKey);
|
||||||
|
String resourceType = getResourceTypeFromRoutingKey(routingKey);
|
||||||
|
String resourceUUID = getResourceUUIDFromRoutingKey(routingKey);
|
||||||
|
|
||||||
|
// create event object from the message details obtained from AMQP server
|
||||||
|
Event event = new Event(eventSource, eventCategory, eventType,
|
||||||
|
resourceType, resourceUUID);
|
||||||
|
event.setDescription(new String(body));
|
||||||
|
|
||||||
|
// deliver the event to call back object provided by subscriber
|
||||||
|
subscriber.onEvent(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
// update the channel details for the subscription
|
||||||
|
subscriberDetails.second(channel);
|
||||||
|
_subscribers.put(subscriberId, subscriberDetails);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
s_logger.warn("Failed to recreate queues and binding for the subscribers due to " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -19,6 +19,7 @@ package com.cloud.network.guru;
|
|||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import com.cloud.event.ActionEventUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -27,7 +28,6 @@ import com.cloud.dc.DataCenter.NetworkType;
|
|||||||
import com.cloud.deploy.DeployDestination;
|
import com.cloud.deploy.DeployDestination;
|
||||||
import com.cloud.deploy.DeploymentPlan;
|
import com.cloud.deploy.DeploymentPlan;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.event.EventVO;
|
import com.cloud.event.EventVO;
|
||||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||||
import com.cloud.network.Network;
|
import com.cloud.network.Network;
|
||||||
@ -99,7 +99,7 @@ public class OvsGuestNetworkGuru extends GuestNetworkGuru {
|
|||||||
throw new InsufficientVirtualNetworkCapcityException("Unable to allocate vnet as a part of network " + network + " implement ", DataCenter.class, dcId);
|
throw new InsufficientVirtualNetworkCapcityException("Unable to allocate vnet as a part of network " + network + " implement ", DataCenter.class, dcId);
|
||||||
}
|
}
|
||||||
implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vnet));
|
implemented.setBroadcastUri(BroadcastDomainType.Vswitch.toUri(vnet));
|
||||||
EventUtils.saveEvent(UserContext.current().getCallerUserId(), network.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: "+vnet+ " Network Id: "+network.getId(), 0);
|
ActionEventUtils.onCompletedActionEvent(UserContext.current().getCallerUserId(), network.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + network.getId(), 0);
|
||||||
} else {
|
} else {
|
||||||
implemented.setBroadcastUri(network.getBroadcastUri());
|
implemented.setBroadcastUri(network.getBroadcastUri());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,6 +41,7 @@
|
|||||||
<module>hypervisors/ovm</module>
|
<module>hypervisors/ovm</module>
|
||||||
<module>hypervisors/xen</module>
|
<module>hypervisors/xen</module>
|
||||||
<module>hypervisors/kvm</module>
|
<module>hypervisors/kvm</module>
|
||||||
|
<module>event-bus/rabbitmq</module>
|
||||||
<module>hypervisors/simulator</module>
|
<module>hypervisors/simulator</module>
|
||||||
<module>hypervisors/baremetal</module>
|
<module>hypervisors/baremetal</module>
|
||||||
<module>hypervisors/ucs</module>
|
<module>hypervisors/ucs</module>
|
||||||
|
|||||||
@ -95,6 +95,11 @@
|
|||||||
<artifactId>cloud-api</artifactId>
|
<artifactId>cloud-api</artifactId>
|
||||||
<version>${project.version}</version>
|
<version>${project.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cloudstack</groupId>
|
||||||
|
<artifactId>cloud-framework-events</artifactId>
|
||||||
|
<version>${project.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<defaultGoal>install</defaultGoal>
|
<defaultGoal>install</defaultGoal>
|
||||||
|
|||||||
@ -61,6 +61,7 @@ import com.cloud.dc.dao.ClusterDao;
|
|||||||
import com.cloud.dc.dao.DataCenterDao;
|
import com.cloud.dc.dao.DataCenterDao;
|
||||||
import com.cloud.dc.dao.DataCenterIpAddressDao;
|
import com.cloud.dc.dao.DataCenterIpAddressDao;
|
||||||
import com.cloud.dc.dao.HostPodDao;
|
import com.cloud.dc.dao.HostPodDao;
|
||||||
|
import com.cloud.event.AlertGenerator;
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.host.dao.HostDao;
|
import com.cloud.host.dao.HostDao;
|
||||||
@ -246,6 +247,10 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendAlert(short alertType, long dataCenterId, Long podId, String subject, String body) {
|
public void sendAlert(short alertType, long dataCenterId, Long podId, String subject, String body) {
|
||||||
|
|
||||||
|
// publish alert
|
||||||
|
AlertGenerator.publishAlertOnEventBus(getAlertType(alertType), dataCenterId, podId, subject, body);
|
||||||
|
|
||||||
// TODO: queue up these messages and send them as one set of issues once a certain number of issues is reached? If that's the case,
|
// TODO: queue up these messages and send them as one set of issues once a certain number of issues is reached? If that's the case,
|
||||||
// shouldn't we have a type/severity as part of the API so that severe errors get sent right away?
|
// shouldn't we have a type/severity as part of the API so that severe errors get sent right away?
|
||||||
try {
|
try {
|
||||||
@ -257,6 +262,65 @@ public class AlertManagerImpl extends ManagerBase implements AlertManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getAlertType(short alertType) {
|
||||||
|
if (alertType == ALERT_TYPE_MEMORY) {
|
||||||
|
return "ALERT.MEMORY";
|
||||||
|
} else if (alertType == ALERT_TYPE_CPU) {
|
||||||
|
return "ALERT.MEMORY";
|
||||||
|
} else if (alertType == ALERT_TYPE_STORAGE) {
|
||||||
|
return "ALERT.STORAGE";
|
||||||
|
} else if (alertType == ALERT_TYPE_STORAGE_ALLOCATED) {
|
||||||
|
return "ALERT.STORAGE.ALLOCATED";
|
||||||
|
} else if (alertType == ALERT_TYPE_VIRTUAL_NETWORK_PUBLIC_IP) {
|
||||||
|
return "ALERT.NETWORK.PUBLICIP";
|
||||||
|
} else if (alertType == ALERT_TYPE_PRIVATE_IP) {
|
||||||
|
return "ALERT.NETWORK.PRIVATEIP";
|
||||||
|
} else if (alertType == ALERT_TYPE_SECONDARY_STORAGE) {
|
||||||
|
return "ALERT.STORAGE.SECONDARY";
|
||||||
|
} else if (alertType == ALERT_TYPE_HOST) {
|
||||||
|
return "ALERT.COMPUTE.HOST";
|
||||||
|
} else if (alertType == ALERT_TYPE_USERVM) {
|
||||||
|
return "ALERT.USERVM";
|
||||||
|
} else if (alertType == ALERT_TYPE_DOMAIN_ROUTER) {
|
||||||
|
return "ALERT.SERVICE.DOMAINROUTER";
|
||||||
|
} else if (alertType == ALERT_TYPE_CONSOLE_PROXY) {
|
||||||
|
return "ALERT.SERVICE.CONSOLEPROXY";
|
||||||
|
} else if (alertType == ALERT_TYPE_ROUTING) {
|
||||||
|
return "ALERT.NETWORK.ROUTING";
|
||||||
|
} else if (alertType == ALERT_TYPE_STORAGE_MISC) {
|
||||||
|
return "ALERT.STORAGE.MISC";
|
||||||
|
} else if (alertType == ALERT_TYPE_USAGE_SERVER) {
|
||||||
|
return "ALERT.USAGE";
|
||||||
|
} else if (alertType == ALERT_TYPE_MANAGMENT_NODE) {
|
||||||
|
return "ALERT.MANAGEMENT";
|
||||||
|
} else if (alertType == ALERT_TYPE_DOMAIN_ROUTER_MIGRATE) {
|
||||||
|
return "ALERT.NETWORK.DOMAINROUTERMIGRATE";
|
||||||
|
} else if (alertType == ALERT_TYPE_CONSOLE_PROXY_MIGRATE) {
|
||||||
|
return "ALERT.SERVICE.CONSOLEPROXYMIGRATE";
|
||||||
|
} else if (alertType == ALERT_TYPE_USERVM_MIGRATE) {
|
||||||
|
return "ALERT.USERVM.MIGRATE";
|
||||||
|
} else if (alertType == ALERT_TYPE_VLAN) {
|
||||||
|
return "ALERT.NETWORK.VLAN";
|
||||||
|
} else if (alertType == ALERT_TYPE_SSVM) {
|
||||||
|
return "ALERT.SERVICE.SSVM";
|
||||||
|
} else if (alertType == ALERT_TYPE_USAGE_SERVER_RESULT) {
|
||||||
|
return "ALERT.USAGE.RESULT";
|
||||||
|
} else if (alertType == ALERT_TYPE_STORAGE_DELETE) {
|
||||||
|
return "ALERT.STORAGE.DELETE";
|
||||||
|
} else if (alertType == ALERT_TYPE_UPDATE_RESOURCE_COUNT) {
|
||||||
|
return "ALERT.RESOURCE.COUNT";
|
||||||
|
} else if (alertType == ALERT_TYPE_USAGE_SANITY_RESULT) {
|
||||||
|
return "ALERT.USAGE.SANITY";
|
||||||
|
} else if (alertType == ALERT_TYPE_DIRECT_ATTACHED_PUBLIC_IP) {
|
||||||
|
return "ALERT.NETWORK.DIRECTPUBLICIP";
|
||||||
|
} else if (alertType == ALERT_TYPE_LOCAL_STORAGE) {
|
||||||
|
return "ALERT.STORAGE.LOCAL";
|
||||||
|
} else if (alertType == ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED) {
|
||||||
|
return "ALERT.RESOURCE.EXCEED";
|
||||||
|
}
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
|
||||||
@Override @DB
|
@Override @DB
|
||||||
public void recalculateCapacity() {
|
public void recalculateCapacity() {
|
||||||
// FIXME: the right way to do this is to register a listener (see RouterStatsListener, VMSyncListener)
|
// FIXME: the right way to do this is to register a listener (see RouterStatsListener, VMSyncListener)
|
||||||
|
|||||||
@ -83,6 +83,8 @@ import com.cloud.api.query.vo.StoragePoolJoinVO;
|
|||||||
import com.cloud.api.query.vo.UserAccountJoinVO;
|
import com.cloud.api.query.vo.UserAccountJoinVO;
|
||||||
import com.cloud.api.query.vo.UserVmJoinVO;
|
import com.cloud.api.query.vo.UserVmJoinVO;
|
||||||
import com.cloud.api.query.vo.VolumeJoinVO;
|
import com.cloud.api.query.vo.VolumeJoinVO;
|
||||||
|
import com.cloud.api.query.dao.*;
|
||||||
|
import com.cloud.api.query.vo.*;
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
import com.cloud.async.AsyncJobManager;
|
import com.cloud.async.AsyncJobManager;
|
||||||
import com.cloud.async.AsyncJobVO;
|
import com.cloud.async.AsyncJobVO;
|
||||||
@ -94,18 +96,8 @@ import com.cloud.configuration.Config;
|
|||||||
import com.cloud.configuration.ConfigurationService;
|
import com.cloud.configuration.ConfigurationService;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.dc.AccountVlanMapVO;
|
import com.cloud.dc.*;
|
||||||
import com.cloud.dc.ClusterVO;
|
import com.cloud.dc.dao.*;
|
||||||
import com.cloud.dc.DataCenter;
|
|
||||||
import com.cloud.dc.DataCenterVO;
|
|
||||||
import com.cloud.dc.HostPodVO;
|
|
||||||
import com.cloud.dc.Vlan;
|
|
||||||
import com.cloud.dc.VlanVO;
|
|
||||||
import com.cloud.dc.dao.AccountVlanMapDao;
|
|
||||||
import com.cloud.dc.dao.ClusterDao;
|
|
||||||
import com.cloud.dc.dao.DataCenterDao;
|
|
||||||
import com.cloud.dc.dao.HostPodDao;
|
|
||||||
import com.cloud.dc.dao.VlanDao;
|
|
||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.Event;
|
import com.cloud.event.Event;
|
||||||
@ -164,17 +156,17 @@ import com.cloud.network.dao.Site2SiteCustomerGatewayDao;
|
|||||||
import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
|
import com.cloud.network.dao.Site2SiteCustomerGatewayVO;
|
||||||
import com.cloud.network.dao.Site2SiteVpnGatewayDao;
|
import com.cloud.network.dao.Site2SiteVpnGatewayDao;
|
||||||
import com.cloud.network.dao.Site2SiteVpnGatewayVO;
|
import com.cloud.network.dao.Site2SiteVpnGatewayVO;
|
||||||
|
import com.cloud.network.*;
|
||||||
|
import com.cloud.network.as.*;
|
||||||
|
import com.cloud.network.as.dao.*;
|
||||||
|
import com.cloud.network.dao.*;
|
||||||
import com.cloud.network.router.VirtualRouter;
|
import com.cloud.network.router.VirtualRouter;
|
||||||
import com.cloud.network.rules.FirewallRuleVO;
|
import com.cloud.network.rules.FirewallRuleVO;
|
||||||
import com.cloud.network.security.SecurityGroup;
|
import com.cloud.network.security.SecurityGroup;
|
||||||
import com.cloud.network.security.SecurityGroupManager;
|
import com.cloud.network.security.SecurityGroupManager;
|
||||||
import com.cloud.network.security.SecurityGroupVO;
|
import com.cloud.network.security.SecurityGroupVO;
|
||||||
import com.cloud.network.security.dao.SecurityGroupDao;
|
import com.cloud.network.security.dao.SecurityGroupDao;
|
||||||
import com.cloud.network.vpc.StaticRouteVO;
|
import com.cloud.network.vpc.*;
|
||||||
import com.cloud.network.vpc.VpcGatewayVO;
|
|
||||||
import com.cloud.network.vpc.VpcManager;
|
|
||||||
import com.cloud.network.vpc.VpcOffering;
|
|
||||||
import com.cloud.network.vpc.VpcVO;
|
|
||||||
import com.cloud.network.vpc.dao.StaticRouteDao;
|
import com.cloud.network.vpc.dao.StaticRouteDao;
|
||||||
import com.cloud.network.vpc.dao.VpcDao;
|
import com.cloud.network.vpc.dao.VpcDao;
|
||||||
import com.cloud.network.vpc.dao.VpcGatewayDao;
|
import com.cloud.network.vpc.dao.VpcGatewayDao;
|
||||||
@ -189,57 +181,16 @@ import com.cloud.projects.ProjectAccount;
|
|||||||
import com.cloud.projects.ProjectInvitation;
|
import com.cloud.projects.ProjectInvitation;
|
||||||
import com.cloud.projects.ProjectService;
|
import com.cloud.projects.ProjectService;
|
||||||
import com.cloud.resource.ResourceManager;
|
import com.cloud.resource.ResourceManager;
|
||||||
import com.cloud.server.Criteria;
|
import com.cloud.server.*;
|
||||||
import com.cloud.server.ManagementServer;
|
|
||||||
import com.cloud.server.ResourceTag;
|
|
||||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||||
import com.cloud.server.StatsCollector;
|
|
||||||
import com.cloud.server.TaggedResourceService;
|
|
||||||
import com.cloud.service.ServiceOfferingVO;
|
import com.cloud.service.ServiceOfferingVO;
|
||||||
import com.cloud.service.dao.ServiceOfferingDao;
|
import com.cloud.service.dao.ServiceOfferingDao;
|
||||||
import com.cloud.storage.DiskOfferingVO;
|
import com.cloud.storage.*;
|
||||||
import com.cloud.storage.GuestOS;
|
|
||||||
import com.cloud.storage.GuestOSCategoryVO;
|
|
||||||
import com.cloud.storage.Snapshot;
|
|
||||||
import com.cloud.storage.SnapshotVO;
|
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
import com.cloud.storage.StorageManager;
|
|
||||||
import com.cloud.storage.StoragePool;
|
|
||||||
import com.cloud.storage.StoragePoolVO;
|
|
||||||
import com.cloud.storage.StorageStats;
|
|
||||||
import com.cloud.storage.UploadVO;
|
|
||||||
import com.cloud.storage.VMTemplateHostVO;
|
|
||||||
import com.cloud.storage.VMTemplateS3VO;
|
|
||||||
import com.cloud.storage.VMTemplateSwiftVO;
|
|
||||||
import com.cloud.storage.VMTemplateVO;
|
|
||||||
import com.cloud.storage.Volume;
|
|
||||||
import com.cloud.storage.Volume.Type;
|
import com.cloud.storage.Volume.Type;
|
||||||
import com.cloud.storage.VolumeHostVO;
|
import com.cloud.storage.dao.*;
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.dao.DiskOfferingDao;
|
|
||||||
import com.cloud.storage.dao.GuestOSCategoryDao;
|
|
||||||
import com.cloud.storage.dao.GuestOSDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotPolicyDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolDao;
|
|
||||||
import com.cloud.storage.dao.UploadDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDetailsDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateHostDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateS3Dao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateSwiftDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.dao.VolumeHostDao;
|
|
||||||
import com.cloud.storage.snapshot.SnapshotPolicy;
|
import com.cloud.storage.snapshot.SnapshotPolicy;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.*;
|
||||||
import com.cloud.user.AccountDetailsDao;
|
|
||||||
import com.cloud.user.AccountVO;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.user.SSHKeyPairVO;
|
|
||||||
import com.cloud.user.User;
|
|
||||||
import com.cloud.user.UserAccount;
|
|
||||||
import com.cloud.user.UserStatisticsVO;
|
|
||||||
import com.cloud.user.UserVO;
|
|
||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.user.dao.SSHKeyPairDao;
|
import com.cloud.user.dao.SSHKeyPairDao;
|
||||||
import com.cloud.user.dao.UserDao;
|
import com.cloud.user.dao.UserDao;
|
||||||
@ -801,7 +752,7 @@ public class ApiDBUtils {
|
|||||||
|
|
||||||
public static Snapshot findSnapshotById(long snapshotId) {
|
public static Snapshot findSnapshotById(long snapshotId) {
|
||||||
SnapshotVO snapshot = _snapshotDao.findById(snapshotId);
|
SnapshotVO snapshot = _snapshotDao.findById(snapshotId);
|
||||||
if (snapshot != null && snapshot.getRemoved() == null && snapshot.getStatus() == Snapshot.Status.BackedUp) {
|
if (snapshot != null && snapshot.getRemoved() == null && snapshot.getState() == Snapshot.State.BackedUp) {
|
||||||
return snapshot;
|
return snapshot;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@ -16,50 +16,8 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.api;
|
package com.cloud.api;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
|
||||||
import static java.util.Collections.singletonList;
|
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.StringTokenizer;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.api.BaseCmd;
|
|
||||||
import org.apache.cloudstack.api.ResponseGenerator;
|
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
|
|
||||||
import org.apache.cloudstack.acl.ControlledEntity;
|
|
||||||
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
|
|
||||||
import org.apache.cloudstack.api.ApiConstants.HostDetails;
|
|
||||||
import org.apache.cloudstack.api.ApiConstants.VMDetails;
|
|
||||||
import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
|
|
||||||
import org.apache.cloudstack.api.response.AccountResponse;
|
|
||||||
|
|
||||||
import com.cloud.api.query.ViewResponseHelper;
|
import com.cloud.api.query.ViewResponseHelper;
|
||||||
import com.cloud.api.query.vo.AccountJoinVO;
|
import com.cloud.api.query.vo.*;
|
||||||
import com.cloud.api.query.vo.AsyncJobJoinVO;
|
|
||||||
import com.cloud.api.query.vo.ControlledViewEntity;
|
|
||||||
import com.cloud.api.query.vo.DataCenterJoinVO;
|
|
||||||
import com.cloud.api.query.vo.DiskOfferingJoinVO;
|
|
||||||
import com.cloud.api.query.vo.DomainRouterJoinVO;
|
|
||||||
import com.cloud.api.query.vo.EventJoinVO;
|
|
||||||
import com.cloud.api.query.vo.HostJoinVO;
|
|
||||||
import com.cloud.api.query.vo.InstanceGroupJoinVO;
|
|
||||||
import com.cloud.api.query.vo.ProjectAccountJoinVO;
|
|
||||||
import com.cloud.api.query.vo.ProjectInvitationJoinVO;
|
|
||||||
import com.cloud.api.query.vo.ProjectJoinVO;
|
|
||||||
import com.cloud.api.query.vo.ResourceTagJoinVO;
|
|
||||||
import com.cloud.api.query.vo.SecurityGroupJoinVO;
|
|
||||||
import com.cloud.api.query.vo.ServiceOfferingJoinVO;
|
|
||||||
import com.cloud.api.query.vo.StoragePoolJoinVO;
|
|
||||||
import com.cloud.api.query.vo.UserAccountJoinVO;
|
|
||||||
import com.cloud.api.query.vo.UserVmJoinVO;
|
|
||||||
import com.cloud.api.query.vo.VolumeJoinVO;
|
|
||||||
import com.cloud.api.response.ApiResponseSerializer;
|
import com.cloud.api.response.ApiResponseSerializer;
|
||||||
import org.apache.cloudstack.api.response.AsyncJobResponse;
|
import org.apache.cloudstack.api.response.AsyncJobResponse;
|
||||||
import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
|
import org.apache.cloudstack.api.response.AutoScalePolicyResponse;
|
||||||
@ -145,15 +103,8 @@ import com.cloud.configuration.Configuration;
|
|||||||
import com.cloud.configuration.Resource.ResourceOwnerType;
|
import com.cloud.configuration.Resource.ResourceOwnerType;
|
||||||
import com.cloud.configuration.ResourceCount;
|
import com.cloud.configuration.ResourceCount;
|
||||||
import com.cloud.configuration.ResourceLimit;
|
import com.cloud.configuration.ResourceLimit;
|
||||||
import com.cloud.dc.ClusterVO;
|
import com.cloud.dc.*;
|
||||||
import com.cloud.dc.DataCenter;
|
|
||||||
import com.cloud.dc.DataCenterVO;
|
|
||||||
import com.cloud.dc.HostPodVO;
|
|
||||||
import com.cloud.dc.Pod;
|
|
||||||
import com.cloud.dc.StorageNetworkIpRange;
|
|
||||||
import com.cloud.dc.Vlan;
|
|
||||||
import com.cloud.dc.Vlan.VlanType;
|
import com.cloud.dc.Vlan.VlanType;
|
||||||
import com.cloud.dc.VlanVO;
|
|
||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
import com.cloud.event.Event;
|
import com.cloud.event.Event;
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
@ -186,12 +137,7 @@ import com.cloud.network.dao.IPAddressVO;
|
|||||||
import com.cloud.network.dao.NetworkVO;
|
import com.cloud.network.dao.NetworkVO;
|
||||||
import com.cloud.network.dao.PhysicalNetworkVO;
|
import com.cloud.network.dao.PhysicalNetworkVO;
|
||||||
import com.cloud.network.router.VirtualRouter;
|
import com.cloud.network.router.VirtualRouter;
|
||||||
import com.cloud.network.rules.FirewallRule;
|
import com.cloud.network.rules.*;
|
||||||
import com.cloud.network.rules.FirewallRuleVO;
|
|
||||||
import com.cloud.network.rules.LoadBalancer;
|
|
||||||
import com.cloud.network.rules.PortForwardingRule;
|
|
||||||
import com.cloud.network.rules.StaticNatRule;
|
|
||||||
import com.cloud.network.rules.StickinessPolicy;
|
|
||||||
import com.cloud.network.security.SecurityGroup;
|
import com.cloud.network.security.SecurityGroup;
|
||||||
import com.cloud.network.security.SecurityRule;
|
import com.cloud.network.security.SecurityRule;
|
||||||
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
import com.cloud.network.security.SecurityRule.SecurityRuleType;
|
||||||
@ -209,25 +155,11 @@ import com.cloud.projects.ProjectInvitation;
|
|||||||
import com.cloud.server.Criteria;
|
import com.cloud.server.Criteria;
|
||||||
import com.cloud.server.ResourceTag;
|
import com.cloud.server.ResourceTag;
|
||||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||||
import com.cloud.storage.GuestOS;
|
import com.cloud.storage.*;
|
||||||
import com.cloud.storage.GuestOSCategoryVO;
|
|
||||||
import com.cloud.storage.S3;
|
|
||||||
import com.cloud.storage.Snapshot;
|
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
import com.cloud.storage.Storage.StoragePoolType;
|
import com.cloud.storage.Storage.StoragePoolType;
|
||||||
import com.cloud.storage.Storage.TemplateType;
|
import com.cloud.storage.Storage.TemplateType;
|
||||||
import com.cloud.storage.StoragePool;
|
|
||||||
import com.cloud.storage.StoragePoolVO;
|
|
||||||
import com.cloud.storage.StorageStats;
|
|
||||||
import com.cloud.storage.Swift;
|
|
||||||
import com.cloud.storage.UploadVO;
|
|
||||||
import com.cloud.storage.VMTemplateHostVO;
|
|
||||||
import com.cloud.storage.VMTemplateS3VO;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||||
import com.cloud.storage.VMTemplateSwiftVO;
|
|
||||||
import com.cloud.storage.VMTemplateVO;
|
|
||||||
import com.cloud.storage.Volume;
|
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.snapshot.SnapshotPolicy;
|
import com.cloud.storage.snapshot.SnapshotPolicy;
|
||||||
import com.cloud.storage.snapshot.SnapshotSchedule;
|
import com.cloud.storage.snapshot.SnapshotSchedule;
|
||||||
import com.cloud.template.VirtualMachineTemplate;
|
import com.cloud.template.VirtualMachineTemplate;
|
||||||
@ -244,6 +176,22 @@ import com.cloud.vm.InstanceGroup;
|
|||||||
import com.cloud.vm.NicProfile;
|
import com.cloud.vm.NicProfile;
|
||||||
import com.cloud.vm.VirtualMachine;
|
import com.cloud.vm.VirtualMachine;
|
||||||
import com.cloud.vm.VirtualMachine.Type;
|
import com.cloud.vm.VirtualMachine.Type;
|
||||||
|
import org.apache.cloudstack.acl.ControlledEntity;
|
||||||
|
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants.HostDetails;
|
||||||
|
import org.apache.cloudstack.api.ApiConstants.VMDetails;
|
||||||
|
import org.apache.cloudstack.api.BaseCmd;
|
||||||
|
import org.apache.cloudstack.api.ResponseGenerator;
|
||||||
|
import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
|
||||||
|
import org.apache.cloudstack.api.response.*;
|
||||||
|
import org.apache.cloudstack.region.Region;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static java.util.Collections.emptyList;
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class ApiResponseHelper implements ResponseGenerator {
|
public class ApiResponseHelper implements ResponseGenerator {
|
||||||
@ -381,7 +329,7 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
snapshotResponse.setCreated(snapshot.getCreated());
|
snapshotResponse.setCreated(snapshot.getCreated());
|
||||||
snapshotResponse.setName(snapshot.getName());
|
snapshotResponse.setName(snapshot.getName());
|
||||||
snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId()));
|
snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId()));
|
||||||
snapshotResponse.setState(snapshot.getStatus());
|
snapshotResponse.setState(snapshot.getState());
|
||||||
|
|
||||||
//set tag information
|
//set tag information
|
||||||
List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Snapshot, snapshot.getId());
|
List<? extends ResourceTag> tags = ApiDBUtils.listByResourceTypeAndId(TaggedResourceType.Snapshot, snapshot.getId());
|
||||||
@ -2741,6 +2689,16 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RegionResponse createRegionResponse(Region region) {
|
||||||
|
RegionResponse response = new RegionResponse();
|
||||||
|
response.setId(region.getId());
|
||||||
|
response.setName(region.getName());
|
||||||
|
response.setEndPoint(region.getEndPoint());
|
||||||
|
response.setObjectName("region");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) {
|
public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) {
|
||||||
ResourceTagJoinVO rto = ApiDBUtils.newResourceTagView(resourceTag);
|
ResourceTagJoinVO rto = ApiDBUtils.newResourceTagView(resourceTag);
|
||||||
@ -3120,8 +3078,6 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GuestOSResponse createGuestOSResponse(GuestOS guestOS) {
|
public GuestOSResponse createGuestOSResponse(GuestOS guestOS) {
|
||||||
GuestOSResponse response = new GuestOSResponse();
|
GuestOSResponse response = new GuestOSResponse();
|
||||||
@ -3160,5 +3116,4 @@ public class ApiResponseHelper implements ResponseGenerator {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -65,6 +65,10 @@ import org.apache.cloudstack.api.command.admin.host.ListHostsCmd;
|
|||||||
import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
|
import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
|
import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
|
import org.apache.cloudstack.api.command.admin.user.ListUsersCmd;
|
||||||
|
import com.cloud.event.ActionEventUtils;
|
||||||
|
import com.cloud.utils.ReflectUtil;
|
||||||
|
import org.apache.cloudstack.acl.APILimitChecker;
|
||||||
|
import org.apache.cloudstack.api.*;
|
||||||
import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
|
import org.apache.cloudstack.api.command.user.account.ListAccountsCmd;
|
||||||
import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
|
import org.apache.cloudstack.api.command.user.account.ListProjectAccountsCmd;
|
||||||
import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
|
import org.apache.cloudstack.api.command.user.event.ListEventsCmd;
|
||||||
@ -112,6 +116,8 @@ import org.springframework.stereotype.Component;
|
|||||||
import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
|
import org.apache.cloudstack.api.command.user.offering.ListDiskOfferingsCmd;
|
||||||
import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
|
import org.apache.cloudstack.api.command.user.offering.ListServiceOfferingsCmd;
|
||||||
import com.cloud.api.response.ApiResponseSerializer;
|
import com.cloud.api.response.ApiResponseSerializer;
|
||||||
|
import org.apache.cloudstack.region.RegionManager;
|
||||||
|
|
||||||
import com.cloud.async.AsyncCommandQueued;
|
import com.cloud.async.AsyncCommandQueued;
|
||||||
import com.cloud.async.AsyncJob;
|
import com.cloud.async.AsyncJob;
|
||||||
import com.cloud.async.AsyncJobManager;
|
import com.cloud.async.AsyncJobManager;
|
||||||
@ -121,7 +127,6 @@ import com.cloud.configuration.ConfigurationVO;
|
|||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.exception.AccountLimitException;
|
import com.cloud.exception.AccountLimitException;
|
||||||
import com.cloud.exception.CloudAuthenticationException;
|
import com.cloud.exception.CloudAuthenticationException;
|
||||||
import com.cloud.exception.InsufficientCapacityException;
|
import com.cloud.exception.InsufficientCapacityException;
|
||||||
@ -139,7 +144,6 @@ import com.cloud.user.UserContext;
|
|||||||
import com.cloud.user.UserVO;
|
import com.cloud.user.UserVO;
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
import com.cloud.utils.ReflectUtil;
|
|
||||||
import com.cloud.utils.StringUtils;
|
import com.cloud.utils.StringUtils;
|
||||||
import com.cloud.utils.component.ComponentContext;
|
import com.cloud.utils.component.ComponentContext;
|
||||||
import com.cloud.utils.component.PluggableService;
|
import com.cloud.utils.component.PluggableService;
|
||||||
@ -168,6 +172,8 @@ public class ApiServer implements HttpRequestHandler {
|
|||||||
|
|
||||||
private Account _systemAccount = null;
|
private Account _systemAccount = null;
|
||||||
private User _systemUser = null;
|
private User _systemUser = null;
|
||||||
|
@Inject private RegionManager _regionMgr = null;
|
||||||
|
|
||||||
private static int _workerCount = 0;
|
private static int _workerCount = 0;
|
||||||
private static ApiServer s_instance = null;
|
private static ApiServer s_instance = null;
|
||||||
private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
|
private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
|
||||||
@ -478,7 +484,7 @@ public class ApiServer implements HttpRequestHandler {
|
|||||||
asyncCmd.setStartEventId(startEventId);
|
asyncCmd.setStartEventId(startEventId);
|
||||||
|
|
||||||
// save the scheduled event
|
// save the scheduled event
|
||||||
Long eventId = EventUtils.saveScheduledEvent((callerUserId == null) ? User.UID_SYSTEM : callerUserId,
|
Long eventId = ActionEventUtils.onScheduledActionEvent((callerUserId == null) ? User.UID_SYSTEM : callerUserId,
|
||||||
asyncCmd.getEntityOwnerId(), asyncCmd.getEventType(), asyncCmd.getEventDescription(),
|
asyncCmd.getEntityOwnerId(), asyncCmd.getEventType(), asyncCmd.getEventDescription(),
|
||||||
startEventId);
|
startEventId);
|
||||||
if (startEventId == 0) {
|
if (startEventId == 0) {
|
||||||
|
|||||||
@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
|
|||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
import com.cloud.dc.DataCenterVO;
|
import com.cloud.dc.DataCenterVO;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
import com.cloud.exception.ResourceAllocationException;
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
@ -84,9 +84,9 @@ public class BareMetalTemplateAdapter extends TemplateAdapterBase implements Tem
|
|||||||
|
|
||||||
private void templateCreateUsage(VMTemplateVO template, HostVO host) {
|
private void templateCreateUsage(VMTemplateVO template, HostVO host) {
|
||||||
if (template.getAccountId() != Account.ACCOUNT_ID_SYSTEM) {
|
if (template.getAccountId() != Account.ACCOUNT_ID_SYSTEM) {
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_TEMPLATE_CREATE, template.getAccountId(), host.getDataCenterId(),
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_TEMPLATE_CREATE, template.getAccountId(), host.getDataCenterId(),
|
||||||
template.getId(), template.getName(), null, template.getSourceTemplateId(), 0L);
|
template.getId(), template.getName(), null, template.getSourceTemplateId(), 0L,
|
||||||
_usageEventDao.persist(usageEvent);
|
template.getClass().getName(), template.getUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,8 +174,8 @@ public class BareMetalTemplateAdapter extends TemplateAdapterBase implements Tem
|
|||||||
_tmpltZoneDao.remove(templateZone.getId());
|
_tmpltZoneDao.remove(templateZone.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
UsageEventVO usageEvent = new UsageEventVO(eventType, account.getId(), pxeServer.getDataCenterId(), templateId, null);
|
UsageEventUtils.publishUsageEvent(eventType, account.getId(), pxeServer.getDataCenterId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
templateId, null, template.getClass().getName(), template.getUuid());
|
||||||
} finally {
|
} finally {
|
||||||
if (lock != null) {
|
if (lock != null) {
|
||||||
_tmpltHostDao.releaseFromLockTable(lock.getId());
|
_tmpltHostDao.releaseFromLockTable(lock.getId());
|
||||||
|
|||||||
@ -40,8 +40,6 @@ import com.cloud.agent.api.baremetal.IpmISetBootDevCommand;
|
|||||||
import com.cloud.agent.api.baremetal.IpmiBootorResetCommand;
|
import com.cloud.agent.api.baremetal.IpmiBootorResetCommand;
|
||||||
import com.cloud.agent.manager.Commands;
|
import com.cloud.agent.manager.Commands;
|
||||||
import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
|
import org.apache.cloudstack.api.command.user.vm.StartVMCmd;
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import com.cloud.baremetal.PxeServerManager.PxeServerType;
|
import com.cloud.baremetal.PxeServerManager.PxeServerType;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
@ -52,14 +50,8 @@ import com.cloud.deploy.DataCenterDeployment;
|
|||||||
import com.cloud.deploy.DeployDestination;
|
import com.cloud.deploy.DeployDestination;
|
||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
import com.cloud.exception.*;
|
||||||
import com.cloud.exception.InsufficientCapacityException;
|
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
|
||||||
import com.cloud.exception.ResourceUnavailableException;
|
|
||||||
import com.cloud.exception.StorageUnavailableException;
|
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
@ -81,6 +73,7 @@ import com.cloud.user.AccountVO;
|
|||||||
import com.cloud.user.SSHKeyPair;
|
import com.cloud.user.SSHKeyPair;
|
||||||
import com.cloud.user.User;
|
import com.cloud.user.User;
|
||||||
import com.cloud.user.UserContext;
|
import com.cloud.user.UserContext;
|
||||||
|
import com.cloud.user.*;
|
||||||
import com.cloud.uservm.UserVm;
|
import com.cloud.uservm.UserVm;
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
@ -91,18 +84,10 @@ import com.cloud.utils.db.DB;
|
|||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.fsm.StateListener;
|
import com.cloud.utils.fsm.StateListener;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.vm.BareMetalVmService;
|
import com.cloud.vm.*;
|
||||||
import com.cloud.vm.NicProfile;
|
|
||||||
import com.cloud.vm.NicVO;
|
|
||||||
import com.cloud.vm.ReservationContext;
|
|
||||||
import com.cloud.vm.UserVmManagerImpl;
|
|
||||||
import com.cloud.vm.UserVmVO;
|
|
||||||
import com.cloud.vm.VirtualMachine;
|
|
||||||
import com.cloud.vm.VirtualMachine.Event;
|
import com.cloud.vm.VirtualMachine.Event;
|
||||||
import com.cloud.vm.VirtualMachine.State;
|
import com.cloud.vm.VirtualMachine.State;
|
||||||
import com.cloud.vm.VirtualMachine.Type;
|
import com.cloud.vm.VirtualMachine.Type;
|
||||||
import com.cloud.vm.VirtualMachineName;
|
|
||||||
import com.cloud.vm.VirtualMachineProfile;
|
|
||||||
import com.cloud.vm.VirtualMachineProfile.Param;
|
import com.cloud.vm.VirtualMachineProfile.Param;
|
||||||
|
|
||||||
@Local(value={BareMetalVmManager.class, BareMetalVmService.class})
|
@Local(value={BareMetalVmManager.class, BareMetalVmService.class})
|
||||||
@ -373,8 +358,9 @@ public class BareMetalVmManagerImpl extends UserVmManagerImpl implements BareMet
|
|||||||
s_logger.debug("Successfully allocated DB entry for " + vm);
|
s_logger.debug("Successfully allocated DB entry for " + vm);
|
||||||
}
|
}
|
||||||
UserContext.current().setEventDetails("Vm Id: " + vm.getId());
|
UserContext.current().setEventDetails("Vm Id: " + vm.getId());
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VM_CREATE, accountId, cmd.getZoneId(), vm.getId(), vm.getHostName(), offering.getId(), template.getId(), HypervisorType.BareMetal.toString());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, cmd.getZoneId(), vm.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
vm.getHostName(), offering.getId(), template.getId(), HypervisorType.BareMetal.toString(),
|
||||||
|
VirtualMachine.class.getName(), vm.getUuid());
|
||||||
|
|
||||||
_resourceLimitMgr.incrementResourceCount(accountId, ResourceType.user_vm);
|
_resourceLimitMgr.incrementResourceCount(accountId, ResourceType.user_vm);
|
||||||
|
|
||||||
|
|||||||
@ -16,18 +16,18 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.configuration;
|
package com.cloud.configuration;
|
||||||
|
|
||||||
import java.util.List;
|
import com.cloud.event.ActionEventUtils;
|
||||||
|
|
||||||
import com.cloud.event.ActionEventCallback;
|
|
||||||
import com.cloud.utils.component.AnnotationInterceptor;
|
import com.cloud.utils.component.AnnotationInterceptor;
|
||||||
import com.cloud.utils.component.InterceptorLibrary;
|
import com.cloud.utils.component.InterceptorLibrary;
|
||||||
import com.cloud.utils.db.DatabaseCallback;
|
import com.cloud.utils.db.DatabaseCallback;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class DefaultInterceptorLibrary implements InterceptorLibrary {
|
public class DefaultInterceptorLibrary implements InterceptorLibrary {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addInterceptors(List<AnnotationInterceptor<?>> interceptors) {
|
public void addInterceptors(List<AnnotationInterceptor<?>> interceptors) {
|
||||||
interceptors.add(new DatabaseCallback());
|
interceptors.add(new DatabaseCallback());
|
||||||
interceptors.add(new ActionEventCallback());
|
interceptors.add(new ActionEventUtils.ActionEventCallback());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -75,15 +75,12 @@ public class DomainVO implements Domain {
|
|||||||
@Column(name="uuid")
|
@Column(name="uuid")
|
||||||
private String uuid;
|
private String uuid;
|
||||||
|
|
||||||
|
@Column(name="region_id")
|
||||||
|
private int regionId;
|
||||||
|
|
||||||
public DomainVO() {}
|
public DomainVO() {}
|
||||||
|
|
||||||
public DomainVO(long id, String name, long owner, Long parentId, String networkDomain) {
|
public DomainVO(String name, long owner, Long parentId, String networkDomain, int regionId) {
|
||||||
this(name, owner, parentId, networkDomain);
|
|
||||||
this.id = id;
|
|
||||||
this.uuid = UUID.randomUUID().toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public DomainVO(String name, long owner, Long parentId, String networkDomain) {
|
|
||||||
this.parent = parentId;
|
this.parent = parentId;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.accountId = owner;
|
this.accountId = owner;
|
||||||
@ -92,6 +89,19 @@ public class DomainVO implements Domain {
|
|||||||
this.state = Domain.State.Active;
|
this.state = Domain.State.Active;
|
||||||
this.networkDomain = networkDomain;
|
this.networkDomain = networkDomain;
|
||||||
this.uuid = UUID.randomUUID().toString();
|
this.uuid = UUID.randomUUID().toString();
|
||||||
|
this.regionId = regionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DomainVO(String name, long owner, Long parentId, String networkDomain, String uuid, int regionId) {
|
||||||
|
this.parent = parentId;
|
||||||
|
this.name = name;
|
||||||
|
this.accountId = owner;
|
||||||
|
this.path ="";
|
||||||
|
this.level = 0;
|
||||||
|
this.state = Domain.State.Active;
|
||||||
|
this.networkDomain = networkDomain;
|
||||||
|
this.uuid = uuid;
|
||||||
|
this.regionId = regionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -205,5 +215,13 @@ public class DomainVO implements Domain {
|
|||||||
public void setUuid(String uuid) {
|
public void setUuid(String uuid) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getRegionId() {
|
||||||
|
return regionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegionId(int regionId) {
|
||||||
|
this.regionId = regionId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -32,7 +32,6 @@ import com.cloud.domain.Domain;
|
|||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.db.GenericDaoBase;
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
import com.cloud.utils.db.GlobalLock;
|
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
import com.cloud.utils.db.Transaction;
|
import com.cloud.utils.db.Transaction;
|
||||||
@ -272,4 +271,5 @@ public class DomainDaoImpl extends GenericDaoBase<DomainVO, Long> implements Dom
|
|||||||
|
|
||||||
return parentDomains;
|
return parentDomains;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,135 +0,0 @@
|
|||||||
// Licensed to the Apache Software Foundation (ASF) under one
|
|
||||||
// or more contributor license agreements. See the NOTICE file
|
|
||||||
// distributed with this work for additional information
|
|
||||||
// regarding copyright ownership. The ASF licenses this file
|
|
||||||
// to you under the Apache License, Version 2.0 (the
|
|
||||||
// "License"); you may not use this file except in compliance
|
|
||||||
// with the License. You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing,
|
|
||||||
// software distributed under the License is distributed on an
|
|
||||||
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
||||||
// KIND, either express or implied. See the License for the
|
|
||||||
// specific language governing permissions and limitations
|
|
||||||
// under the License.
|
|
||||||
package com.cloud.event;
|
|
||||||
|
|
||||||
import java.lang.reflect.AnnotatedElement;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import net.sf.cglib.proxy.Callback;
|
|
||||||
import net.sf.cglib.proxy.MethodInterceptor;
|
|
||||||
import net.sf.cglib.proxy.MethodProxy;
|
|
||||||
|
|
||||||
import com.cloud.user.UserContext;
|
|
||||||
import com.cloud.utils.component.AnnotationInterceptor;
|
|
||||||
|
|
||||||
public class ActionEventCallback implements MethodInterceptor, AnnotationInterceptor<EventVO> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
|
|
||||||
EventVO event = interceptStart(method);
|
|
||||||
boolean success = true;
|
|
||||||
try {
|
|
||||||
return methodProxy.invokeSuper(object, args);
|
|
||||||
} catch (Exception e){
|
|
||||||
success = false;
|
|
||||||
interceptException(method, event);
|
|
||||||
throw e;
|
|
||||||
} finally {
|
|
||||||
if(success){
|
|
||||||
interceptComplete(method, event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean needToIntercept(AnnotatedElement element) {
|
|
||||||
if (!(element instanceof Method)) {
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
Method method = (Method)element;
|
|
||||||
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
|
||||||
if (actionEvent != null) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public EventVO interceptStart(AnnotatedElement element) {
|
|
||||||
EventVO event = null;
|
|
||||||
Method method = (Method)element;
|
|
||||||
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
|
||||||
if (actionEvent != null) {
|
|
||||||
boolean async = actionEvent.async();
|
|
||||||
if(async){
|
|
||||||
UserContext ctx = UserContext.current();
|
|
||||||
long userId = ctx.getCallerUserId();
|
|
||||||
long accountId = ctx.getAccountId();
|
|
||||||
long startEventId = ctx.getStartEventId();
|
|
||||||
String eventDescription = actionEvent.eventDescription();
|
|
||||||
if(ctx.getEventDetails() != null){
|
|
||||||
eventDescription += ". "+ctx.getEventDetails();
|
|
||||||
}
|
|
||||||
EventUtils.saveStartedEvent(userId, accountId, actionEvent.eventType(), eventDescription, startEventId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void interceptComplete(AnnotatedElement element, EventVO event) {
|
|
||||||
Method method = (Method)element;
|
|
||||||
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
|
||||||
if (actionEvent != null) {
|
|
||||||
UserContext ctx = UserContext.current();
|
|
||||||
long userId = ctx.getCallerUserId();
|
|
||||||
long accountId = ctx.getAccountId();
|
|
||||||
long startEventId = ctx.getStartEventId();
|
|
||||||
String eventDescription = actionEvent.eventDescription();
|
|
||||||
if(ctx.getEventDetails() != null){
|
|
||||||
eventDescription += ". "+ctx.getEventDetails();
|
|
||||||
}
|
|
||||||
if(actionEvent.create()){
|
|
||||||
//This start event has to be used for subsequent events of this action
|
|
||||||
startEventId = EventUtils.saveCreatedEvent(userId, accountId, EventVO.LEVEL_INFO, actionEvent.eventType(), "Successfully created entity for "+eventDescription);
|
|
||||||
ctx.setStartEventId(startEventId);
|
|
||||||
} else {
|
|
||||||
EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_INFO, actionEvent.eventType(), "Successfully completed "+eventDescription, startEventId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void interceptException(AnnotatedElement element, EventVO event) {
|
|
||||||
Method method = (Method)element;
|
|
||||||
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
|
||||||
if (actionEvent != null) {
|
|
||||||
UserContext ctx = UserContext.current();
|
|
||||||
long userId = ctx.getCallerUserId();
|
|
||||||
long accountId = ctx.getAccountId();
|
|
||||||
long startEventId = ctx.getStartEventId();
|
|
||||||
String eventDescription = actionEvent.eventDescription();
|
|
||||||
if(ctx.getEventDetails() != null){
|
|
||||||
eventDescription += ". "+ctx.getEventDetails();
|
|
||||||
}
|
|
||||||
if(actionEvent.create()){
|
|
||||||
long eventId = EventUtils.saveCreatedEvent(userId, accountId, EventVO.LEVEL_ERROR, actionEvent.eventType(), "Error while creating entity for "+eventDescription);
|
|
||||||
ctx.setStartEventId(eventId);
|
|
||||||
} else {
|
|
||||||
EventUtils.saveEvent(userId, accountId, EventVO.LEVEL_ERROR, actionEvent.eventType(), "Error while "+eventDescription, startEventId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Callback getCallback() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
296
server/src/com/cloud/event/ActionEventUtils.java
Executable file
296
server/src/com/cloud/event/ActionEventUtils.java
Executable file
@ -0,0 +1,296 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package com.cloud.event;
|
||||||
|
|
||||||
|
import com.cloud.event.dao.EventDao;
|
||||||
|
import com.cloud.server.ManagementServer;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.user.AccountVO;
|
||||||
|
import com.cloud.user.User;
|
||||||
|
import com.cloud.user.UserContext;
|
||||||
|
import com.cloud.user.dao.AccountDao;
|
||||||
|
import com.cloud.user.dao.UserDao;
|
||||||
|
import com.cloud.utils.component.AnnotationInterceptor;
|
||||||
|
import net.sf.cglib.proxy.Callback;
|
||||||
|
import net.sf.cglib.proxy.MethodInterceptor;
|
||||||
|
import net.sf.cglib.proxy.MethodProxy;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBus;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBusException;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.lang.reflect.AnnotatedElement;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ActionEventUtils {
|
||||||
|
private static final Logger s_logger = Logger.getLogger(ActionEventUtils.class);
|
||||||
|
|
||||||
|
private static EventDao _eventDao;
|
||||||
|
private static AccountDao _accountDao;
|
||||||
|
protected static UserDao _userDao;
|
||||||
|
|
||||||
|
// get the event bus provider if configured
|
||||||
|
protected static EventBus _eventBus;
|
||||||
|
|
||||||
|
@Inject EventDao eventDao;
|
||||||
|
@Inject AccountDao accountDao;
|
||||||
|
@Inject UserDao userDao;
|
||||||
|
|
||||||
|
public ActionEventUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
void init() {
|
||||||
|
_eventDao = eventDao;
|
||||||
|
_accountDao = accountDao;
|
||||||
|
_userDao = userDao;
|
||||||
|
|
||||||
|
// TODO we will do injection of event bus later
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long onActionEvent(Long userId, Long accountId, Long domainId, String type, String description) {
|
||||||
|
|
||||||
|
publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(),
|
||||||
|
type, com.cloud.event.Event.State.Completed);
|
||||||
|
|
||||||
|
Event event = persistActionEvent(userId, accountId, domainId, null, type, Event.State.Completed,
|
||||||
|
description, null);
|
||||||
|
|
||||||
|
return event.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Save event after scheduling an async job
|
||||||
|
*/
|
||||||
|
public static Long onScheduledActionEvent(Long userId, Long accountId, String type, String description,
|
||||||
|
long startEventId) {
|
||||||
|
|
||||||
|
publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type,
|
||||||
|
com.cloud.event.Event.State.Scheduled);
|
||||||
|
|
||||||
|
Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Scheduled,
|
||||||
|
description, startEventId);
|
||||||
|
|
||||||
|
return event.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Save event after starting execution of an async job
|
||||||
|
*/
|
||||||
|
public static Long onStartedActionEvent(Long userId, Long accountId, String type, String description,
|
||||||
|
long startEventId) {
|
||||||
|
|
||||||
|
publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type,
|
||||||
|
com.cloud.event.Event.State.Started);
|
||||||
|
|
||||||
|
Event event = persistActionEvent(userId, accountId, null, null, type, Event.State.Started,
|
||||||
|
description, startEventId);
|
||||||
|
return event.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long onCompletedActionEvent(Long userId, Long accountId, String level, String type,
|
||||||
|
String description, long startEventId) {
|
||||||
|
|
||||||
|
publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type,
|
||||||
|
com.cloud.event.Event.State.Completed);
|
||||||
|
|
||||||
|
Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Completed,
|
||||||
|
description, startEventId);
|
||||||
|
|
||||||
|
return event.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Long onCreatedActionEvent(Long userId, Long accountId, String level, String type, String description) {
|
||||||
|
|
||||||
|
publishOnEventBus(userId, accountId, EventCategory.ACTION_EVENT.getName(), type,
|
||||||
|
com.cloud.event.Event.State.Created);
|
||||||
|
|
||||||
|
Event event = persistActionEvent(userId, accountId, null, level, type, Event.State.Created, description, null);
|
||||||
|
|
||||||
|
return event.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Event persistActionEvent(Long userId, Long accountId, Long domainId, String level, String type,
|
||||||
|
Event.State state, String description, Long startEventId) {
|
||||||
|
EventVO event = new EventVO();
|
||||||
|
event.setUserId(userId);
|
||||||
|
event.setAccountId(accountId);
|
||||||
|
event.setType(type);
|
||||||
|
event.setState(state);
|
||||||
|
event.setDescription(description);
|
||||||
|
if (domainId != null) {
|
||||||
|
event.setDomainId(domainId);
|
||||||
|
} else {
|
||||||
|
event.setDomainId(getDomainId(accountId));
|
||||||
|
}
|
||||||
|
if (level != null && !level.isEmpty()) {
|
||||||
|
event.setLevel(level);
|
||||||
|
}
|
||||||
|
if (startEventId != null) {
|
||||||
|
event.setStartId(startEventId);
|
||||||
|
}
|
||||||
|
event = _eventDao.persist(event);
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void publishOnEventBus(long userId, long accountId, String eventCategory,
|
||||||
|
String eventType, Event.State state) {
|
||||||
|
if (_eventBus == null) {
|
||||||
|
return; // no provider is configured to provide events bus, so just return
|
||||||
|
}
|
||||||
|
|
||||||
|
org.apache.cloudstack.framework.events.Event event = new org.apache.cloudstack.framework.events.Event(
|
||||||
|
ManagementServer.Name,
|
||||||
|
eventCategory,
|
||||||
|
eventType,
|
||||||
|
EventTypes.getEntityForEvent(eventType), null);
|
||||||
|
|
||||||
|
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||||
|
Account account = _accountDao.findById(accountId);
|
||||||
|
User user = _userDao.findById(userId);
|
||||||
|
eventDescription.put("user", user.getUuid());
|
||||||
|
eventDescription.put("account", account.getUuid());
|
||||||
|
eventDescription.put("event", eventType);
|
||||||
|
eventDescription.put("status", state.toString());
|
||||||
|
event.setDescription(eventDescription);
|
||||||
|
|
||||||
|
try {
|
||||||
|
_eventBus.publish(event);
|
||||||
|
} catch (EventBusException e) {
|
||||||
|
s_logger.warn("Failed to publish action event on the the event bus.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long getDomainId(long accountId){
|
||||||
|
AccountVO account = _accountDao.findByIdIncludingRemoved(accountId);
|
||||||
|
return account.getDomainId();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ActionEventCallback implements MethodInterceptor, AnnotationInterceptor<EventVO> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
|
||||||
|
EventVO event = interceptStart(method);
|
||||||
|
boolean success = true;
|
||||||
|
try {
|
||||||
|
return methodProxy.invokeSuper(object, args);
|
||||||
|
} catch (Exception e){
|
||||||
|
success = false;
|
||||||
|
interceptException(method, event);
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
if(success){
|
||||||
|
interceptComplete(method, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needToIntercept(AnnotatedElement element) {
|
||||||
|
if (!(element instanceof Method)) {
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
Method method = (Method)element;
|
||||||
|
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
||||||
|
if (actionEvent != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EventVO interceptStart(AnnotatedElement element) {
|
||||||
|
EventVO event = null;
|
||||||
|
Method method = (Method)element;
|
||||||
|
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
||||||
|
if (actionEvent != null) {
|
||||||
|
boolean async = actionEvent.async();
|
||||||
|
if(async){
|
||||||
|
UserContext ctx = UserContext.current();
|
||||||
|
long userId = ctx.getCallerUserId();
|
||||||
|
long accountId = ctx.getAccountId();
|
||||||
|
long startEventId = ctx.getStartEventId();
|
||||||
|
String eventDescription = actionEvent.eventDescription();
|
||||||
|
if(ctx.getEventDetails() != null){
|
||||||
|
eventDescription += ". "+ctx.getEventDetails();
|
||||||
|
}
|
||||||
|
ActionEventUtils.onStartedActionEvent(userId, accountId, actionEvent.eventType(), eventDescription, startEventId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return event;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void interceptComplete(AnnotatedElement element, EventVO event) {
|
||||||
|
Method method = (Method)element;
|
||||||
|
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
||||||
|
if (actionEvent != null) {
|
||||||
|
UserContext ctx = UserContext.current();
|
||||||
|
long userId = ctx.getCallerUserId();
|
||||||
|
long accountId = ctx.getAccountId();
|
||||||
|
long startEventId = ctx.getStartEventId();
|
||||||
|
String eventDescription = actionEvent.eventDescription();
|
||||||
|
if(ctx.getEventDetails() != null){
|
||||||
|
eventDescription += ". "+ctx.getEventDetails();
|
||||||
|
}
|
||||||
|
if(actionEvent.create()){
|
||||||
|
//This start event has to be used for subsequent events of this action
|
||||||
|
startEventId = ActionEventUtils.onCreatedActionEvent(userId, accountId, EventVO.LEVEL_INFO, actionEvent.eventType(), "Successfully created entity for " + eventDescription);
|
||||||
|
ctx.setStartEventId(startEventId);
|
||||||
|
} else {
|
||||||
|
ActionEventUtils.onCompletedActionEvent(userId, accountId, EventVO.LEVEL_INFO, actionEvent.eventType(), "Successfully completed " + eventDescription, startEventId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void interceptException(AnnotatedElement element, EventVO event) {
|
||||||
|
Method method = (Method)element;
|
||||||
|
ActionEvent actionEvent = method.getAnnotation(ActionEvent.class);
|
||||||
|
if (actionEvent != null) {
|
||||||
|
UserContext ctx = UserContext.current();
|
||||||
|
long userId = ctx.getCallerUserId();
|
||||||
|
long accountId = ctx.getAccountId();
|
||||||
|
long startEventId = ctx.getStartEventId();
|
||||||
|
String eventDescription = actionEvent.eventDescription();
|
||||||
|
if(ctx.getEventDetails() != null){
|
||||||
|
eventDescription += ". "+ctx.getEventDetails();
|
||||||
|
}
|
||||||
|
if(actionEvent.create()){
|
||||||
|
long eventId = ActionEventUtils.onCreatedActionEvent(userId, accountId, EventVO.LEVEL_ERROR, actionEvent.eventType(), "Error while creating entity for " + eventDescription);
|
||||||
|
ctx.setStartEventId(eventId);
|
||||||
|
} else {
|
||||||
|
ActionEventUtils.onCompletedActionEvent(userId, accountId, EventVO.LEVEL_ERROR, actionEvent.eventType(), "Error while " + eventDescription, startEventId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Callback getCallback() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
93
server/src/com/cloud/event/AlertGenerator.java
Normal file
93
server/src/com/cloud/event/AlertGenerator.java
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package com.cloud.event;
|
||||||
|
|
||||||
|
import com.cloud.dc.DataCenterVO;
|
||||||
|
import com.cloud.dc.HostPodVO;
|
||||||
|
import com.cloud.dc.dao.DataCenterDao;
|
||||||
|
import com.cloud.dc.dao.HostPodDao;
|
||||||
|
import com.cloud.server.ManagementServer;
|
||||||
|
import org.apache.cloudstack.framework.events.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class AlertGenerator {
|
||||||
|
|
||||||
|
private static final Logger s_logger = Logger.getLogger(AlertGenerator.class);
|
||||||
|
private static DataCenterDao _dcDao;
|
||||||
|
private static HostPodDao _podDao;
|
||||||
|
|
||||||
|
// get the event bus provider if configured
|
||||||
|
protected static EventBus _eventBus = null;
|
||||||
|
|
||||||
|
@Inject DataCenterDao dcDao;
|
||||||
|
@Inject HostPodDao podDao;
|
||||||
|
|
||||||
|
public AlertGenerator() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
void init() {
|
||||||
|
_dcDao = dcDao;
|
||||||
|
_podDao = podDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void publishAlertOnEventBus(String alertType, long dataCenterId, Long podId, String subject, String body) {
|
||||||
|
if (_eventBus == null) {
|
||||||
|
return; // no provider is configured to provider events bus, so just return
|
||||||
|
}
|
||||||
|
|
||||||
|
org.apache.cloudstack.framework.events.Event event =
|
||||||
|
new org.apache.cloudstack.framework.events.Event(ManagementServer.Name,
|
||||||
|
EventCategory.ALERT_EVENT.getName(),
|
||||||
|
alertType,
|
||||||
|
null,
|
||||||
|
null);
|
||||||
|
|
||||||
|
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||||
|
DataCenterVO dc = _dcDao.findById(dataCenterId);
|
||||||
|
HostPodVO pod = _podDao.findById(podId);
|
||||||
|
|
||||||
|
eventDescription.put("event", alertType);
|
||||||
|
if (dc != null) {
|
||||||
|
eventDescription.put("dataCenterId", dc.getUuid());
|
||||||
|
} else {
|
||||||
|
eventDescription.put("dataCenterId", null);
|
||||||
|
}
|
||||||
|
if (pod != null) {
|
||||||
|
eventDescription.put("podId", pod.getUuid());
|
||||||
|
} else {
|
||||||
|
eventDescription.put("podId", null);
|
||||||
|
}
|
||||||
|
event.setDescription(eventDescription);
|
||||||
|
|
||||||
|
try {
|
||||||
|
_eventBus.publish(event);
|
||||||
|
} catch (EventBusException e) {
|
||||||
|
s_logger.warn("Failed to publish alert on the the event bus.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
143
server/src/com/cloud/event/UsageEventUtils.java
Normal file
143
server/src/com/cloud/event/UsageEventUtils.java
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package com.cloud.event;
|
||||||
|
|
||||||
|
import com.cloud.dc.DataCenterVO;
|
||||||
|
import com.cloud.dc.dao.DataCenterDao;
|
||||||
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
|
import com.cloud.server.ManagementServer;
|
||||||
|
import com.cloud.user.Account;
|
||||||
|
import com.cloud.user.dao.AccountDao;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBus;
|
||||||
|
import org.apache.cloudstack.framework.events.Event;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBusException;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class UsageEventUtils {
|
||||||
|
|
||||||
|
private static UsageEventDao _usageEventDao;
|
||||||
|
private static AccountDao _accountDao;
|
||||||
|
private static DataCenterDao _dcDao;
|
||||||
|
private static final Logger s_logger = Logger.getLogger(UsageEventUtils.class);
|
||||||
|
|
||||||
|
// get the event bus provider if configured
|
||||||
|
protected static EventBus _eventBus;
|
||||||
|
|
||||||
|
@Inject UsageEventDao usageEventDao;
|
||||||
|
@Inject AccountDao accountDao;
|
||||||
|
@Inject DataCenterDao dcDao;
|
||||||
|
|
||||||
|
public UsageEventUtils() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
void init() {
|
||||||
|
_usageEventDao = usageEventDao;
|
||||||
|
_accountDao = accountDao;
|
||||||
|
_dcDao = dcDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void publishUsageEvent(String usageType, long accountId, long zoneId,
|
||||||
|
long resourceId, String resourceName,
|
||||||
|
Long offeringId, Long templateId, Long size,
|
||||||
|
String entityType, String entityUUID) {
|
||||||
|
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, size);
|
||||||
|
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId,
|
||||||
|
String resourceName, String entityType, String entityUUID) {
|
||||||
|
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName);
|
||||||
|
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void publishUsageEvent(String usageType, long accountId, long zoneId,
|
||||||
|
long ipAddressId, String ipAddress, boolean isSourceNat,
|
||||||
|
String guestType, boolean isSystem, String entityType, String entityUUID) {
|
||||||
|
saveUsageEvent(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem);
|
||||||
|
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void publishUsageEvent(String usageType, long accountId, long zoneId, long resourceId,
|
||||||
|
String resourceName, Long offeringId, Long templateId, String resourceType,
|
||||||
|
String entityType, String entityUUID) {
|
||||||
|
saveUsageEvent(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, resourceType);
|
||||||
|
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void publishUsageEvent(String usageType, long accountId,long zoneId, long vmId,
|
||||||
|
long securityGroupId, String entityType, String entityUUID) {
|
||||||
|
saveUsageEvent(usageType, accountId, zoneId, vmId, securityGroupId);
|
||||||
|
publishUsageEvent(usageType, accountId, zoneId, entityType, entityUUID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId, Long size) {
|
||||||
|
_usageEventDao.persist( new UsageEventVO(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, size));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName) {
|
||||||
|
_usageEventDao.persist( new UsageEventVO(usageType, accountId, zoneId, resourceId, resourceName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveUsageEvent(String usageType, long accountId, long zoneId, long ipAddressId, String ipAddress, boolean isSourceNat, String guestType, boolean isSystem) {
|
||||||
|
_usageEventDao.persist( new UsageEventVO(usageType, accountId, zoneId, ipAddressId, ipAddress, isSourceNat, guestType, isSystem));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveUsageEvent(String usageType, long accountId, long zoneId, long resourceId, String resourceName, Long offeringId, Long templateId, String resourceType) {
|
||||||
|
_usageEventDao.persist( new UsageEventVO(usageType, accountId, zoneId, resourceId, resourceName, offeringId, templateId, resourceType));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveUsageEvent(String usageType, long accountId,long zoneId, long vmId, long securityGroupId) {
|
||||||
|
_usageEventDao.persist( new UsageEventVO( usageType, accountId, zoneId, vmId, securityGroupId));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void publishUsageEvent(String usageEventType, Long accountId, Long zoneId, String resourceType, String resourceUUID) {
|
||||||
|
|
||||||
|
if (_eventBus == null) {
|
||||||
|
return; // no provider is configured to provider events bus, so just return
|
||||||
|
}
|
||||||
|
|
||||||
|
Account account = _accountDao.findById(accountId);
|
||||||
|
DataCenterVO dc = _dcDao.findById(zoneId);
|
||||||
|
|
||||||
|
Event event = new Event(ManagementServer.Name, EventCategory.USAGE_EVENT.getName(), usageEventType,
|
||||||
|
resourceType, resourceUUID);
|
||||||
|
|
||||||
|
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||||
|
eventDescription.put("account", account.getUuid());
|
||||||
|
eventDescription.put("zone", dc.getUuid());
|
||||||
|
eventDescription.put("event", usageEventType);
|
||||||
|
eventDescription.put("resource", resourceType);
|
||||||
|
eventDescription.put("id", resourceUUID);
|
||||||
|
event.setDescription(eventDescription);
|
||||||
|
|
||||||
|
try {
|
||||||
|
_eventBus.publish(event);
|
||||||
|
} catch (EventBusException e) {
|
||||||
|
s_logger.warn("Failed to publish usage event on the the event bus.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -43,14 +43,7 @@ import org.springframework.stereotype.Component;
|
|||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.Listener;
|
import com.cloud.agent.Listener;
|
||||||
import com.cloud.agent.api.AgentControlAnswer;
|
import com.cloud.agent.api.*;
|
||||||
import com.cloud.agent.api.AgentControlCommand;
|
|
||||||
import com.cloud.agent.api.Answer;
|
|
||||||
import com.cloud.agent.api.CheckNetworkAnswer;
|
|
||||||
import com.cloud.agent.api.CheckNetworkCommand;
|
|
||||||
import com.cloud.agent.api.Command;
|
|
||||||
import com.cloud.agent.api.StartupCommand;
|
|
||||||
import com.cloud.agent.api.StartupRoutingCommand;
|
|
||||||
import com.cloud.agent.api.to.NicTO;
|
import com.cloud.agent.api.to.NicTO;
|
||||||
import com.cloud.alert.AlertManager;
|
import com.cloud.alert.AlertManager;
|
||||||
import com.cloud.api.ApiDBUtils;
|
import com.cloud.api.ApiDBUtils;
|
||||||
@ -58,15 +51,9 @@ import com.cloud.configuration.Config;
|
|||||||
import com.cloud.configuration.ConfigurationManager;
|
import com.cloud.configuration.ConfigurationManager;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.dc.AccountVlanMapVO;
|
import com.cloud.dc.*;
|
||||||
import com.cloud.dc.DataCenter;
|
|
||||||
import com.cloud.dc.DataCenter.NetworkType;
|
import com.cloud.dc.DataCenter.NetworkType;
|
||||||
import com.cloud.dc.DataCenterVO;
|
|
||||||
import com.cloud.dc.Pod;
|
|
||||||
import com.cloud.dc.PodVlanMapVO;
|
|
||||||
import com.cloud.dc.Vlan;
|
|
||||||
import com.cloud.dc.Vlan.VlanType;
|
import com.cloud.dc.Vlan.VlanType;
|
||||||
import com.cloud.dc.VlanVO;
|
|
||||||
import com.cloud.dc.dao.AccountVlanMapDao;
|
import com.cloud.dc.dao.AccountVlanMapDao;
|
||||||
import com.cloud.dc.dao.DataCenterDao;
|
import com.cloud.dc.dao.DataCenterDao;
|
||||||
import com.cloud.dc.dao.PodVlanMapDao;
|
import com.cloud.dc.dao.PodVlanMapDao;
|
||||||
@ -77,29 +64,16 @@ import com.cloud.deploy.DeploymentPlan;
|
|||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.AccountLimitException;
|
import com.cloud.exception.*;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
|
||||||
import com.cloud.exception.ConnectionException;
|
|
||||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
|
||||||
import com.cloud.exception.InsufficientCapacityException;
|
|
||||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
|
||||||
import com.cloud.exception.ResourceUnavailableException;
|
|
||||||
import com.cloud.exception.UnsupportedServiceException;
|
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.host.Status;
|
import com.cloud.host.Status;
|
||||||
import com.cloud.host.dao.HostDao;
|
import com.cloud.host.dao.HostDao;
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
import com.cloud.network.IpAddress.State;
|
import com.cloud.network.IpAddress.State;
|
||||||
import com.cloud.network.Network.Capability;
|
import com.cloud.network.Network.*;
|
||||||
import com.cloud.network.Network.GuestType;
|
|
||||||
import com.cloud.network.Network.Provider;
|
|
||||||
import com.cloud.network.Network.Service;
|
|
||||||
import com.cloud.network.Networks.AddressFormat;
|
import com.cloud.network.Networks.AddressFormat;
|
||||||
import com.cloud.network.Networks.BroadcastDomainType;
|
import com.cloud.network.Networks.BroadcastDomainType;
|
||||||
import com.cloud.network.Networks.IsolationType;
|
import com.cloud.network.Networks.IsolationType;
|
||||||
@ -132,15 +106,8 @@ import com.cloud.network.lb.LoadBalancingRule;
|
|||||||
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
|
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
|
||||||
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
|
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
|
||||||
import com.cloud.network.lb.LoadBalancingRulesManager;
|
import com.cloud.network.lb.LoadBalancingRulesManager;
|
||||||
import com.cloud.network.rules.FirewallManager;
|
import com.cloud.network.rules.*;
|
||||||
import com.cloud.network.rules.FirewallRule;
|
|
||||||
import com.cloud.network.rules.FirewallRule.Purpose;
|
import com.cloud.network.rules.FirewallRule.Purpose;
|
||||||
import com.cloud.network.rules.FirewallRuleVO;
|
|
||||||
import com.cloud.network.rules.PortForwardingRuleVO;
|
|
||||||
import com.cloud.network.rules.RulesManager;
|
|
||||||
import com.cloud.network.rules.StaticNat;
|
|
||||||
import com.cloud.network.rules.StaticNatRule;
|
|
||||||
import com.cloud.network.rules.StaticNatRuleImpl;
|
|
||||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||||
import com.cloud.network.vpc.NetworkACLManager;
|
import com.cloud.network.vpc.NetworkACLManager;
|
||||||
import com.cloud.network.vpc.VpcManager;
|
import com.cloud.network.vpc.VpcManager;
|
||||||
@ -153,39 +120,23 @@ import com.cloud.offerings.NetworkOfferingVO;
|
|||||||
import com.cloud.offerings.dao.NetworkOfferingDao;
|
import com.cloud.offerings.dao.NetworkOfferingDao;
|
||||||
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
|
import com.cloud.offerings.dao.NetworkOfferingServiceMapDao;
|
||||||
import com.cloud.org.Grouping;
|
import com.cloud.org.Grouping;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.*;
|
||||||
import com.cloud.user.AccountManager;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.user.User;
|
|
||||||
import com.cloud.user.UserContext;
|
|
||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
import com.cloud.utils.component.AdapterBase;
|
import com.cloud.utils.component.AdapterBase;
|
||||||
import com.cloud.utils.component.Manager;
|
|
||||||
import com.cloud.utils.component.ManagerBase;
|
import com.cloud.utils.component.ManagerBase;
|
||||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.Filter;
|
|
||||||
import com.cloud.utils.db.JoinBuilder.JoinType;
|
import com.cloud.utils.db.JoinBuilder.JoinType;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import com.cloud.utils.fsm.NoTransitionException;
|
||||||
|
import com.cloud.utils.fsm.StateMachine2;
|
||||||
import com.cloud.utils.net.Ip;
|
import com.cloud.utils.net.Ip;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.vm.Nic;
|
import com.cloud.vm.*;
|
||||||
import com.cloud.vm.NicProfile;
|
|
||||||
import com.cloud.vm.NicVO;
|
|
||||||
import com.cloud.vm.ReservationContext;
|
|
||||||
import com.cloud.vm.ReservationContextImpl;
|
|
||||||
import com.cloud.vm.UserVmVO;
|
|
||||||
import com.cloud.vm.VMInstanceVO;
|
|
||||||
import com.cloud.vm.VirtualMachine;
|
|
||||||
import com.cloud.vm.VirtualMachine.Type;
|
import com.cloud.vm.VirtualMachine.Type;
|
||||||
import com.cloud.vm.VirtualMachineProfile;
|
|
||||||
import com.cloud.vm.VirtualMachineProfileImpl;
|
|
||||||
import com.cloud.vm.dao.NicDao;
|
import com.cloud.vm.dao.NicDao;
|
||||||
import com.cloud.vm.dao.UserVmDao;
|
import com.cloud.vm.dao.UserVmDao;
|
||||||
import com.cloud.vm.dao.VMInstanceDao;
|
import com.cloud.vm.dao.VMInstanceDao;
|
||||||
@ -231,8 +182,6 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
@Inject
|
@Inject
|
||||||
LoadBalancingRulesManager _lbMgr;
|
LoadBalancingRulesManager _lbMgr;
|
||||||
@Inject
|
@Inject
|
||||||
UsageEventDao _usageEventDao;
|
|
||||||
@Inject
|
|
||||||
RemoteAccessVpnService _vpnMgr;
|
RemoteAccessVpnService _vpnMgr;
|
||||||
@Inject
|
@Inject
|
||||||
PodVlanMapDao _podVlanMapDao;
|
PodVlanMapDao _podVlanMapDao;
|
||||||
@ -282,12 +231,18 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
@Inject
|
@Inject
|
||||||
NetworkACLManager _networkACLMgr;
|
NetworkACLManager _networkACLMgr;
|
||||||
@Inject
|
@Inject
|
||||||
|
UsageEventDao _usageEventDao;
|
||||||
|
@Inject
|
||||||
NetworkModel _networkModel;
|
NetworkModel _networkModel;
|
||||||
@Inject
|
@Inject
|
||||||
UserIpv6AddressDao _ipv6Dao;
|
UserIpv6AddressDao _ipv6Dao;
|
||||||
@Inject
|
@Inject
|
||||||
Ipv6AddressManager _ipv6Mgr;
|
Ipv6AddressManager _ipv6Mgr;
|
||||||
|
|
||||||
|
protected StateMachine2<Network.State, Network.Event, Network> _stateMachine;
|
||||||
|
private final HashMap<String, NetworkOfferingVO> _systemNetworks = new HashMap<String, NetworkOfferingVO>(5);
|
||||||
|
private static Long _privateOfferingId = null;
|
||||||
|
|
||||||
ScheduledExecutorService _executor;
|
ScheduledExecutorService _executor;
|
||||||
|
|
||||||
SearchBuilder<IPAddressVO> AssignIpAddressSearch;
|
SearchBuilder<IPAddressVO> AssignIpAddressSearch;
|
||||||
@ -419,11 +374,9 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
VlanVO vlan = _vlanDao.findById(addr.getVlanId());
|
VlanVO vlan = _vlanDao.findById(addr.getVlanId());
|
||||||
|
|
||||||
String guestType = vlan.getVlanType().toString();
|
String guestType = vlan.getVlanType().toString();
|
||||||
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(),
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_ASSIGN, owner.getId(),
|
|
||||||
addr.getDataCenterId(), addr.getId(), addr.getAddress().toString(), addr.isSourceNat(), guestType,
|
addr.getDataCenterId(), addr.getId(), addr.getAddress().toString(), addr.isSourceNat(), guestType,
|
||||||
addr.getSystem());
|
addr.getSystem(), addr.getClass().getName(), addr.getUuid());
|
||||||
_usageEventDao.persist(usageEvent);
|
|
||||||
// don't increment resource count for direct ip addresses
|
// don't increment resource count for direct ip addresses
|
||||||
if (addr.getAssociatedWithNetworkId() != null) {
|
if (addr.getAssociatedWithNetworkId() != null) {
|
||||||
_resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
|
_resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
|
||||||
@ -1058,6 +1011,8 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
|
|
||||||
_agentMgr.registerForHostEvents(this, true, false, true);
|
_agentMgr.registerForHostEvents(this, true, false, true);
|
||||||
|
|
||||||
|
Network.State.getStateMachine().registerListener(new NetworkStateListener(_usageEventDao, _networksDao));
|
||||||
|
|
||||||
s_logger.info("Network Manager is configured.");
|
s_logger.info("Network Manager is configured.");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1075,6 +1030,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected NetworkManagerImpl() {
|
protected NetworkManagerImpl() {
|
||||||
|
setStateMachine();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1434,9 +1390,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
|
NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId());
|
||||||
|
|
||||||
network.setReservationId(context.getReservationId());
|
network.setReservationId(context.getReservationId());
|
||||||
network.setState(Network.State.Implementing);
|
stateTransitTo(network, Event.ImplementNetwork);
|
||||||
|
|
||||||
_networksDao.update(networkId, network);
|
|
||||||
|
|
||||||
Network result = guru.implement(network, offering, dest, context);
|
Network result = guru.implement(network, offering, dest, context);
|
||||||
network.setCidr(result.getCidr());
|
network.setCidr(result.getCidr());
|
||||||
@ -1449,16 +1403,23 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
// implement network elements and re-apply all the network rules
|
// implement network elements and re-apply all the network rules
|
||||||
implementNetworkElementsAndResources(dest, context, network, offering);
|
implementNetworkElementsAndResources(dest, context, network, offering);
|
||||||
|
|
||||||
network.setState(Network.State.Implemented);
|
stateTransitTo(network,Event.OperationSucceeded);
|
||||||
|
|
||||||
network.setRestartRequired(false);
|
network.setRestartRequired(false);
|
||||||
_networksDao.update(network.getId(), network);
|
_networksDao.update(network.getId(), network);
|
||||||
implemented.set(guru, network);
|
implemented.set(guru, network);
|
||||||
return implemented;
|
return implemented;
|
||||||
|
} catch (NoTransitionException e) {
|
||||||
|
s_logger.error(e.getMessage());
|
||||||
|
return null;
|
||||||
} finally {
|
} finally {
|
||||||
if (implemented.first() == null) {
|
if (implemented.first() == null) {
|
||||||
s_logger.debug("Cleaning up because we're unable to implement the network " + network);
|
s_logger.debug("Cleaning up because we're unable to implement the network " + network);
|
||||||
network.setState(Network.State.Shutdown);
|
try {
|
||||||
_networksDao.update(networkId, network);
|
stateTransitTo(network,Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException e) {
|
||||||
|
s_logger.error(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
shutdownNetwork(networkId, context, false);
|
shutdownNetwork(networkId, context, false);
|
||||||
}
|
}
|
||||||
@ -2080,9 +2041,12 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
s_logger.debug("Network is not implemented: " + network);
|
s_logger.debug("Network is not implemented: " + network);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
stateTransitTo(network, Event.DestroyNetwork);
|
||||||
|
} catch (NoTransitionException e) {
|
||||||
network.setState(Network.State.Shutdown);
|
network.setState(Network.State.Shutdown);
|
||||||
_networksDao.update(network.getId(), network);
|
_networksDao.update(network.getId(), network);
|
||||||
|
}
|
||||||
|
|
||||||
boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network);
|
boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network);
|
||||||
|
|
||||||
@ -2097,15 +2061,22 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
guru.shutdown(profile, _networkOfferingDao.findById(network.getNetworkOfferingId()));
|
guru.shutdown(profile, _networkOfferingDao.findById(network.getNetworkOfferingId()));
|
||||||
|
|
||||||
applyProfileToNetwork(network, profile);
|
applyProfileToNetwork(network, profile);
|
||||||
|
try {
|
||||||
|
stateTransitTo(network, Event.OperationSucceeded);
|
||||||
|
} catch (NoTransitionException e) {
|
||||||
network.setState(Network.State.Allocated);
|
network.setState(Network.State.Allocated);
|
||||||
network.setRestartRequired(false);
|
network.setRestartRequired(false);
|
||||||
|
}
|
||||||
_networksDao.update(network.getId(), network);
|
_networksDao.update(network.getId(), network);
|
||||||
_networksDao.clearCheckForGc(networkId);
|
_networksDao.clearCheckForGc(networkId);
|
||||||
result = true;
|
result = true;
|
||||||
} else {
|
} else {
|
||||||
|
try {
|
||||||
|
stateTransitTo(network, Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException e) {
|
||||||
network.setState(Network.State.Implemented);
|
network.setState(Network.State.Implemented);
|
||||||
_networksDao.update(network.getId(), network);
|
_networksDao.update(network.getId(), network);
|
||||||
|
}
|
||||||
result = false;
|
result = false;
|
||||||
}
|
}
|
||||||
txn.commit();
|
txn.commit();
|
||||||
@ -2265,8 +2236,11 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
s_logger.warn("Failed to delete network " + network + "; was unable to cleanup corresponding ip ranges");
|
s_logger.warn("Failed to delete network " + network + "; was unable to cleanup corresponding ip ranges");
|
||||||
} else {
|
} else {
|
||||||
// commit transaction only when ips and vlans for the network are released successfully
|
// commit transaction only when ips and vlans for the network are released successfully
|
||||||
network.setState(Network.State.Destroy);
|
try {
|
||||||
_networksDao.update(network.getId(), network);
|
stateTransitTo(network, Event.DestroyNetwork);
|
||||||
|
} catch (NoTransitionException e) {
|
||||||
|
s_logger.debug(e.getMessage());
|
||||||
|
}
|
||||||
_networksDao.remove(network.getId());
|
_networksDao.remove(network.getId());
|
||||||
|
|
||||||
NetworkOffering ntwkOff = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
|
NetworkOffering ntwkOff = _configMgr.getNetworkOffering(network.getNetworkOfferingId());
|
||||||
@ -2772,10 +2746,9 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
|
|
||||||
String guestType = vlan.getVlanType().toString();
|
String guestType = vlan.getVlanType().toString();
|
||||||
|
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_IP_RELEASE,
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_RELEASE,
|
||||||
ip.getAllocatedToAccountId(), ip.getDataCenterId(), addrId, ip.getAddress().addr(),
|
ip.getAllocatedToAccountId(), ip.getDataCenterId(), addrId, ip.getAddress().addr(),
|
||||||
ip.isSourceNat(), guestType, ip.getSystem());
|
ip.isSourceNat(), guestType, ip.getSystem(), ip.getClass().getName(), ip.getUuid());
|
||||||
_usageEventDao.persist(usageEvent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ip = _ipAddressDao.markAsUnavailable(addrId);
|
ip = _ipAddressDao.markAsUnavailable(addrId);
|
||||||
@ -3522,6 +3495,15 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||||||
return _networkLockTimeout;
|
return _networkLockTimeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected boolean stateTransitTo(NetworkVO network, Network.Event e) throws NoTransitionException {
|
||||||
|
return _stateMachine.transitTo(network, e, null, _networksDao);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setStateMachine() {
|
||||||
|
_stateMachine = Network.State.getStateMachine();
|
||||||
|
}
|
||||||
|
|
||||||
private Map<Service, Set<Provider>> getServiceProvidersMap(long networkId) {
|
private Map<Service, Set<Provider>> getServiceProvidersMap(long networkId) {
|
||||||
Map<Service, Set<Provider>> map = new HashMap<Service, Set<Provider>>();
|
Map<Service, Set<Provider>> map = new HashMap<Service, Set<Provider>>();
|
||||||
List<NetworkServiceMapVO> nsms = _ntwkSrvcDao.getServicesInNetwork(networkId);
|
List<NetworkServiceMapVO> nsms = _ntwkSrvcDao.getServicesInNetwork(networkId);
|
||||||
|
|||||||
@ -58,17 +58,10 @@ import com.cloud.domain.DomainVO;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
import com.cloud.exception.*;
|
||||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
|
||||||
import com.cloud.exception.InsufficientCapacityException;
|
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
|
||||||
import com.cloud.exception.ResourceUnavailableException;
|
|
||||||
import com.cloud.exception.UnsupportedServiceException;
|
|
||||||
import com.cloud.network.IpAddress.State;
|
import com.cloud.network.IpAddress.State;
|
||||||
import com.cloud.network.Network.Capability;
|
import com.cloud.network.Network.Capability;
|
||||||
import com.cloud.network.Network.GuestType;
|
import com.cloud.network.Network.GuestType;
|
||||||
@ -93,6 +86,7 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
|
|||||||
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
|
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
|
||||||
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
|
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
|
||||||
import com.cloud.network.dao.PhysicalNetworkVO;
|
import com.cloud.network.dao.PhysicalNetworkVO;
|
||||||
|
import com.cloud.network.dao.*;
|
||||||
import com.cloud.network.element.NetworkElement;
|
import com.cloud.network.element.NetworkElement;
|
||||||
import com.cloud.network.element.VirtualRouterElement;
|
import com.cloud.network.element.VirtualRouterElement;
|
||||||
import com.cloud.network.element.VpcVirtualRouterElement;
|
import com.cloud.network.element.VpcVirtualRouterElement;
|
||||||
@ -113,13 +107,7 @@ import com.cloud.projects.ProjectManager;
|
|||||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||||
import com.cloud.tags.ResourceTagVO;
|
import com.cloud.tags.ResourceTagVO;
|
||||||
import com.cloud.tags.dao.ResourceTagDao;
|
import com.cloud.tags.dao.ResourceTagDao;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.*;
|
||||||
import com.cloud.user.AccountManager;
|
|
||||||
import com.cloud.user.AccountVO;
|
|
||||||
import com.cloud.user.DomainManager;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.user.User;
|
|
||||||
import com.cloud.user.UserContext;
|
|
||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.utils.AnnotationHelper;
|
import com.cloud.utils.AnnotationHelper;
|
||||||
import com.cloud.utils.NumbersUtil;
|
import com.cloud.utils.NumbersUtil;
|
||||||
@ -131,20 +119,15 @@ import com.cloud.utils.db.Filter;
|
|||||||
import com.cloud.utils.db.JoinBuilder;
|
import com.cloud.utils.db.JoinBuilder;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.vm.NicVO;
|
import com.cloud.vm.*;
|
||||||
import com.cloud.vm.ReservationContext;
|
|
||||||
import com.cloud.vm.ReservationContextImpl;
|
|
||||||
import com.cloud.vm.SecondaryStorageVmVO;
|
|
||||||
import com.cloud.vm.UserVmVO;
|
|
||||||
import com.cloud.vm.VMInstanceVO;
|
|
||||||
import com.cloud.vm.VirtualMachine;
|
|
||||||
import com.cloud.vm.dao.NicDao;
|
import com.cloud.vm.dao.NicDao;
|
||||||
import com.cloud.vm.dao.UserVmDao;
|
import com.cloud.vm.dao.UserVmDao;
|
||||||
import com.cloud.vm.dao.VMInstanceDao;
|
import com.cloud.vm.dao.VMInstanceDao;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NetworkServiceImpl implements NetworkService.
|
* NetworkServiceImpl implements NetworkService.
|
||||||
@ -1688,10 +1671,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
long isDefault = (nic.isDefaultNic()) ? 1 : 0;
|
long isDefault = (nic.isDefaultNic()) ? 1 : 0;
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), null, oldNetworkOfferingId, null, 0L);
|
UsageEventUtils.saveUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), null, oldNetworkOfferingId, null, 0L);
|
||||||
_usageEventDao.persist(usageEvent);
|
UsageEventUtils.saveUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), vm.getHostName(), networkOfferingId, null, isDefault);
|
||||||
usageEvent = new UsageEventVO(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), vm.getHostName(), networkOfferingId, null, isDefault);
|
|
||||||
_usageEventDao.persist(usageEvent);
|
|
||||||
}
|
}
|
||||||
txn.commit();
|
txn.commit();
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
98
server/src/com/cloud/network/NetworkStateListener.java
Normal file
98
server/src/com/cloud/network/NetworkStateListener.java
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package com.cloud.network;
|
||||||
|
|
||||||
|
import com.cloud.event.EventCategory;
|
||||||
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
|
import com.cloud.network.Network.Event;
|
||||||
|
import com.cloud.network.Network.State;
|
||||||
|
import com.cloud.network.dao.NetworkDao;
|
||||||
|
import com.cloud.server.ManagementServer;
|
||||||
|
import com.cloud.utils.fsm.StateListener;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBus;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBusException;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
public class NetworkStateListener implements StateListener<State, Event, Network> {
|
||||||
|
|
||||||
|
@Inject protected UsageEventDao _usageEventDao;
|
||||||
|
@Inject protected NetworkDao _networkDao;
|
||||||
|
|
||||||
|
// get the event bus provider if configured
|
||||||
|
@Inject protected EventBus _eventBus;
|
||||||
|
|
||||||
|
private static final Logger s_logger = Logger.getLogger(NetworkStateListener.class);
|
||||||
|
|
||||||
|
public NetworkStateListener(UsageEventDao usageEventDao, NetworkDao networkDao) {
|
||||||
|
this._usageEventDao = usageEventDao;
|
||||||
|
this._networkDao = networkDao;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preStateTransitionEvent(State oldState, Event event, State newState, Network vo, boolean status, Object opaque) {
|
||||||
|
pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean postStateTransitionEvent(State oldState, Event event, State newState, Network vo, boolean status, Object opaque) {
|
||||||
|
pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pubishOnEventBus(String event, String status, Network vo, State oldState, State newState) {
|
||||||
|
|
||||||
|
if (_eventBus == null) {
|
||||||
|
return; // no provider is configured to provide events bus, so just return
|
||||||
|
}
|
||||||
|
|
||||||
|
String resourceName = getEntityFromClassName(Network.class.getName());
|
||||||
|
org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event(
|
||||||
|
ManagementServer.Name,
|
||||||
|
EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(),
|
||||||
|
event,
|
||||||
|
resourceName,
|
||||||
|
vo.getUuid());
|
||||||
|
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||||
|
eventDescription.put("resource", resourceName);
|
||||||
|
eventDescription.put("id", vo.getUuid());
|
||||||
|
eventDescription.put("old-state", oldState.name());
|
||||||
|
eventDescription.put("new-state", newState.name());
|
||||||
|
eventMsg.setDescription(eventDescription);
|
||||||
|
try {
|
||||||
|
_eventBus.publish(eventMsg);
|
||||||
|
} catch (EventBusException e) {
|
||||||
|
s_logger.warn("Failed to publish state change event on the the event bus.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEntityFromClassName(String entityClassName) {
|
||||||
|
int index = entityClassName.lastIndexOf(".");
|
||||||
|
String entityName = entityClassName;
|
||||||
|
if (index != -1) {
|
||||||
|
entityName = entityClassName.substring(index+1);
|
||||||
|
}
|
||||||
|
return entityName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -22,10 +22,12 @@ import java.util.Map;
|
|||||||
import com.cloud.network.Network;
|
import com.cloud.network.Network;
|
||||||
import com.cloud.network.Network.GuestType;
|
import com.cloud.network.Network.GuestType;
|
||||||
import com.cloud.network.Networks.TrafficType;
|
import com.cloud.network.Networks.TrafficType;
|
||||||
|
import com.cloud.network.Network.State;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
|
import com.cloud.utils.fsm.StateDao;
|
||||||
|
|
||||||
public interface NetworkDao extends GenericDao<NetworkVO, Long> {
|
public interface NetworkDao extends GenericDao<NetworkVO, Long> , StateDao<State, Network.Event, Network> {
|
||||||
|
|
||||||
List<NetworkVO> listByOwner(long ownerId);
|
List<NetworkVO> listByOwner(long ownerId);
|
||||||
|
|
||||||
|
|||||||
@ -32,6 +32,8 @@ import com.cloud.network.Network;
|
|||||||
import com.cloud.network.Network.GuestType;
|
import com.cloud.network.Network.GuestType;
|
||||||
import com.cloud.network.Network.Provider;
|
import com.cloud.network.Network.Provider;
|
||||||
import com.cloud.network.Network.Service;
|
import com.cloud.network.Network.Service;
|
||||||
|
import com.cloud.network.Network.State;
|
||||||
|
import com.cloud.network.Network.Event;
|
||||||
import com.cloud.network.Networks.BroadcastDomainType;
|
import com.cloud.network.Networks.BroadcastDomainType;
|
||||||
import com.cloud.network.Networks.Mode;
|
import com.cloud.network.Networks.Mode;
|
||||||
import com.cloud.network.Networks.TrafficType;
|
import com.cloud.network.Networks.TrafficType;
|
||||||
@ -44,13 +46,10 @@ import com.cloud.utils.db.DB;
|
|||||||
import com.cloud.utils.db.GenericDaoBase;
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
import com.cloud.utils.db.GenericSearchBuilder;
|
import com.cloud.utils.db.GenericSearchBuilder;
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
import com.cloud.utils.db.JoinBuilder;
|
||||||
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.JoinBuilder.JoinType;
|
import com.cloud.utils.db.JoinBuilder.JoinType;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
|
||||||
import com.cloud.utils.db.SearchCriteria.Func;
|
import com.cloud.utils.db.SearchCriteria.Func;
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.SequenceFetcher;
|
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@ -566,6 +565,20 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
|
|||||||
return customSearch(sc, null).get(0);
|
return customSearch(sc, null).get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateState(State currentState, Event event, State nextState, Network vo, Object data) {
|
||||||
|
// TODO: ensure this update is correct
|
||||||
|
Transaction txn = Transaction.currentTxn();
|
||||||
|
txn.start();
|
||||||
|
|
||||||
|
NetworkVO networkVo = (NetworkVO) vo;
|
||||||
|
networkVo.setState(nextState);
|
||||||
|
super.update(networkVo.getId(), networkVo);
|
||||||
|
|
||||||
|
txn.commit();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<NetworkVO> listNetworksByAccount(long accountId, long zoneId, Network.GuestType type, boolean isSystem) {
|
public List<NetworkVO> listNetworksByAccount(long accountId, long zoneId, Network.GuestType type, boolean isSystem) {
|
||||||
SearchCriteria<NetworkVO> sc = OfferingAccountNetworkSearch.create();
|
SearchCriteria<NetworkVO> sc = OfferingAccountNetworkSearch.create();
|
||||||
@ -582,7 +595,6 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
|
|||||||
public List<NetworkVO> listRedundantNetworks() {
|
public List<NetworkVO> listRedundantNetworks() {
|
||||||
SearchCriteria<NetworkVO> sc = AllFieldsSearch.create();
|
SearchCriteria<NetworkVO> sc = AllFieldsSearch.create();
|
||||||
sc.setJoinParameters("offerings", "isRedundant", true);
|
sc.setJoinParameters("offerings", "isRedundant", true);
|
||||||
|
|
||||||
return listBy(sc, null);
|
return listBy(sc, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -259,6 +259,7 @@ public class NetworkVO implements Network {
|
|||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// don't use this directly when possible, use Network state machine instead
|
||||||
public void setState(State state) {
|
public void setState(State state) {
|
||||||
this.state = state;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,19 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
package com.cloud.network.dao;
|
package com.cloud.network.dao;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@ -1,3 +1,19 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
package com.cloud.network.dao;
|
package com.cloud.network.dao;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@ -42,7 +42,7 @@ import com.cloud.configuration.dao.ConfigurationDao;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
@ -64,15 +64,10 @@ import com.cloud.network.element.FirewallServiceProvider;
|
|||||||
import com.cloud.network.element.NetworkACLServiceProvider;
|
import com.cloud.network.element.NetworkACLServiceProvider;
|
||||||
import com.cloud.network.element.PortForwardingServiceProvider;
|
import com.cloud.network.element.PortForwardingServiceProvider;
|
||||||
import com.cloud.network.element.StaticNatServiceProvider;
|
import com.cloud.network.element.StaticNatServiceProvider;
|
||||||
import com.cloud.network.rules.FirewallManager;
|
import com.cloud.network.rules.*;
|
||||||
import com.cloud.network.rules.FirewallRule;
|
|
||||||
import com.cloud.network.rules.FirewallRule.FirewallRuleType;
|
import com.cloud.network.rules.FirewallRule.FirewallRuleType;
|
||||||
import com.cloud.network.rules.FirewallRule.Purpose;
|
import com.cloud.network.rules.FirewallRule.Purpose;
|
||||||
import com.cloud.network.rules.FirewallRule.State;
|
import com.cloud.network.rules.FirewallRule.State;
|
||||||
import com.cloud.network.rules.FirewallRuleVO;
|
|
||||||
import com.cloud.network.rules.PortForwardingRule;
|
|
||||||
import com.cloud.network.rules.PortForwardingRuleVO;
|
|
||||||
import com.cloud.network.rules.StaticNat;
|
|
||||||
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
import com.cloud.network.rules.dao.PortForwardingRulesDao;
|
||||||
import com.cloud.network.vpc.VpcManager;
|
import com.cloud.network.vpc.VpcManager;
|
||||||
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
||||||
@ -85,15 +80,14 @@ import com.cloud.user.DomainManager;
|
|||||||
import com.cloud.user.UserContext;
|
import com.cloud.user.UserContext;
|
||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
import com.cloud.utils.Ternary;
|
import com.cloud.utils.Ternary;
|
||||||
import com.cloud.utils.component.Manager;
|
|
||||||
import com.cloud.utils.component.ManagerBase;
|
import com.cloud.utils.component.ManagerBase;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.db.Filter;
|
import com.cloud.utils.db.Filter;
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
import com.cloud.utils.db.JoinBuilder;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.vm.UserVmVO;
|
import com.cloud.vm.UserVmVO;
|
||||||
@ -692,8 +686,8 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (generateUsageEvent && needUsageEvent) {
|
if (generateUsageEvent && needUsageEvent) {
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_RULE_DELETE, rule.getAccountId(), 0, rule.getId(), null);
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_DELETE, rule.getAccountId(), 0, rule.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
null, rule.getClass().getName(), rule.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import java.util.List;
|
|||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import com.cloud.event.ActionEventUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
@ -30,7 +31,6 @@ import com.cloud.dc.dao.DataCenterDao;
|
|||||||
import com.cloud.deploy.DeployDestination;
|
import com.cloud.deploy.DeployDestination;
|
||||||
import com.cloud.deploy.DeploymentPlan;
|
import com.cloud.deploy.DeploymentPlan;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.event.EventVO;
|
import com.cloud.event.EventVO;
|
||||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||||
@ -139,7 +139,7 @@ public class ExternalGuestNetworkGuru extends GuestNetworkGuru {
|
|||||||
}
|
}
|
||||||
|
|
||||||
implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlanTag));
|
implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlanTag));
|
||||||
EventUtils.saveEvent(UserContext.current().getCallerUserId(), config.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: "+vnet+ " Network Id: "+config.getId(), 0);
|
ActionEventUtils.onCompletedActionEvent(UserContext.current().getCallerUserId(), config.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + config.getId(), 0);
|
||||||
} else {
|
} else {
|
||||||
vlanTag = Integer.parseInt(config.getBroadcastUri().getHost());
|
vlanTag = Integer.parseInt(config.getBroadcastUri().getHost());
|
||||||
implemented.setBroadcastUri(config.getBroadcastUri());
|
implemented.setBroadcastUri(config.getBroadcastUri());
|
||||||
|
|||||||
@ -19,13 +19,13 @@ package com.cloud.network.guru;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
|
||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import com.cloud.event.ActionEventUtils;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
@ -38,7 +38,6 @@ import com.cloud.dc.dao.VlanDao;
|
|||||||
import com.cloud.deploy.DeployDestination;
|
import com.cloud.deploy.DeployDestination;
|
||||||
import com.cloud.deploy.DeploymentPlan;
|
import com.cloud.deploy.DeploymentPlan;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.event.EventVO;
|
import com.cloud.event.EventVO;
|
||||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||||
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
|
||||||
@ -300,8 +299,8 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
|
|||||||
"part of network " + network + " implement ", DataCenter.class, dcId);
|
"part of network " + network + " implement ", DataCenter.class, dcId);
|
||||||
}
|
}
|
||||||
implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vnet));
|
implemented.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vnet));
|
||||||
EventUtils.saveEvent(UserContext.current().getCallerUserId(), network.getAccountId(),
|
ActionEventUtils.onCompletedActionEvent(UserContext.current().getCallerUserId(), network.getAccountId(),
|
||||||
EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: "+vnet+ " Network Id: "+network.getId(), 0);
|
EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_ASSIGN, "Assigned Zone Vlan: " + vnet + " Network Id: " + network.getId(), 0);
|
||||||
} else {
|
} else {
|
||||||
implemented.setBroadcastUri(network.getBroadcastUri());
|
implemented.setBroadcastUri(network.getBroadcastUri());
|
||||||
}
|
}
|
||||||
@ -435,9 +434,9 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
|
|||||||
s_logger.debug("Releasing vnet for the network id=" + profile.getId());
|
s_logger.debug("Releasing vnet for the network id=" + profile.getId());
|
||||||
_dcDao.releaseVnet(profile.getBroadcastUri().getHost(), profile.getDataCenterId(),
|
_dcDao.releaseVnet(profile.getBroadcastUri().getHost(), profile.getDataCenterId(),
|
||||||
profile.getPhysicalNetworkId(), profile.getAccountId(), profile.getReservationId());
|
profile.getPhysicalNetworkId(), profile.getAccountId(), profile.getReservationId());
|
||||||
EventUtils.saveEvent(UserContext.current().getCallerUserId(), profile.getAccountId(),
|
ActionEventUtils.onCompletedActionEvent(UserContext.current().getCallerUserId(), profile.getAccountId(),
|
||||||
EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_RELEASE, "Released Zone Vlan: "
|
EventVO.LEVEL_INFO, EventTypes.EVENT_ZONE_VLAN_RELEASE, "Released Zone Vlan: "
|
||||||
+profile.getBroadcastUri().getHost()+" for Network: "+profile.getId(), 0);
|
+ profile.getBroadcastUri().getHost() + " for Network: " + profile.getId(), 0);
|
||||||
}
|
}
|
||||||
profile.setBroadcastUri(null);
|
profile.setBroadcastUri(null);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,9 @@ import java.util.Set;
|
|||||||
|
|
||||||
import javax.ejb.Local;
|
import javax.ejb.Local;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.naming.ConfigurationException;
|
|
||||||
|
import com.cloud.event.UsageEventUtils;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
|
import org.apache.cloudstack.api.command.user.loadbalancer.CreateLBStickinessPolicyCmd;
|
||||||
import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
|
import org.apache.cloudstack.api.command.user.loadbalancer.CreateLoadBalancerRuleCmd;
|
||||||
@ -38,7 +40,6 @@ import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRuleI
|
|||||||
import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRulesCmd;
|
import org.apache.cloudstack.api.command.user.loadbalancer.ListLoadBalancerRulesCmd;
|
||||||
import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRuleCmd;
|
import org.apache.cloudstack.api.command.user.loadbalancer.UpdateLoadBalancerRuleCmd;
|
||||||
import org.apache.cloudstack.api.response.ServiceResponse;
|
import org.apache.cloudstack.api.response.ServiceResponse;
|
||||||
import org.apache.log4j.Logger;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
@ -51,7 +52,6 @@ import com.cloud.dc.dao.VlanDao;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||||
@ -871,8 +871,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
|
|||||||
|
|
||||||
if (generateUsageEvent) {
|
if (generateUsageEvent) {
|
||||||
// Generate usage event right after all rules were marked for revoke
|
// Generate usage event right after all rules were marked for revoke
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(), null);
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
null, LoadBalancingRule.class.getName(), lb.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
@ -1104,8 +1104,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
|
|||||||
}
|
}
|
||||||
s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port " + srcPortStart + ", private port " + defPortStart + " is added successfully.");
|
s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port " + srcPortStart + ", private port " + defPortStart + " is added successfully.");
|
||||||
UserContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
|
UserContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(), ipAddr.getDataCenterId(), newRule.getId(), null);
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
ipAddr.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(), newRule.getUuid());
|
||||||
txn.commit();
|
txn.commit();
|
||||||
|
|
||||||
return newRule;
|
return newRule;
|
||||||
|
|||||||
@ -34,7 +34,7 @@ import com.cloud.configuration.ConfigurationManager;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||||
@ -289,9 +289,9 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
|
|||||||
throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
|
throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
|
||||||
}
|
}
|
||||||
UserContext.current().setEventDetails("Rule Id: " + newRule.getId());
|
UserContext.current().setEventDetails("Rule Id: " + newRule.getId());
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(),
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(),
|
||||||
ipAddress.getDataCenterId(), newRule.getId(), null);
|
ipAddress.getDataCenterId(), newRule.getId(), null, PortForwardingRule.class.getName(),
|
||||||
_usageEventDao.persist(usageEvent);
|
newRule.getUuid());
|
||||||
txn.commit();
|
txn.commit();
|
||||||
return newRule;
|
return newRule;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@ -371,8 +371,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
|
|||||||
throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
|
throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
|
||||||
}
|
}
|
||||||
UserContext.current().setEventDetails("Rule Id: " + newRule.getId());
|
UserContext.current().setEventDetails("Rule Id: " + newRule.getId());
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(), 0, newRule.getId(), null);
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(), 0, newRule.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
null, FirewallRule.class.getName(), newRule.getUuid());
|
||||||
|
|
||||||
txn.commit();
|
txn.commit();
|
||||||
StaticNatRule staticNatRule = new StaticNatRuleImpl(newRule, dstIp);
|
StaticNatRule staticNatRule = new StaticNatRuleImpl(newRule, dstIp);
|
||||||
|
|||||||
@ -59,13 +59,8 @@ import com.cloud.configuration.dao.ConfigurationDao;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.exception.*;
|
||||||
import com.cloud.exception.AgentUnavailableException;
|
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
|
||||||
import com.cloud.exception.OperationTimedoutException;
|
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
|
||||||
import com.cloud.exception.ResourceInUseException;
|
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
import com.cloud.network.Network;
|
import com.cloud.network.Network;
|
||||||
import com.cloud.network.NetworkManager;
|
import com.cloud.network.NetworkManager;
|
||||||
@ -78,6 +73,7 @@ import com.cloud.network.security.dao.SecurityGroupRulesDao;
|
|||||||
import com.cloud.network.security.dao.SecurityGroupVMMapDao;
|
import com.cloud.network.security.dao.SecurityGroupVMMapDao;
|
||||||
import com.cloud.network.security.dao.SecurityGroupWorkDao;
|
import com.cloud.network.security.dao.SecurityGroupWorkDao;
|
||||||
import com.cloud.network.security.dao.VmRulesetLogDao;
|
import com.cloud.network.security.dao.VmRulesetLogDao;
|
||||||
|
import com.cloud.network.security.dao.*;
|
||||||
import com.cloud.projects.ProjectManager;
|
import com.cloud.projects.ProjectManager;
|
||||||
import com.cloud.tags.dao.ResourceTagDao;
|
import com.cloud.tags.dao.ResourceTagDao;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
@ -98,19 +94,14 @@ import com.cloud.utils.db.Transaction;
|
|||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.fsm.StateListener;
|
import com.cloud.utils.fsm.StateListener;
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.vm.Nic;
|
import com.cloud.vm.*;
|
||||||
import com.cloud.vm.NicProfile;
|
|
||||||
import com.cloud.vm.UserVmManager;
|
|
||||||
import com.cloud.vm.UserVmVO;
|
|
||||||
import com.cloud.vm.VMInstanceVO;
|
|
||||||
import com.cloud.vm.VirtualMachine;
|
|
||||||
import com.cloud.vm.VirtualMachine.Event;
|
import com.cloud.vm.VirtualMachine.Event;
|
||||||
import com.cloud.vm.VirtualMachine.State;
|
import com.cloud.vm.VirtualMachine.State;
|
||||||
import com.cloud.vm.VirtualMachineManager;
|
|
||||||
import com.cloud.vm.dao.UserVmDao;
|
import com.cloud.vm.dao.UserVmDao;
|
||||||
import com.cloud.vm.dao.VMInstanceDao;
|
import com.cloud.vm.dao.VMInstanceDao;
|
||||||
|
|
||||||
import edu.emory.mathcs.backport.java.util.Collections;
|
import edu.emory.mathcs.backport.java.util.Collections;
|
||||||
|
import org.apache.cloudstack.api.command.user.securitygroup.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
@Local(value = { SecurityGroupManager.class, SecurityGroupService.class })
|
@Local(value = { SecurityGroupManager.class, SecurityGroupService.class })
|
||||||
public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGroupManager, SecurityGroupService, StateListener<State, VirtualMachine.Event, VirtualMachine> {
|
public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGroupManager, SecurityGroupService, StateListener<State, VirtualMachine.Event, VirtualMachine> {
|
||||||
@ -157,8 +148,6 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
|
|||||||
@Inject
|
@Inject
|
||||||
ProjectManager _projectMgr;
|
ProjectManager _projectMgr;
|
||||||
@Inject
|
@Inject
|
||||||
UsageEventDao _usageEventDao;
|
|
||||||
@Inject
|
|
||||||
ResourceTagDao _resourceTagDao;
|
ResourceTagDao _resourceTagDao;
|
||||||
|
|
||||||
ScheduledExecutorService _executorPool;
|
ScheduledExecutorService _executorPool;
|
||||||
@ -458,8 +447,9 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
|
|||||||
// For each group, find the security rules that allow the group
|
// For each group, find the security rules that allow the group
|
||||||
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
||||||
//Add usage events for security group assign
|
//Add usage events for security group assign
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SECURITY_GROUP_ASSIGN, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), mapVO.getSecurityGroupId());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SECURITY_GROUP_ASSIGN, vm.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
vm.getDataCenterId(), vm.getId(), mapVO.getSecurityGroupId(),
|
||||||
|
vm.getClass().getName(), vm.getUuid());
|
||||||
|
|
||||||
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
||||||
// For each security rule that allows a group that the vm belongs to, find the group it belongs to
|
// For each security rule that allows a group that the vm belongs to, find the group it belongs to
|
||||||
@ -474,8 +464,9 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
|
|||||||
// For each group, find the security rules rules that allow the group
|
// For each group, find the security rules rules that allow the group
|
||||||
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
for (SecurityGroupVMMapVO mapVO : groupsForVm) {// FIXME: use custom sql in the dao
|
||||||
//Add usage events for security group remove
|
//Add usage events for security group remove
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SECURITY_GROUP_REMOVE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), mapVO.getSecurityGroupId());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SECURITY_GROUP_REMOVE,
|
||||||
_usageEventDao.persist(usageEvent);
|
vm.getAccountId(), vm.getDataCenterId(), vm.getId(), mapVO.getSecurityGroupId(),
|
||||||
|
vm.getClass().getName(), vm.getUuid());
|
||||||
|
|
||||||
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(mapVO.getSecurityGroupId());
|
||||||
// For each security rule that allows a group that the vm belongs to, find the group it belongs to
|
// For each security rule that allows a group that the vm belongs to, find the group it belongs to
|
||||||
|
|||||||
@ -35,7 +35,7 @@ import com.cloud.configuration.dao.ConfigurationDao;
|
|||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.AccountLimitException;
|
import com.cloud.exception.AccountLimitException;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
@ -47,8 +47,8 @@ import com.cloud.network.NetworkModel;
|
|||||||
import com.cloud.network.PublicIpAddress;
|
import com.cloud.network.PublicIpAddress;
|
||||||
import com.cloud.network.RemoteAccessVpn;
|
import com.cloud.network.RemoteAccessVpn;
|
||||||
import com.cloud.network.VpnUser;
|
import com.cloud.network.VpnUser;
|
||||||
|
import com.cloud.network.*;
|
||||||
import com.cloud.network.VpnUser.State;
|
import com.cloud.network.VpnUser.State;
|
||||||
import com.cloud.network.VpnUserVO;
|
|
||||||
import com.cloud.network.dao.FirewallRulesDao;
|
import com.cloud.network.dao.FirewallRulesDao;
|
||||||
import com.cloud.network.dao.IPAddressDao;
|
import com.cloud.network.dao.IPAddressDao;
|
||||||
import com.cloud.network.dao.IPAddressVO;
|
import com.cloud.network.dao.IPAddressVO;
|
||||||
@ -71,15 +71,14 @@ import com.cloud.utils.NumbersUtil;
|
|||||||
import com.cloud.utils.Pair;
|
import com.cloud.utils.Pair;
|
||||||
import com.cloud.utils.PasswordGenerator;
|
import com.cloud.utils.PasswordGenerator;
|
||||||
import com.cloud.utils.Ternary;
|
import com.cloud.utils.Ternary;
|
||||||
import com.cloud.utils.component.Manager;
|
|
||||||
import com.cloud.utils.component.ManagerBase;
|
import com.cloud.utils.component.ManagerBase;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.db.Filter;
|
import com.cloud.utils.db.Filter;
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
import com.cloud.utils.db.JoinBuilder;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@ -280,8 +279,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||||||
for(VpnUserVO user : vpnUsers){
|
for(VpnUserVO user : vpnUsers){
|
||||||
// VPN_USER_REMOVE event is already generated for users in Revoke state
|
// VPN_USER_REMOVE event is already generated for users in Revoke state
|
||||||
if(user.getState() != VpnUser.State.Revoke){
|
if(user.getState() != VpnUser.State.Revoke){
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(), user.getUsername());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (vpnFwRules != null) {
|
if (vpnFwRules != null) {
|
||||||
@ -332,8 +331,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||||||
}
|
}
|
||||||
|
|
||||||
VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
|
VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(), user.getUsername());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
user.getUsername(), user.getClass().getName(), user.getUuid());
|
||||||
txn.commit();
|
txn.commit();
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
@ -349,8 +348,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||||||
txn.start();
|
txn.start();
|
||||||
user.setState(State.Revoke);
|
user.setState(State.Revoke);
|
||||||
_vpnUsersDao.update(user.getId(), user);
|
_vpnUsersDao.update(user.getId(), user);
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(), user.getUsername());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
user.getUsername(), user.getClass().getName(), user.getUuid());
|
||||||
txn.commit();
|
txn.commit();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -406,8 +405,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||||||
List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
|
List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
|
||||||
for(VpnUserVO user : vpnUsers){
|
for(VpnUserVO user : vpnUsers){
|
||||||
if(user.getState() != VpnUser.State.Revoke){
|
if(user.getState() != VpnUser.State.Revoke){
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(), user.getUsername());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0,
|
||||||
_usageEventDao.persist(usageEvent);
|
user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
txn.commit();
|
txn.commit();
|
||||||
@ -482,8 +481,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
|
|||||||
Transaction txn = Transaction.currentTxn();
|
Transaction txn = Transaction.currentTxn();
|
||||||
txn.start();
|
txn.start();
|
||||||
_vpnUsersDao.remove(user.getId());
|
_vpnUsersDao.remove(user.getId());
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(), user.getUsername());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
|
||||||
txn.commit();
|
txn.commit();
|
||||||
}
|
}
|
||||||
s_logger.warn("Failed to apply vpn for user " + user.getUsername() + ", accountId=" + user.getAccountId());
|
s_logger.warn("Failed to apply vpn for user " + user.getUsername() + ", accountId=" + user.getAccountId());
|
||||||
|
|||||||
@ -204,7 +204,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
|
|||||||
StringBuilder acctNm = new StringBuilder("PrjAcct-");
|
StringBuilder acctNm = new StringBuilder("PrjAcct-");
|
||||||
acctNm.append(name).append("-").append(owner.getDomainId());
|
acctNm.append(name).append("-").append(owner.getDomainId());
|
||||||
|
|
||||||
Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null);
|
Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, "", 0);
|
||||||
|
|
||||||
Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId()));
|
Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId()));
|
||||||
|
|
||||||
|
|||||||
@ -106,6 +106,10 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
|||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.utils.script.Script;
|
import com.cloud.utils.script.Script;
|
||||||
import com.cloud.uuididentity.dao.IdentityDao;
|
import com.cloud.uuididentity.dao.IdentityDao;
|
||||||
|
import org.apache.cloudstack.region.RegionVO;
|
||||||
|
import org.apache.cloudstack.region.dao.RegionDao;
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class ConfigurationServerImpl extends ManagerBase implements ConfigurationServer {
|
public class ConfigurationServerImpl extends ManagerBase implements ConfigurationServer {
|
||||||
@ -126,6 +130,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||||||
@Inject private ResourceCountDao _resourceCountDao;
|
@Inject private ResourceCountDao _resourceCountDao;
|
||||||
@Inject private NetworkOfferingServiceMapDao _ntwkOfferingServiceMapDao;
|
@Inject private NetworkOfferingServiceMapDao _ntwkOfferingServiceMapDao;
|
||||||
@Inject private IdentityDao _identityDao;
|
@Inject private IdentityDao _identityDao;
|
||||||
|
@Inject private RegionDao _regionDao;
|
||||||
|
|
||||||
public ConfigurationServerImpl() {
|
public ConfigurationServerImpl() {
|
||||||
setRunLevel(ComponentLifecycle.RUN_LEVEL_FRAMEWORK_BOOTSTRAP);
|
setRunLevel(ComponentLifecycle.RUN_LEVEL_FRAMEWORK_BOOTSTRAP);
|
||||||
@ -229,6 +234,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||||||
// Create default networks
|
// Create default networks
|
||||||
createDefaultNetworks();
|
createDefaultNetworks();
|
||||||
|
|
||||||
|
createDefaultRegion();
|
||||||
|
|
||||||
// Create userIpAddress ranges
|
// Create userIpAddress ranges
|
||||||
|
|
||||||
// Update existing vlans with networkId
|
// Update existing vlans with networkId
|
||||||
@ -276,7 +283,6 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||||||
|
|
||||||
// We should not update seed data UUID column here since this will be invoked in upgrade case as well.
|
// We should not update seed data UUID column here since this will be invoked in upgrade case as well.
|
||||||
//updateUuids();
|
//updateUuids();
|
||||||
|
|
||||||
// Set init to true
|
// Set init to true
|
||||||
_configDao.update("init", "Hidden", "true");
|
_configDao.update("init", "Hidden", "true");
|
||||||
|
|
||||||
@ -332,6 +338,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||||||
|
|
||||||
@DB
|
@DB
|
||||||
protected void saveUser() {
|
protected void saveUser() {
|
||||||
|
//ToDo: Add regionId to default users and accounts
|
||||||
// insert system account
|
// insert system account
|
||||||
String insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id) VALUES (1, UUID(), 'system', '1', '1')";
|
String insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id) VALUES (1, UUID(), 'system', '1', '1')";
|
||||||
Transaction txn = Transaction.currentTxn();
|
Transaction txn = Transaction.currentTxn();
|
||||||
@ -1265,4 +1272,9 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
|
|||||||
return svcProviders;
|
return svcProviders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createDefaultRegion(){
|
||||||
|
//Get Region name and URL from db.properties
|
||||||
|
_regionDao.persist(new RegionVO(_regionDao.getRegionId(), "Local", "http://localhost:8080/client/api", "", ""));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,7 +28,6 @@ import java.util.Comparator;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@ -51,6 +50,8 @@ import javax.naming.ConfigurationException;
|
|||||||
import com.cloud.storage.dao.*;
|
import com.cloud.storage.dao.*;
|
||||||
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
|
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
|
||||||
import org.apache.cloudstack.api.ApiConstants;
|
import org.apache.cloudstack.api.ApiConstants;
|
||||||
|
|
||||||
|
import com.cloud.event.ActionEventUtils;
|
||||||
import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
|
import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
|
import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd;
|
||||||
import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
|
import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd;
|
||||||
@ -139,7 +140,6 @@ import com.cloud.domain.DomainVO;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.event.EventVO;
|
import com.cloud.event.EventVO;
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
import com.cloud.exception.ConcurrentOperationException;
|
||||||
@ -242,7 +242,6 @@ import com.cloud.utils.net.MacAddress;
|
|||||||
import com.cloud.utils.net.NetUtils;
|
import com.cloud.utils.net.NetUtils;
|
||||||
import com.cloud.utils.ssh.SSHKeysHelper;
|
import com.cloud.utils.ssh.SSHKeysHelper;
|
||||||
import com.cloud.vm.ConsoleProxyVO;
|
import com.cloud.vm.ConsoleProxyVO;
|
||||||
import com.cloud.vm.DomainRouterVO;
|
|
||||||
import com.cloud.vm.InstanceGroupVO;
|
import com.cloud.vm.InstanceGroupVO;
|
||||||
import com.cloud.vm.SecondaryStorageVmVO;
|
import com.cloud.vm.SecondaryStorageVmVO;
|
||||||
import com.cloud.vm.UserVmVO;
|
import com.cloud.vm.UserVmVO;
|
||||||
@ -2436,12 +2435,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long saveStartedEvent(Long userId, Long accountId, String type, String description, long startEventId) {
|
public Long saveStartedEvent(Long userId, Long accountId, String type, String description, long startEventId) {
|
||||||
return EventUtils.saveStartedEvent(userId, accountId, type, description, startEventId);
|
return ActionEventUtils.onStartedActionEvent(userId, accountId, type, description, startEventId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long saveCompletedEvent(Long userId, Long accountId, String level, String type, String description, long startEventId) {
|
public Long saveCompletedEvent(Long userId, Long accountId, String level, String type, String description, long startEventId) {
|
||||||
return EventUtils.saveEvent(userId, accountId, level, type, description, startEventId);
|
return ActionEventUtils.onCompletedActionEvent(userId, accountId, level, type, description, startEventId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -2828,8 +2827,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||||||
// This means its a new account, set the password using the
|
// This means its a new account, set the password using the
|
||||||
// authenticator
|
// authenticator
|
||||||
|
|
||||||
for (Iterator<UserAuthenticator> en = _userAuthenticators.iterator(); en.hasNext();) {
|
for (UserAuthenticator authenticator: _userAuthenticators) {
|
||||||
UserAuthenticator authenticator = en.next();
|
|
||||||
encodedPassword = authenticator.encode(password);
|
encodedPassword = authenticator.encode(password);
|
||||||
if (encodedPassword != null) {
|
if (encodedPassword != null) {
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -55,27 +55,8 @@ import org.apache.log4j.Logger;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.*;
|
||||||
import com.cloud.agent.api.BackupSnapshotCommand;
|
import com.cloud.agent.api.storage.*;
|
||||||
import com.cloud.agent.api.CleanupSnapshotBackupCommand;
|
|
||||||
import com.cloud.agent.api.Command;
|
|
||||||
import com.cloud.agent.api.CreateStoragePoolCommand;
|
|
||||||
import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer;
|
|
||||||
import com.cloud.agent.api.CreateVolumeFromSnapshotCommand;
|
|
||||||
import com.cloud.agent.api.DeleteStoragePoolCommand;
|
|
||||||
import com.cloud.agent.api.ManageSnapshotCommand;
|
|
||||||
import com.cloud.agent.api.ModifyStoragePoolAnswer;
|
|
||||||
import com.cloud.agent.api.ModifyStoragePoolCommand;
|
|
||||||
import com.cloud.agent.api.UpgradeSnapshotCommand;
|
|
||||||
import com.cloud.agent.api.storage.CopyVolumeAnswer;
|
|
||||||
import com.cloud.agent.api.storage.CopyVolumeCommand;
|
|
||||||
import com.cloud.agent.api.storage.CreateAnswer;
|
|
||||||
import com.cloud.agent.api.storage.CreateCommand;
|
|
||||||
import com.cloud.agent.api.storage.DeleteTemplateCommand;
|
|
||||||
import com.cloud.agent.api.storage.DeleteVolumeCommand;
|
|
||||||
import com.cloud.agent.api.storage.DestroyCommand;
|
|
||||||
import com.cloud.agent.api.storage.ResizeVolumeCommand;
|
|
||||||
import com.cloud.agent.api.storage.ResizeVolumeAnswer;
|
|
||||||
import com.cloud.agent.api.to.StorageFilerTO;
|
import com.cloud.agent.api.to.StorageFilerTO;
|
||||||
import com.cloud.agent.api.to.VolumeTO;
|
import com.cloud.agent.api.to.VolumeTO;
|
||||||
import com.cloud.agent.manager.Commands;
|
import com.cloud.agent.manager.Commands;
|
||||||
@ -106,21 +87,9 @@ import com.cloud.domain.Domain;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.exception.*;
|
||||||
import com.cloud.exception.AgentUnavailableException;
|
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
|
||||||
import com.cloud.exception.DiscoveryException;
|
|
||||||
import com.cloud.exception.InsufficientCapacityException;
|
|
||||||
import com.cloud.exception.InsufficientStorageCapacityException;
|
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
|
||||||
import com.cloud.exception.OperationTimedoutException;
|
|
||||||
import com.cloud.exception.PermissionDeniedException;
|
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
|
||||||
import com.cloud.exception.ResourceInUseException;
|
|
||||||
import com.cloud.exception.ResourceUnavailableException;
|
|
||||||
import com.cloud.exception.StorageUnavailableException;
|
|
||||||
import com.cloud.host.Host;
|
import com.cloud.host.Host;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.host.Status;
|
import com.cloud.host.Status;
|
||||||
@ -142,32 +111,17 @@ import com.cloud.storage.Storage.StoragePoolType;
|
|||||||
import com.cloud.storage.Volume.Event;
|
import com.cloud.storage.Volume.Event;
|
||||||
import com.cloud.storage.Volume.Type;
|
import com.cloud.storage.Volume.Type;
|
||||||
import com.cloud.storage.allocator.StoragePoolAllocator;
|
import com.cloud.storage.allocator.StoragePoolAllocator;
|
||||||
import com.cloud.storage.dao.DiskOfferingDao;
|
import com.cloud.storage.dao.*;
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotPolicyDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolHostDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolWorkDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateHostDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplatePoolDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateS3Dao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateSwiftDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.dao.VolumeHostDao;
|
|
||||||
import com.cloud.storage.download.DownloadMonitor;
|
import com.cloud.storage.download.DownloadMonitor;
|
||||||
import com.cloud.storage.listener.StoragePoolMonitor;
|
import com.cloud.storage.listener.StoragePoolMonitor;
|
||||||
|
import com.cloud.storage.listener.VolumeStateListener;
|
||||||
import com.cloud.storage.s3.S3Manager;
|
import com.cloud.storage.s3.S3Manager;
|
||||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||||
import com.cloud.storage.snapshot.SnapshotManager;
|
import com.cloud.storage.snapshot.SnapshotManager;
|
||||||
import com.cloud.storage.snapshot.SnapshotScheduler;
|
import com.cloud.storage.snapshot.SnapshotScheduler;
|
||||||
import com.cloud.tags.dao.ResourceTagDao;
|
import com.cloud.tags.dao.ResourceTagDao;
|
||||||
import com.cloud.template.TemplateManager;
|
import com.cloud.template.TemplateManager;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.*;
|
||||||
import com.cloud.user.AccountManager;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.user.User;
|
|
||||||
import com.cloud.user.UserContext;
|
|
||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.user.dao.UserDao;
|
import com.cloud.user.dao.UserDao;
|
||||||
import com.cloud.uservm.UserVm;
|
import com.cloud.uservm.UserVm;
|
||||||
@ -179,36 +133,16 @@ import com.cloud.utils.component.ComponentContext;
|
|||||||
import com.cloud.utils.component.Manager;
|
import com.cloud.utils.component.Manager;
|
||||||
import com.cloud.utils.component.ManagerBase;
|
import com.cloud.utils.component.ManagerBase;
|
||||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.GenericSearchBuilder;
|
|
||||||
import com.cloud.utils.db.GlobalLock;
|
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
|
||||||
import com.cloud.utils.db.JoinBuilder.JoinType;
|
import com.cloud.utils.db.JoinBuilder.JoinType;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
|
||||||
import com.cloud.utils.db.SearchCriteria.Op;
|
import com.cloud.utils.db.SearchCriteria.Op;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.exception.ExecutionException;
|
import com.cloud.utils.exception.ExecutionException;
|
||||||
import com.cloud.utils.fsm.NoTransitionException;
|
import com.cloud.utils.fsm.NoTransitionException;
|
||||||
import com.cloud.utils.fsm.StateMachine2;
|
import com.cloud.utils.fsm.StateMachine2;
|
||||||
import com.cloud.vm.ConsoleProxyVO;
|
import com.cloud.vm.*;
|
||||||
import com.cloud.vm.DiskProfile;
|
|
||||||
import com.cloud.vm.DomainRouterVO;
|
|
||||||
import com.cloud.vm.SecondaryStorageVmVO;
|
|
||||||
import com.cloud.vm.UserVmManager;
|
|
||||||
import com.cloud.vm.UserVmVO;
|
|
||||||
import com.cloud.vm.VMInstanceVO;
|
|
||||||
import com.cloud.vm.VirtualMachine;
|
|
||||||
import com.cloud.vm.VirtualMachine.State;
|
import com.cloud.vm.VirtualMachine.State;
|
||||||
import com.cloud.vm.VirtualMachineManager;
|
import com.cloud.vm.dao.*;
|
||||||
import com.cloud.vm.VirtualMachineProfile;
|
|
||||||
import com.cloud.vm.VirtualMachineProfileImpl;
|
|
||||||
import com.cloud.vm.dao.ConsoleProxyDao;
|
|
||||||
import com.cloud.vm.dao.DomainRouterDao;
|
|
||||||
import com.cloud.vm.dao.SecondaryStorageVmDao;
|
|
||||||
import com.cloud.vm.dao.UserVmDao;
|
|
||||||
import com.cloud.vm.dao.VMInstanceDao;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Local(value = { StorageManager.class, StorageService.class })
|
@Local(value = { StorageManager.class, StorageService.class })
|
||||||
@ -303,8 +237,6 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
@Inject
|
@Inject
|
||||||
protected ClusterDao _clusterDao;
|
protected ClusterDao _clusterDao;
|
||||||
@Inject
|
@Inject
|
||||||
protected UsageEventDao _usageEventDao;
|
|
||||||
@Inject
|
|
||||||
protected VirtualMachineManager _vmMgr;
|
protected VirtualMachineManager _vmMgr;
|
||||||
@Inject
|
@Inject
|
||||||
protected DomainRouterDao _domrDao;
|
protected DomainRouterDao _domrDao;
|
||||||
@ -654,9 +586,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
Pair<VolumeVO, String> volumeDetails = createVolumeFromSnapshot(volume, snapshot);
|
Pair<VolumeVO, String> volumeDetails = createVolumeFromSnapshot(volume, snapshot);
|
||||||
if (volumeDetails != null) {
|
if (volumeDetails != null) {
|
||||||
createdVolume = volumeDetails.first();
|
createdVolume = volumeDetails.first();
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, createdVolume.getAccountId(), createdVolume.getDataCenterId(), createdVolume.getId(), createdVolume.getName(),
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, createdVolume.getAccountId(),
|
||||||
createdVolume.getDiskOfferingId(), null, createdVolume.getSize());
|
createdVolume.getDataCenterId(), createdVolume.getId(), createdVolume.getName(), createdVolume.getDiskOfferingId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
null, createdVolume.getSize(), Volume.class.getName(), createdVolume.getUuid());
|
||||||
}
|
}
|
||||||
return createdVolume;
|
return createdVolume;
|
||||||
}
|
}
|
||||||
@ -776,8 +708,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
volume.setPoolId(destPool.getId());
|
volume.setPoolId(destPool.getId());
|
||||||
volume.setPodId(destPool.getPodId());
|
volume.setPodId(destPool.getPodId());
|
||||||
stateTransitTo(volume, Event.CopySucceeded);
|
stateTransitTo(volume, Event.CopySucceeded);
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(), null, volume.getSize());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(),
|
||||||
|
null, volume.getSize(), Volume.class.getName(), volume.getUuid());
|
||||||
_volumeHostDao.remove(volumeHostVO.getId());
|
_volumeHostDao.remove(volumeHostVO.getId());
|
||||||
txn.commit();
|
txn.commit();
|
||||||
return volume;
|
return volume;
|
||||||
@ -1042,6 +975,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
LocalStorageSearch.join("poolHost", storageHostSearch, storageHostSearch.entity().getPoolId(), LocalStorageSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
LocalStorageSearch.join("poolHost", storageHostSearch, storageHostSearch.entity().getPoolId(), LocalStorageSearch.entity().getId(), JoinBuilder.JoinType.INNER);
|
||||||
LocalStorageSearch.and("type", LocalStorageSearch.entity().getPoolType(), SearchCriteria.Op.IN);
|
LocalStorageSearch.and("type", LocalStorageSearch.entity().getPoolType(), SearchCriteria.Op.IN);
|
||||||
LocalStorageSearch.done();
|
LocalStorageSearch.done();
|
||||||
|
|
||||||
|
Volume.State.getStateMachine().registerListener( new VolumeStateListener());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1953,8 +1889,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
throw new InvalidParameterValueException("unable to find a snapshot with id " + snapshotId);
|
throw new InvalidParameterValueException("unable to find a snapshot with id " + snapshotId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (snapshotCheck.getStatus() != Snapshot.Status.BackedUp) {
|
if (snapshotCheck.getState() != Snapshot.State.BackedUp) {
|
||||||
throw new InvalidParameterValueException("Snapshot id=" + snapshotId + " is not in " + Snapshot.Status.BackedUp + " state yet and can't be used for volume creation");
|
throw new InvalidParameterValueException("Snapshot id=" + snapshotId + " is not in " + Snapshot.State.BackedUp + " state yet and can't be used for volume creation");
|
||||||
}
|
}
|
||||||
|
|
||||||
diskOfferingId = snapshotCheck.getDiskOfferingId();
|
diskOfferingId = snapshotCheck.getDiskOfferingId();
|
||||||
@ -2045,8 +1981,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
volume = _volsDao.persist(volume);
|
volume = _volsDao.persist(volume);
|
||||||
if(cmd.getSnapshotId() == null){
|
if(cmd.getSnapshotId() == null){
|
||||||
//for volume created from snapshot, create usage event after volume creation
|
//for volume created from snapshot, create usage event after volume creation
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId, null, size);
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId, null, size,
|
||||||
|
Volume.class.getName(), volume.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
UserContext.current().setEventDetails("Volume Id: " + volume.getId());
|
UserContext.current().setEventDetails("Volume Id: " + volume.getId());
|
||||||
@ -2291,8 +2228,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
// Decrement the resource count for volumes belonging user VM's only
|
// Decrement the resource count for volumes belonging user VM's only
|
||||||
_resourceLimitMgr.decrementResourceCount(volume.getAccountId(), ResourceType.volume);
|
_resourceLimitMgr.decrementResourceCount(volume.getAccountId(), ResourceType.volume);
|
||||||
// Log usage event for volumes belonging user VM's only
|
// Log usage event for volumes belonging user VM's only
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName());
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
volume.getDataCenterId(), volume.getId(), volume.getName(),
|
||||||
|
Volume.class.getName(), volume.getUuid());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -2457,7 +2395,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
}
|
}
|
||||||
|
|
||||||
// remove snapshots in Error state
|
// remove snapshots in Error state
|
||||||
List<SnapshotVO> snapshots = _snapshotDao.listAllByStatus(Snapshot.Status.Error);
|
List<SnapshotVO> snapshots = _snapshotDao.listAllByStatus(Snapshot.State.Error);
|
||||||
for (SnapshotVO snapshotVO : snapshots) {
|
for (SnapshotVO snapshotVO : snapshots) {
|
||||||
try{
|
try{
|
||||||
_snapshotDao.expunge(snapshotVO.getId());
|
_snapshotDao.expunge(snapshotVO.getId());
|
||||||
@ -3126,10 +3064,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
|
|
||||||
// Save usage event and update resource count for user vm volumes
|
// Save usage event and update resource count for user vm volumes
|
||||||
if (vm instanceof UserVm) {
|
if (vm instanceof UserVm) {
|
||||||
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(),
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offering.getId(), null, size);
|
vol.getDataCenterId(), vol.getId(), vol.getName(), offering.getId(), null, size,
|
||||||
_usageEventDao.persist(usageEvent);
|
Volume.class.getName(), vol.getUuid());
|
||||||
|
|
||||||
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
|
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
|
||||||
}
|
}
|
||||||
return toDiskProfile(vol, offering);
|
return toDiskProfile(vol, offering);
|
||||||
@ -3190,9 +3127,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
|
|||||||
offeringId = offering.getId();
|
offeringId = offering.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(), vol.getDataCenterId(), vol.getId(), vol.getName(), offeringId, template.getId(),
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, vol.getAccountId(),
|
||||||
vol.getSize());
|
vol.getDataCenterId(), vol.getId(), vol.getName(), offeringId, template.getId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
vol.getSize(), Volume.class.getName(), vol.getUuid());
|
||||||
|
|
||||||
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
|
_resourceLimitMgr.incrementResourceCount(vm.getAccountId(), ResourceType.volume);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,15 +16,16 @@
|
|||||||
// under the License.
|
// under the License.
|
||||||
package com.cloud.storage.dao;
|
package com.cloud.storage.dao;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import com.cloud.storage.Snapshot;
|
import com.cloud.storage.Snapshot;
|
||||||
import com.cloud.storage.Snapshot.Type;
|
import com.cloud.storage.Snapshot.Type;
|
||||||
import com.cloud.storage.SnapshotVO;
|
import com.cloud.storage.SnapshotVO;
|
||||||
import com.cloud.utils.db.Filter;
|
import com.cloud.utils.db.Filter;
|
||||||
import com.cloud.utils.db.GenericDao;
|
import com.cloud.utils.db.GenericDao;
|
||||||
|
import com.cloud.utils.fsm.StateDao;
|
||||||
|
|
||||||
public interface SnapshotDao extends GenericDao<SnapshotVO, Long> {
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface SnapshotDao extends GenericDao<SnapshotVO, Long>, StateDao<Snapshot.State, Snapshot.Event, Snapshot> {
|
||||||
List<SnapshotVO> listByVolumeId(long volumeId);
|
List<SnapshotVO> listByVolumeId(long volumeId);
|
||||||
List<SnapshotVO> listByVolumeId(Filter filter, long volumeId);
|
List<SnapshotVO> listByVolumeId(Filter filter, long volumeId);
|
||||||
SnapshotVO findNextSnapshot(long parentSnapId);
|
SnapshotVO findNextSnapshot(long parentSnapId);
|
||||||
@ -39,7 +40,7 @@ public interface SnapshotDao extends GenericDao<SnapshotVO, Long> {
|
|||||||
List<SnapshotVO> listByHostId(Filter filter, long hostId);
|
List<SnapshotVO> listByHostId(Filter filter, long hostId);
|
||||||
List<SnapshotVO> listByHostId(long hostId);
|
List<SnapshotVO> listByHostId(long hostId);
|
||||||
public Long countSnapshotsForAccount(long accountId);
|
public Long countSnapshotsForAccount(long accountId);
|
||||||
List<SnapshotVO> listByInstanceId(long instanceId, Snapshot.Status... status);
|
List<SnapshotVO> listByInstanceId(long instanceId, Snapshot.State... status);
|
||||||
List<SnapshotVO> listByStatus(long volumeId, Snapshot.Status... status);
|
List<SnapshotVO> listByStatus(long volumeId, Snapshot.State... status);
|
||||||
List<SnapshotVO> listAllByStatus(Snapshot.Status... status);
|
List<SnapshotVO> listAllByStatus(Snapshot.State... status);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,8 @@ import org.springframework.stereotype.Component;
|
|||||||
|
|
||||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||||
import com.cloud.storage.Snapshot;
|
import com.cloud.storage.Snapshot;
|
||||||
|
import com.cloud.storage.Snapshot.Event;
|
||||||
|
import com.cloud.storage.Snapshot.State;
|
||||||
import com.cloud.storage.Snapshot.Type;
|
import com.cloud.storage.Snapshot.Type;
|
||||||
import com.cloud.storage.SnapshotVO;
|
import com.cloud.storage.SnapshotVO;
|
||||||
import com.cloud.storage.Volume;
|
import com.cloud.storage.Volume;
|
||||||
@ -39,11 +41,9 @@ import com.cloud.utils.db.DB;
|
|||||||
import com.cloud.utils.db.Filter;
|
import com.cloud.utils.db.Filter;
|
||||||
import com.cloud.utils.db.GenericDaoBase;
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
import com.cloud.utils.db.GenericSearchBuilder;
|
import com.cloud.utils.db.GenericSearchBuilder;
|
||||||
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.JoinBuilder.JoinType;
|
import com.cloud.utils.db.JoinBuilder.JoinType;
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
|
||||||
import com.cloud.utils.db.SearchCriteria.Func;
|
import com.cloud.utils.db.SearchCriteria.Func;
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.vm.VMInstanceVO;
|
import com.cloud.vm.VMInstanceVO;
|
||||||
import com.cloud.vm.dao.VMInstanceDaoImpl;
|
import com.cloud.vm.dao.VMInstanceDaoImpl;
|
||||||
|
|
||||||
@ -117,7 +117,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
public List<SnapshotVO> listByHostId(Filter filter, long hostId ) {
|
public List<SnapshotVO> listByHostId(Filter filter, long hostId ) {
|
||||||
SearchCriteria<SnapshotVO> sc = HostIdSearch.create();
|
SearchCriteria<SnapshotVO> sc = HostIdSearch.create();
|
||||||
sc.setParameters("hostId", hostId);
|
sc.setParameters("hostId", hostId);
|
||||||
sc.setParameters("status", Snapshot.Status.BackedUp);
|
sc.setParameters("status", Snapshot.State.BackedUp);
|
||||||
return listBy(sc, filter);
|
return listBy(sc, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
|
|
||||||
HostIdSearch = createSearchBuilder();
|
HostIdSearch = createSearchBuilder();
|
||||||
HostIdSearch.and("hostId", HostIdSearch.entity().getSecHostId(), SearchCriteria.Op.EQ);
|
HostIdSearch.and("hostId", HostIdSearch.entity().getSecHostId(), SearchCriteria.Op.EQ);
|
||||||
HostIdSearch.and("status", HostIdSearch.entity().getStatus(), SearchCriteria.Op.EQ);
|
HostIdSearch.and("status", HostIdSearch.entity().getState(), SearchCriteria.Op.EQ);
|
||||||
HostIdSearch.done();
|
HostIdSearch.done();
|
||||||
|
|
||||||
VolumeIdTypeSearch = createSearchBuilder();
|
VolumeIdTypeSearch = createSearchBuilder();
|
||||||
@ -180,7 +180,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
|
|
||||||
StatusSearch = createSearchBuilder();
|
StatusSearch = createSearchBuilder();
|
||||||
StatusSearch.and("volumeId", StatusSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
|
StatusSearch.and("volumeId", StatusSearch.entity().getVolumeId(), SearchCriteria.Op.EQ);
|
||||||
StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN);
|
StatusSearch.and("status", StatusSearch.entity().getState(), SearchCriteria.Op.IN);
|
||||||
StatusSearch.done();
|
StatusSearch.done();
|
||||||
|
|
||||||
CountSnapshotsByAccount = createSearchBuilder(Long.class);
|
CountSnapshotsByAccount = createSearchBuilder(Long.class);
|
||||||
@ -190,7 +190,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
CountSnapshotsByAccount.done();
|
CountSnapshotsByAccount.done();
|
||||||
|
|
||||||
InstanceIdSearch = createSearchBuilder();
|
InstanceIdSearch = createSearchBuilder();
|
||||||
InstanceIdSearch.and("status", InstanceIdSearch.entity().getStatus(), SearchCriteria.Op.IN);
|
InstanceIdSearch.and("status", InstanceIdSearch.entity().getState(), SearchCriteria.Op.IN);
|
||||||
|
|
||||||
SearchBuilder<VMInstanceVO> instanceSearch = _instanceDao.createSearchBuilder();
|
SearchBuilder<VMInstanceVO> instanceSearch = _instanceDao.createSearchBuilder();
|
||||||
instanceSearch.and("instanceId", instanceSearch.entity().getId(), SearchCriteria.Op.EQ);
|
instanceSearch.and("instanceId", instanceSearch.entity().getId(), SearchCriteria.Op.EQ);
|
||||||
@ -282,7 +282,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SnapshotVO> listByInstanceId(long instanceId, Snapshot.Status... status) {
|
public List<SnapshotVO> listByInstanceId(long instanceId, Snapshot.State... status) {
|
||||||
SearchCriteria<SnapshotVO> sc = this.InstanceIdSearch.create();
|
SearchCriteria<SnapshotVO> sc = this.InstanceIdSearch.create();
|
||||||
|
|
||||||
if (status != null && status.length != 0) {
|
if (status != null && status.length != 0) {
|
||||||
@ -295,7 +295,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SnapshotVO> listByStatus(long volumeId, Snapshot.Status... status) {
|
public List<SnapshotVO> listByStatus(long volumeId, Snapshot.State... status) {
|
||||||
SearchCriteria<SnapshotVO> sc = this.StatusSearch.create();
|
SearchCriteria<SnapshotVO> sc = this.StatusSearch.create();
|
||||||
sc.setParameters("volumeId", volumeId);
|
sc.setParameters("volumeId", volumeId);
|
||||||
sc.setParameters("status", (Object[])status);
|
sc.setParameters("status", (Object[])status);
|
||||||
@ -317,9 +317,20 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<SnapshotVO> listAllByStatus(Snapshot.Status... status) {
|
public List<SnapshotVO> listAllByStatus(Snapshot.State... status) {
|
||||||
SearchCriteria<SnapshotVO> sc = this.StatusSearch.create();
|
SearchCriteria<SnapshotVO> sc = this.StatusSearch.create();
|
||||||
sc.setParameters("status", (Object[])status);
|
sc.setParameters("status", (Object[])status);
|
||||||
return listBy(sc, null);
|
return listBy(sc, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateState(State currentState, Event event, State nextState, Snapshot snapshot, Object data) {
|
||||||
|
Transaction txn = Transaction.currentTxn();
|
||||||
|
txn.start();
|
||||||
|
SnapshotVO snapshotVO = (SnapshotVO)snapshot;
|
||||||
|
snapshotVO.setStatus(nextState);
|
||||||
|
super.update(snapshotVO.getId(), snapshotVO);
|
||||||
|
txn.commit();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,17 +37,10 @@ import com.cloud.agent.AgentManager;
|
|||||||
import com.cloud.agent.Listener;
|
import com.cloud.agent.Listener;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
import com.cloud.agent.api.Command;
|
import com.cloud.agent.api.Command;
|
||||||
import com.cloud.agent.api.storage.DeleteTemplateCommand;
|
import com.cloud.agent.api.storage.*;
|
||||||
import com.cloud.agent.api.storage.DeleteVolumeCommand;
|
|
||||||
import com.cloud.agent.api.storage.DownloadCommand;
|
|
||||||
import com.cloud.agent.api.storage.ListVolumeAnswer;
|
|
||||||
import com.cloud.agent.api.storage.ListVolumeCommand;
|
|
||||||
import com.cloud.agent.api.storage.DownloadCommand.Proxy;
|
import com.cloud.agent.api.storage.DownloadCommand.Proxy;
|
||||||
import com.cloud.agent.api.storage.DownloadCommand.ResourceType;
|
import com.cloud.agent.api.storage.DownloadCommand.ResourceType;
|
||||||
import com.cloud.agent.api.storage.DownloadProgressCommand;
|
|
||||||
import com.cloud.agent.api.storage.DownloadProgressCommand.RequestType;
|
import com.cloud.agent.api.storage.DownloadProgressCommand.RequestType;
|
||||||
import com.cloud.agent.api.storage.ListTemplateAnswer;
|
|
||||||
import com.cloud.agent.api.storage.ListTemplateCommand;
|
|
||||||
import com.cloud.agent.manager.Commands;
|
import com.cloud.agent.manager.Commands;
|
||||||
import com.cloud.alert.AlertManager;
|
import com.cloud.alert.AlertManager;
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
@ -56,8 +49,7 @@ import com.cloud.dc.DataCenterVO;
|
|||||||
import com.cloud.dc.dao.ClusterDao;
|
import com.cloud.dc.dao.ClusterDao;
|
||||||
import com.cloud.dc.dao.DataCenterDao;
|
import com.cloud.dc.dao.DataCenterDao;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
|
||||||
import com.cloud.exception.AgentUnavailableException;
|
import com.cloud.exception.AgentUnavailableException;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
import com.cloud.exception.StorageUnavailableException;
|
import com.cloud.exception.StorageUnavailableException;
|
||||||
@ -67,26 +59,9 @@ import com.cloud.host.dao.HostDao;
|
|||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
import com.cloud.resource.ResourceManager;
|
import com.cloud.resource.ResourceManager;
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
import com.cloud.storage.StorageManager;
|
import com.cloud.storage.*;
|
||||||
import com.cloud.storage.SwiftVO;
|
|
||||||
import com.cloud.storage.VMTemplateHostVO;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
|
||||||
import com.cloud.storage.Volume;
|
|
||||||
import com.cloud.storage.VolumeHostVO;
|
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||||
import com.cloud.storage.Volume.Event;
|
import com.cloud.storage.dao.*;
|
||||||
import com.cloud.storage.VMTemplateVO;
|
|
||||||
import com.cloud.storage.VMTemplateZoneVO;
|
|
||||||
import com.cloud.storage.dao.StoragePoolHostDao;
|
|
||||||
import com.cloud.storage.dao.SwiftDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateHostDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplatePoolDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateSwiftDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateZoneDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.dao.VolumeHostDao;
|
|
||||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||||
import com.cloud.storage.swift.SwiftManager;
|
import com.cloud.storage.swift.SwiftManager;
|
||||||
import com.cloud.storage.template.TemplateConstants;
|
import com.cloud.storage.template.TemplateConstants;
|
||||||
@ -100,7 +75,6 @@ import com.cloud.utils.db.SearchBuilder;
|
|||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
import com.cloud.utils.db.Transaction;
|
import com.cloud.utils.db.Transaction;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.utils.fsm.NoTransitionException;
|
|
||||||
import com.cloud.vm.SecondaryStorageVm;
|
import com.cloud.vm.SecondaryStorageVm;
|
||||||
import com.cloud.vm.SecondaryStorageVmVO;
|
import com.cloud.vm.SecondaryStorageVmVO;
|
||||||
import com.cloud.vm.UserVmManager;
|
import com.cloud.vm.UserVmManager;
|
||||||
@ -150,11 +124,6 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
|
|||||||
ConfigurationDao _configDao;
|
ConfigurationDao _configDao;
|
||||||
@Inject
|
@Inject
|
||||||
UserVmManager _vmMgr;
|
UserVmManager _vmMgr;
|
||||||
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
private UsageEventDao _usageEventDao;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ClusterDao _clusterDao;
|
private ClusterDao _clusterDao;
|
||||||
@Inject
|
@Inject
|
||||||
@ -513,8 +482,9 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
|
|||||||
eventType = EventTypes.EVENT_ISO_CREATE;
|
eventType = EventTypes.EVENT_ISO_CREATE;
|
||||||
}
|
}
|
||||||
if(template.getAccountId() != Account.ACCOUNT_ID_SYSTEM){
|
if(template.getAccountId() != Account.ACCOUNT_ID_SYSTEM){
|
||||||
UsageEventVO usageEvent = new UsageEventVO(eventType, template.getAccountId(), host.getDataCenterId(), template.getId(), template.getName(), null, template.getSourceTemplateId() , size);
|
UsageEventUtils.publishUsageEvent(eventType, template.getAccountId(), host.getDataCenterId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
template.getId(), template.getName(), null, template.getSourceTemplateId(), size,
|
||||||
|
template.getClass().getName(), template.getUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
txn.commit();
|
txn.commit();
|
||||||
@ -546,8 +516,8 @@ public class DownloadMonitorImpl extends ManagerBase implements DownloadMonitor
|
|||||||
}
|
}
|
||||||
String eventType = EventTypes.EVENT_VOLUME_UPLOAD;
|
String eventType = EventTypes.EVENT_VOLUME_UPLOAD;
|
||||||
if(volume.getAccountId() != Account.ACCOUNT_ID_SYSTEM){
|
if(volume.getAccountId() != Account.ACCOUNT_ID_SYSTEM){
|
||||||
UsageEventVO usageEvent = new UsageEventVO(eventType, volume.getAccountId(), host.getDataCenterId(), volume.getId(), volume.getName(), null, 0l , size);
|
UsageEventUtils.publishUsageEvent(eventType, volume.getAccountId(), host.getDataCenterId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
volume.getId(), volume.getName(), null, 0l, size, volume.getClass().getName(), volume.getUuid());
|
||||||
}
|
}
|
||||||
}else if (dnldStatus == Status.DOWNLOAD_ERROR || dnldStatus == Status.ABANDONED || dnldStatus == Status.UNKNOWN){
|
}else if (dnldStatus == Status.DOWNLOAD_ERROR || dnldStatus == Status.ABANDONED || dnldStatus == Status.UNKNOWN){
|
||||||
//Decrement the volume count
|
//Decrement the volume count
|
||||||
|
|||||||
@ -0,0 +1,94 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package com.cloud.storage.listener;
|
||||||
|
|
||||||
|
import com.cloud.event.EventCategory;
|
||||||
|
import com.cloud.storage.Snapshot;
|
||||||
|
import com.cloud.storage.Snapshot.Event;
|
||||||
|
import com.cloud.storage.Snapshot.State;
|
||||||
|
import com.cloud.server.ManagementServer;
|
||||||
|
import com.cloud.utils.fsm.StateListener;
|
||||||
|
|
||||||
|
import org.apache.cloudstack.framework.events.EventBus;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBusException;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
public class SnapshotStateListener implements StateListener<State, Event, Snapshot> {
|
||||||
|
|
||||||
|
// get the event bus provider if configured
|
||||||
|
@Inject protected EventBus _eventBus;
|
||||||
|
|
||||||
|
private static final Logger s_logger = Logger.getLogger(VolumeStateListener.class);
|
||||||
|
|
||||||
|
public SnapshotStateListener() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preStateTransitionEvent(State oldState, Event event, State newState, Snapshot vo, boolean status, Object opaque) {
|
||||||
|
pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean postStateTransitionEvent(State oldState, Event event, State newState, Snapshot vo, boolean status, Object opaque) {
|
||||||
|
pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pubishOnEventBus(String event, String status, Snapshot vo, State oldState, State newState) {
|
||||||
|
|
||||||
|
if (_eventBus == null) {
|
||||||
|
return; // no provider is configured to provide events bus, so just return
|
||||||
|
}
|
||||||
|
|
||||||
|
String resourceName = getEntityFromClassName(Snapshot.class.getName());
|
||||||
|
org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event(
|
||||||
|
ManagementServer.Name,
|
||||||
|
EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(),
|
||||||
|
event,
|
||||||
|
resourceName,
|
||||||
|
vo.getUuid());
|
||||||
|
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||||
|
eventDescription.put("resource", resourceName);
|
||||||
|
eventDescription.put("id", vo.getUuid());
|
||||||
|
eventDescription.put("old-state", oldState.name());
|
||||||
|
eventDescription.put("new-state", newState.name());
|
||||||
|
eventMsg.setDescription(eventDescription);
|
||||||
|
try {
|
||||||
|
_eventBus.publish(eventMsg);
|
||||||
|
} catch (EventBusException e) {
|
||||||
|
s_logger.warn("Failed to publish state change event on the the event bus.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEntityFromClassName(String entityClassName) {
|
||||||
|
int index = entityClassName.lastIndexOf(".");
|
||||||
|
String entityName = entityClassName;
|
||||||
|
if (index != -1) {
|
||||||
|
entityName = entityClassName.substring(index+1);
|
||||||
|
}
|
||||||
|
return entityName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
|
||||||
|
package com.cloud.storage.listener;
|
||||||
|
|
||||||
|
import com.cloud.event.EventCategory;
|
||||||
|
import com.cloud.storage.Volume;
|
||||||
|
import com.cloud.storage.Volume.Event;
|
||||||
|
import com.cloud.storage.Volume.State;
|
||||||
|
import com.cloud.server.ManagementServer;
|
||||||
|
import com.cloud.utils.fsm.StateListener;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBus;
|
||||||
|
import org.apache.cloudstack.framework.events.EventBusException;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
public class VolumeStateListener implements StateListener<State, Event, Volume> {
|
||||||
|
|
||||||
|
// get the event bus provider if configured
|
||||||
|
@Inject protected EventBus _eventBus = null;
|
||||||
|
|
||||||
|
private static final Logger s_logger = Logger.getLogger(VolumeStateListener.class);
|
||||||
|
|
||||||
|
public VolumeStateListener() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preStateTransitionEvent(State oldState, Event event, State newState, Volume vo, boolean status, Object opaque) {
|
||||||
|
pubishOnEventBus(event.name(), "preStateTransitionEvent", vo, oldState, newState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean postStateTransitionEvent(State oldState, Event event, State newState, Volume vo, boolean status, Object opaque) {
|
||||||
|
pubishOnEventBus(event.name(), "postStateTransitionEvent", vo, oldState, newState);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pubishOnEventBus(String event, String status, Volume vo, State oldState, State newState) {
|
||||||
|
|
||||||
|
if (_eventBus == null) {
|
||||||
|
return; // no provider is configured to provide events bus, so just return
|
||||||
|
}
|
||||||
|
|
||||||
|
String resourceName = getEntityFromClassName(Volume.class.getName());
|
||||||
|
org.apache.cloudstack.framework.events.Event eventMsg = new org.apache.cloudstack.framework.events.Event(
|
||||||
|
ManagementServer.Name,
|
||||||
|
EventCategory.RESOURCE_STATE_CHANGE_EVENT.getName(),
|
||||||
|
event,
|
||||||
|
resourceName,
|
||||||
|
vo.getUuid());
|
||||||
|
Map<String, String> eventDescription = new HashMap<String, String>();
|
||||||
|
eventDescription.put("resource", resourceName);
|
||||||
|
eventDescription.put("id", vo.getUuid());
|
||||||
|
eventDescription.put("old-state", oldState.name());
|
||||||
|
eventDescription.put("new-state", newState.name());
|
||||||
|
eventMsg.setDescription(eventDescription);
|
||||||
|
try {
|
||||||
|
_eventBus.publish(eventMsg);
|
||||||
|
} catch (EventBusException e) {
|
||||||
|
s_logger.warn("Failed to state change event on the the event bus.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEntityFromClassName(String entityClassName) {
|
||||||
|
int index = entityClassName.lastIndexOf(".");
|
||||||
|
String entityName = entityClassName;
|
||||||
|
if (index != -1) {
|
||||||
|
entityName = entityClassName.substring(index+1);
|
||||||
|
}
|
||||||
|
return entityName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -33,22 +33,11 @@ import org.apache.log4j.Logger;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.*;
|
||||||
import com.cloud.agent.api.BackupSnapshotAnswer;
|
|
||||||
import com.cloud.agent.api.BackupSnapshotCommand;
|
|
||||||
import com.cloud.agent.api.Command;
|
|
||||||
import com.cloud.agent.api.DeleteSnapshotBackupCommand;
|
|
||||||
import com.cloud.agent.api.DeleteSnapshotsDirCommand;
|
|
||||||
import com.cloud.agent.api.DownloadSnapshotFromS3Command;
|
|
||||||
import com.cloud.agent.api.ManageSnapshotAnswer;
|
|
||||||
import com.cloud.agent.api.ManageSnapshotCommand;
|
|
||||||
import com.cloud.agent.api.downloadSnapshotFromSwiftCommand;
|
|
||||||
import com.cloud.agent.api.to.S3TO;
|
import com.cloud.agent.api.to.S3TO;
|
||||||
import com.cloud.agent.api.to.SwiftTO;
|
import com.cloud.agent.api.to.SwiftTO;
|
||||||
import com.cloud.alert.AlertManager;
|
import com.cloud.alert.AlertManager;
|
||||||
import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
|
|
||||||
import com.cloud.api.commands.ListRecurringSnapshotScheduleCmd;
|
import com.cloud.api.commands.ListRecurringSnapshotScheduleCmd;
|
||||||
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
|
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
@ -57,11 +46,7 @@ import com.cloud.dc.DataCenter;
|
|||||||
import com.cloud.dc.dao.ClusterDao;
|
import com.cloud.dc.dao.ClusterDao;
|
||||||
import com.cloud.dc.dao.DataCenterDao;
|
import com.cloud.dc.dao.DataCenterDao;
|
||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.*;
|
||||||
import com.cloud.event.EventTypes;
|
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.event.EventVO;
|
|
||||||
import com.cloud.event.UsageEventVO;
|
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
@ -71,44 +56,21 @@ import com.cloud.exception.StorageUnavailableException;
|
|||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
import com.cloud.host.dao.HostDao;
|
import com.cloud.host.dao.HostDao;
|
||||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||||
import com.cloud.network.PhysicalNetworkTrafficType;
|
|
||||||
import com.cloud.org.Grouping;
|
import com.cloud.org.Grouping;
|
||||||
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
import com.cloud.projects.Project.ListProjectResourcesCriteria;
|
||||||
import com.cloud.resource.ResourceManager;
|
import com.cloud.resource.ResourceManager;
|
||||||
import com.cloud.server.ResourceTag.TaggedResourceType;
|
import com.cloud.server.ResourceTag.TaggedResourceType;
|
||||||
import com.cloud.storage.Snapshot;
|
import com.cloud.storage.*;
|
||||||
import com.cloud.storage.Snapshot.Status;
|
|
||||||
import com.cloud.storage.Snapshot.Type;
|
import com.cloud.storage.Snapshot.Type;
|
||||||
import com.cloud.storage.SnapshotPolicyVO;
|
|
||||||
import com.cloud.storage.SnapshotScheduleVO;
|
|
||||||
import com.cloud.storage.SnapshotVO;
|
|
||||||
import com.cloud.storage.Storage;
|
|
||||||
import com.cloud.storage.Storage.StoragePoolType;
|
import com.cloud.storage.Storage.StoragePoolType;
|
||||||
import com.cloud.storage.StorageManager;
|
import com.cloud.storage.dao.*;
|
||||||
import com.cloud.storage.StoragePool;
|
import com.cloud.storage.listener.SnapshotStateListener;
|
||||||
import com.cloud.storage.StoragePoolVO;
|
|
||||||
import com.cloud.storage.VMTemplateVO;
|
|
||||||
import com.cloud.storage.Volume;
|
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.dao.DiskOfferingDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotPolicyDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotScheduleDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.s3.S3Manager;
|
import com.cloud.storage.s3.S3Manager;
|
||||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||||
import com.cloud.storage.swift.SwiftManager;
|
import com.cloud.storage.swift.SwiftManager;
|
||||||
import com.cloud.tags.ResourceTagVO;
|
import com.cloud.tags.ResourceTagVO;
|
||||||
import com.cloud.tags.dao.ResourceTagDao;
|
import com.cloud.tags.dao.ResourceTagDao;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.*;
|
||||||
import com.cloud.user.AccountManager;
|
|
||||||
import com.cloud.user.AccountVO;
|
|
||||||
import com.cloud.user.DomainManager;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.user.User;
|
|
||||||
import com.cloud.user.UserContext;
|
|
||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.utils.DateUtil;
|
import com.cloud.utils.DateUtil;
|
||||||
import com.cloud.utils.DateUtil.IntervalType;
|
import com.cloud.utils.DateUtil.IntervalType;
|
||||||
@ -124,12 +86,24 @@ import com.cloud.utils.db.JoinBuilder;
|
|||||||
import com.cloud.utils.db.SearchBuilder;
|
import com.cloud.utils.db.SearchBuilder;
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
import com.cloud.utils.db.SearchCriteria;
|
||||||
import com.cloud.utils.db.Transaction;
|
import com.cloud.utils.db.Transaction;
|
||||||
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import com.cloud.utils.fsm.NoTransitionException;
|
||||||
|
import com.cloud.utils.fsm.StateMachine2;
|
||||||
import com.cloud.vm.UserVmVO;
|
import com.cloud.vm.UserVmVO;
|
||||||
import com.cloud.vm.VMInstanceVO;
|
import com.cloud.vm.VMInstanceVO;
|
||||||
import com.cloud.vm.VirtualMachine;
|
import com.cloud.vm.VirtualMachine;
|
||||||
import com.cloud.vm.VirtualMachine.State;
|
import com.cloud.vm.VirtualMachine.State;
|
||||||
import com.cloud.vm.dao.UserVmDao;
|
import com.cloud.vm.dao.UserVmDao;
|
||||||
|
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotPolicyCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.snapshot.DeleteSnapshotPoliciesCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotPoliciesCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.snapshot.ListSnapshotsCmd;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import javax.ejb.Local;
|
||||||
|
import javax.naming.ConfigurationException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Local(value = { SnapshotManager.class, SnapshotService.class })
|
@Local(value = { SnapshotManager.class, SnapshotService.class })
|
||||||
@ -199,6 +173,8 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
private int _deltaSnapshotMax;
|
private int _deltaSnapshotMax;
|
||||||
private int _backupsnapshotwait;
|
private int _backupsnapshotwait;
|
||||||
|
|
||||||
|
private StateMachine2<Snapshot.State, Snapshot.Event, Snapshot> _snapshotFsm;
|
||||||
|
|
||||||
protected SearchBuilder<SnapshotVO> PolicySnapshotSearch;
|
protected SearchBuilder<SnapshotVO> PolicySnapshotSearch;
|
||||||
protected SearchBuilder<SnapshotPolicyVO> PoliciesForSnapSearch;
|
protected SearchBuilder<SnapshotPolicyVO> PoliciesForSnapSearch;
|
||||||
|
|
||||||
@ -263,6 +239,13 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
if (snapshot == null) {
|
if (snapshot == null) {
|
||||||
throw new CloudRuntimeException("Can not find snapshot " + snapshotId);
|
throw new CloudRuntimeException("Can not find snapshot " + snapshotId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stateTransitTo(snapshot, Snapshot.Event.CreateRequested);
|
||||||
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("Failed to update snapshot state due to " + nte.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
// Send a ManageSnapshotCommand to the agent
|
// Send a ManageSnapshotCommand to the agent
|
||||||
String vmName = _storageMgr.getVmNameOnVolume(volume);
|
String vmName = _storageMgr.getVmNameOnVolume(volume);
|
||||||
long volumeId = volume.getId();
|
long volumeId = volume.getId();
|
||||||
@ -293,14 +276,16 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
if (preSnapshotPath != null && preSnapshotPath.equals(answer.getSnapshotPath())) {
|
if (preSnapshotPath != null && preSnapshotPath.equals(answer.getSnapshotPath())) {
|
||||||
// empty snapshot
|
// empty snapshot
|
||||||
s_logger.debug("CreateSnapshot: this is empty snapshot ");
|
s_logger.debug("CreateSnapshot: this is empty snapshot ");
|
||||||
|
try {
|
||||||
snapshot.setPath(preSnapshotPath);
|
snapshot.setPath(preSnapshotPath);
|
||||||
snapshot.setBackupSnapshotId(preSnapshotVO.getBackupSnapshotId());
|
snapshot.setBackupSnapshotId(preSnapshotVO.getBackupSnapshotId());
|
||||||
snapshot.setSwiftId(preSnapshotVO.getSwiftId());
|
snapshot.setSwiftId(preSnapshotVO.getSwiftId());
|
||||||
|
|
||||||
snapshot.setStatus(Snapshot.Status.BackedUp);
|
|
||||||
snapshot.setPrevSnapshotId(preId);
|
snapshot.setPrevSnapshotId(preId);
|
||||||
snapshot.setSecHostId(preSnapshotVO.getSecHostId());
|
snapshot.setSecHostId(preSnapshotVO.getSecHostId());
|
||||||
_snapshotDao.update(snapshotId, snapshot);
|
stateTransitTo(snapshot, Snapshot.Event.OperationNotPerformed);
|
||||||
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("CreateSnapshot: failed to update state of snapshot due to " + nte.getMessage());
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
long preSnapshotId = 0;
|
long preSnapshotId = 0;
|
||||||
|
|
||||||
@ -350,6 +335,11 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
if (answer != null) {
|
if (answer != null) {
|
||||||
s_logger.error(answer.getDetails());
|
s_logger.error(answer.getDetails());
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
stateTransitTo(snapshot, Snapshot.Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("Failed to update snapshot state due to " + nte.getMessage());
|
||||||
|
}
|
||||||
throw new CloudRuntimeException("Creating snapshot for volume " + volumeId + " on primary storage failed.");
|
throw new CloudRuntimeException("Creating snapshot for volume " + volumeId + " on primary storage failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,7 +404,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(userVm.getHypervisorType() == HypervisorType.VMware || userVm.getHypervisorType() == HypervisorType.KVM) {
|
if(userVm.getHypervisorType() == HypervisorType.VMware || userVm.getHypervisorType() == HypervisorType.KVM) {
|
||||||
List<SnapshotVO> activeSnapshots = _snapshotDao.listByInstanceId(volume.getInstanceId(), Snapshot.Status.Creating, Snapshot.Status.CreatedOnPrimary, Snapshot.Status.BackingUp);
|
List<SnapshotVO> activeSnapshots = _snapshotDao.listByInstanceId(volume.getInstanceId(), Snapshot.State.Creating, Snapshot.State.CreatedOnPrimary, Snapshot.State.BackingUp);
|
||||||
if(activeSnapshots.size() > 1)
|
if(activeSnapshots.size() > 1)
|
||||||
throw new CloudRuntimeException("There is other active snapshot tasks on the instance to which the volume is attached, please try again later");
|
throw new CloudRuntimeException("There is other active snapshot tasks on the instance to which the volume is attached, please try again later");
|
||||||
}
|
}
|
||||||
@ -423,19 +413,15 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
|
|
||||||
snapshot = createSnapshotOnPrimary(volume, policyId, snapshotId);
|
snapshot = createSnapshotOnPrimary(volume, policyId, snapshotId);
|
||||||
if (snapshot != null) {
|
if (snapshot != null) {
|
||||||
if (snapshot.getStatus() == Snapshot.Status.CreatedOnPrimary) {
|
if (snapshot.getState() == Snapshot.State.CreatedOnPrimary) {
|
||||||
backedUp = backupSnapshotToSecondaryStorage(snapshot);
|
backedUp = backupSnapshotToSecondaryStorage(snapshot);
|
||||||
} else if (snapshot.getStatus() == Snapshot.Status.BackedUp) {
|
} else if (snapshot.getState() == Snapshot.State.BackedUp) {
|
||||||
// For empty snapshot we set status to BackedUp in createSnapshotOnPrimary
|
// For empty snapshot we set status to BackedUp in createSnapshotOnPrimary
|
||||||
backedUp = true;
|
backedUp = true;
|
||||||
} else {
|
} else {
|
||||||
snapshot.setStatus(Status.Error);
|
|
||||||
_snapshotDao.update(snapshot.getId(), snapshot);
|
|
||||||
throw new CloudRuntimeException("Failed to create snapshot: " + snapshot + " on primary storage");
|
throw new CloudRuntimeException("Failed to create snapshot: " + snapshot + " on primary storage");
|
||||||
}
|
}
|
||||||
if (!backedUp) {
|
if (!backedUp) {
|
||||||
snapshot.setStatus(Status.Error);
|
|
||||||
_snapshotDao.update(snapshot.getId(), snapshot);
|
|
||||||
throw new CloudRuntimeException("Created snapshot: " + snapshot + " on primary but failed to backup on secondary");
|
throw new CloudRuntimeException("Created snapshot: " + snapshot + " on primary but failed to backup on secondary");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -448,23 +434,15 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
//Check if the snapshot was removed while backingUp. If yes, do not log snapshot create usage event
|
//Check if the snapshot was removed while backingUp. If yes, do not log snapshot create usage event
|
||||||
SnapshotVO freshSnapshot = _snapshotDao.findById(snapshot.getId());
|
SnapshotVO freshSnapshot = _snapshotDao.findById(snapshot.getId());
|
||||||
if ((freshSnapshot != null) && backedUp) {
|
if ((freshSnapshot != null) && backedUp) {
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_CREATE, snapshot.getAccountId(), snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null, null,
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_CREATE, snapshot.getAccountId(),
|
||||||
volume.getSize());
|
snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null, null,
|
||||||
_usageEventDao.persist(usageEvent);
|
volume.getSize(), snapshot.getClass().getName(), snapshot.getUuid());
|
||||||
}
|
}
|
||||||
if( !backedUp ) {
|
if( !backedUp ) {
|
||||||
|
|
||||||
snapshot.setStatus(Status.Error);
|
|
||||||
_snapshotDao.update(snapshot.getId(), snapshot);
|
|
||||||
} else {
|
} else {
|
||||||
_resourceLimitMgr.incrementResourceCount(snapshotOwner.getId(), ResourceType.snapshot);
|
_resourceLimitMgr.incrementResourceCount(snapshotOwner.getId(), ResourceType.snapshot);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
snapshot = _snapshotDao.findById(snapshotId);
|
|
||||||
if (snapshot != null) {
|
|
||||||
snapshot.setStatus(Status.Error);
|
|
||||||
_snapshotDao.update(snapshotId, snapshot);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -482,9 +460,12 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
private SnapshotVO updateDBOnCreate(Long id, String snapshotPath, long preSnapshotId) {
|
private SnapshotVO updateDBOnCreate(Long id, String snapshotPath, long preSnapshotId) {
|
||||||
SnapshotVO createdSnapshot = _snapshotDao.findByIdIncludingRemoved(id);
|
SnapshotVO createdSnapshot = _snapshotDao.findByIdIncludingRemoved(id);
|
||||||
createdSnapshot.setPath(snapshotPath);
|
createdSnapshot.setPath(snapshotPath);
|
||||||
createdSnapshot.setStatus(Snapshot.Status.CreatedOnPrimary);
|
|
||||||
createdSnapshot.setPrevSnapshotId(preSnapshotId);
|
createdSnapshot.setPrevSnapshotId(preSnapshotId);
|
||||||
_snapshotDao.update(id, createdSnapshot);
|
try {
|
||||||
|
stateTransitTo(createdSnapshot, Snapshot.Event.OperationSucceeded);
|
||||||
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("Faile to update state of snapshot due to " + nte.getMessage());
|
||||||
|
}
|
||||||
return createdSnapshot;
|
return createdSnapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,9 +607,11 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
throw new CloudRuntimeException("Can not acquire lock for snapshot: " + ss);
|
throw new CloudRuntimeException("Can not acquire lock for snapshot: " + ss);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
try {
|
||||||
snapshot.setStatus(Snapshot.Status.BackingUp);
|
stateTransitTo(snapshot, Snapshot.Event.BackupToSecondary);
|
||||||
_snapshotDao.update(snapshot.getId(), snapshot);
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("Failed to update the state of snapshot while backing up snapshot");
|
||||||
|
}
|
||||||
|
|
||||||
long volumeId = snapshot.getVolumeId();
|
long volumeId = snapshot.getVolumeId();
|
||||||
VolumeVO volume = _volsDao.lockRow(volumeId, true);
|
VolumeVO volume = _volsDao.lockRow(volumeId, true);
|
||||||
@ -709,10 +692,18 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
if (answer.isFull()) {
|
if (answer.isFull()) {
|
||||||
snapshot.setPrevSnapshotId(0);
|
snapshot.setPrevSnapshotId(0);
|
||||||
}
|
}
|
||||||
snapshot.setStatus(Snapshot.Status.BackedUp);
|
try {
|
||||||
_snapshotDao.update(snapshotId, snapshot);
|
stateTransitTo(snapshot, Snapshot.Event.OperationSucceeded);
|
||||||
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("Failed to update the state of snapshot while backing up snapshot");
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
try {
|
||||||
|
stateTransitTo(snapshot, Snapshot.Event.OperationFailed);
|
||||||
|
} catch (NoTransitionException nte) {
|
||||||
|
s_logger.debug("Failed to update the state of snapshot while backing up snapshot");
|
||||||
|
}
|
||||||
s_logger.warn("Failed to back up snapshot on secondary storage, deleting the record from the DB");
|
s_logger.warn("Failed to back up snapshot on secondary storage, deleting the record from the DB");
|
||||||
_snapshotDao.remove(snapshotId);
|
_snapshotDao.remove(snapshotId);
|
||||||
}
|
}
|
||||||
@ -771,7 +762,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
s_logger.debug("Max snaps: " + policy.getMaxSnaps() + " exceeded for snapshot policy with Id: " + policyId + ". Deleting oldest snapshot: " + oldSnapId);
|
s_logger.debug("Max snaps: " + policy.getMaxSnaps() + " exceeded for snapshot policy with Id: " + policyId + ". Deleting oldest snapshot: " + oldSnapId);
|
||||||
if(deleteSnapshotInternal(oldSnapId)){
|
if(deleteSnapshotInternal(oldSnapId)){
|
||||||
//log Snapshot delete event
|
//log Snapshot delete event
|
||||||
EventUtils.saveEvent(User.UID_SYSTEM, oldestSnapshot.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_SNAPSHOT_DELETE, "Successfully deleted oldest snapshot: " + oldSnapId, 0);
|
ActionEventUtils.onCompletedActionEvent(User.UID_SYSTEM, oldestSnapshot.getAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_SNAPSHOT_DELETE, "Successfully deleted oldest snapshot: " + oldSnapId, 0);
|
||||||
}
|
}
|
||||||
snaps.remove(oldestSnapshot);
|
snaps.remove(oldestSnapshot);
|
||||||
}
|
}
|
||||||
@ -791,7 +782,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
|
|
||||||
_accountMgr.checkAccess(caller, null, true, snapshotCheck);
|
_accountMgr.checkAccess(caller, null, true, snapshotCheck);
|
||||||
|
|
||||||
if( !Status.BackedUp.equals(snapshotCheck.getStatus() ) ) {
|
if( !Snapshot.State.BackedUp.equals(snapshotCheck.getState() ) ) {
|
||||||
throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is not in BackedUp Status");
|
throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is not in BackedUp Status");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,9 +807,10 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
Transaction txn = Transaction.currentTxn();
|
Transaction txn = Transaction.currentTxn();
|
||||||
txn.start();
|
txn.start();
|
||||||
_snapshotDao.remove(snapshotId);
|
_snapshotDao.remove(snapshotId);
|
||||||
if (snapshot.getStatus() == Snapshot.Status.BackedUp) {
|
if (snapshot.getState() == Snapshot.State.BackedUp) {
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_DELETE, snapshot.getAccountId(), snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null, null, 0L);
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_DELETE, snapshot.getAccountId(),
|
||||||
_usageEventDao.persist(usageEvent);
|
snapshot.getDataCenterId(), snapshotId, snapshot.getName(), null, null, 0L,
|
||||||
|
snapshot.getClass().getName(), snapshot.getUuid());
|
||||||
}
|
}
|
||||||
_resourceLimitMgr.decrementResourceCount(snapshot.getAccountId(), ResourceType.snapshot);
|
_resourceLimitMgr.decrementResourceCount(snapshot.getAccountId(), ResourceType.snapshot);
|
||||||
txn.commit();
|
txn.commit();
|
||||||
@ -970,7 +962,7 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
SearchBuilder<SnapshotVO> sb = _snapshotDao.createSearchBuilder();
|
SearchBuilder<SnapshotVO> sb = _snapshotDao.createSearchBuilder();
|
||||||
_accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
|
_accountMgr.buildACLSearchBuilder(sb, domainId, isRecursive, permittedAccounts, listProjectResourcesCriteria);
|
||||||
|
|
||||||
sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ);
|
sb.and("status", sb.entity().getState(), SearchCriteria.Op.EQ);
|
||||||
sb.and("volumeId", sb.entity().getVolumeId(), SearchCriteria.Op.EQ);
|
sb.and("volumeId", sb.entity().getVolumeId(), SearchCriteria.Op.EQ);
|
||||||
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
|
sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE);
|
||||||
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
|
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
|
||||||
@ -1119,9 +1111,9 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Log event after successful deletion
|
// Log event after successful deletion
|
||||||
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_SNAPSHOT_DELETE, snapshot.getAccountId(), volume.getDataCenterId(), snapshot.getId(), snapshot.getName(), null, null,
|
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_DELETE, snapshot.getAccountId(),
|
||||||
volume.getSize());
|
volume.getDataCenterId(), snapshot.getId(), snapshot.getName(), null, null,
|
||||||
_usageEventDao.persist(usageEvent);
|
volume.getSize(), snapshot.getClass().getName(), snapshot.getUuid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1448,6 +1440,9 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
|
|
||||||
s_logger.info("Snapshot Manager is configured.");
|
s_logger.info("Snapshot Manager is configured.");
|
||||||
|
|
||||||
|
_snapshotFsm = Snapshot.State.getStateMachine();
|
||||||
|
_snapshotFsm.registerListener(new SnapshotStateListener());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1529,11 +1524,15 @@ public class SnapshotManagerImpl extends ManagerBase implements SnapshotManager,
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canOperateOnVolume(VolumeVO volume) {
|
public boolean canOperateOnVolume(VolumeVO volume) {
|
||||||
List<SnapshotVO> snapshots = _snapshotDao.listByStatus(volume.getId(), Status.Creating, Status.CreatedOnPrimary, Status.BackingUp);
|
List<SnapshotVO> snapshots = _snapshotDao.listByStatus(volume.getId(), Snapshot.State.Creating,
|
||||||
|
Snapshot.State.CreatedOnPrimary, Snapshot.State.BackingUp);
|
||||||
if (snapshots.size() > 0) {
|
if (snapshots.size() > 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected boolean stateTransitTo(Snapshot snapshot, Snapshot.Event e) throws NoTransitionException {
|
||||||
|
return _snapshotFsm.transitTo(snapshot, e, null, _snapshotDao);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,6 +27,7 @@ import javax.ejb.Local;
|
|||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.naming.ConfigurationException;
|
import javax.naming.ConfigurationException;
|
||||||
|
|
||||||
|
import com.cloud.event.ActionEventUtils;
|
||||||
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
|
import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@ -41,7 +42,6 @@ import com.cloud.async.AsyncJobVO;
|
|||||||
import com.cloud.async.dao.AsyncJobDao;
|
import com.cloud.async.dao.AsyncJobDao;
|
||||||
import com.cloud.configuration.dao.ConfigurationDao;
|
import com.cloud.configuration.dao.ConfigurationDao;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.EventUtils;
|
|
||||||
import com.cloud.storage.Snapshot;
|
import com.cloud.storage.Snapshot;
|
||||||
import com.cloud.storage.SnapshotPolicyVO;
|
import com.cloud.storage.SnapshotPolicyVO;
|
||||||
import com.cloud.storage.SnapshotScheduleVO;
|
import com.cloud.storage.SnapshotScheduleVO;
|
||||||
@ -235,8 +235,8 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu
|
|||||||
|
|
||||||
|
|
||||||
tmpSnapshotScheduleVO = _snapshotScheduleDao.acquireInLockTable(snapshotScheId);
|
tmpSnapshotScheduleVO = _snapshotScheduleDao.acquireInLockTable(snapshotScheId);
|
||||||
Long eventId = EventUtils.saveScheduledEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM,
|
Long eventId = ActionEventUtils.onScheduledActionEvent(User.UID_SYSTEM, Account.ACCOUNT_ID_SYSTEM,
|
||||||
EventTypes.EVENT_SNAPSHOT_CREATE, "creating snapshot for volume Id:"+volumeId,0);
|
EventTypes.EVENT_SNAPSHOT_CREATE, "creating snapshot for volume Id:" + volumeId, 0);
|
||||||
|
|
||||||
Map<String, String> params = new HashMap<String, String>();
|
Map<String, String> params = new HashMap<String, String>();
|
||||||
params.put(ApiConstants.VOLUME_ID, "" + volumeId);
|
params.put(ApiConstants.VOLUME_ID, "" + volumeId);
|
||||||
|
|||||||
@ -34,12 +34,10 @@ import org.springframework.stereotype.Component;
|
|||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
import com.cloud.agent.api.storage.DeleteTemplateCommand;
|
import com.cloud.agent.api.storage.DeleteTemplateCommand;
|
||||||
import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
|
|
||||||
import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
|
|
||||||
import com.cloud.configuration.Resource.ResourceType;
|
import com.cloud.configuration.Resource.ResourceType;
|
||||||
import com.cloud.dc.DataCenterVO;
|
import com.cloud.dc.DataCenterVO;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
import com.cloud.exception.ResourceAllocationException;
|
import com.cloud.exception.ResourceAllocationException;
|
||||||
import com.cloud.host.HostVO;
|
import com.cloud.host.HostVO;
|
||||||
@ -55,6 +53,15 @@ import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
|||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.DB;
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
|
import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
|
||||||
|
import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import javax.ejb.Local;
|
||||||
|
import java.net.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Local(value=TemplateAdapter.class)
|
@Local(value=TemplateAdapter.class)
|
||||||
@ -205,8 +212,7 @@ public class HyervisorTemplateAdapter extends TemplateAdapterBase implements Tem
|
|||||||
success = false;
|
success = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
UsageEventVO usageEvent = new UsageEventVO(eventType, account.getId(), sZoneId, templateId, null);
|
UsageEventUtils.publishUsageEvent(eventType, account.getId(), sZoneId, templateId, null, null, null);
|
||||||
_usageEventDao.persist(usageEvent);
|
|
||||||
templateHostVO.setDestroyed(true);
|
templateHostVO.setDestroyed(true);
|
||||||
_tmpltHostDao.update(templateHostVO.getId(), templateHostVO);
|
_tmpltHostDao.update(templateHostVO.getId(), templateHostVO);
|
||||||
String installPath = templateHostVO.getInstallPath();
|
String installPath = templateHostVO.getInstallPath();
|
||||||
|
|||||||
@ -46,13 +46,11 @@ import org.apache.cloudstack.acl.SecurityChecker.AccessType;
|
|||||||
import com.cloud.agent.AgentManager;
|
import com.cloud.agent.AgentManager;
|
||||||
import com.cloud.agent.api.Answer;
|
import com.cloud.agent.api.Answer;
|
||||||
import com.cloud.agent.api.downloadTemplateFromSwiftToSecondaryStorageCommand;
|
import com.cloud.agent.api.downloadTemplateFromSwiftToSecondaryStorageCommand;
|
||||||
import com.cloud.agent.api.uploadTemplateToSwiftFromSecondaryStorageCommand;
|
|
||||||
import com.cloud.agent.api.storage.DestroyCommand;
|
import com.cloud.agent.api.storage.DestroyCommand;
|
||||||
import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
|
import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
|
||||||
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
|
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
|
||||||
import com.cloud.agent.api.to.SwiftTO;
|
import com.cloud.agent.api.to.SwiftTO;
|
||||||
import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd;
|
import com.cloud.agent.api.uploadTemplateToSwiftFromSecondaryStorageCommand;
|
||||||
import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
|
|
||||||
import com.cloud.async.AsyncJobManager;
|
import com.cloud.async.AsyncJobManager;
|
||||||
import com.cloud.async.AsyncJobVO;
|
import com.cloud.async.AsyncJobVO;
|
||||||
import com.cloud.configuration.Config;
|
import com.cloud.configuration.Config;
|
||||||
@ -65,7 +63,7 @@ import com.cloud.dc.dao.DataCenterDao;
|
|||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
import com.cloud.event.ActionEvent;
|
import com.cloud.event.ActionEvent;
|
||||||
import com.cloud.event.EventTypes;
|
import com.cloud.event.EventTypes;
|
||||||
import com.cloud.event.UsageEventVO;
|
import com.cloud.event.UsageEventUtils;
|
||||||
import com.cloud.event.dao.EventDao;
|
import com.cloud.event.dao.EventDao;
|
||||||
import com.cloud.event.dao.UsageEventDao;
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
@ -79,9 +77,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
|||||||
import com.cloud.hypervisor.HypervisorGuruManager;
|
import com.cloud.hypervisor.HypervisorGuruManager;
|
||||||
import com.cloud.projects.Project;
|
import com.cloud.projects.Project;
|
||||||
import com.cloud.projects.ProjectManager;
|
import com.cloud.projects.ProjectManager;
|
||||||
import com.cloud.storage.LaunchPermissionVO;
|
import com.cloud.storage.*;
|
||||||
import com.cloud.storage.SnapshotVO;
|
|
||||||
import com.cloud.storage.Storage;
|
|
||||||
import com.cloud.storage.Storage.ImageFormat;
|
import com.cloud.storage.Storage.ImageFormat;
|
||||||
import com.cloud.storage.Storage.TemplateType;
|
import com.cloud.storage.Storage.TemplateType;
|
||||||
import com.cloud.storage.StorageManager;
|
import com.cloud.storage.StorageManager;
|
||||||
@ -92,39 +88,15 @@ import com.cloud.storage.StoragePoolVO;
|
|||||||
import com.cloud.storage.TemplateProfile;
|
import com.cloud.storage.TemplateProfile;
|
||||||
import com.cloud.storage.Upload;
|
import com.cloud.storage.Upload;
|
||||||
import com.cloud.storage.Upload.Type;
|
import com.cloud.storage.Upload.Type;
|
||||||
import com.cloud.storage.UploadVO;
|
|
||||||
import com.cloud.storage.VMTemplateHostVO;
|
|
||||||
import com.cloud.storage.VMTemplateStoragePoolVO;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc;
|
|
||||||
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
|
||||||
import com.cloud.storage.VMTemplateSwiftVO;
|
import com.cloud.storage.dao.*;
|
||||||
import com.cloud.storage.VMTemplateVO;
|
|
||||||
import com.cloud.storage.VMTemplateZoneVO;
|
|
||||||
import com.cloud.storage.VolumeVO;
|
|
||||||
import com.cloud.storage.dao.LaunchPermissionDao;
|
|
||||||
import com.cloud.storage.dao.SnapshotDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolDao;
|
|
||||||
import com.cloud.storage.dao.StoragePoolHostDao;
|
|
||||||
import com.cloud.storage.dao.UploadDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateHostDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplatePoolDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateS3Dao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateSwiftDao;
|
|
||||||
import com.cloud.storage.dao.VMTemplateZoneDao;
|
|
||||||
import com.cloud.storage.dao.VolumeDao;
|
|
||||||
import com.cloud.storage.download.DownloadMonitor;
|
import com.cloud.storage.download.DownloadMonitor;
|
||||||
import com.cloud.storage.s3.S3Manager;
|
import com.cloud.storage.s3.S3Manager;
|
||||||
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
import com.cloud.storage.secondary.SecondaryStorageVmManager;
|
||||||
import com.cloud.storage.swift.SwiftManager;
|
import com.cloud.storage.swift.SwiftManager;
|
||||||
import com.cloud.storage.upload.UploadMonitor;
|
import com.cloud.storage.upload.UploadMonitor;
|
||||||
import com.cloud.template.TemplateAdapter.TemplateAdapterType;
|
import com.cloud.template.TemplateAdapter.TemplateAdapterType;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.*;
|
||||||
import com.cloud.user.AccountManager;
|
|
||||||
import com.cloud.user.AccountService;
|
|
||||||
import com.cloud.user.AccountVO;
|
|
||||||
import com.cloud.user.ResourceLimitService;
|
|
||||||
import com.cloud.user.UserContext;
|
|
||||||
import com.cloud.user.dao.AccountDao;
|
import com.cloud.user.dao.AccountDao;
|
||||||
import com.cloud.user.dao.UserAccountDao;
|
import com.cloud.user.dao.UserAccountDao;
|
||||||
import com.cloud.user.dao.UserDao;
|
import com.cloud.user.dao.UserDao;
|
||||||
@ -133,14 +105,8 @@ import com.cloud.utils.NumbersUtil;
|
|||||||
import com.cloud.utils.component.AdapterBase;
|
import com.cloud.utils.component.AdapterBase;
|
||||||
import com.cloud.utils.component.ManagerBase;
|
import com.cloud.utils.component.ManagerBase;
|
||||||
|
|
||||||
import com.cloud.utils.component.Manager;
|
|
||||||
import com.cloud.utils.concurrency.NamedThreadFactory;
|
import com.cloud.utils.concurrency.NamedThreadFactory;
|
||||||
import com.cloud.utils.db.DB;
|
import com.cloud.utils.db.*;
|
||||||
import com.cloud.utils.db.GlobalLock;
|
|
||||||
import com.cloud.utils.db.JoinBuilder;
|
|
||||||
import com.cloud.utils.db.SearchBuilder;
|
|
||||||
import com.cloud.utils.db.SearchCriteria;
|
|
||||||
import com.cloud.utils.db.Transaction;
|
|
||||||
import com.cloud.utils.exception.CloudRuntimeException;
|
import com.cloud.utils.exception.CloudRuntimeException;
|
||||||
import com.cloud.vm.UserVmManager;
|
import com.cloud.vm.UserVmManager;
|
||||||
import com.cloud.vm.UserVmVO;
|
import com.cloud.vm.UserVmVO;
|
||||||
@ -825,8 +791,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
|
|||||||
_tmpltDao.addTemplateToZone(template, dstZoneId);
|
_tmpltDao.addTemplateToZone(template, dstZoneId);
|
||||||
|
|
||||||
if(account.getId() != Account.ACCOUNT_ID_SYSTEM){
|
if(account.getId() != Account.ACCOUNT_ID_SYSTEM){
|
||||||
UsageEventVO usageEvent = new UsageEventVO(copyEventType, account.getId(), dstZoneId, tmpltId, null, null, null, srcTmpltHost.getSize());
|
UsageEventUtils.publishUsageEvent(copyEventType, account.getId(), dstZoneId, tmpltId, null, null, null, srcTmpltHost.getSize(),
|
||||||
_usageEventDao.persist(usageEvent);
|
template.getClass().getName(), template.getUuid());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,10 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.cloudstack.acl.ControlledEntity;
|
import org.apache.cloudstack.acl.ControlledEntity;
|
||||||
|
import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
|
||||||
|
import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
|
||||||
|
|
||||||
import com.cloud.api.query.vo.ControlledViewEntity;
|
import com.cloud.api.query.vo.ControlledViewEntity;
|
||||||
import com.cloud.exception.ConcurrentOperationException;
|
import com.cloud.exception.ConcurrentOperationException;
|
||||||
import com.cloud.exception.ResourceUnavailableException;
|
import com.cloud.exception.ResourceUnavailableException;
|
||||||
@ -47,7 +51,7 @@ public interface AccountManager extends AccountService {
|
|||||||
|
|
||||||
Long checkAccessAndSpecifyAuthority(Account caller, Long zoneId);
|
Long checkAccessAndSpecifyAuthority(Account caller, Long zoneId);
|
||||||
|
|
||||||
Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details);
|
Account createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map details, String uuid, int regionId);
|
||||||
|
|
||||||
UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone);
|
UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone);
|
||||||
|
|
||||||
@ -103,4 +107,93 @@ public interface AccountManager extends AccountService {
|
|||||||
void buildACLSearchParameters(Account caller, Long id,
|
void buildACLSearchParameters(Account caller, Long id,
|
||||||
String accountName, Long projectId, List<Long> permittedAccounts, Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject, boolean listAll, boolean forProjectInvitation);
|
String accountName, Long projectId, List<Long> permittedAccounts, Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject, boolean listAll, boolean forProjectInvitation);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a user by userId
|
||||||
|
*
|
||||||
|
* @param accountId
|
||||||
|
* - id of the account do delete
|
||||||
|
*
|
||||||
|
* @return true if delete was successful, false otherwise
|
||||||
|
*/
|
||||||
|
boolean deleteUserAccount(long accountId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates an account
|
||||||
|
*
|
||||||
|
* @param cmd
|
||||||
|
* - the parameter containing accountId or account nameand domainId
|
||||||
|
* @return updated account object
|
||||||
|
*/
|
||||||
|
Account updateAccount(UpdateAccountCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables an account by accountName and domainId
|
||||||
|
*
|
||||||
|
* @param accountName
|
||||||
|
* @param domainId
|
||||||
|
* @param accountId
|
||||||
|
* @param disabled
|
||||||
|
* account if success
|
||||||
|
* @return true if disable was successful, false otherwise
|
||||||
|
*/
|
||||||
|
Account disableAccount(String accountName, Long domainId, Long accountId) throws ConcurrentOperationException, ResourceUnavailableException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables an account by accountId
|
||||||
|
*
|
||||||
|
* @param accountName
|
||||||
|
* - the enableAccount command defining the accountId to be deleted.
|
||||||
|
* @param domainId
|
||||||
|
* TODO
|
||||||
|
* @param accountId
|
||||||
|
* @return account object
|
||||||
|
*/
|
||||||
|
Account enableAccount(String accountName, Long domainId, Long accountId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes user by Id
|
||||||
|
* @param deleteUserCmd
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
boolean deleteUser(DeleteUserCmd deleteUserCmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update a user by userId
|
||||||
|
*
|
||||||
|
* @param userId
|
||||||
|
* @return UserAccount object
|
||||||
|
*/
|
||||||
|
UserAccount updateUser(UpdateUserCmd cmd);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disables a user by userId
|
||||||
|
*
|
||||||
|
* @param userId
|
||||||
|
* - the userId
|
||||||
|
* @return UserAccount object
|
||||||
|
*/
|
||||||
|
UserAccount disableUser(long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enables a user
|
||||||
|
*
|
||||||
|
* @param userId
|
||||||
|
* - the userId
|
||||||
|
* @return UserAccount object
|
||||||
|
*/
|
||||||
|
UserAccount enableUser(long userId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locks an account by accountId. A locked account cannot access the API, but will still have running VMs/IP
|
||||||
|
* addresses
|
||||||
|
* allocated/etc.
|
||||||
|
*
|
||||||
|
* @param accountName
|
||||||
|
* - the LockAccount command defining the accountId to be locked.
|
||||||
|
* @param domainId
|
||||||
|
* TODO
|
||||||
|
* @param accountId
|
||||||
|
* @return account object
|
||||||
|
*/
|
||||||
|
Account lockAccount(String accountName, Long domainId, Long accountId);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user