From c774b865c99ecc58ab91a9ad341f5af8306663de Mon Sep 17 00:00:00 2001 From: David Jumani Date: Wed, 1 Feb 2023 13:49:53 +0530 Subject: [PATCH] Tungsten integration (#7065) Co-authored-by: rtodirica Co-authored-by: Huy Le Co-authored-by: radu-todirica Co-authored-by: Huy Le Co-authored-by: Simon Weller Co-authored-by: dahn --- .../main/java/com/cloud/event/EventTypes.java | 29 + .../main/java/com/cloud/network/Network.java | 2 + .../com/cloud/network/NetworkService.java | 2 + .../main/java/com/cloud/network/Networks.java | 3 +- .../com/cloud/network/TungstenProvider.java | 31 + .../security/SecurityGroupService.java | 5 + .../security/TungstenSecurityGroupRule.java | 23 + .../com/cloud/offering/NetworkOffering.java | 3 + .../apache/cloudstack/api/ApiConstants.java | 62 + .../network/CreateNetworkOfferingCmd.java | 9 + .../user/network/CreateNetworkCmd.java | 7 + .../api/response/NetworkOfferingResponse.java | 8 + .../api/response/NetworkResponse.java | 12 + client/pom.xml | 14 + .../configuration/ConfigurationManager.java | 8 +- .../com/cloud/network/IpAddressManager.java | 6 + .../orchestration/NetworkOrchestrator.java | 35 +- .../TungstenGuestNetworkIpAddressVO.java | 104 + .../com/cloud/network/dao/IPAddressDao.java | 4 + .../cloud/network/dao/IPAddressDaoImpl.java | 26 + .../dao/TungstenGuestNetworkIpAddressDao.java | 34 + .../TungstenGuestNetworkIpAddressDaoImpl.java | 93 + .../network/dao/TungstenProviderDao.java | 32 + .../network/dao/TungstenProviderDaoImpl.java | 84 + .../network/element/TungstenProviderVO.java | 169 + .../security/TungstenSecurityGroupRuleVO.java | 129 + .../dao/TungstenSecurityGroupRuleDao.java | 31 + .../dao/TungstenSecurityGroupRuleDaoImpl.java | 78 + .../cloud/offerings/NetworkOfferingVO.java | 12 + ...spring-engine-schema-core-daos-context.xml | 3 + .../META-INF/db/schema-41720to41800.sql | 126 + plugins/hypervisors/kvm/pom.xml | 5 + .../resource/LibvirtComputingResource.java | 102 +- .../kvm/resource/VRouterVifDriver.java | 117 + .../LibvirtSetTfRouteCommandWrapper.java | 39 + ...irtSetupTungstenVRouterCommandWrapper.java | 40 + ...TungstenLoadbalancerSslCommandWrapper.java | 44 + ...ngstenLoadbalancerStatsCommandWrapper.java | 44 + .../kvm/resource/LibvirtVifDriverTest.java | 4 +- .../management/ContrailManagerImpl.java | 4 +- plugins/network-elements/tungsten/pom.xml | 47 + ...nNetworkGatewayToLogicalRouterCommand.java | 57 + .../api/AddTungstenNetworkSubnetCommand.java | 101 + .../api/AddTungstenPolicyRuleCommand.java | 133 + .../AddTungstenSecondaryIpAddressCommand.java | 64 + .../AddTungstenSecurityGroupRuleCommand.java | 89 + .../AddTungstenVmToSecurityGroupCommand.java | 52 + .../ApplyTungstenNetworkPolicyCommand.java | 86 + .../ApplyTungstenPortForwardingCommand.java | 89 + .../agent/api/ApplyTungstenTagCommand.java | 77 + .../api/AssignTungstenFloatingIpCommand.java | 70 + .../ClearTungstenNetworkGatewayCommand.java | 57 + .../CreateTungstenAddressGroupCommand.java | 64 + ...teTungstenApplicationPolicySetCommand.java | 52 + .../CreateTungstenDefaultProjectCommand.java | 20 + .../api/CreateTungstenDomainCommand.java | 51 + .../CreateTungstenFirewallPolicyCommand.java | 64 + .../CreateTungstenFirewallRuleCommand.java | 126 + .../api/CreateTungstenFloatingIpCommand.java | 70 + .../CreateTungstenFloatingIpPoolCommand.java | 59 + .../CreateTungstenLogicalRouterCommand.java | 57 + .../api/CreateTungstenNetworkCommand.java | 139 + ...ateTungstenNetworkLoadbalancerCommand.java | 200 ++ .../CreateTungstenNetworkPolicyCommand.java | 61 + .../api/CreateTungstenPolicyCommand.java | 58 + .../api/CreateTungstenProjectCommand.java | 64 + ...teTungstenRoutingLogicalRouterCommand.java | 58 + .../CreateTungstenSecurityGroupCommand.java | 64 + .../CreateTungstenServiceGroupCommand.java | 71 + .../agent/api/CreateTungstenTagCommand.java | 58 + .../api/CreateTungstenTagTypeCommand.java | 52 + .../CreateTungstenVirtualMachineCommand.java | 125 + .../DeleteTungstenAddressGroupCommand.java | 45 + ...teTungstenApplicationPolicySetCommand.java | 45 + .../api/DeleteTungstenDomainCommand.java | 45 + .../DeleteTungstenFirewallPolicyCommand.java | 45 + .../DeleteTungstenFirewallRuleCommand.java | 45 + .../api/DeleteTungstenFloatingIpCommand.java | 57 + .../DeleteTungstenFloatingIpPoolCommand.java | 51 + .../DeleteTungstenLoadBalancerCommand.java | 83 + ...teTungstenLoadBalancerListenerCommand.java | 51 + .../api/DeleteTungstenNetworkCommand.java | 46 + .../DeleteTungstenNetworkPolicyCommand.java | 57 + .../api/DeleteTungstenObjectCommand.java | 47 + .../api/DeleteTungstenPolicyCommand.java | 46 + .../api/DeleteTungstenProjectCommand.java | 45 + ...teTungstenRoutingLogicalRouterCommand.java | 46 + .../DeleteTungstenSecurityGroupCommand.java | 45 + .../DeleteTungstenServiceGroupCommand.java | 45 + .../agent/api/DeleteTungstenTagCommand.java | 46 + .../api/DeleteTungstenTagTypeCommand.java | 46 + .../api/DeleteTungstenVRouterPortCommand.java | 51 + .../agent/api/DeleteTungstenVmCommand.java | 46 + .../api/DeleteTungstenVmInterfaceCommand.java | 51 + .../api/GetTungstenFabricNetworkCommand.java | 21 + .../api/GetTungstenFloatingIpsCommand.java | 51 + .../api/GetTungstenLoadBalancerCommand.java | 51 + .../agent/api/GetTungstenNatIpCommand.java | 51 + .../api/GetTungstenNetworkDnsCommand.java | 51 + .../agent/api/GetTungstenPolicyCommand.java | 51 + .../api/GetTungstenSecurityGroupCommand.java | 45 + .../api/ListTungstenAddressGroupCommand.java | 45 + ...stTungstenApplicationPolicySetCommand.java | 45 + ...nectedNetworkFromLogicalRouterCommand.java | 45 + .../ListTungstenFirewallPolicyCommand.java | 51 + .../api/ListTungstenFirewallRuleCommand.java | 51 + .../agent/api/ListTungstenNetworkCommand.java | 51 + .../agent/api/ListTungstenNicCommand.java | 51 + .../agent/api/ListTungstenPolicyCommand.java | 64 + .../api/ListTungstenPolicyRuleCommand.java | 45 + ...stTungstenRoutingLogicalRouterCommand.java | 51 + .../api/ListTungstenServiceGroupCommand.java | 45 + .../agent/api/ListTungstenTagCommand.java | 76 + .../agent/api/ListTungstenTagTypeCommand.java | 45 + .../agent/api/ListTungstenVmCommand.java | 51 + .../api/ReleaseTungstenFloatingIpCommand.java | 57 + ...etworkGatewayFromLogicalRouterCommand.java | 51 + .../RemoveTungstenNetworkSubnetCommand.java | 51 + .../api/RemoveTungstenPolicyCommand.java | 51 + .../api/RemoveTungstenPolicyRuleCommand.java | 51 + ...moveTungstenSecondaryIpAddressCommand.java | 45 + ...emoveTungstenSecurityGroupRuleCommand.java | 51 + .../agent/api/RemoveTungstenTagCommand.java | 77 + ...oveTungstenVmFromSecurityGroupCommand.java | 52 + .../api/SetTungstenNetworkGatewayCommand.java | 70 + .../agent/api/SetupTfRouteCommand.java | 64 + .../api/SetupTungstenVRouterCommand.java | 77 + .../agent/api/StartupTungstenCommand.java | 26 + .../tungsten/agent/api/TungstenAnswer.java | 112 + .../tungsten/agent/api/TungstenCommand.java | 26 + ...ateLoadBalancerServiceInstanceCommand.java | 70 + ...teTungstenDefaultSecurityGroupCommand.java | 45 + ...gstenLoadBalancerHealthMonitorCommand.java | 95 + ...teTungstenLoadBalancerListenerCommand.java | 70 + ...dateTungstenLoadBalancerMemberCommand.java | 67 + ...UpdateTungstenLoadBalancerPoolCommand.java | 102 + .../UpdateTungstenLoadbalancerSslCommand.java | 83 + ...pdateTungstenLoadbalancerStatsCommand.java | 71 + .../UpdateTungstenVrouterConfigCommand.java | 45 + ...abricNetworkGatewayToLogicalRouterCmd.java | 97 + .../AddTungstenFabricPolicyRuleCmd.java | 131 + .../command/ApplyTungstenFabricPolicyCmd.java | 97 + .../command/ApplyTungstenFabricTagCmd.java | 109 + .../ConfigTungstenFabricServiceCmd.java | 203 ++ .../CreateTungstenFabricAddressGroupCmd.java | 95 + ...TungstenFabricApplicationPolicySetCmd.java | 89 + ...CreateTungstenFabricFirewallPolicyCmd.java | 96 + .../CreateTungstenFabricFirewallRuleCmd.java | 129 + .../CreateTungstenFabricLogicalRouterCmd.java | 87 + ...ateTungstenFabricManagementNetworkCmd.java | 94 + .../CreateTungstenFabricPolicyCmd.java | 87 + .../CreateTungstenFabricProviderCmd.java | 134 + .../CreateTungstenFabricPublicNetworkCmd.java | 105 + .../CreateTungstenFabricServiceGroupCmd.java | 98 + .../command/CreateTungstenFabricTagCmd.java | 89 + .../CreateTungstenFabricTagTypeCmd.java | 87 + .../DeleteTungstenFabricAddressGroupCmd.java | 86 + ...TungstenFabricApplicationPolicySetCmd.java | 86 + ...DeleteTungstenFabricFirewallPolicyCmd.java | 87 + .../DeleteTungstenFabricFirewallRuleCmd.java | 86 + .../DeleteTungstenFabricLogicalRouterCmd.java | 93 + .../DeleteTungstenFabricPolicyCmd.java | 86 + .../DeleteTungstenFabricServiceGroupCmd.java | 86 + .../command/DeleteTungstenFabricTagCmd.java | 86 + .../DeleteTungstenFabricTagTypeCmd.java | 86 + .../GetLoadBalancerSslCertificateCmd.java | 85 + .../ListTungstenFabricAddressGroupCmd.java | 90 + ...tTungstenFabricApplictionPolicySetCmd.java | 90 + .../ListTungstenFabricFirewallPolicyCmd.java | 93 + .../ListTungstenFabricFirewallRuleCmd.java | 93 + .../ListTungstenFabricLBHealthMonitorCmd.java | 75 + .../ListTungstenFabricLogicalRouterCmd.java | 93 + .../command/ListTungstenFabricNetworkCmd.java | 95 + .../api/command/ListTungstenFabricNicCmd.java | 89 + .../command/ListTungstenFabricPolicyCmd.java | 97 + .../ListTungstenFabricPolicyRuleCmd.java | 93 + .../ListTungstenFabricProvidersCmd.java | 88 + .../ListTungstenFabricServiceGroupCmd.java | 90 + .../api/command/ListTungstenFabricTagCmd.java | 104 + .../command/ListTungstenFabricTagTypeCmd.java | 90 + .../api/command/ListTungstenFabricVmCmd.java | 89 + ...ricNetworkGatewayFromLogicalRouterCmd.java | 97 + .../RemoveTungstenFabricPolicyCmd.java | 91 + .../RemoveTungstenFabricPolicyRuleCmd.java | 91 + .../command/RemoveTungstenFabricTagCmd.java | 104 + .../SynchronizeTungstenFabricDataCmd.java | 80 + ...pdateTungstenFabricLBHealthMonitorCmd.java | 161 + .../api/response/TlsDataResponse.java | 62 + .../TungstenFabricAddressGroupResponse.java | 116 + ...tenFabricApplicationPolicySetResponse.java | 136 + .../TungstenFabricFirewallPolicyResponse.java | 119 + .../TungstenFabricFirewallRuleResponse.java | 279 ++ ...TungstenFabricLBHealthMonitorResponse.java | 185 ++ .../TungstenFabricLogicalRouterResponse.java | 103 + .../TungstenFabricNetworkResponse.java | 88 + .../response/TungstenFabricNicResponse.java | 90 + .../TungstenFabricPolicyResponse.java | 135 + .../TungstenFabricProviderResponse.java | 148 + .../response/TungstenFabricRuleResponse.java | 278 ++ .../TungstenFabricServiceGroupResponse.java | 129 + .../response/TungstenFabricTagResponse.java | 222 ++ .../TungstenFabricTagTypeResponse.java | 82 + .../response/TungstenFabricVmResponse.java | 88 + .../dao/TungstenFabricLBHealthMonitorDao.java | 23 + .../TungstenFabricLBHealthMonitorDaoImpl.java | 46 + .../dao/TungstenFabricLBHealthMonitorVO.java | 159 + .../model/TungstenLoadBalancerMember.java | 47 + .../tungsten/model/TungstenLogicalRouter.java | 51 + .../network/tungsten/model/TungstenModel.java | 20 + .../tungsten/model/TungstenNetworkPolicy.java | 51 + .../network/tungsten/model/TungstenRule.java | 132 + .../network/tungsten/model/TungstenTag.java | 97 + .../tungsten/resource/TungstenResource.java | 2366 ++++++++++++++ .../network/tungsten/service/TungstenApi.java | 2790 +++++++++++++++++ .../tungsten/service/TungstenElement.java | 1185 +++++++ .../tungsten/service/TungstenFabricUtils.java | 58 + .../service/TungstenGuestNetworkGuru.java | 524 ++++ .../service/TungstenIntrospectApi.java | 40 + .../service/TungstenProviderService.java | 33 + .../service/TungstenProviderServiceImpl.java | 234 ++ .../tungsten/service/TungstenService.java | 207 ++ .../tungsten/service/TungstenServiceImpl.java | 2555 +++++++++++++++ .../tungsten/service/TungstenVRouterApi.java | 48 + .../tungsten/vrouter/CustomHttpDelete.java | 40 + .../network/tungsten/vrouter/Gateway.java | 75 + .../vrouter/IntrospectApiConnector.java | 23 + .../IntrospectApiConnectorFactory.java | 32 + .../vrouter/IntrospectApiConnectorImpl.java | 72 + .../network/tungsten/vrouter/Port.java | 166 + .../network/tungsten/vrouter/Subnet.java | 48 + .../network/tungsten/vrouter/VRouter.java | 63 + .../tungsten/vrouter/VRouterApiConnector.java | 34 + .../vrouter/VRouterApiConnectorFactory.java | 32 + .../vrouter/VRouterApiConnectorImpl.java | 138 + .../cloudstack/tungsten/module.properties | 21 + .../tungsten/spring-tungsten-context.xml | 42 + ...cNetworkGatewayToLogicalRouterCmdTest.java | 70 + .../AddTungstenFabricPolicyRuleCmdTest.java | 85 + .../ApplyTungstenFabricPolicyCmdTest.java | 64 + .../ApplyTungstenFabricTagCmdTest.java | 69 + .../ConfigTungstenFabricServiceCmdTest.java | 101 + ...eateTungstenFabricAddressGroupCmdTest.java | 66 + ...stenFabricApplicationPolicySetCmdTest.java | 63 + ...teTungstenFabricFirewallPolicyCmdTest.java | 66 + ...eateTungstenFabricFirewallRuleCmdTest.java | 80 + ...ateTungstenFabricLogicalRouterCmdTest.java | 62 + ...ungstenFabricManagementNetworkCmdTest.java | 67 + .../CreateTungstenFabricPolicyCmdTest.java | 60 + .../CreateTungstenFabricProviderCmdTest.java | 69 + ...ateTungstenFabricPublicNetworkCmdTest.java | 82 + ...eateTungstenFabricServiceGroupCmdTest.java | 67 + .../CreateTungstenFabricTagCmdTest.java | 62 + .../CreateTungstenFabricTagTypeCmdTest.java | 60 + ...leteTungstenFabricAddressGroupCmdTest.java | 61 + ...stenFabricApplicationPolicySetCmdTest.java | 61 + ...teTungstenFabricFirewallPolicyCmdTest.java | 61 + ...leteTungstenFabricFirewallRuleCmdTest.java | 61 + ...eteTungstenFabricLogicalRouterCmdTest.java | 67 + .../DeleteTungstenFabricPolicyCmdTest.java | 61 + ...leteTungstenFabricServiceGroupCmdTest.java | 61 + .../DeleteTungstenFabricTagCmdTest.java | 61 + .../DeleteTungstenFabricTagTypeCmdTest.java | 61 + .../GetLoadBalancerSslCertificateCmdTest.java | 64 + ...ListTungstenFabricAddressGroupCmdTest.java | 92 + ...gstenFabricApplictionPolicySetCmdTest.java | 93 + ...stTungstenFabricFirewallPolicyCmdTest.java | 93 + ...ListTungstenFabricFirewallRuleCmdTest.java | 93 + ...tTungstenFabricLBHealthMonitorCmdTest.java | 74 + ...istTungstenFabricLogicalRouterCmdTest.java | 93 + .../ListTungstenFabricNetworkCmdTest.java | 94 + .../command/ListTungstenFabricNicCmdTest.java | 92 + .../ListTungstenFabricPolicyCmdTest.java | 98 + .../ListTungstenFabricPolicyRuleCmdTest.java | 95 + .../ListTungstenFabricProvidersCmdTest.java | 75 + ...ListTungstenFabricServiceGroupCmdTest.java | 92 + .../command/ListTungstenFabricTagCmdTest.java | 107 + .../ListTungstenFabricTagTypeCmdTest.java | 92 + .../command/ListTungstenFabricVmCmdTest.java | 90 + ...etworkGatewayFromLogicalRouterCmdTest.java | 70 + .../RemoveTungstenFabricPolicyCmdTest.java | 63 + ...RemoveTungstenFabricPolicyRuleCmdTest.java | 63 + .../RemoveTungstenFabricTagCmdTest.java | 73 + .../SynchronizeTungstenFabricDataCmdTest.java | 59 + ...eTungstenFabricLBHealthMonitorCmdTest.java | 114 + .../resource/TungstenResourceTest.java | 1465 +++++++++ .../tungsten/service/TungstenApiTest.java | 2059 ++++++++++++ .../tungsten/service/TungstenElementTest.java | 1061 +++++++ .../service/TungstenFabricUtilsTest.java | 95 + .../service/TungstenGuestNetworkGuruTest.java | 532 ++++ .../service/TungstenIntrospectApiTest.java | 58 + .../service/TungstenProviderServiceTest.java | 133 + .../service/TungstenServiceImplTest.java | 1789 +++++++++++ .../service/TungstenVRouterApiTest.java | 78 + .../IntrospectApiConnectorImplTest.java | 127 + .../vrouter/VRouterApiConnectorImplTest.java | 222 ++ .../tungsten/src/test/resources/db.properties | 68 + .../src/test/resources/log4j.properties | 35 + plugins/pom.xml | 1 + .../vm/network/tungsten/create_tap_device.sh | 20 + .../vm/network/tungsten/delete_tap_device.sh | 19 + .../tungsten/setup_tungsten_vrouter.sh | 24 + .../update_tungsten_loadbalancer_ssl.sh | 36 + .../update_tungsten_loadbalancer_stats.sh | 41 + server/pom.xml | 12 + .../java/com/cloud/api/ApiResponseHelper.java | 3 +- .../api/query/vo/NetworkOfferingJoinVO.java | 8 + .../ConfigurationManagerImpl.java | 46 +- .../cloud/network/IpAddressManagerImpl.java | 20 + .../com/cloud/network/NetworkModelImpl.java | 6 + .../com/cloud/network/NetworkServiceImpl.java | 17 + .../security/SecurityGroupManagerImpl.java | 23 +- .../security/SecurityGroupManagerImpl2.java | 3 +- .../com/cloud/projects/ProjectManager.java | 3 + .../cloud/projects/ProjectManagerImpl.java | 12 +- .../cloud/server/ConfigurationServerImpl.java | 21 + .../com/cloud/user/AccountManagerImpl.java | 10 +- .../java/com/cloud/user/DomainManager.java | 2 + .../com/cloud/user/DomainManagerImpl.java | 1 + .../java/com/cloud/vm/UserVmManagerImpl.java | 7 + .../ConfigurationManagerTest.java | 4 + .../vpc/MockConfigurationManagerImpl.java | 2 +- .../CreateNetworkOfferingTest.java | 20 +- setup/dev/advancedsgtf.cfg | 131 + setup/dev/advancedtf.cfg | 134 + .../debian/opt/cloud/bin/setup_tf_route.py | 45 + test/integration/plugins/tf/common.py | 94 + .../plugins/tf/test_isolated_zone.py | 1410 +++++++++ .../plugins/tf/test_shared_zone.py | 972 ++++++ tools/apidoc/gen_toc.py | 74 + tools/marvin/marvin/deployDataCenter.py | 56 + tools/marvin/marvin/lib/base.py | 376 +++ .../java/com/cloud/utils/TungstenUtils.java | 290 ++ .../java/com/cloud/utils/net/NetUtils.java | 1 + 333 files changed, 41303 insertions(+), 37 deletions(-) create mode 100644 api/src/main/java/com/cloud/network/TungstenProvider.java create mode 100644 api/src/main/java/com/cloud/network/security/TungstenSecurityGroupRule.java create mode 100644 engine/schema/src/main/java/com/cloud/network/TungstenGuestNetworkIpAddressVO.java create mode 100644 engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDao.java create mode 100644 engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDaoImpl.java create mode 100644 engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDao.java create mode 100644 engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDaoImpl.java create mode 100644 engine/schema/src/main/java/com/cloud/network/element/TungstenProviderVO.java create mode 100644 engine/schema/src/main/java/com/cloud/network/security/TungstenSecurityGroupRuleVO.java create mode 100644 engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDao.java create mode 100644 engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDaoImpl.java create mode 100644 plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VRouterVifDriver.java create mode 100644 plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetTfRouteCommandWrapper.java create mode 100644 plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetupTungstenVRouterCommandWrapper.java create mode 100644 plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerSslCommandWrapper.java create mode 100644 plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerStatsCommandWrapper.java create mode 100644 plugins/network-elements/tungsten/pom.xml create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkGatewayToLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkSubnetCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenPolicyRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecondaryIpAddressCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecurityGroupRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenVmToSecurityGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenNetworkPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenPortForwardingCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenTagCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AssignTungstenFloatingIpCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ClearTungstenNetworkGatewayCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenAddressGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenApplicationPolicySetCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDefaultProjectCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDomainCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpPoolCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkLoadbalancerCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenProjectCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenRoutingLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenSecurityGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenServiceGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagTypeCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenVirtualMachineCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenAddressGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenApplicationPolicySetCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenDomainCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpPoolCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerListenerCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenObjectCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenProjectCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenRoutingLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenSecurityGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenServiceGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagTypeCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVRouterPortCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmInterfaceCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFabricNetworkCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFloatingIpsCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenLoadBalancerCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNatIpCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNetworkDnsCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenSecurityGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenAddressGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenApplicationPolicySetCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenConnectedNetworkFromLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNetworkCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNicCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenRoutingLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenServiceGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagTypeCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenVmCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ReleaseTungstenFloatingIpCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkGatewayFromLogicalRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkSubnetCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecondaryIpAddressCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecurityGroupRuleCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenTagCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenVmFromSecurityGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetTungstenNetworkGatewayCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTfRouteCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTungstenVRouterCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/StartupTungstenCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenAnswer.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateLoadBalancerServiceInstanceCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenDefaultSecurityGroupCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerHealthMonitorCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerListenerCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerMemberCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerPoolCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerSslCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerStatsCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenVrouterConfigCommand.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmd.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TlsDataResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricAddressGroupResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricApplicationPolicySetResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallPolicyResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallRuleResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLBHealthMonitorResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLogicalRouterResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNetworkResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNicResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricPolicyResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricProviderResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricRuleResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricServiceGroupResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagTypeResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricVmResponse.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDao.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDaoImpl.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorVO.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLoadBalancerMember.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLogicalRouter.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenModel.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenNetworkPolicy.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenRule.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenTag.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/resource/TungstenResource.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenApi.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenElement.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtils.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuru.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApi.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderService.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceImpl.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenService.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApi.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/CustomHttpDelete.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Gateway.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnector.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorFactory.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImpl.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Port.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Subnet.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouter.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnector.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorFactory.java create mode 100644 plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImpl.java create mode 100644 plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/module.properties create mode 100644 plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/spring-tungsten-context.xml create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmdTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/resource/TungstenResourceTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenApiTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenElementTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtilsTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuruTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApiTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImplTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApiTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImplTest.java create mode 100644 plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImplTest.java create mode 100644 plugins/network-elements/tungsten/src/test/resources/db.properties create mode 100644 plugins/network-elements/tungsten/src/test/resources/log4j.properties create mode 100644 scripts/vm/network/tungsten/create_tap_device.sh create mode 100644 scripts/vm/network/tungsten/delete_tap_device.sh create mode 100644 scripts/vm/network/tungsten/setup_tungsten_vrouter.sh create mode 100644 scripts/vm/network/tungsten/update_tungsten_loadbalancer_ssl.sh create mode 100644 scripts/vm/network/tungsten/update_tungsten_loadbalancer_stats.sh create mode 100644 setup/dev/advancedsgtf.cfg create mode 100644 setup/dev/advancedtf.cfg create mode 100644 systemvm/debian/opt/cloud/bin/setup_tf_route.py create mode 100644 test/integration/plugins/tf/common.py create mode 100644 test/integration/plugins/tf/test_isolated_zone.py create mode 100644 test/integration/plugins/tf/test_shared_zone.py create mode 100644 utils/src/main/java/com/cloud/utils/TungstenUtils.java diff --git a/api/src/main/java/com/cloud/event/EventTypes.java b/api/src/main/java/com/cloud/event/EventTypes.java index 93dee22e4df..f7678d99d32 100644 --- a/api/src/main/java/com/cloud/event/EventTypes.java +++ b/api/src/main/java/com/cloud/event/EventTypes.java @@ -161,6 +161,35 @@ public class EventTypes { public static final String EVENT_FIREWALL_EGRESS_CLOSE = "FIREWALL.EGRESS.CLOSE"; public static final String EVENT_FIREWALL_EGRESS_UPDATE = "FIREWALL.EGRESS.UPDATE"; + // Tungsten-Fabric + public static final String EVENT_TUNGSTEN_ADD_POLICY_RULE = "TUNGSTEN.ADD.POLICY.RULE"; + public static final String EVENT_TUNGSTEN_APPLY_POLICY = "TUNGSTEN.APPLY.POLICY"; + public static final String EVENT_TUNGSTEN_APPLY_TAG = "TUNGSTEN.APPLY.TAG"; + public static final String EVENT_TUNGSTEN_CREATE_POLICY = "TUNGSTEN.CREATE.POLICY"; + public static final String EVENT_TUNGSTEN_CREATE_TAG = "TUNGSTEN.CREATE.TAG"; + public static final String EVENT_TUNGSTEN_CREATE_TAGTYPE = "TUNGSTEN.CREATE.TAGTYPE"; + public static final String EVENT_TUNGSTEN_CREATE_ADDRESS_GROUP = "TUNGSTEN.CREATE.ADDRESS.GROUP"; + public static final String EVENT_TUNGSTEN_CREATE_SERVICE_GROUP = "TUNGSTEN.CREATE.SERVICE.GROUP"; + public static final String EVENT_TUNGSTEN_CREATE_APPLICATION_POLICY_SET = "TUNGSTEN.CREATE.APS"; + public static final String EVENT_TUNGSTEN_CREATE_FIREWALL_POLICY = "TUNGSTEN.CREATE.FIREWALL.POLICY"; + public static final String EVENT_TUNGSTEN_CREATE_FIREWALL_RULE = "TUNGSTEN.CREATE.FIREWALL.RULE"; + public static final String EVENT_TUNGSTEN_DELETE_POLICY = "TUNGSTEN.DELETE.POLICY"; + public static final String EVENT_TUNGSTEN_DELETE_TAG = "TUNGSTEN.DELETE.TAG"; + public static final String EVENT_TUNGSTEN_DELETE_TAGTYPE = "TUNGSTEN.DELETE.TAGTYPE"; + public static final String EVENT_TUNGSTEN_DELETE_ADDRESS_GROUP = "TUNGSTEN.DELETE.ADDRESS.GROUP"; + public static final String EVENT_TUNGSTEN_DELETE_APPLICATION_POLICY_SET = "TUNGSTEN.DELETE.APS"; + public static final String EVENT_TUNGSTEN_DELETE_FIREWALL_POLICY = "TUNGSTEN.DELETE.FIREWALL.POLICY"; + public static final String EVENT_TUNGSTEN_DELETE_FIREWALL_RULE = "TUNGSTEN.DELETE.FIREWALL.RULE"; + public static final String EVENT_TUNGSTEN_DELETE_SERVICE_GROUP = "TUNGSTEN.DELETE.SERVICE.GROUP"; + public static final String EVENT_TUNGSTEN_REMOVE_POLICY = "TUNGSTEN.REMOVE.POLICY"; + public static final String EVENT_TUNGSTEN_REMOVE_TAG = "TUNGSTEN.REMOVE.TAG"; + public static final String EVENT_TUNGSTEN_REMOVE_POLICY_RULE = "TUNGSTEN.REMOVE.POLICY.RULE"; + public static final String EVENT_TUNGSTEN_CREATE_LOGICAL_ROUTER = "TUNGSTEN.CREATE.LOGICAL.ROUTER"; + public static final String EVENT_TUNGSTEN_ADD_NETWORK_GATEWAY_TO_LOGICAL_ROUTER = "TUNGSTEN.ADD.NETWORK.GW.TO.LG"; + public static final String EVENT_TUNGSTEN_REMOVE_NETWORK_GATEWAY_FROM_LOGICAL_ROUTER = "TUNGSTEN.RM.NETWORK.GW.FROM.LG"; + public static final String EVENT_TUNGSTEN_DELETE_LOGICAL_ROUTER = "TUNGSTEN.DELETE.LOGICAL.ROUTER"; + public static final String EVENT_TUNGSTEN_UPDATE_LB_HEALTH_MONITOR = "TUNGSTEN.UPDATE.LB.HM"; + //NIC Events public static final String EVENT_NIC_CREATE = "NIC.CREATE"; public static final String EVENT_NIC_DELETE = "NIC.DELETE"; diff --git a/api/src/main/java/com/cloud/network/Network.java b/api/src/main/java/com/cloud/network/Network.java index 256eec0f5de..a2633ec7bac 100644 --- a/api/src/main/java/com/cloud/network/Network.java +++ b/api/src/main/java/com/cloud/network/Network.java @@ -202,6 +202,8 @@ public interface Network extends ControlledEntity, StateObject, I public static final Provider BigSwitchBcf = new Provider("BigSwitchBcf", false); //Add ConfigDrive provider public static final Provider ConfigDrive = new Provider("ConfigDrive", false); + //Add Tungsten Fabric provider + public static final Provider Tungsten = new Provider("Tungsten", false); private final String name; private final boolean isExternal; diff --git a/api/src/main/java/com/cloud/network/NetworkService.java b/api/src/main/java/com/cloud/network/NetworkService.java index e329f45acfb..099d73d5fcb 100644 --- a/api/src/main/java/com/cloud/network/NetworkService.java +++ b/api/src/main/java/com/cloud/network/NetworkService.java @@ -63,6 +63,8 @@ public interface NetworkService { public static final Integer DEFAULT_MTU = 1500; public static final Integer MINIMUM_MTU = 68; + public static final String MESSAGE_ASSIGN_NIC_SECONDARY_IP_EVENT = "Message.AssignNicSecondaryIp.Event"; + public static final String MESSAGE_RELEASE_NIC_SECONDARY_IP_EVENT = "Message.ReleaseNicSecondaryIp.Event"; public static final ConfigKey VRPublicInterfaceMtu = new ConfigKey<>("VirtualRouter", Integer.class, "vr.public.interface.max.mtu", "1500", "The maximum value the MTU can have on the VR's public interfaces", diff --git a/api/src/main/java/com/cloud/network/Networks.java b/api/src/main/java/com/cloud/network/Networks.java index 6a6ff3539f9..aeed5d4aec6 100644 --- a/api/src/main/java/com/cloud/network/Networks.java +++ b/api/src/main/java/com/cloud/network/Networks.java @@ -127,7 +127,8 @@ public class Networks { } }, UnDecided(null, null), - OpenDaylight("opendaylight", String.class); + OpenDaylight("opendaylight", String.class), + TUNGSTEN("tf", String.class); private final String scheme; private final Class type; diff --git a/api/src/main/java/com/cloud/network/TungstenProvider.java b/api/src/main/java/com/cloud/network/TungstenProvider.java new file mode 100644 index 00000000000..f4ccd0dda4c --- /dev/null +++ b/api/src/main/java/com/cloud/network/TungstenProvider.java @@ -0,0 +1,31 @@ +// 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 org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +public interface TungstenProvider extends InternalIdentity, Identity { + String getHostname(); + String getPort(); + String getProviderName(); + String getGateway(); + String getIntrospectPort(); + String getVrouterPort(); + long getZoneId(); + long getHostId(); +} diff --git a/api/src/main/java/com/cloud/network/security/SecurityGroupService.java b/api/src/main/java/com/cloud/network/security/SecurityGroupService.java index ee32c0bce19..e5ac6c0dfe7 100644 --- a/api/src/main/java/com/cloud/network/security/SecurityGroupService.java +++ b/api/src/main/java/com/cloud/network/security/SecurityGroupService.java @@ -55,4 +55,9 @@ public interface SecurityGroupService { public List authorizeSecurityGroupEgress(AuthorizeSecurityGroupEgressCmd cmd); public boolean securityGroupRulesForVmSecIp(long nicId, String secondaryIp, boolean ruleAction); + + String MESSAGE_CREATE_TUNGSTEN_SECURITY_GROUP_EVENT = "Message.CreateTungstenSecurityGroup.Event"; + String MESSAGE_DELETE_TUNGSTEN_SECURITY_GROUP_EVENT = "Message.DeleteTungstenSecurityGroup.Event"; + String MESSAGE_ADD_SECURITY_GROUP_RULE_EVENT = "Message.AddSecurityGroupRule.Event"; + String MESSAGE_REMOVE_SECURITY_GROUP_RULE_EVENT = "Message.RemoveSecurityGroupRule.Event"; } diff --git a/api/src/main/java/com/cloud/network/security/TungstenSecurityGroupRule.java b/api/src/main/java/com/cloud/network/security/TungstenSecurityGroupRule.java new file mode 100644 index 00000000000..f6ef5a8e1fe --- /dev/null +++ b/api/src/main/java/com/cloud/network/security/TungstenSecurityGroupRule.java @@ -0,0 +1,23 @@ +// 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.security; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +public interface TungstenSecurityGroupRule extends Identity, InternalIdentity { +} diff --git a/api/src/main/java/com/cloud/offering/NetworkOffering.java b/api/src/main/java/com/cloud/offering/NetworkOffering.java index 5825431c6bd..207880ea28c 100644 --- a/api/src/main/java/com/cloud/offering/NetworkOffering.java +++ b/api/src/main/java/com/cloud/offering/NetworkOffering.java @@ -51,6 +51,7 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity, public final static String SystemPrivateGatewayNetworkOfferingWithoutVlan = "System-Private-Gateway-Network-Offering-Without-Vlan"; public final static String DefaultSharedNetworkOfferingWithSGService = "DefaultSharedNetworkOfferingWithSGService"; + public static final String DEFAULT_TUNGSTEN_SHARED_NETWORK_OFFERING_WITH_SGSERVICE = "DefaultTungstenSharedNetworkOfferingWithSGService"; public final static String QuickCloudNoServices = "QuickCloudNoServices"; public final static String DefaultIsolatedNetworkOfferingWithSourceNatService = "DefaultIsolatedNetworkOfferingWithSourceNatService"; public final static String OvsIsolatedNetworkOfferingWithSourceNatService = "OvsIsolatedNetworkOfferingWithSourceNatService"; @@ -87,6 +88,8 @@ public interface NetworkOffering extends InfrastructureEntity, InternalIdentity, boolean isForVpc(); + boolean isForTungsten(); + TrafficType getTrafficType(); boolean isSpecifyVlan(); diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index e655e90dc52..ec5799ceb91 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -663,6 +663,67 @@ public class ApiConstants { public static final String VSWITCH_TYPE_PUBLIC_TRAFFIC = "publicvswitchtype"; public static final String VSWITCH_NAME_GUEST_TRAFFIC = "guestvswitchname"; public static final String VSWITCH_NAME_PUBLIC_TRAFFIC = "publicvswitchname"; + // Tungsten-Fabric + public static final String TUNGSTEN_VIRTUAL_ROUTER_UUID = "tungstenvirtualrouteruuid"; + public static final String TUNGSTEN_PROVIDER_HOSTNAME = "tungstenproviderhostname"; + public static final String TUNGSTEN_PROVIDER_PORT = "tungstenproviderport"; + public static final String TUNGSTEN_PROVIDER_UUID = "tungstenprovideruuid"; + public static final String TUNGSTEN_GATEWAY = "tungstengateway"; + public static final String TUNGSTEN_PROVIDER_VROUTER_PORT = "tungstenprovidervrouterport"; + public static final String TUNGSTEN_PROVIDER_INTROSPECT_PORT = "tungstenproviderintrospectport"; + public static final String SRC_NETWORK = "srcnetwork"; + public static final String SRC_IP_PREFIX = "srcipprefix"; + public static final String SRC_IP_PREFIX_LEN = "srcipprefixlen"; + public static final String SRC_START_PORT = "srcstartport"; + public static final String SRC_END_PORT = "srcendport"; + public static final String DEST_NETWORK = "destnetwork"; + public static final String DEST_IP_PREFIX = "destipprefix"; + public static final String DEST_IP_PREFIX_LEN = "destipprefixlen"; + public static final String DEST_START_PORT = "deststartport"; + public static final String DEST_END_PORT = "destendport"; + public static final String MAJOR_SEQUENCE = "majorsequence"; + public static final String MINOR_SEQUENCE = "minorsequence"; + public static final String POLICY_UUID = "policyuuid"; + public static final String RULE_UUID = "ruleuuid"; + public static final String DIRECTION = "direction"; + public static final String TAG_UUID = "taguuid"; + public static final String TAG_TYPE = "tagtype"; + public static final String TAG_VALUE = "tagvalue"; + public static final String TAG_TYPE_UUID = "tagtypeuuid"; + public static final String NETWORK_UUID = "networkuuid"; + public static final String NIC_UUID = "nicuuid"; + public static final String VM_UUID = "vmuuid"; + public static final String ONE_WAY = "oneway"; + public static final String POLICY = "policy"; + public static final String VM = "vm"; + public static final String FIREWALL_POLICY = "firewallpolicy"; + public static final String FIREWALL_RULE = "firewallrule"; + public static final String TAG = "tag"; + public static final String APPLICATION_POLICY_SET_UUID = "applicationpolicysetuuid"; + public static final String FIREWALL_POLICY_UUID = "firewallpolicyuuid"; + public static final String FIREWALL_RULE_UUID = "firewallruleuuid"; + public static final String ADDRESS_GROUP_UUID = "addressgroupuuid"; + public static final String SERVICE_GROUP_UUID = "servicegroupuuid"; + public static final String SEQUENCE = "sequence"; + public static final String SERVICE_GROUP = "servicegroup"; + public static final String SRC_ADDRESS_GROUP = "srcaddressgroup"; + public static final String DEST_ADDRESS_GROUP = "destaddressgroup"; + public static final String SRC_TAG = "srctag"; + public static final String DEST_TAG = "desttag"; + public static final String IP_PREFIX = "ipprefix"; + public static final String IP_PREFIX_LEN = "ipprefixlen"; + public static final String SRC_ADDRESS_GROUP_UUID = "srcaddressgroupuuid"; + public static final String DEST_ADDRESS_GROUP_UUID = "destaddressgroupuuid"; + public static final String SRC_TAG_UUID = "srctaguuid"; + public static final String DEST_TAG_UUID = "desttaguuid"; + public static final String SRC_NETWORK_UUID = "srcnetworkuuid"; + public static final String DEST_NETWORK_UUID = "destnetworkuuid"; + public static final String LOGICAL_ROUTER_UUID = "logicalrouteruuid"; + public static final String RETRY = "retry"; + public static final String HTTP_METHOD = "httpmethodtype"; + public static final String EXPECTED_CODE = "expectedcode"; + public static final String URL_PATH = "urlpath"; + // Ovs controller public static final String OVS_DEVICE_ID = "ovsdeviceid"; public static final String OVS_DEVICE_NAME = "ovsdevicename"; @@ -719,6 +780,7 @@ public class ApiConstants { public static final String FORCE_ENCAP = "forceencap"; public static final String SPLIT_CONNECTIONS = "splitconnections"; public static final String FOR_VPC = "forvpc"; + public static final String FOR_TUNGSTEN = "fortungsten"; public static final String SHRINK_OK = "shrinkok"; public static final String NICIRA_NVP_DEVICE_ID = "nvpdeviceid"; public static final String NICIRA_NVP_TRANSPORT_ZONE_UUID = "transportzoneuuid"; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index 1126edd1d44..ac6dee1aea9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -126,6 +126,11 @@ public class CreateNetworkOfferingCmd extends BaseCmd { description = "true if network offering is meant to be used for VPC, false otherwise.") private Boolean forVpc; + @Parameter(name = ApiConstants.FOR_TUNGSTEN, + type = CommandType.BOOLEAN, + description = "true if network offering is meant to be used for Tungsten-Fabric, false otherwise.") + private Boolean forTungsten; + @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, since = "4.2.0", description = "Network offering details in key/value pairs." + " Supported keys are internallbprovider/publiclbprovider with service provider as a value, and" + " promiscuousmode/macaddresschanges/forgedtransmits with true/false as value to accept/reject the security settings if available for a nic/portgroup") @@ -235,6 +240,10 @@ public class CreateNetworkOfferingCmd extends BaseCmd { return forVpc; } + public Boolean getForTungsten() { + return forTungsten; + } + public Boolean getEgressDefaultPolicy() { if (egressDefaultPolicy == null) { return true; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 276f59e7049..9054ab4a66e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -128,6 +128,9 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { @Parameter(name = ApiConstants.VPC_ID, type = CommandType.UUID, entityType = VpcResponse.class, description = "the VPC network belongs to") private Long vpcId; + @Parameter(name = ApiConstants.TUNGSTEN_VIRTUAL_ROUTER_UUID, type = CommandType.STRING, description = "Tungsten-Fabric virtual router the network belongs to") + private String tungstenVirtualRouterUuid; + @Parameter(name = ApiConstants.START_IPV6, type = CommandType.STRING, description = "the beginning IPv6 address in the IPv6 network range") private String startIpv6; @@ -257,6 +260,10 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { return associatedNetworkId; } + public String getTungstenVirtualRouterUuid() { + return tungstenVirtualRouterUuid; + } + @Override public boolean isDisplay() { if(displayNetwork == null) diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java index 17fe1e0d741..b92725d883e 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkOfferingResponse.java @@ -99,6 +99,10 @@ public class NetworkOfferingResponse extends BaseResponseWithAnnotations { @Param(description = "true if network offering can be used by VPC networks only") private Boolean forVpc; + @SerializedName(ApiConstants.FOR_TUNGSTEN) + @Param(description = "true if network offering can be used by Tungsten-Fabric networks only") + private Boolean forTungsten; + @SerializedName(ApiConstants.IS_PERSISTENT) @Param(description = "true if network offering supports persistent networks, false otherwise") private Boolean isPersistent; @@ -211,6 +215,10 @@ public class NetworkOfferingResponse extends BaseResponseWithAnnotations { this.forVpc = forVpc; } + public void setForTungsten(Boolean forTungsten) { + this.forTungsten = forTungsten; + } + public void setIsPersistent(Boolean isPersistent) { this.isPersistent = isPersistent; } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java index a40a5a475fe..243579e2f71 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java @@ -203,6 +203,10 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement @Param(description = "the name of the Network associated with this network") private String associatedNetworkName; + @SerializedName(ApiConstants.TUNGSTEN_VIRTUAL_ROUTER_UUID) + @Param(description = "Tungsten-Fabric virtual router the network belongs to") + private String tungstenVirtualRouterUuid; + @SerializedName(ApiConstants.CAN_USE_FOR_DEPLOY) @Param(description = "list networks available for vm deployment") private Boolean canUseForDeploy; @@ -546,6 +550,10 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement this.redundantRouter = redundantRouter; } + public String getTungstenVirtualRouterUuid() { + return tungstenVirtualRouterUuid; + } + public Boolean getSupportsVmAutoScaling() { return supportsVmAutoScaling; } @@ -554,6 +562,10 @@ public class NetworkResponse extends BaseResponseWithAssociatedNetwork implement this.supportsVmAutoScaling = supportsVmAutoScaling; } + public void setTungstenVirtualRouterUuid(String tungstenVirtualRouterUuid) { + this.tungstenVirtualRouterUuid = tungstenVirtualRouterUuid; + } + public String getVpcName() { return vpcName; } diff --git a/client/pom.xml b/client/pom.xml index 37b9c39b904..b416bbff7b6 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -32,8 +32,17 @@ juniper-contrail https://juniper.github.io/contrail-maven/snapshots + + juniper-tungsten-api + https://github.com/radu-todirica/tungsten-api/raw/master + + + net.juniper.tungsten + juniper-tungsten-api + 2.0 + javax.servlet javax.servlet-api @@ -202,6 +211,11 @@ cloud-plugin-network-ovs ${project.version} + + org.apache.cloudstack + cloud-plugin-network-tungsten + ${project.version} + org.apache.cloudstack cloud-plugin-network-elb diff --git a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java index 10b53082bac..c5caa312b58 100644 --- a/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java +++ b/engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java @@ -53,6 +53,12 @@ import com.cloud.utils.net.NetUtils; * */ public interface ConfigurationManager { + + public static final String MESSAGE_CREATE_POD_IP_RANGE_EVENT = "Message.CreatePodIpRange.Event"; + public static final String MESSAGE_DELETE_POD_IP_RANGE_EVENT = "Message.DeletePodIpRange.Event"; + public static final String MESSAGE_CREATE_VLAN_IP_RANGE_EVENT = "Message.CreateVlanIpRange.Event"; + public static final String MESSAGE_DELETE_VLAN_IP_RANGE_EVENT = "Message.DeleteVlanIpRange.Event"; + /** * @param offering * @return @@ -219,7 +225,7 @@ public interface ConfigurationManager { Integer networkRate, Map> serviceProviderMap, boolean isDefault, Network.GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode, Map> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive, Boolean forVpc, - List domainIds, List zoneIds, boolean enableOffering, final NetUtils.InternetProtocol internetProtocol); + Boolean forTungsten, List domainIds, List zoneIds, boolean enableOffering, final NetUtils.InternetProtocol internetProtocol); Vlan createVlanAndPublicIpRange(long zoneId, long networkId, long physicalNetworkId, boolean forVirtualNetwork, boolean forSystemVms, Long podId, String startIP, String endIP, String vlanGateway, String vlanNetmask, String vlanId, boolean bypassVlanOverlapCheck, Domain domain, Account vlanOwner, String startIPv6, String endIPv6, String vlanIp6Gateway, String vlanIp6Cidr) diff --git a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java index 32d5aa8dfa2..aa6f3a8610d 100644 --- a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java @@ -72,6 +72,9 @@ public interface IpAddressManager { PublicIp assignPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem, boolean forSystemVms) throws InsufficientAddressCapacityException; + PublicIp assignSourceNatPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem, boolean forSystemVms) + throws InsufficientAddressCapacityException; + /** * Do all of the work of releasing public ip addresses. Note that if this method fails, there can be side effects. * @@ -227,5 +230,8 @@ public interface IpAddressManager { final boolean forSystemVms, final boolean lockOneRow) throws InsufficientAddressCapacityException; + + public static final String MESSAGE_ASSIGN_IPADDR_EVENT = "Message.AssignIpAddr.Event"; + public static final String MESSAGE_RELEASE_IPADDR_EVENT = "Message.ReleaseIpAddr.Event"; } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 436fc397bda..1a3edb59a07 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -467,6 +467,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra // populate providers final Map> defaultSharedNetworkOfferingProviders = new HashMap>(); final Set defaultProviders = new HashSet(); + final Set tungstenProvider = new HashSet<>(); defaultProviders.add(Network.Provider.VirtualRouter); defaultSharedNetworkOfferingProviders.put(Service.Dhcp, defaultProviders); @@ -492,6 +493,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra sgProviders.add(Provider.SecurityGroupProvider); defaultSharedSGEnabledNetworkOfferingProviders.put(Service.SecurityGroup, sgProviders); + tungstenProvider.add(Provider.Tungsten); + final Map> defaultTungstenSharedSGEnabledNetworkOfferingProviders = new HashMap<>(); + defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.Connectivity, tungstenProvider); + defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.Dhcp, tungstenProvider); + defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.Dns, tungstenProvider); + defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.UserData, tungstenProvider); + defaultTungstenSharedSGEnabledNetworkOfferingProviders.put(Service.SecurityGroup, tungstenProvider); + final Map> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap>(); defaultProviders.clear(); defaultProviders.add(Network.Provider.VirtualRouter); @@ -528,21 +537,29 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true, Availability.Optional, null, new HashMap>(), true, Network.GuestType.Shared, false, null, true, null, true, - false, null, false, null, true, false, null, null, true, null); + false, null, false, null, true, false, false, null, null, true, null); } //#2 - SG enabled network offering if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks", TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, - null, true, false, null, false, null, true, false, null, null, true, null); + null, true, false, null, false, null, true, false, false, null, null, true, null); } //#3 - shared network offering with no SG service if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, - null, true, false, null, null, true, null); + null, true, false, false, null, null, true, null); + } + + if (_networkOfferingDao.findByUniqueName(NetworkOffering.DEFAULT_TUNGSTEN_SHARED_NETWORK_OFFERING_WITH_SGSERVICE) == null) { + offering = _configMgr.createNetworkOffering(NetworkOffering.DEFAULT_TUNGSTEN_SHARED_NETWORK_OFFERING_WITH_SGSERVICE, "Offering for Tungsten Shared Security group enabled networks", + TrafficType.Guest, null, true, Availability.Optional, null, defaultTungstenSharedSGEnabledNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, + null, true, false, null, false, null, true, false, true,null, null, true, null); + offering.setState(NetworkOffering.State.Enabled); + _networkOfferingDao.update(offering.getId(), offering); } //#4 - default isolated offering with Source nat service @@ -550,14 +567,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService, "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null, defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null, - true, false, null, null, true, null); + true, false, false, null, null, true, null); } //#5 - default vpc offering with LB service if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks, "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, - defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, true, null); + defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, false, null, null, true, null); } //#6 - default vpc offering with no LB service @@ -566,14 +583,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra defaultVPCOffProviders.remove(Service.Lb); offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB, "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, - null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, true, null); + null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, false, null, null, true, null); } //#7 - isolated offering with source nat disabled if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service", TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, - true, null, true, false, null, false, null, true, false, null, null, true, null); + true, null, true, false, null, false, null, true, false, false, null, null, true, null); } //#8 - network offering with internal lb service @@ -595,7 +612,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB, "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, - true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, true, null); + true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, false, null, null, true, null); offering.setInternalLb(true); offering.setPublicLb(false); _networkOfferingDao.update(offering.getId(), offering); @@ -626,7 +643,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering, "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, - netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true, false, null, null, true, null); + netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true, false, false, null, null, true, null); offering.setDedicatedLB(false); _networkOfferingDao.update(offering.getId(), offering); } diff --git a/engine/schema/src/main/java/com/cloud/network/TungstenGuestNetworkIpAddressVO.java b/engine/schema/src/main/java/com/cloud/network/TungstenGuestNetworkIpAddressVO.java new file mode 100644 index 00000000000..6ff92ac6398 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/TungstenGuestNetworkIpAddressVO.java @@ -0,0 +1,104 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network; + +import com.cloud.utils.net.Ip; +import org.apache.cloudstack.api.InternalIdentity; + +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; + +@Entity +@Table(name = ("tungsten_guest_network_ip_address")) +public class TungstenGuestNetworkIpAddressVO implements InternalIdentity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "network_id") + private long networkId; + + @Column(name = "public_ip_address") + @Enumerated(value = EnumType.STRING) + private Ip publicIpAddress = null; + + @Column(name = "guest_ip_address") + @Enumerated(value = EnumType.STRING) + private Ip guestIpAddress = null; + + @Column(name = "logical_router_uuid") + private String logicalRouterUuid; + + public TungstenGuestNetworkIpAddressVO() { + } + + public TungstenGuestNetworkIpAddressVO(long networkId, Ip guestIpAddress) { + this.networkId = networkId; + this.guestIpAddress = guestIpAddress; + } + + public TungstenGuestNetworkIpAddressVO(long networkId, Ip guestIpAddress, String logicalRouterUuid) { + this.networkId = networkId; + this.guestIpAddress = guestIpAddress; + this.logicalRouterUuid = logicalRouterUuid; + } + + @Override + public long getId() { + return id; + } + + public long getNetworkId() { + return networkId; + } + + public void setNetworkId(final long networkId) { + this.networkId = networkId; + } + + public Ip getPublicIpAddress() { + return publicIpAddress; + } + + public void setPublicIpAddress(final Ip publicIpAddress) { + this.publicIpAddress = publicIpAddress; + } + + public Ip getGuestIpAddress() { + return guestIpAddress; + } + + public void setGuestIpAddress(final Ip guestIpAddress) { + this.guestIpAddress = guestIpAddress; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + public void setLogicalRouterUuid(final String logicalRouterUuid) { + this.logicalRouterUuid = logicalRouterUuid; + } +} diff --git a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java index eea6c358110..51dfa91a404 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java @@ -67,6 +67,8 @@ public interface IPAddressDao extends GenericDao { List listByPhysicalNetworkId(long physicalNetworkId); + IPAddressVO findByIpAndNetworkIdAndDcId(long networkId, long dcId, String ipAddress); + List listByAssociatedVpc(long vpcId, Boolean isSourceNat); long countFreePublicIPs(); @@ -95,5 +97,7 @@ public interface IPAddressDao extends GenericDao { IPAddressVO findByAccountIdAndZoneIdAndStateAndIpAddress(long accountId, long dcId, State state, String ipAddress); + List listByDcIdAndAssociatedNetwork(long dcId); + List listByNetworkId(long networkId); } diff --git a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java index f50e3f83c8a..b995959f01e 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java @@ -59,6 +59,7 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen protected GenericSearchBuilder AllIpCountForDashboard; protected SearchBuilder DeleteAllExceptGivenIp; protected GenericSearchBuilder AllocatedIpCountForAccount; + protected SearchBuilder tungstenFloatingIpSearch; @Inject protected VlanDao _vlanDao; protected GenericSearchBuilder CountFreePublicIps; @@ -151,6 +152,13 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen CountFreePublicIps.join("vlans", join, CountFreePublicIps.entity().getVlanId(), join.entity().getId(), JoinBuilder.JoinType.INNER); CountFreePublicIps.done(); + tungstenFloatingIpSearch = createSearchBuilder(); + tungstenFloatingIpSearch.and("dc", tungstenFloatingIpSearch.entity().getDataCenterId(), Op.EQ); + tungstenFloatingIpSearch.and("state", tungstenFloatingIpSearch.entity().getState(), Op.EQ); + tungstenFloatingIpSearch.and("network", tungstenFloatingIpSearch.entity().getAssociatedWithNetworkId(), Op.NNULL); + tungstenFloatingIpSearch.and("sourceNat", tungstenFloatingIpSearch.entity().isSourceNat(), Op.EQ); + tungstenFloatingIpSearch.done(); + DeleteAllExceptGivenIp = createSearchBuilder(); DeleteAllExceptGivenIp.and("vlanDbId", DeleteAllExceptGivenIp.entity().getVlanId(), Op.EQ); DeleteAllExceptGivenIp.and("ip", DeleteAllExceptGivenIp.entity().getAddress(), Op.NEQ); @@ -218,6 +226,15 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen return findOneBy(sc); } + @Override + public IPAddressVO findByIpAndNetworkIdAndDcId(long networkId, long dcId, String ipAddress) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("ipAddress", ipAddress); + sc.setParameters("dataCenterId", dcId); + return findOneBy(sc); + } + @Override public IPAddressVO findByIpAndNetworkId(long networkId, String ipAddress) { SearchCriteria sc = AllFieldsSearch.create(); @@ -501,6 +518,15 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen return findOneBy(sc); } + @Override + public List listByDcIdAndAssociatedNetwork(final long dcId) { + SearchCriteria sc = tungstenFloatingIpSearch.create(); + sc.setParameters("dataCenterId", dcId); + sc.setParameters("sourceNat", false); + sc.setParameters("state", State.Allocated); + return listBy(sc); + } + @Override public List listByNetworkId(long networkId) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDao.java b/engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDao.java new file mode 100644 index 00000000000..8062ab19349 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDao.java @@ -0,0 +1,34 @@ +// 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; + +import com.cloud.network.TungstenGuestNetworkIpAddressVO; +import com.cloud.utils.db.GenericDao; + +import java.util.List; + +public interface TungstenGuestNetworkIpAddressDao extends GenericDao { + List listGuestIpAddressByNetworkId(long networkId); + + List listByNetworkId(long networkId); + + TungstenGuestNetworkIpAddressVO findByNetworkIdAndPublicIp(long networkId, String publicIp); + + TungstenGuestNetworkIpAddressVO findByNetworkAndGuestIpAddress(long networkId, String guestIp); + + TungstenGuestNetworkIpAddressVO findByNetworkAndLogicalRouter(long networkId, String logicalRouterUuid); +} diff --git a/engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDaoImpl.java new file mode 100644 index 00000000000..a39fe456dd8 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/dao/TungstenGuestNetworkIpAddressDaoImpl.java @@ -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.network.dao; + +import com.cloud.network.TungstenGuestNetworkIpAddressVO; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@DB +public class TungstenGuestNetworkIpAddressDaoImpl extends GenericDaoBase + implements TungstenGuestNetworkIpAddressDao { + private static final String ID = "id"; + private static final String NETWORK_ID = "network_id"; + private static final String GUEST_IP_ADDRESS = "guest_ip_address"; + private static final String PUBLIC_IP_ADDRESS = "public_ip_address"; + private static final String LOGICAL_ROUTER_UUID = "logical_router_uuid"; + final SearchBuilder allFieldsSearch; + final GenericSearchBuilder networkSearch; + + public TungstenGuestNetworkIpAddressDaoImpl() { + allFieldsSearch = createSearchBuilder(); + allFieldsSearch.and(ID, allFieldsSearch.entity().getId(), SearchCriteria.Op.EQ); + allFieldsSearch.and(NETWORK_ID, allFieldsSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); + allFieldsSearch.and(GUEST_IP_ADDRESS, allFieldsSearch.entity().getGuestIpAddress(), SearchCriteria.Op.EQ); + allFieldsSearch.and(PUBLIC_IP_ADDRESS, allFieldsSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ); + allFieldsSearch.and(LOGICAL_ROUTER_UUID, allFieldsSearch.entity().getLogicalRouterUuid(), SearchCriteria.Op.EQ); + allFieldsSearch.done(); + networkSearch = createSearchBuilder(String.class); + networkSearch.select(null, SearchCriteria.Func.DISTINCT, networkSearch.entity().getGuestIpAddress()); + networkSearch.and(NETWORK_ID, networkSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); + networkSearch.done(); + } + + @Override + public List listGuestIpAddressByNetworkId(long networkId) { + SearchCriteria searchCriteria = networkSearch.create(); + searchCriteria.setParameters(NETWORK_ID, networkId); + return customSearch(searchCriteria, null); + } + + @Override + public List listByNetworkId(final long networkId) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(NETWORK_ID, networkId); + return listBy(searchCriteria); + } + + @Override + public TungstenGuestNetworkIpAddressVO findByNetworkIdAndPublicIp(final long networkId, final String publicIp) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(NETWORK_ID, networkId); + searchCriteria.setParameters(PUBLIC_IP_ADDRESS, publicIp); + return findOneBy(searchCriteria); + } + + @Override + public TungstenGuestNetworkIpAddressVO findByNetworkAndGuestIpAddress(final long networkId, final String guestIp) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(NETWORK_ID, networkId); + searchCriteria.setParameters(GUEST_IP_ADDRESS, guestIp); + return findOneBy(searchCriteria); + } + + @Override + public TungstenGuestNetworkIpAddressVO findByNetworkAndLogicalRouter(final long networkId, + final String logicalRouterUuid) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(NETWORK_ID, networkId); + searchCriteria.setParameters(LOGICAL_ROUTER_UUID, logicalRouterUuid); + return findOneBy(searchCriteria); + } +} diff --git a/engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDao.java b/engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDao.java new file mode 100644 index 00000000000..a31c610cf0a --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDao.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.dao; + +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.utils.db.GenericDao; + +import java.util.List; + +public interface TungstenProviderDao extends GenericDao { + TungstenProviderVO findByZoneId(long zoneId); + + TungstenProviderVO findByUuid(String uuid); + + List findAll(); + + void deleteProviderByUuid(String providerUuid); +} diff --git a/engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDaoImpl.java new file mode 100644 index 00000000000..d37e08f73da --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/dao/TungstenProviderDaoImpl.java @@ -0,0 +1,84 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.dao; + +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@DB() +public class TungstenProviderDaoImpl extends GenericDaoBase + implements TungstenProviderDao { + + final SearchBuilder allFieldsSearch; + + public TungstenProviderDaoImpl() { + super(); + allFieldsSearch = createSearchBuilder(); + allFieldsSearch.and("id", allFieldsSearch.entity().getId(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("uuid", allFieldsSearch.entity().getUuid(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("hostname", allFieldsSearch.entity().getHostname(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("provider_name", allFieldsSearch.entity().getProviderName(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("port", allFieldsSearch.entity().getPort(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("zone_id", allFieldsSearch.entity().getZoneId(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("gateway", allFieldsSearch.entity().getGateway(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("vrouter_port", allFieldsSearch.entity().getVrouterPort(), + SearchCriteria.Op.EQ); + allFieldsSearch.and("introspect_port", allFieldsSearch.entity().getIntrospectPort(), + SearchCriteria.Op.EQ); + allFieldsSearch.done(); + } + + @Override + public TungstenProviderVO findByZoneId(long nspId) { + SearchCriteria sc = allFieldsSearch.create(); + sc.setParameters("zone_id", nspId); + return findOneBy(sc); + } + + @Override + public TungstenProviderVO findByUuid(String uuid) { + SearchCriteria sc = allFieldsSearch.create(); + sc.setParameters("uuid", uuid); + return findOneBy(sc); + } + + @Override + public void deleteProviderByUuid(String providerUuid) { + SearchCriteria sc = allFieldsSearch.create(); + sc.setParameters("uuid", providerUuid); + remove(sc); + } + + @Override + public List findAll() { + return listAll(); + } +} diff --git a/engine/schema/src/main/java/com/cloud/network/element/TungstenProviderVO.java b/engine/schema/src/main/java/com/cloud/network/element/TungstenProviderVO.java new file mode 100644 index 00000000000..7529e129ce6 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/element/TungstenProviderVO.java @@ -0,0 +1,169 @@ +// 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.element; + +import com.cloud.network.TungstenProvider; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.UUID; + +@Entity +@Table(name = "tungsten_providers") +public class TungstenProviderVO implements TungstenProvider { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + long id; + + @Column(name = "zone_id") + private long zoneId; + + @Column(name = "uuid") + private String uuid; + + @Column(name = "host_id") + private long hostId; + + @Column(name = "provider_name") + private String providerName; + + @Column(name = "port") + private String port; + + @Column(name = "hostname") + private String hostname; + + @Column(name = "gateway") + private String gateway; + + @Column(name = "vrouter_port") + private String vrouterPort; + + @Column(name = "introspect_port") + private String introspectPort; + + public TungstenProviderVO() { + this.uuid = UUID.randomUUID().toString(); + } + + public TungstenProviderVO(long zoneId, String providerName, long hostId, String port, String hostname, String gateway, String vrouterPort, String introspectPort) { + this.zoneId = zoneId; + this.uuid = UUID.randomUUID().toString(); + this.providerName = providerName; + this.port = port; + this.hostname = hostname; + this.gateway = gateway; + this.vrouterPort = vrouterPort; + this.introspectPort = introspectPort; + this.hostId = hostId; + } + + @Override + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + @Override + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public String getProviderName() { + return providerName; + } + + public void setProviderName(String providerName) { + this.providerName = providerName; + } + + @Override + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + @Override + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + @Override + public String getGateway() { + return gateway; + } + + public void setGateway(final String gateway) { + this.gateway = gateway; + } + + @Override + public String getIntrospectPort() { + return introspectPort; + } + + public void setIntrospectPort(final String introspectPort) { + this.introspectPort = introspectPort; + } + + @Override + public String getVrouterPort() { + return vrouterPort; + } + + public void setVrouterPort(final String vrouterPort) { + this.vrouterPort = vrouterPort; + } + + @Override + public long getHostId() { + return hostId; + } + + public void setHostId(long hostId) { + this.hostId = hostId; + } +} diff --git a/engine/schema/src/main/java/com/cloud/network/security/TungstenSecurityGroupRuleVO.java b/engine/schema/src/main/java/com/cloud/network/security/TungstenSecurityGroupRuleVO.java new file mode 100644 index 00000000000..dc438db712e --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/security/TungstenSecurityGroupRuleVO.java @@ -0,0 +1,129 @@ +// 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.security; + +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = ("tungsten_security_group_rule")) +public class TungstenSecurityGroupRuleVO implements TungstenSecurityGroupRule { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "uuid") + private String uuid; + + @Column(name = "zone_id") + private long zoneId; + + @Column(name = "security_group_id") + private long securityGroupId; + + @Column(name = "rule_type") + private String ruleType; + + @Column(name = "rule_target") + private String ruleTarget; + + @Column(name = "ether_type") + private String etherType; + + @Column(name = "default_rule") + private boolean defaultRule; + + public TungstenSecurityGroupRuleVO() { + this.uuid = UUID.randomUUID().toString(); + } + + public TungstenSecurityGroupRuleVO(final long zoneId, final long securityGroupId, final String ruleType, + final String ruleTarget, final String etherType, final boolean defaultRule) { + this.uuid = UUID.randomUUID().toString(); + this.zoneId = zoneId; + this.securityGroupId = securityGroupId; + this.ruleType = ruleType; + this.ruleTarget = ruleTarget; + this.etherType = etherType; + this.defaultRule = defaultRule; + } + + @Override + public String getUuid() { + return uuid; + } + + @Override + public long getId() { + return id; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public long getSecurityGroupId() { + return securityGroupId; + } + + public void setSecurityGroupId(final long securityGroupId) { + this.securityGroupId = securityGroupId; + } + + public String getRuleType() { + return ruleType; + } + + public void setRuleType(final String ruleType) { + this.ruleType = ruleType; + } + + public String getRuleTarget() { + return ruleTarget; + } + + public void setRuleTarget(final String ruleTarget) { + this.ruleTarget = ruleTarget; + } + + public String getEtherType() { + return etherType; + } + + public void setEtherType(final String etherType) { + this.etherType = etherType; + } + + public boolean isDefaultRule() { + return defaultRule; + } + + public void setDefaultRule(final boolean defaultRule) { + this.defaultRule = defaultRule; + } +} diff --git a/engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDao.java b/engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDao.java new file mode 100644 index 00000000000..d71855fcf73 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDao.java @@ -0,0 +1,31 @@ +// 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.security.dao; + +import com.cloud.network.security.TungstenSecurityGroupRuleVO; +import com.cloud.utils.db.GenericDao; + +import java.util.List; + +public interface TungstenSecurityGroupRuleDao extends GenericDao { + TungstenSecurityGroupRuleVO findDefaultSecurityRule(long securityGroupId, String ruleType, String etherType); + + TungstenSecurityGroupRuleVO findBySecurityGroupAndRuleTypeAndRuleTarget(long securityGroupId, String ruleType, + String ruleTarget); + + List listByRuleTarget(String ruleTarget); +} diff --git a/engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDaoImpl.java new file mode 100644 index 00000000000..8d2036c717b --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/network/security/dao/TungstenSecurityGroupRuleDaoImpl.java @@ -0,0 +1,78 @@ +// 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.security.dao; + +import com.cloud.network.security.TungstenSecurityGroupRuleVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class TungstenSecurityGroupRuleDaoImpl extends GenericDaoBase + implements TungstenSecurityGroupRuleDao { + private static final String ID = "id"; + private static final String UUID = "uuid"; + private static final String SECURITY_GROUP_ID = "security_group_id"; + private static final String RULE_TYPE = "rule_type"; + private static final String RULE_TARGET = "rule_target"; + private static final String ETHER_TYPE = "ether_type"; + private static final String DEFAULT_RULE = "default_rule"; + protected final SearchBuilder allFieldsSearch; + + protected TungstenSecurityGroupRuleDaoImpl() { + allFieldsSearch = createSearchBuilder(); + allFieldsSearch.and(ID, allFieldsSearch.entity().getId(), SearchCriteria.Op.EQ); + allFieldsSearch.and(UUID, allFieldsSearch.entity().getUuid(), SearchCriteria.Op.EQ); + allFieldsSearch.and(SECURITY_GROUP_ID, allFieldsSearch.entity().getSecurityGroupId(), SearchCriteria.Op.EQ); + allFieldsSearch.and(RULE_TYPE, allFieldsSearch.entity().getRuleType(), SearchCriteria.Op.EQ); + allFieldsSearch.and(RULE_TARGET, allFieldsSearch.entity().getRuleTarget(), SearchCriteria.Op.EQ); + allFieldsSearch.and(ETHER_TYPE, allFieldsSearch.entity().getEtherType(), SearchCriteria.Op.EQ); + allFieldsSearch.and(DEFAULT_RULE, allFieldsSearch.entity().isDefaultRule(), SearchCriteria.Op.EQ); + allFieldsSearch.done(); + } + + @Override + public TungstenSecurityGroupRuleVO findDefaultSecurityRule(final long securityGroupId, final String ruleType + , final String etherType) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(SECURITY_GROUP_ID, securityGroupId); + searchCriteria.setParameters(RULE_TYPE, ruleType); + searchCriteria.setParameters(ETHER_TYPE, etherType); + searchCriteria.setParameters(DEFAULT_RULE, true); + return findOneBy(searchCriteria); + } + + @Override + public TungstenSecurityGroupRuleVO findBySecurityGroupAndRuleTypeAndRuleTarget(final long securityGroupId, + final String ruleType, final String ruleTarget) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(SECURITY_GROUP_ID, securityGroupId); + searchCriteria.setParameters(RULE_TYPE, ruleType); + searchCriteria.setParameters(RULE_TARGET, ruleTarget); + return findOneBy(searchCriteria); + } + + @Override + public List listByRuleTarget(final String ruleTarget) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters(RULE_TARGET, ruleTarget); + return listBy(searchCriteria); + } +} diff --git a/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java b/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java index a3ceb9cce43..ae5e6fb95ea 100644 --- a/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java +++ b/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java @@ -133,6 +133,9 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name = "for_vpc") boolean forVpc; + @Column(name = "for_tungsten") + boolean forTungsten = false; + @Column(name = "egress_default_policy") boolean egressdefaultpolicy; @@ -183,6 +186,15 @@ public class NetworkOfferingVO implements NetworkOffering { this.forVpc = isForVpc; } + @Override + public boolean isForTungsten() { + return forTungsten; + } + + public void setForTungsten(boolean forTungsten) { + this.forTungsten = forTungsten; + } + @Override public long getId() { return id; diff --git a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml index 3f97ed90d15..51e557f0c52 100644 --- a/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml +++ b/engine/schema/src/main/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml @@ -136,6 +136,7 @@ + @@ -239,6 +240,8 @@ + + diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql index 2c078e37c03..51e070ec98f 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800.sql @@ -1049,6 +1049,132 @@ WHERE usage_unit = 'Policy-Month'; -- delete configuration task.cleanup.retry.interval #6910 DELETE FROM `cloud`.`configuration` WHERE name='task.cleanup.retry.interval'; +-- Tungsten Fabric Plugin -- +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.network_offerings','for_tungsten', 'int(1) unsigned DEFAULT "0" COMMENT "is tungsten enabled for the resource"'); + +-- Network offering with multi-domains and multi-zones +DROP VIEW IF EXISTS `cloud`.`network_offering_view`; +CREATE VIEW `cloud`.`network_offering_view` AS + SELECT + `network_offerings`.`id` AS `id`, + `network_offerings`.`uuid` AS `uuid`, + `network_offerings`.`name` AS `name`, + `network_offerings`.`unique_name` AS `unique_name`, + `network_offerings`.`display_text` AS `display_text`, + `network_offerings`.`nw_rate` AS `nw_rate`, + `network_offerings`.`mc_rate` AS `mc_rate`, + `network_offerings`.`traffic_type` AS `traffic_type`, + `network_offerings`.`tags` AS `tags`, + `network_offerings`.`system_only` AS `system_only`, + `network_offerings`.`specify_vlan` AS `specify_vlan`, + `network_offerings`.`service_offering_id` AS `service_offering_id`, + `network_offerings`.`conserve_mode` AS `conserve_mode`, + `network_offerings`.`created` AS `created`, + `network_offerings`.`removed` AS `removed`, + `network_offerings`.`default` AS `default`, + `network_offerings`.`availability` AS `availability`, + `network_offerings`.`dedicated_lb_service` AS `dedicated_lb_service`, + `network_offerings`.`shared_source_nat_service` AS `shared_source_nat_service`, + `network_offerings`.`sort_key` AS `sort_key`, + `network_offerings`.`redundant_router_service` AS `redundant_router_service`, + `network_offerings`.`state` AS `state`, + `network_offerings`.`guest_type` AS `guest_type`, + `network_offerings`.`elastic_ip_service` AS `elastic_ip_service`, + `network_offerings`.`eip_associate_public_ip` AS `eip_associate_public_ip`, + `network_offerings`.`elastic_lb_service` AS `elastic_lb_service`, + `network_offerings`.`specify_ip_ranges` AS `specify_ip_ranges`, + `network_offerings`.`inline` AS `inline`, + `network_offerings`.`is_persistent` AS `is_persistent`, + `network_offerings`.`internal_lb` AS `internal_lb`, + `network_offerings`.`public_lb` AS `public_lb`, + `network_offerings`.`egress_default_policy` AS `egress_default_policy`, + `network_offerings`.`concurrent_connections` AS `concurrent_connections`, + `network_offerings`.`keep_alive_enabled` AS `keep_alive_enabled`, + `network_offerings`.`supports_streched_l2` AS `supports_streched_l2`, + `network_offerings`.`supports_public_access` AS `supports_public_access`, + `network_offerings`.`supports_vm_autoscaling` AS `supports_vm_autoscaling`, + `network_offerings`.`for_vpc` AS `for_vpc`, + `network_offerings`.`for_tungsten` AS `for_tungsten`, + `network_offerings`.`service_package_id` AS `service_package_id`, + GROUP_CONCAT(DISTINCT(domain.id)) AS domain_id, + GROUP_CONCAT(DISTINCT(domain.uuid)) AS domain_uuid, + GROUP_CONCAT(DISTINCT(domain.name)) AS domain_name, + GROUP_CONCAT(DISTINCT(domain.path)) AS domain_path, + GROUP_CONCAT(DISTINCT(zone.id)) AS zone_id, + GROUP_CONCAT(DISTINCT(zone.uuid)) AS zone_uuid, + GROUP_CONCAT(DISTINCT(zone.name)) AS zone_name, + `offering_details`.value AS internet_protocol + FROM + `cloud`.`network_offerings` + LEFT JOIN + `cloud`.`network_offering_details` AS `domain_details` ON `domain_details`.`network_offering_id` = `network_offerings`.`id` AND `domain_details`.`name`='domainid' + LEFT JOIN + `cloud`.`domain` AS `domain` ON FIND_IN_SET(`domain`.`id`, `domain_details`.`value`) + LEFT JOIN + `cloud`.`network_offering_details` AS `zone_details` ON `zone_details`.`network_offering_id` = `network_offerings`.`id` AND `zone_details`.`name`='zoneid' + LEFT JOIN + `cloud`.`data_center` AS `zone` ON FIND_IN_SET(`zone`.`id`, `zone_details`.`value`) + LEFT JOIN + `cloud`.`network_offering_details` AS `offering_details` ON `offering_details`.`network_offering_id` = `network_offerings`.`id` AND `offering_details`.`name`='internetProtocol' + GROUP BY + `network_offerings`.`id`; + + +CREATE TABLE IF NOT EXISTS `cloud`.`tungsten_providers` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `zone_id` bigint unsigned NOT NULL COMMENT 'Zone ID', + `uuid` varchar(40), + `host_id` bigint unsigned NOT NULL, + `provider_name` varchar(40), + `port` varchar(40), + `hostname` varchar(40), + `gateway` varchar(40), + `vrouter_port` varchar(40), + `introspect_port` varchar(40), + PRIMARY KEY (`id`), + CONSTRAINT `fk_tungsten_providers__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_tungsten_providers__zone_id` FOREIGN KEY (`zone_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_tungsten_providers__uuid` UNIQUE (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `cloud`.`tungsten_guest_network_ip_address` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + `public_ip_address` varchar(15) COMMENT 'ip public_ip_address', + `guest_ip_address` varchar(15) NOT NULL COMMENT 'ip guest_ip_address', + `logical_router_uuid` varchar(40) COMMENT 'logical router uuid', + PRIMARY KEY (`id`), + CONSTRAINT `fk_tungsten_guest_network_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `cloud`.`tungsten_security_group_rule` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40) NOT NULL COMMENT 'rule uuid', + `zone_id` bigint unsigned NOT NULL COMMENT 'Zone ID', + `security_group_id` bigint unsigned NOT NULL COMMENT 'security group id', + `rule_type` varchar(40) NOT NULL COMMENT 'rule type', + `rule_target` varchar(40) NOT NULL COMMENT 'rule target', + `ether_type` varchar(40) NOT NULL COMMENT 'ether type', + `default_rule` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if security group is default', + PRIMARY KEY (`id`), + CONSTRAINT `fk_tungsten_security_group_rule__security_group_id` FOREIGN KEY (`security_group_id`) REFERENCES `security_group`(`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `cloud`.`tungsten_lb_health_monitor` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `load_balancer_id` bigint unsigned NOT NULL, + `type` varchar(40) NOT NULL, + `retry` bigint unsigned NOT NULL, + `timeout` bigint unsigned NOT NULL, + `interval` bigint unsigned NOT NULL, + `http_method` varchar(40), + `expected_code` varchar(40), + `url_path` varchar(255), + PRIMARY KEY (`id`), + CONSTRAINT `fk_tungsten_lb_health_monitor__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + --- #6888 add index to speed up querying IPs in the network-tab DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_KEY`; diff --git a/plugins/hypervisors/kvm/pom.xml b/plugins/hypervisors/kvm/pom.xml index 2eb96ae15af..a5b10e9c670 100644 --- a/plugins/hypervisors/kvm/pom.xml +++ b/plugins/hypervisors/kvm/pom.xml @@ -83,6 +83,11 @@ ${project.version} compile + + org.apache.cloudstack + cloud-plugin-network-tungsten + ${project.version} + diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 178f67d3da2..a24a0464b0e 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -50,6 +50,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy; +import org.apache.cloudstack.network.tungsten.service.TungstenService; import org.apache.cloudstack.storage.configdrive.ConfigDrive; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.TemplateObjectTO; @@ -297,6 +298,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv public static final String RESIZE_NOTIFY_ONLY = "NOTIFYONLY"; public static final String BASEPATH = "/usr/share/cloudstack-common/vms/"; + public static final String TUNGSTEN_PATH = "scripts/vm/network/tungsten"; + private String _modifyVlanPath; private String _versionstringpath; private String _patchScriptPath; @@ -311,6 +314,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv private String _ovsPvlanVmPath; private String _routerProxyPath; private String _ovsTunnelPath; + + private String setupTungstenVrouterPath; + private String updateTungstenLoadbalancerStatsPath; + private String updateTungstenLoadbalancerSslPath; + private String _host; + private String _dcId; private String _clusterId; private final Properties _uefiProperties = new Properties(); @@ -341,10 +350,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv private KVMStoragePoolManager _storagePoolMgr; private VifDriver _defaultVifDriver; + private VifDriver tungstenVifDriver; private Map _trafficTypeVifDrivers; protected static final String DEFAULT_OVS_VIF_DRIVER_CLASS_NAME = "com.cloud.hypervisor.kvm.resource.OvsVifDriver"; protected static final String DEFAULT_BRIDGE_VIF_DRIVER_CLASS_NAME = "com.cloud.hypervisor.kvm.resource.BridgeVifDriver"; + protected static final String DEFAULT_TUNGSTEN_VIF_DRIVER_CLASS_NAME = "com.cloud.hypervisor.kvm.resource.VRouterVifDriver"; private final static long HYPERVISOR_LIBVIRT_VERSION_SUPPORTS_IO_URING = 6003000; private final static long HYPERVISOR_QEMU_VERSION_SUPPORTS_IO_URING = 5000000; @@ -702,7 +713,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv protected List _cpuFeatures; protected enum BridgeType { - NATIVE, OPENVSWITCH + NATIVE, OPENVSWITCH, TUNGSTEN } protected BridgeType _bridgeType; @@ -789,6 +800,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return _publicNic; } + protected String getDefaultTungstenScriptsDir() { + return TUNGSTEN_PATH; + } + @Override public boolean configure(final String name, final Map params) throws ConfigurationException { boolean success = super.configure(name, params); @@ -814,8 +829,17 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv String storageScriptsDir = AgentPropertiesFileHandler.getPropertyValue(AgentProperties.STORAGE_SCRIPTS_DIR); + String tungstenScriptsDir = (String) params.get("tungsten.scripts.dir"); + if (tungstenScriptsDir == null) { + tungstenScriptsDir = getDefaultTungstenScriptsDir(); + } + final String bridgeType = AgentPropertiesFileHandler.getPropertyValue(AgentProperties.NETWORK_BRIDGE_TYPE); - _bridgeType = BridgeType.valueOf(bridgeType.toUpperCase()); + if (bridgeType == null) { + _bridgeType = BridgeType.NATIVE; + } else { + _bridgeType = BridgeType.valueOf(bridgeType.toUpperCase()); + } Boolean dpdk = AgentPropertiesFileHandler.getPropertyValue(AgentProperties.OPENVSWITCH_DPDK_ENABLED); if (_bridgeType == BridgeType.OPENVSWITCH && BooleanUtils.isTrue(dpdk)) { @@ -918,6 +942,21 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv throw new ConfigurationException("Unable to find the ovs-pvlan-kvm-vm.sh"); } + setupTungstenVrouterPath = Script.findScript(tungstenScriptsDir, "setup_tungsten_vrouter.sh"); + if (setupTungstenVrouterPath == null) { + throw new ConfigurationException("Unable to find the setup_tungsten_vrouter.sh"); + } + + updateTungstenLoadbalancerStatsPath = Script.findScript(tungstenScriptsDir, "update_tungsten_loadbalancer_stats.sh"); + if (updateTungstenLoadbalancerStatsPath == null) { + throw new ConfigurationException("Unable to find the update_tungsten_loadbalancer_stats.sh"); + } + + updateTungstenLoadbalancerSslPath = Script.findScript(tungstenScriptsDir, "update_tungsten_loadbalancer_ssl.sh"); + if (updateTungstenLoadbalancerSslPath == null) { + throw new ConfigurationException("Unable to find the update_tungsten_loadbalancer_ssl.sh"); + } + final boolean isDeveloper = AgentPropertiesFileHandler.getPropertyValue(AgentProperties.DEVELOPER); if (isDeveloper) { params.putAll(getDeveloperProperties()); @@ -1442,6 +1481,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv defaultVifDriverName = DEFAULT_BRIDGE_VIF_DRIVER_CLASS_NAME; } } + tungstenVifDriver = getVifDriverClass(DEFAULT_TUNGSTEN_VIF_DRIVER_CLASS_NAME, params); _defaultVifDriver = getVifDriverClass(defaultVifDriverName, params); // Load any per-traffic-type vif drivers @@ -1516,6 +1556,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv final Set vifDrivers = new HashSet(); vifDrivers.add(_defaultVifDriver); + if (TungstenService.isTungstenEnabled(Long.parseLong(_dcId))) { + vifDrivers.add(tungstenVifDriver); + } vifDrivers.addAll(_trafficTypeVifDrivers.values()); final ArrayList vifDriverList = new ArrayList(vifDrivers); @@ -4545,6 +4588,61 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv return true; } + public boolean setupTungstenVRouter(final String oper, final String inf, final String subnet, final String route, + final String vrf) { + final Script cmd = new Script(setupTungstenVrouterPath, _timeout, s_logger); + cmd.add(oper); + cmd.add(inf); + cmd.add(subnet); + cmd.add(route); + cmd.add(vrf); + + final String result = cmd.execute(); + return result == null; + } + + public boolean updateTungstenLoadbalancerStats(final String lbUuid, final String lbStatsPort, + final String lbStatsUri, final String lbStatsAuth) { + final Script cmd = new Script(updateTungstenLoadbalancerStatsPath, _timeout, s_logger); + cmd.add(lbUuid); + cmd.add(lbStatsPort); + cmd.add(lbStatsUri); + cmd.add(lbStatsAuth); + + final String result = cmd.execute(); + return result == null; + } + + public boolean updateTungstenLoadbalancerSsl(final String lbUuid, final String sslCertName, + final String certificateKey, final String privateKey, final String privateIp, final String port) { + final Script cmd = new Script(updateTungstenLoadbalancerSslPath, _timeout, s_logger); + cmd.add(lbUuid); + cmd.add(sslCertName); + cmd.add(certificateKey); + cmd.add(privateKey); + cmd.add(privateIp); + cmd.add(port); + + final String result = cmd.execute(); + return result == null; + } + + public boolean setupTfRoute(final String privateIpAddress, final String fromNetwork, final String toNetwork) { + final Script setupTfRouteScript = new Script(_routerProxyPath, _timeout, s_logger); + setupTfRouteScript.add("setup_tf_route.py"); + setupTfRouteScript.add(privateIpAddress); + setupTfRouteScript.add(fromNetwork); + setupTfRouteScript.add(toNetwork); + + final OutputInterpreter.OneLineParser setupTfRouteParser = new OutputInterpreter.OneLineParser(); + final String result = setupTfRouteScript.execute(setupTfRouteParser); + if (result != null) { + s_logger.debug("Failed to execute setup TF Route:" + result); + return false; + } + return true; + } + public boolean cleanupRules() { if (!_canBridgeFirewall) { return false; diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VRouterVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VRouterVifDriver.java new file mode 100644 index 00000000000..5876602bc64 --- /dev/null +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/VRouterVifDriver.java @@ -0,0 +1,117 @@ +// 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.hypervisor.kvm.resource; + +import com.cloud.agent.api.to.NicTO; +import com.cloud.exception.InternalErrorException; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.script.Script; +import org.apache.log4j.Logger; +import org.joda.time.Duration; +import org.libvirt.LibvirtException; + +import java.io.File; +import java.util.Map; + +import javax.naming.ConfigurationException; + +public class VRouterVifDriver extends VifDriverBase { + private static final Logger s_logger = Logger.getLogger(VRouterVifDriver.class); + private String createTapDeviceScript; + private String deleteTapDeviceScript; + + @Override + public void configure(final Map params) throws ConfigurationException { + + super.configure(params); + + String tungstenScriptsDir = (String) params.get("tungsten.scripts.dir"); + tungstenScriptsDir = tungstenScriptsDir == null ? _libvirtComputingResource.getDefaultTungstenScriptsDir() : tungstenScriptsDir; + + createTapDeviceScript = Script.findScript(tungstenScriptsDir, "create_tap_device.sh"); + deleteTapDeviceScript = Script.findScript(tungstenScriptsDir, "delete_tap_device.sh"); + + if (createTapDeviceScript == null) { + throw new ConfigurationException("Unable to find create_tap_device.sh"); + } + + if (deleteTapDeviceScript == null) { + throw new ConfigurationException("Unable to find delete_tap_device.sh"); + } + } + + @Override + public LibvirtVMDef.InterfaceDef plug(final NicTO nic, final String guestOsType, final String nicAdapter, + final Map extraConfig) throws InternalErrorException, LibvirtException { + + final String tapDeviceName = TungstenUtils.getTapName(nic.getMac()); + final String script = createTapDeviceScript; + + final Script command = new Script(script, Duration.standardSeconds(300), s_logger); + command.add(tapDeviceName); + + final String result = command.execute(); + if (result != null) { + throw new InternalErrorException("Failed to create tap device " + tapDeviceName + ": " + result); + } + + final LibvirtVMDef.InterfaceDef intf = new LibvirtVMDef.InterfaceDef(); + intf.defEthernet(tapDeviceName, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter)); + + return intf; + } + + @Override + public void unplug(final LibvirtVMDef.InterfaceDef iface, boolean deleteBr) { + final String tapDeviceName = TungstenUtils.getTapName(iface.getMacAddress()); + final String script = deleteTapDeviceScript; + + final Script command = new Script(script, Duration.standardSeconds(300), s_logger); + command.add(tapDeviceName); + + final String result = command.execute(); + if (result != null) { + s_logger.error("Failed to delete tap device " + tapDeviceName + ": " + result); + } + } + + @Override + public void attach(final LibvirtVMDef.InterfaceDef iface) { + // not use + } + + @Override + public void detach(final LibvirtVMDef.InterfaceDef iface) { + // not use + } + + @Override + public void createControlNetwork(final String privBrName) { + // not use + } + + @Override + public boolean isExistingBridge(String bridgeName) { + File f = new File("/sys/devices/virtual/net/" + bridgeName); + return f.exists(); + } + + @Override + public void deleteBr(NicTO nic) { + // not use + } +} diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetTfRouteCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetTfRouteCommandWrapper.java new file mode 100644 index 00000000000..63a1ec43240 --- /dev/null +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetTfRouteCommandWrapper.java @@ -0,0 +1,39 @@ +// 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.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTfRouteCommand; + +import java.io.IOException; + +@ResourceWrapper(handles = SetupTfRouteCommand.class) +public class LibvirtSetTfRouteCommandWrapper + extends CommandWrapper { + @Override + public Answer execute(final SetupTfRouteCommand command, final LibvirtComputingResource serverResource) { + boolean result = serverResource.setupTfRoute(command.getPrivateIp(), command.getPublicIp(), command.getSrcNetwork()); + if (result) { + return new Answer(command, true, null); + } else { + return new Answer(command, new IOException()); + } + } +} diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetupTungstenVRouterCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetupTungstenVRouterCommandWrapper.java new file mode 100644 index 00000000000..3a29fbff404 --- /dev/null +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSetupTungstenVRouterCommandWrapper.java @@ -0,0 +1,40 @@ +// 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.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; + +import java.io.IOException; + +@ResourceWrapper(handles = SetupTungstenVRouterCommand.class) +public class LibvirtSetupTungstenVRouterCommandWrapper + extends CommandWrapper { + @Override + public Answer execute(final SetupTungstenVRouterCommand command, final LibvirtComputingResource serverResource) { + boolean result = serverResource.setupTungstenVRouter(command.getOper(), command.getInf(), command.getSubnet(), + command.getRoute(), command.getVrf()); + if (result) { + return new Answer(command, true, null); + } else { + return new Answer(command, new IOException()); + } + } +} diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerSslCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerSslCommandWrapper.java new file mode 100644 index 00000000000..267b514a972 --- /dev/null +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerSslCommandWrapper.java @@ -0,0 +1,44 @@ +// +// 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.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadbalancerSslCommand; + +import java.io.IOException; + +@ResourceWrapper(handles = UpdateTungstenLoadbalancerSslCommand.class) +public class LibvirtUpdateTungstenLoadbalancerSslCommandWrapper + extends CommandWrapper { + @Override + public Answer execute(final UpdateTungstenLoadbalancerSslCommand command, + final LibvirtComputingResource serverResource) { + boolean result = serverResource.updateTungstenLoadbalancerSsl(command.getLbUuid(), command.getSslCertName(), + command.getCertificateKey(), command.getPrivateKey(), command.getPrivateIp(), command.getPort()); + + if (result) { + return new Answer(command, true, null); + } else { + return new Answer(command, new IOException()); + } + } +} diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerStatsCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerStatsCommandWrapper.java new file mode 100644 index 00000000000..7129b0703dd --- /dev/null +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUpdateTungstenLoadbalancerStatsCommandWrapper.java @@ -0,0 +1,44 @@ +// +// 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.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadbalancerStatsCommand; + +import java.io.IOException; + +@ResourceWrapper(handles = UpdateTungstenLoadbalancerStatsCommand.class) +public class LibvirtUpdateTungstenLoadbalancerStatsCommandWrapper + extends CommandWrapper { + @Override + public Answer execute(final UpdateTungstenLoadbalancerStatsCommand command, + final LibvirtComputingResource serverResource) { + boolean result = serverResource.updateTungstenLoadbalancerStats(command.getLbUuid(), command.getLbStatsPort(), + command.getLbStatsUri(), command.getLbStatsAuth()); + + if (result) { + return new Answer(command, true, null); + } else { + return new Answer(command, new IOException()); + } + } +} diff --git a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVifDriverTest.java b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVifDriverTest.java index e3b74e84e1d..b49f7fe9e3f 100644 --- a/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVifDriverTest.java +++ b/plugins/hypervisors/kvm/src/test/java/com/cloud/hypervisor/kvm/resource/LibvirtVifDriverTest.java @@ -57,7 +57,7 @@ public class LibvirtVifDriverTest { final String FakeVifDriverClassName = "com.cloud.hypervisor.kvm.resource.FakeVifDriver"; final String NonExistentVifDriverClassName = "com.cloud.hypervisor.kvm.resource.NonExistentVifDriver"; - private VifDriver fakeVifDriver, bridgeVifDriver, ovsVifDriver; + private VifDriver fakeVifDriver, bridgeVifDriver, ovsVifDriver, tungstenVifDriver; final String memInfo = "MemTotal: 5830236 kB\n" + "MemFree: 156752 kB\n" + @@ -77,6 +77,7 @@ public class LibvirtVifDriverTest { try { bridgeVifDriver = (VifDriver)Class.forName(LibvirtComputingResource.DEFAULT_BRIDGE_VIF_DRIVER_CLASS_NAME).newInstance(); ovsVifDriver = (VifDriver)Class.forName(LibvirtComputingResource.DEFAULT_OVS_VIF_DRIVER_CLASS_NAME).newInstance(); + tungstenVifDriver = (VifDriver)Class.forName(LibvirtComputingResource.DEFAULT_TUNGSTEN_VIF_DRIVER_CLASS_NAME).newInstance(); // Instantiating bridge vif driver again as the fake vif driver // is good enough, as this is a separate instance @@ -84,6 +85,7 @@ public class LibvirtVifDriverTest { doReturn(bridgeVifDriver).when(res).getVifDriverClass(eq(LibvirtComputingResource.DEFAULT_BRIDGE_VIF_DRIVER_CLASS_NAME), anyMap()); doReturn(ovsVifDriver).when(res).getVifDriverClass(eq(LibvirtComputingResource.DEFAULT_OVS_VIF_DRIVER_CLASS_NAME), anyMap()); + doReturn(tungstenVifDriver).when(res).getVifDriverClass(eq(LibvirtComputingResource.DEFAULT_TUNGSTEN_VIF_DRIVER_CLASS_NAME), anyMap()); doReturn(fakeVifDriver).when(res).getVifDriverClass(eq(FakeVifDriverClassName), anyMap()); } catch (final ConfigurationException ex) { diff --git a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java index 1a92945131d..7021b9ac235 100644 --- a/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java +++ b/plugins/network-elements/juniper-contrail/src/main/java/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java @@ -219,7 +219,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager ConfigurationManager configMgr = (ConfigurationManager) _configService; NetworkOfferingVO voffer = configMgr.createNetworkOffering(offeringName, offeringDisplayText, TrafficType.Public, null, true, Availability.Optional, null, serviceProviderMap, true, - Network.GuestType.Shared, false, null, false, null, true, false, null, true, null, false, false, null, null, true, null); + Network.GuestType.Shared, false, null, false, null, true, false, null, true, null, false, false, false, null, null, true, null); long id = voffer.getId(); _networkOfferingDao.update(id, voffer); return _networkOfferingDao.findById(id); @@ -254,7 +254,7 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager ConfigurationManager configMgr = (ConfigurationManager)_configService; NetworkOfferingVO voffer = configMgr.createNetworkOffering(offeringName, offeringDisplayText, TrafficType.Guest, null, false, Availability.Optional, null, serviceProviderMap, true, - Network.GuestType.Isolated, false, null, false, null, false, true, null, true, null, false, offeringName.equals(vpcRouterOfferingName), null, null, true, null); + Network.GuestType.Isolated, false, null, false, null, false, true, null, true, null, false, offeringName.equals(vpcRouterOfferingName), false, null, null, true, null); if (offeringName.equals(vpcRouterOfferingName)) { voffer.setInternalLb(true); } diff --git a/plugins/network-elements/tungsten/pom.xml b/plugins/network-elements/tungsten/pom.xml new file mode 100644 index 00000000000..32383a281f3 --- /dev/null +++ b/plugins/network-elements/tungsten/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + cloud-plugin-network-tungsten + Apache CloudStack Plugin - Tungsten-Fabric Network + + + org.apache.cloudstack + cloudstack-plugins + 4.18.0.0-SNAPSHOT + ../../pom.xml + + + + + juniper-tungsten-api + https://github.com/radu-todirica/tungsten-api/raw/master + + + + + + net.juniper.tungsten + juniper-tungsten-api + 2.0 + + + \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkGatewayToLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkGatewayToLogicalRouterCommand.java new file mode 100644 index 00000000000..612e0386e0b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkGatewayToLogicalRouterCommand.java @@ -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.network.tungsten.agent.api; + +import java.util.Objects; + +public class AddTungstenNetworkGatewayToLogicalRouterCommand extends TungstenCommand { + private final String networkUuid; + private final String logicalRouterUuid; + private final String ipAddress; + + public AddTungstenNetworkGatewayToLogicalRouterCommand(String networkUuid, String logicalRouterUuid, String ipAddress) { + this.networkUuid = networkUuid; + this.logicalRouterUuid = logicalRouterUuid; + this.ipAddress = ipAddress; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + public String getIpAddress() { + return ipAddress; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AddTungstenNetworkGatewayToLogicalRouterCommand that = (AddTungstenNetworkGatewayToLogicalRouterCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(logicalRouterUuid, that.logicalRouterUuid) && Objects.equals(ipAddress, that.ipAddress); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, logicalRouterUuid, ipAddress); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkSubnetCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkSubnetCommand.java new file mode 100644 index 00000000000..a0aa063a167 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenNetworkSubnetCommand.java @@ -0,0 +1,101 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class AddTungstenNetworkSubnetCommand extends TungstenCommand { + private final String networkUuid; + private final String ipPrefix; + private final int ipPrefixLen; + private final String gateway; + private final boolean dhcpEnable; + private final String dnsServer; + private final String allocationStart; + private final String allocationEnd; + private final boolean ipFromStart; + private final String subnetName; + + public AddTungstenNetworkSubnetCommand(final String networkUuid, final String ipPrefix, final int ipPrefixLen, + final String gateway, final boolean dhcpEnable, final String dnsServer, final String allocationStart, + final String allocationEnd, final boolean ipFromStart, final String subnetName) { + this.networkUuid = networkUuid; + this.ipPrefix = ipPrefix; + this.ipPrefixLen = ipPrefixLen; + this.gateway = gateway; + this.dhcpEnable = dhcpEnable; + this.dnsServer = dnsServer; + this.allocationStart = allocationStart; + this.allocationEnd = allocationEnd; + this.ipFromStart = ipFromStart; + this.subnetName = subnetName; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getIpPrefix() { + return ipPrefix; + } + + public int getIpPrefixLen() { + return ipPrefixLen; + } + + public String getGateway() { + return gateway; + } + + public boolean isDhcpEnable() { + return dhcpEnable; + } + + public String getDnsServer() { + return dnsServer; + } + + public String getAllocationStart() { + return allocationStart; + } + + public String getAllocationEnd() { + return allocationEnd; + } + + public boolean isIpFromStart() { + return ipFromStart; + } + + public String getSubnetName() { + return subnetName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AddTungstenNetworkSubnetCommand that = (AddTungstenNetworkSubnetCommand) o; + return ipPrefixLen == that.ipPrefixLen && dhcpEnable == that.dhcpEnable && ipFromStart == that.ipFromStart && Objects.equals(networkUuid, that.networkUuid) && Objects.equals(ipPrefix, that.ipPrefix) && Objects.equals(gateway, that.gateway) && Objects.equals(dnsServer, that.dnsServer) && Objects.equals(allocationStart, that.allocationStart) && Objects.equals(allocationEnd, that.allocationEnd) && Objects.equals(subnetName, that.subnetName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, ipPrefix, ipPrefixLen, gateway, dhcpEnable, dnsServer, allocationStart, allocationEnd, ipFromStart, subnetName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenPolicyRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenPolicyRuleCommand.java new file mode 100644 index 00000000000..3cde1a202c9 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenPolicyRuleCommand.java @@ -0,0 +1,133 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class AddTungstenPolicyRuleCommand extends TungstenCommand { + private final String uuid; + private final String policyUuid; + private final String action; + private final String direction; + private final String protocol; + private final String srcNetwork; + private final String srcIpPrefix; + private final int srcIpPrefixLen; + private final int srcStartPort; + private final int srcEndPort; + private final String destNetwork; + private final String destIpPrefix; + private final int destIpPrefixLen; + private final int destStartPort; + private final int destEndPort; + + public AddTungstenPolicyRuleCommand(final String policyUuid, final String action, final String direction, + final String protocol, final String srcNetwork, final String srcIpPrefix, final int srcIpPrefixLen, + final int srcStartPort, final int srcEndPort, final String destNetwork, final String destIpPrefix, + final int destIpPrefixLen, final int destStartPort, final int destEndPort) { + this.uuid = UUID.randomUUID().toString(); + this.policyUuid = policyUuid; + this.action = action; + this.direction = direction; + this.protocol = protocol; + this.srcNetwork = srcNetwork; + this.srcIpPrefix = srcIpPrefix; + this.srcIpPrefixLen = srcIpPrefixLen; + this.srcStartPort = srcStartPort; + this.srcEndPort = srcEndPort; + this.destNetwork = destNetwork; + this.destIpPrefix = destIpPrefix; + this.destIpPrefixLen = destIpPrefixLen; + this.destStartPort = destStartPort; + this.destEndPort = destEndPort; + } + + public String getUuid() { + return uuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public String getAction() { + return action; + } + + public String getDirection() { + return direction; + } + + public String getProtocol() { + return protocol; + } + + public String getSrcNetwork() { + return srcNetwork; + } + + public String getSrcIpPrefix() { + return srcIpPrefix; + } + + public int getSrcIpPrefixLen() { + return srcIpPrefixLen; + } + + public int getSrcStartPort() { + return srcStartPort; + } + + public int getSrcEndPort() { + return srcEndPort; + } + + public String getDestNetwork() { + return destNetwork; + } + + public String getDestIpPrefix() { + return destIpPrefix; + } + + public int getDestIpPrefixLen() { + return destIpPrefixLen; + } + + public int getDestStartPort() { + return destStartPort; + } + + public int getDestEndPort() { + return destEndPort; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AddTungstenPolicyRuleCommand that = (AddTungstenPolicyRuleCommand) o; + return srcIpPrefixLen == that.srcIpPrefixLen && srcStartPort == that.srcStartPort && srcEndPort == that.srcEndPort && destIpPrefixLen == that.destIpPrefixLen && destStartPort == that.destStartPort && destEndPort == that.destEndPort && Objects.equals(uuid, that.uuid) && Objects.equals(policyUuid, that.policyUuid) && Objects.equals(action, that.action) && Objects.equals(direction, that.direction) && Objects.equals(protocol, that.protocol) && Objects.equals(srcNetwork, that.srcNetwork) && Objects.equals(srcIpPrefix, that.srcIpPrefix) && Objects.equals(destNetwork, that.destNetwork) && Objects.equals(destIpPrefix, that.destIpPrefix); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, policyUuid, action, direction, protocol, srcNetwork, srcIpPrefix, srcIpPrefixLen, srcStartPort, srcEndPort, destNetwork, destIpPrefix, destIpPrefixLen, destStartPort, destEndPort); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecondaryIpAddressCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecondaryIpAddressCommand.java new file mode 100644 index 00000000000..f58e9e9682a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecondaryIpAddressCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class AddTungstenSecondaryIpAddressCommand extends TungstenCommand { + private final String networkUuid; + private final String nicUuid; + private final String iiName; + private final String address; + + public AddTungstenSecondaryIpAddressCommand(final String networkUuid, final String nicUuid, final String iiName, + final String address) { + this.networkUuid = networkUuid; + this.nicUuid = nicUuid; + this.iiName = iiName; + this.address = address; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getNicUuid() { + return nicUuid; + } + + public String getIiName() { + return iiName; + } + + public String getAddress() { + return address; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AddTungstenSecondaryIpAddressCommand that = (AddTungstenSecondaryIpAddressCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(nicUuid, that.nicUuid) && Objects.equals(iiName, that.iiName) && Objects.equals(address, that.address); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, nicUuid, iiName, address); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecurityGroupRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecurityGroupRuleCommand.java new file mode 100644 index 00000000000..1f7464ce852 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenSecurityGroupRuleCommand.java @@ -0,0 +1,89 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class AddTungstenSecurityGroupRuleCommand extends TungstenCommand { + private final String tungstenSecurityGroupUuid; + private final String tungstenGroupRuleUuid; + private final String securityGroupRuleType; + private final int startPort; + private final int endPort; + private final String target; + private final String etherType; + private final String protocol; + + public AddTungstenSecurityGroupRuleCommand(String tungstenSecurityGroupUuid, String tungstenGroupRuleUuid, + String securityGroupRuleType, int startPort, int endPort, + String target, String etherType, String protocol) { + this.tungstenSecurityGroupUuid = tungstenSecurityGroupUuid; + this.tungstenGroupRuleUuid = tungstenGroupRuleUuid; + this.securityGroupRuleType = securityGroupRuleType; + this.startPort = startPort; + this.endPort = endPort; + this.target = target; + this.etherType = etherType; + this.protocol = protocol; + } + + public String getTungstenSecurityGroupUuid() { + return tungstenSecurityGroupUuid; + } + + public String getTungstenGroupRuleUuid() { + return tungstenGroupRuleUuid; + } + + public String getSecurityGroupRuleType() { + return securityGroupRuleType; + } + + public int getStartPort() { + return startPort; + } + + public int getEndPort() { + return endPort; + } + + public String getTarget() { + return target; + } + + public String getEtherType() { + return etherType; + } + + public String getProtocol() { + return protocol; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AddTungstenSecurityGroupRuleCommand that = (AddTungstenSecurityGroupRuleCommand) o; + return startPort == that.startPort && endPort == that.endPort && Objects.equals(tungstenSecurityGroupUuid, that.tungstenSecurityGroupUuid) && Objects.equals(tungstenGroupRuleUuid, that.tungstenGroupRuleUuid) && Objects.equals(securityGroupRuleType, that.securityGroupRuleType) && Objects.equals(target, that.target) && Objects.equals(etherType, that.etherType) && Objects.equals(protocol, that.protocol); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenSecurityGroupUuid, tungstenGroupRuleUuid, securityGroupRuleType, startPort, endPort, target, etherType, protocol); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenVmToSecurityGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenVmToSecurityGroupCommand.java new file mode 100644 index 00000000000..5f52dd0454d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AddTungstenVmToSecurityGroupCommand.java @@ -0,0 +1,52 @@ +// 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.network.tungsten.agent.api; + +import java.util.List; +import java.util.Objects; + +public class AddTungstenVmToSecurityGroupCommand extends TungstenCommand { + private final String nicUuid; + private final List securityGroupUuidList; + + public AddTungstenVmToSecurityGroupCommand(String nicUuid, List securityGroupUuidList) { + this.nicUuid = nicUuid; + this.securityGroupUuidList = securityGroupUuidList; + } + + public String getNicUuid() { + return nicUuid; + } + + public List getSecurityGroupUuidList() { + return securityGroupUuidList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AddTungstenVmToSecurityGroupCommand that = (AddTungstenVmToSecurityGroupCommand) o; + return Objects.equals(nicUuid, that.nicUuid) && Objects.equals(securityGroupUuidList, that.securityGroupUuidList); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), nicUuid, securityGroupUuidList); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenNetworkPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenNetworkPolicyCommand.java new file mode 100644 index 00000000000..f7238ab33c5 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenNetworkPolicyCommand.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ApplyTungstenNetworkPolicyCommand extends TungstenCommand { + private final String projectFqn; + private final String networkPolicyName; + private final String networkUuid; + private final String policyUuid; + private final int majorSequence; + private final int minorSequence; + + public ApplyTungstenNetworkPolicyCommand(final String networkUuid, final String policyUuid, final int majorSequence, + final int minorSequence) { + this.projectFqn = null; + this.networkPolicyName = null; + this.networkUuid = networkUuid; + this.policyUuid = policyUuid; + this.majorSequence = majorSequence; + this.minorSequence = minorSequence; + } + + public ApplyTungstenNetworkPolicyCommand(final String projectFqn, final String networkPolicyName, + final String networkUuid, final int majorSequence, final int minorSequence) { + this.projectFqn = projectFqn; + this.networkPolicyName = networkPolicyName; + this.networkUuid = networkUuid; + this.policyUuid = null; + this.majorSequence = majorSequence; + this.minorSequence = minorSequence; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkPolicyName() { + return networkPolicyName; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public int getMajorSequence() { + return majorSequence; + } + + public int getMinorSequence() { + return minorSequence; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ApplyTungstenNetworkPolicyCommand that = (ApplyTungstenNetworkPolicyCommand) o; + return majorSequence == that.majorSequence && minorSequence == that.minorSequence && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkPolicyName, that.networkPolicyName) && Objects.equals(networkUuid, that.networkUuid) && Objects.equals(policyUuid, that.policyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, networkPolicyName, networkUuid, policyUuid, majorSequence, minorSequence); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenPortForwardingCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenPortForwardingCommand.java new file mode 100644 index 00000000000..c23fadc95be --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenPortForwardingCommand.java @@ -0,0 +1,89 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ApplyTungstenPortForwardingCommand extends TungstenCommand { + private final boolean isAdd; + private final String publicNetworkUuid; + private final String floatingIpPoolName; + private final String floatingIpName; + private final String vmiUuid; + private final String protocol; + private final int publicPort; + private final int privatePort; + + public ApplyTungstenPortForwardingCommand(final boolean isAdd, final String publicNetworkUuid, + final String floatingIpPoolName, final String floatingIpName, final String vmiUuid, final String protocol, + final int publicPort, final int privatePort) { + this.isAdd = isAdd; + this.publicNetworkUuid = publicNetworkUuid; + this.floatingIpPoolName = floatingIpPoolName; + this.floatingIpName = floatingIpName; + this.vmiUuid = vmiUuid; + this.protocol = protocol; + this.publicPort = publicPort; + this.privatePort = privatePort; + } + + public boolean isAdd() { + return isAdd; + } + + public String getPublicNetworkUuid() { + return publicNetworkUuid; + } + + public String getFloatingIpPoolName() { + return floatingIpPoolName; + } + + public String getFloatingIpName() { + return floatingIpName; + } + + public String getVmiUuid() { + return vmiUuid; + } + + public String getProtocol() { + return protocol; + } + + public int getPublicPort() { + return publicPort; + } + + public int getPrivatePort() { + return privatePort; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ApplyTungstenPortForwardingCommand that = (ApplyTungstenPortForwardingCommand) o; + return isAdd == that.isAdd && publicPort == that.publicPort && privatePort == that.privatePort && Objects.equals(publicNetworkUuid, that.publicNetworkUuid) && Objects.equals(floatingIpPoolName, that.floatingIpPoolName) && Objects.equals(floatingIpName, that.floatingIpName) && Objects.equals(vmiUuid, that.vmiUuid) && Objects.equals(protocol, that.protocol); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), isAdd, publicNetworkUuid, floatingIpPoolName, floatingIpName, vmiUuid, protocol, publicPort, privatePort); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenTagCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenTagCommand.java new file mode 100644 index 00000000000..dddd4d0f6fd --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ApplyTungstenTagCommand.java @@ -0,0 +1,77 @@ +// 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.network.tungsten.agent.api; + +import java.util.List; +import java.util.Objects; + +public class ApplyTungstenTagCommand extends TungstenCommand { + private final List networkUuids; + private final List vmUuids; + private final List nicUuids; + private final String policyUuid; + private final String applicationPolicySetUuid; + private final String tagUuid; + + public ApplyTungstenTagCommand(final List networkUuids, final List vmUuids, + final List nicUuids, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid) { + this.networkUuids = networkUuids; + this.vmUuids = vmUuids; + this.nicUuids = nicUuids; + this.policyUuid = policyUuid; + this.applicationPolicySetUuid = applicationPolicySetUuid; + this.tagUuid = tagUuid; + } + + public List getNetworkUuids() { + return networkUuids; + } + + public List getVmUuids() { + return vmUuids; + } + + public List getNicUuids() { + return nicUuids; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + public String getTagUuid() { + return tagUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ApplyTungstenTagCommand that = (ApplyTungstenTagCommand) o; + return Objects.equals(networkUuids, that.networkUuids) && Objects.equals(vmUuids, that.vmUuids) && Objects.equals(nicUuids, that.nicUuids) && Objects.equals(policyUuid, that.policyUuid) && Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid) && Objects.equals(tagUuid, that.tagUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuids, vmUuids, nicUuids, policyUuid, applicationPolicySetUuid, tagUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AssignTungstenFloatingIpCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AssignTungstenFloatingIpCommand.java new file mode 100644 index 00000000000..b83c3a72932 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/AssignTungstenFloatingIpCommand.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class AssignTungstenFloatingIpCommand extends TungstenCommand { + private final String networkUuid; + private final String vmiUuid; + private final String fipName; + private final String name; + private final String privateIp; + + public AssignTungstenFloatingIpCommand(final String networkUuid, final String vmiUuid, final String fipName, + final String name, final String privateIp) { + this.networkUuid = networkUuid; + this.vmiUuid = vmiUuid; + this.fipName = fipName; + this.name = name; + this.privateIp = privateIp; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getVmiUuid() { + return vmiUuid; + } + + public String getFipName() { + return fipName; + } + + public String getName() { + return name; + } + + public String getPrivateIp() { + return privateIp; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AssignTungstenFloatingIpCommand that = (AssignTungstenFloatingIpCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(vmiUuid, that.vmiUuid) && Objects.equals(fipName, that.fipName) && Objects.equals(name, that.name) && Objects.equals(privateIp, that.privateIp); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, vmiUuid, fipName, name, privateIp); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ClearTungstenNetworkGatewayCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ClearTungstenNetworkGatewayCommand.java new file mode 100644 index 00000000000..4bcc6145ad5 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ClearTungstenNetworkGatewayCommand.java @@ -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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ClearTungstenNetworkGatewayCommand extends TungstenCommand { + private final String projectFqn; + private final String routerName; + private final long vnId; + + public ClearTungstenNetworkGatewayCommand(final String projectFqn, final String routerName, final long vnId) { + this.projectFqn = projectFqn; + this.routerName = routerName; + this.vnId = vnId; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getRouterName() { + return routerName; + } + + public long getVnId() { + return vnId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ClearTungstenNetworkGatewayCommand that = (ClearTungstenNetworkGatewayCommand) o; + return vnId == that.vnId && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(routerName, that.routerName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, routerName, vnId); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenAddressGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenAddressGroupCommand.java new file mode 100644 index 00000000000..aed0a2e159b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenAddressGroupCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenAddressGroupCommand extends TungstenCommand { + private final String uuid; + private final String name; + private final String ipPrefix; + private final int ipPrefixLen; + + public CreateTungstenAddressGroupCommand(final String name, final String ipPrefix, final int ipPrefixLen) { + this.uuid = UUID.randomUUID().toString(); + this.name = name; + this.ipPrefix = ipPrefix; + this.ipPrefixLen = ipPrefixLen; + } + + public String getUuid() { + return uuid; + } + + public String getName() { + return name; + } + + public String getIpPrefix() { + return ipPrefix; + } + + public int getIpPrefixLen() { + return ipPrefixLen; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenAddressGroupCommand that = (CreateTungstenAddressGroupCommand) o; + return ipPrefixLen == that.ipPrefixLen && Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name) && Objects.equals(ipPrefix, that.ipPrefix); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, name, ipPrefix, ipPrefixLen); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenApplicationPolicySetCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenApplicationPolicySetCommand.java new file mode 100644 index 00000000000..4720e65c959 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenApplicationPolicySetCommand.java @@ -0,0 +1,52 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenApplicationPolicySetCommand extends TungstenCommand { + private final String uuid; + private final String name; + + public CreateTungstenApplicationPolicySetCommand(final String name) { + this.uuid = UUID.randomUUID().toString(); + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenApplicationPolicySetCommand that = (CreateTungstenApplicationPolicySetCommand) o; + return Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDefaultProjectCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDefaultProjectCommand.java new file mode 100644 index 00000000000..1bae8665883 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDefaultProjectCommand.java @@ -0,0 +1,20 @@ +// 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.network.tungsten.agent.api; + +public class CreateTungstenDefaultProjectCommand extends TungstenCommand { +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDomainCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDomainCommand.java new file mode 100644 index 00000000000..c5a74cfed69 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenDomainCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenDomainCommand extends TungstenCommand { + private final String tungstenDomainName; + private final String tungstenDomainUuid; + + public CreateTungstenDomainCommand(String tungstenDomainName, String tungstenDomainUuid) { + this.tungstenDomainName = tungstenDomainName; + this.tungstenDomainUuid = tungstenDomainUuid; + } + + public String getTungstenDomainName() { + return tungstenDomainName; + } + + public String getTungstenDomainUuid() { + return tungstenDomainUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenDomainCommand that = (CreateTungstenDomainCommand) o; + return Objects.equals(tungstenDomainName, that.tungstenDomainName) && Objects.equals(tungstenDomainUuid, that.tungstenDomainUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenDomainName, tungstenDomainUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallPolicyCommand.java new file mode 100644 index 00000000000..e98b67c2f48 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallPolicyCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenFirewallPolicyCommand extends TungstenCommand { + private final String uuid; + private final String applicationPolicySetUuid; + private final String name; + private final int sequence; + + public CreateTungstenFirewallPolicyCommand(final String name, final String applicationPolicySetUuid, final int sequence) { + this.uuid = UUID.randomUUID().toString(); + this.applicationPolicySetUuid = applicationPolicySetUuid; + this.name = name; + this.sequence = sequence; + } + + public String getUuid() { + return uuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + public String getName() { + return name; + } + + public int getSequence() { + return sequence; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenFirewallPolicyCommand that = (CreateTungstenFirewallPolicyCommand) o; + return sequence == that.sequence && Objects.equals(uuid, that.uuid) && Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, applicationPolicySetUuid, name, sequence); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallRuleCommand.java new file mode 100644 index 00000000000..7635e6b6eb0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFirewallRuleCommand.java @@ -0,0 +1,126 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenFirewallRuleCommand extends TungstenCommand { + private final String uuid; + private final String firewallPolicyUuid; + private final String name; + private final String action; + private final String serviceGroupUuid; + private final String srcTagUuid; + private final String srcAddressGroupUuid; + private final String srcNetworkUuid; + private final String direction; + private final String destTagUuid; + private final String destAddressGroupUuid; + private final String destNetworkUuid; + private final String tagTypeUuid; + private final int sequence; + + public CreateTungstenFirewallRuleCommand(final String firewallPolicyUuid, final String name, final String action, final String serviceGroupUuid, + final String srcTagUuid, final String srcAddressGroupUuid, final String srcNetworkUuid, final String direction, final String destTagUuid, + final String destAddressGroupUuid, final String destNetworkUuid, final String tagTypeUuid, final int sequence) { + this.uuid = UUID.randomUUID().toString(); + this.firewallPolicyUuid = firewallPolicyUuid; + this.name = name; + this.action = action; + this.serviceGroupUuid = serviceGroupUuid; + this.srcTagUuid = srcTagUuid; + this.srcAddressGroupUuid = srcAddressGroupUuid; + this.srcNetworkUuid = srcNetworkUuid; + this.direction = direction; + this.destTagUuid = destTagUuid; + this.destAddressGroupUuid = destAddressGroupUuid; + this.destNetworkUuid = destNetworkUuid; + this.tagTypeUuid = tagTypeUuid; + this.sequence = sequence; + } + + public String getUuid() { + return uuid; + } + + public String getFirewallPolicyUuid() { + return firewallPolicyUuid; + } + + public String getName() { + return name; + } + + public String getAction() { + return action; + } + + public String getServiceGroupUuid() { + return serviceGroupUuid; + } + + public String getSrcAddressGroupUuid() { + return srcAddressGroupUuid; + } + + public String getSrcNetworkUuid() { + return srcNetworkUuid; + } + + public String getDirection() { + return direction; + } + + public String getDestAddressGroupUuid() { + return destAddressGroupUuid; + } + + public String getDestNetworkUuid() { + return destNetworkUuid; + } + + public String getTagTypeUuid() { + return tagTypeUuid; + } + + public String getSrcTagUuid() { + return srcTagUuid; + } + + public String getDestTagUuid() { + return destTagUuid; + } + + public int getSequence() { + return sequence; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenFirewallRuleCommand that = (CreateTungstenFirewallRuleCommand) o; + return sequence == that.sequence && Objects.equals(uuid, that.uuid) && Objects.equals(firewallPolicyUuid, that.firewallPolicyUuid) && Objects.equals(name, that.name) && Objects.equals(action, that.action) && Objects.equals(serviceGroupUuid, that.serviceGroupUuid) && Objects.equals(srcTagUuid, that.srcTagUuid) && Objects.equals(srcAddressGroupUuid, that.srcAddressGroupUuid) && Objects.equals(srcNetworkUuid, that.srcNetworkUuid) && Objects.equals(direction, that.direction) && Objects.equals(destTagUuid, that.destTagUuid) && Objects.equals(destAddressGroupUuid, that.destAddressGroupUuid) && Objects.equals(destNetworkUuid, that.destNetworkUuid) && Objects.equals(tagTypeUuid, that.tagTypeUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, firewallPolicyUuid, name, action, serviceGroupUuid, srcTagUuid, srcAddressGroupUuid, srcNetworkUuid, direction, destTagUuid, destAddressGroupUuid, destNetworkUuid, tagTypeUuid, sequence); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpCommand.java new file mode 100644 index 00000000000..299e52c840e --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpCommand.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenFloatingIpCommand extends TungstenCommand { + private final String projectFqn; + private final String networkUuid; + private final String fipName; + private final String name; + private final String publicIp; + + public CreateTungstenFloatingIpCommand(final String projectFqn, final String networkUuid, final String fipName, + final String name, final String publicIp) { + this.projectFqn = projectFqn; + this.networkUuid = networkUuid; + this.fipName = fipName; + this.name = name; + this.publicIp = publicIp; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getFipName() { + return fipName; + } + + public String getName() { + return name; + } + + public String getPublicIp() { + return publicIp; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenFloatingIpCommand that = (CreateTungstenFloatingIpCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkUuid, that.networkUuid) && Objects.equals(fipName, that.fipName) && Objects.equals(name, that.name) && Objects.equals(publicIp, that.publicIp); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, networkUuid, fipName, name, publicIp); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpPoolCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpPoolCommand.java new file mode 100644 index 00000000000..6cb7ab3ed69 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenFloatingIpPoolCommand.java @@ -0,0 +1,59 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenFloatingIpPoolCommand extends TungstenCommand { + private String networkUuid; + private String fipName; + + public CreateTungstenFloatingIpPoolCommand(final String networkUuid, final String fipName) { + this.networkUuid = networkUuid; + this.fipName = fipName; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public void setNetworkUuid(final String networkUuid) { + this.networkUuid = networkUuid; + } + + public String getFipName() { + return fipName; + } + + public void setFipName(final String fipName) { + this.fipName = fipName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenFloatingIpPoolCommand that = (CreateTungstenFloatingIpPoolCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(fipName, that.fipName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, fipName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenLogicalRouterCommand.java new file mode 100644 index 00000000000..315e26a8d4d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenLogicalRouterCommand.java @@ -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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenLogicalRouterCommand extends TungstenCommand { + private final String name; + private final String projectFqn; + private final String pubNetworkUuid; + + public CreateTungstenLogicalRouterCommand(final String name, final String projectFqn, final String pubNetworkUuid) { + this.name = name; + this.projectFqn = projectFqn; + this.pubNetworkUuid = pubNetworkUuid; + } + + public String getName() { + return name; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getPubNetworkUuid() { + return pubNetworkUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenLogicalRouterCommand that = (CreateTungstenLogicalRouterCommand) o; + return Objects.equals(name, that.name) && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(pubNetworkUuid, that.pubNetworkUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), name, projectFqn, pubNetworkUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkCommand.java new file mode 100644 index 00000000000..f6d023933bc --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkCommand.java @@ -0,0 +1,139 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenNetworkCommand extends TungstenCommand { + private final String uuid; + private final String name; + private final String displayName; + private final String projectFqn; + private final boolean routerExternal; + private final boolean shared; + private final String ipPrefix; + private final int ipPrefixLen; + private final String gateway; + private final boolean dhcpEnable; + private final String dnsServer; + private final String allocationStart; + private final String allocationEnd; + private final boolean ipFromStart; + private final boolean isManagementNetwork; + private final String subnetName; + + public CreateTungstenNetworkCommand(final String uuid, final String name, final String displayName, + final String projectFqn, final boolean routerExternal, final boolean shared, final String ipPrefix, + final int ipPrefixLen, final String gateway, final boolean dhcpEnable, final String dnsServer, + final String allocationStart, final String allocationEnd, final boolean ipFromStart, + final boolean isManagementNetwork, final String subnetName) { + this.uuid = uuid; + this.name = name; + this.displayName = displayName; + this.projectFqn = projectFqn; + this.routerExternal = routerExternal; + this.shared = shared; + this.ipPrefix = ipPrefix; + this.ipPrefixLen = ipPrefixLen; + this.gateway = gateway; + this.dhcpEnable = dhcpEnable; + this.dnsServer = dnsServer; + this.allocationStart = allocationStart; + this.allocationEnd = allocationEnd; + this.ipFromStart = ipFromStart; + this.isManagementNetwork = isManagementNetwork; + this.subnetName = subnetName; + } + + public String getUuid() { + return uuid; + } + + public String getName() { + return name; + } + + public String getDisplayName() { + return displayName; + } + + public String getProjectFqn() { + return projectFqn; + } + + public boolean isRouterExternal() { + return routerExternal; + } + + public boolean isShared() { + return shared; + } + + public String getIpPrefix() { + return ipPrefix; + } + + public int getIpPrefixLen() { + return ipPrefixLen; + } + + public String getGateway() { + return gateway; + } + + public boolean isDhcpEnable() { + return dhcpEnable; + } + + public String getDnsServer() { + return dnsServer; + } + + public String getAllocationStart() { + return allocationStart; + } + + public String getAllocationEnd() { + return allocationEnd; + } + + public boolean isIpFromStart() { + return ipFromStart; + } + + public boolean isManagementNetwork() { + return isManagementNetwork; + } + + public String getSubnetName() { + return subnetName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenNetworkCommand that = (CreateTungstenNetworkCommand) o; + return routerExternal == that.routerExternal && shared == that.shared && ipPrefixLen == that.ipPrefixLen && dhcpEnable == that.dhcpEnable && ipFromStart == that.ipFromStart && isManagementNetwork == that.isManagementNetwork && Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name) && Objects.equals(displayName, that.displayName) && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(ipPrefix, that.ipPrefix) && Objects.equals(gateway, that.gateway) && Objects.equals(dnsServer, that.dnsServer) && Objects.equals(allocationStart, that.allocationStart) && Objects.equals(allocationEnd, that.allocationEnd) && Objects.equals(subnetName, that.subnetName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, name, displayName, projectFqn, routerExternal, shared, ipPrefix, ipPrefixLen, gateway, dhcpEnable, dnsServer, allocationStart, allocationEnd, ipFromStart, isManagementNetwork, subnetName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkLoadbalancerCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkLoadbalancerCommand.java new file mode 100644 index 00000000000..fa0cdc778e4 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkLoadbalancerCommand.java @@ -0,0 +1,200 @@ +// 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.network.tungsten.agent.api; + +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; + +import java.util.List; +import java.util.Objects; + +public class CreateTungstenNetworkLoadbalancerCommand extends TungstenCommand { + private final String projectFqn; + private final String networkUuid; + private final String publicNetworkUuid; + private final String loadBalancerMethod; + private final String loadBalancerName; + private final String loadBalancerListenerName; + private final String loadBalancerPoolName; + private final String loadBalancerHealthMonitorName; + private final String loadBalancerVmiName; + private final String loadBalancerIiName; + private final long ruleId; + private final List listMember; + private final String protocol; + private final int srcPort; + private final int dstPort; + private final String privateIp; + private final String fipName; + private final String fiName; + private final String monitorType; + private final int maxRetries; + private final int delay; + private final int timeout; + private final String httpMethod; + private final String urlPath; + private final String expectedCodes; + + public CreateTungstenNetworkLoadbalancerCommand(final String projectFqn, final String networkUuid, + final String publicNetworkUuid, final String loadBalancerMethod, final String loadBalancerName, + final String loadBalancerListenerName, final String loadBalancerPoolName, + final String loadBalancerHealthMonitorName, final String loadBalancerVmiName, final String loadBalancerIiName, + final long ruleId, final List listMember, final String protocol, final int srcPort, + final int dstPort, final String privateIp, final String fipName, final String fiName, final String monitorType, + final int maxRetries, final int delay, final int timeout, final String httpMethod, final String urlPath, + final String expectedCodes) { + this.projectFqn = projectFqn; + this.networkUuid = networkUuid; + this.publicNetworkUuid = publicNetworkUuid; + this.loadBalancerMethod = loadBalancerMethod; + this.loadBalancerName = loadBalancerName; + this.loadBalancerListenerName = loadBalancerListenerName; + this.loadBalancerPoolName = loadBalancerPoolName; + this.loadBalancerHealthMonitorName = loadBalancerHealthMonitorName; + this.loadBalancerVmiName = loadBalancerVmiName; + this.loadBalancerIiName = loadBalancerIiName; + this.ruleId = ruleId; + this.listMember = listMember; + this.protocol = protocol; + this.srcPort = srcPort; + this.dstPort = dstPort; + this.privateIp = privateIp; + this.fipName = fipName; + this.fiName = fiName; + this.monitorType = monitorType; + this.maxRetries = maxRetries; + this.delay = delay; + this.timeout = timeout; + this.httpMethod = httpMethod; + this.urlPath = urlPath; + this.expectedCodes = expectedCodes; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getPublicNetworkUuid() { + return publicNetworkUuid; + } + + public String getLoadBalancerMethod() { + return loadBalancerMethod; + } + + public String getLoadBalancerName() { + return loadBalancerName; + } + + public String getLoadBalancerListenerName() { + return loadBalancerListenerName; + } + + public String getLoadBalancerPoolName() { + return loadBalancerPoolName; + } + + public String getLoadBalancerHealthMonitorName() { + return loadBalancerHealthMonitorName; + } + + public String getLoadBalancerVmiName() { + return loadBalancerVmiName; + } + + public String getLoadBalancerIiName() { + return loadBalancerIiName; + } + + public long getRuleId() { + return ruleId; + } + + public List getListMember() { + return listMember; + } + + public String getProtocol() { + return protocol; + } + + public int getSrcPort() { + return srcPort; + } + + public int getDstPort() { + return dstPort; + } + + public String getPrivateIp() { + return privateIp; + } + + public String getFipName() { + return fipName; + } + + public String getFiName() { + return fiName; + } + + public String getMonitorType() { + return monitorType; + } + + public int getMaxRetries() { + return maxRetries; + } + + public int getDelay() { + return delay; + } + + public int getTimeout() { + return timeout; + } + + public String getHttpMethod() { + return httpMethod; + } + + public String getUrlPath() { + return urlPath; + } + + public String getExpectedCodes() { + return expectedCodes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenNetworkLoadbalancerCommand that = (CreateTungstenNetworkLoadbalancerCommand) o; + return ruleId == that.ruleId && srcPort == that.srcPort && dstPort == that.dstPort && maxRetries == that.maxRetries && delay == that.delay && timeout == that.timeout && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkUuid, that.networkUuid) && Objects.equals(publicNetworkUuid, that.publicNetworkUuid) && Objects.equals(loadBalancerMethod, that.loadBalancerMethod) && Objects.equals(loadBalancerName, that.loadBalancerName) && Objects.equals(loadBalancerListenerName, that.loadBalancerListenerName) && Objects.equals(loadBalancerPoolName, that.loadBalancerPoolName) + && Objects.equals(loadBalancerHealthMonitorName, that.loadBalancerHealthMonitorName) && Objects.equals(loadBalancerVmiName, that.loadBalancerVmiName) && Objects.equals(loadBalancerIiName, that.loadBalancerIiName) && Objects.equals(listMember, that.listMember) && Objects.equals(protocol, that.protocol) && Objects.equals(privateIp, that.privateIp) && Objects.equals(fipName, that.fipName) && Objects.equals(fiName, that.fiName) && Objects.equals(monitorType, that.monitorType) && Objects.equals(httpMethod, that.httpMethod) && Objects.equals(urlPath, that.urlPath) && Objects.equals(expectedCodes, that.expectedCodes); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, networkUuid, publicNetworkUuid, loadBalancerMethod, loadBalancerName, loadBalancerListenerName, loadBalancerPoolName, loadBalancerHealthMonitorName, loadBalancerVmiName, loadBalancerIiName, ruleId, listMember, protocol, srcPort, dstPort, privateIp, fipName, fiName, monitorType, maxRetries, delay, timeout, httpMethod, urlPath, expectedCodes); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkPolicyCommand.java new file mode 100644 index 00000000000..c91a1c5b90a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenNetworkPolicyCommand.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.agent.api; + +import org.apache.cloudstack.network.tungsten.model.TungstenRule; + +import java.util.List; +import java.util.Objects; + +public class CreateTungstenNetworkPolicyCommand extends TungstenCommand { + private final String name; + private final String projectFqn; + private final List tungstenRuleList; + + public CreateTungstenNetworkPolicyCommand(final String name, final String projectFqn, + final List tungstenRuleList) { + this.name = name; + this.projectFqn = projectFqn; + this.tungstenRuleList = tungstenRuleList; + } + + public String getName() { + return name; + } + + public String getProjectFqn() { + return projectFqn; + } + + public List getTungstenRuleList() { + return tungstenRuleList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenNetworkPolicyCommand that = (CreateTungstenNetworkPolicyCommand) o; + return Objects.equals(name, that.name) && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(tungstenRuleList, that.tungstenRuleList); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), name, projectFqn, tungstenRuleList); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenPolicyCommand.java new file mode 100644 index 00000000000..2c4883bba59 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenPolicyCommand.java @@ -0,0 +1,58 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenPolicyCommand extends TungstenCommand { + private final String uuid; + private final String name; + private final String projectFqn; + + public CreateTungstenPolicyCommand(final String name, final String projectFqn) { + this.uuid = UUID.randomUUID().toString(); + this.name = name; + this.projectFqn = projectFqn; + } + + public String getUuid() { + return uuid; + } + + public String getName() { + return name; + } + + public String getProjectFqn() { + return projectFqn; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenPolicyCommand that = (CreateTungstenPolicyCommand) o; + return Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name) && Objects.equals(projectFqn, that.projectFqn); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, name, projectFqn); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenProjectCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenProjectCommand.java new file mode 100644 index 00000000000..7deee801406 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenProjectCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenProjectCommand extends TungstenCommand { + private final String tungstenProjectName; + private final String tungstenProjectUuid; + private final String tungstenDomainUuid; + private final String tungstenDomainName; + + public CreateTungstenProjectCommand(String tungstenProjectName, String tungstenProjectUuid, + String tungstenDomainUuid, String tungstenDomainName) { + this.tungstenProjectName = tungstenProjectName; + this.tungstenProjectUuid = tungstenProjectUuid; + this.tungstenDomainUuid = tungstenDomainUuid; + this.tungstenDomainName = tungstenDomainName; + } + + public String getTungstenProjectName() { + return tungstenProjectName; + } + + public String getTungstenProjectUuid() { + return tungstenProjectUuid; + } + + public String getTungstenDomainUuid() { + return tungstenDomainUuid; + } + + public String getTungstenDomainName() { + return tungstenDomainName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenProjectCommand that = (CreateTungstenProjectCommand) o; + return Objects.equals(tungstenProjectName, that.tungstenProjectName) && Objects.equals(tungstenProjectUuid, that.tungstenProjectUuid) && Objects.equals(tungstenDomainUuid, that.tungstenDomainUuid) && Objects.equals(tungstenDomainName, that.tungstenDomainName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenProjectName, tungstenProjectUuid, tungstenDomainUuid, tungstenDomainName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenRoutingLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenRoutingLogicalRouterCommand.java new file mode 100644 index 00000000000..0827bd572c2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenRoutingLogicalRouterCommand.java @@ -0,0 +1,58 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenRoutingLogicalRouterCommand extends TungstenCommand { + private final String projectFqn; + private final String uuid; + private final String name; + + public CreateTungstenRoutingLogicalRouterCommand(final String projectFqn, final String name) { + this.uuid = UUID.randomUUID().toString(); + this.projectFqn = projectFqn; + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenRoutingLogicalRouterCommand that = (CreateTungstenRoutingLogicalRouterCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, uuid, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenSecurityGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenSecurityGroupCommand.java new file mode 100644 index 00000000000..0db83d9a666 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenSecurityGroupCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenSecurityGroupCommand extends TungstenCommand { + private final String securityGroupUuid; + private final String securityGroupName; + private final String securityGroupDescription; + private final String projectFqn; + + public CreateTungstenSecurityGroupCommand(String securityGroupUuid, String securityGroupName, + String securityGroupDescription, String projectFqn) { + this.securityGroupUuid = securityGroupUuid; + this.securityGroupName = securityGroupName; + this.securityGroupDescription = securityGroupDescription; + this.projectFqn = projectFqn; + } + + public String getSecurityGroupUuid() { + return securityGroupUuid; + } + + public String getSecurityGroupName() { + return securityGroupName; + } + + public String getSecurityGroupDescription() { + return securityGroupDescription; + } + + public String getProjectFqn() { + return projectFqn; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenSecurityGroupCommand that = (CreateTungstenSecurityGroupCommand) o; + return Objects.equals(securityGroupUuid, that.securityGroupUuid) && Objects.equals(securityGroupName, that.securityGroupName) && Objects.equals(securityGroupDescription, that.securityGroupDescription) && Objects.equals(projectFqn, that.projectFqn); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), securityGroupUuid, securityGroupName, securityGroupDescription, projectFqn); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenServiceGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenServiceGroupCommand.java new file mode 100644 index 00000000000..bed66bd438c --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenServiceGroupCommand.java @@ -0,0 +1,71 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenServiceGroupCommand extends TungstenCommand { + private final String uuid; + private final String name; + private final String protocol; + private final int startPort; + private final int endPort; + + public CreateTungstenServiceGroupCommand(final String name, final String protocol, final int startPort, + final int endPort) { + this.uuid = UUID.randomUUID().toString(); + this.name = name; + this.protocol = protocol; + this.startPort = startPort; + this.endPort = endPort; + } + + public String getUuid() { + return uuid; + } + + public String getName() { + return name; + } + + public String getProtocol() { + return protocol; + } + + public int getStartPort() { + return startPort; + } + + public int getEndPort() { + return endPort; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenServiceGroupCommand that = (CreateTungstenServiceGroupCommand) o; + return startPort == that.startPort && endPort == that.endPort && Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name) && Objects.equals(protocol, that.protocol); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, name, protocol, startPort, endPort); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagCommand.java new file mode 100644 index 00000000000..a59a41d1fb9 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagCommand.java @@ -0,0 +1,58 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenTagCommand extends TungstenCommand { + private final String uuid; + private final String tagType; + private final String tagValue; + + public CreateTungstenTagCommand(final String tagType, final String tagValue) { + this.uuid = UUID.randomUUID().toString(); + this.tagType = tagType; + this.tagValue = tagValue; + } + + public String getUuid() { + return uuid; + } + + public String getTagType() { + return tagType; + } + + public String getTagValue() { + return tagValue; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenTagCommand that = (CreateTungstenTagCommand) o; + return Objects.equals(uuid, that.uuid) && Objects.equals(tagType, that.tagType) && Objects.equals(tagValue, that.tagValue); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, tagType, tagValue); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagTypeCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagTypeCommand.java new file mode 100644 index 00000000000..0761327c7fb --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenTagTypeCommand.java @@ -0,0 +1,52 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; +import java.util.UUID; + +public class CreateTungstenTagTypeCommand extends TungstenCommand { + private final String uuid; + private final String name; + + public CreateTungstenTagTypeCommand(final String name) { + this.uuid = UUID.randomUUID().toString(); + this.name = name; + } + + public String getUuid() { + return uuid; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenTagTypeCommand that = (CreateTungstenTagTypeCommand) o; + return Objects.equals(uuid, that.uuid) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenVirtualMachineCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenVirtualMachineCommand.java new file mode 100644 index 00000000000..58e722275f2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/CreateTungstenVirtualMachineCommand.java @@ -0,0 +1,125 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class CreateTungstenVirtualMachineCommand extends TungstenCommand { + private final String projectFqn; + private final String vnUuid; + private final String vmUuid; + private final String vmName; + private final String nicUuid; + private final long nicId; + private final String ip; + private final String ipv6; + private final String mac; + private final String vmType; + private final String trafficType; + private final String host; + private final String gateway; + private final boolean isDefaultNic; + + public CreateTungstenVirtualMachineCommand(final String projectFqn, final String vnUuid, final String vmUuid, + final String vmName, final String nicUuid, final long nicId, final String ip, final String ipv6, final String mac, + final String vmType, final String trafficType, final String host, final String gateway, final boolean isDefaultNic) { + this.projectFqn = projectFqn; + this.vnUuid = vnUuid; + this.vmUuid = vmUuid; + this.vmName = vmName; + this.nicUuid = nicUuid; + this.nicId = nicId; + this.ip = ip; + this.ipv6 = ipv6; + this.mac = mac; + this.vmType = vmType; + this.trafficType = trafficType; + this.host = host; + this.gateway = gateway; + this.isDefaultNic = isDefaultNic; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getVnUuid() { + return vnUuid; + } + + public String getVmUuid() { + return vmUuid; + } + + public String getVmName() { + return vmName; + } + + public String getNicUuid() { + return nicUuid; + } + + public long getNicId() { + return nicId; + } + + public String getIp() { + return ip; + } + + public String getIpv6() { + return ipv6; + } + + public String getMac() { + return mac; + } + + public String getVmType() { + return vmType; + } + + public String getTrafficType() { + return trafficType; + } + + public String getHost() { + return host; + } + + public String getGateway() { + return gateway; + } + + public boolean isDefaultNic() { + return isDefaultNic; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + CreateTungstenVirtualMachineCommand that = (CreateTungstenVirtualMachineCommand) o; + return nicId == that.nicId && isDefaultNic == that.isDefaultNic && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(vnUuid, that.vnUuid) && Objects.equals(vmUuid, that.vmUuid) && Objects.equals(vmName, that.vmName) && Objects.equals(nicUuid, that.nicUuid) && Objects.equals(ip, that.ip) && Objects.equals(ipv6, that.ipv6) && Objects.equals(mac, that.mac) && Objects.equals(vmType, that.vmType) && Objects.equals(trafficType, that.trafficType) && Objects.equals(host, that.host) && Objects.equals(gateway, that.gateway); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, vnUuid, vmUuid, vmName, nicUuid, nicId, ip, ipv6, mac, vmType, trafficType, host, gateway, isDefaultNic); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenAddressGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenAddressGroupCommand.java new file mode 100644 index 00000000000..5e8e2804bf8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenAddressGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenAddressGroupCommand extends TungstenCommand { + private final String addressGroupUuid; + + public DeleteTungstenAddressGroupCommand(final String addressGroupUuid) { + this.addressGroupUuid = addressGroupUuid; + } + + public String getAddressGroupUuid() { + return addressGroupUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenAddressGroupCommand that = (DeleteTungstenAddressGroupCommand) o; + return Objects.equals(addressGroupUuid, that.addressGroupUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), addressGroupUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenApplicationPolicySetCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenApplicationPolicySetCommand.java new file mode 100644 index 00000000000..c63eadf0459 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenApplicationPolicySetCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenApplicationPolicySetCommand extends TungstenCommand { + private final String applicationPolicySetUuid; + + public DeleteTungstenApplicationPolicySetCommand(final String applicationPolicySetUuid) { + this.applicationPolicySetUuid = applicationPolicySetUuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenApplicationPolicySetCommand that = (DeleteTungstenApplicationPolicySetCommand) o; + return Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), applicationPolicySetUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenDomainCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenDomainCommand.java new file mode 100644 index 00000000000..c063ec9d15a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenDomainCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenDomainCommand extends TungstenCommand { + private final String tungstenDomainUuid; + + public DeleteTungstenDomainCommand(String tungstenDomainUuid) { + this.tungstenDomainUuid = tungstenDomainUuid; + } + + public String getTungstenDomainUuid() { + return tungstenDomainUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenDomainCommand that = (DeleteTungstenDomainCommand) o; + return Objects.equals(tungstenDomainUuid, that.tungstenDomainUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenDomainUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallPolicyCommand.java new file mode 100644 index 00000000000..6cfa0ebb62a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallPolicyCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenFirewallPolicyCommand extends TungstenCommand { + private final String firewallPolicyUuid; + + public DeleteTungstenFirewallPolicyCommand(final String firewallPolicyUuid) { + this.firewallPolicyUuid = firewallPolicyUuid; + } + + public String getFirewallPolicyUuid() { + return firewallPolicyUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenFirewallPolicyCommand that = (DeleteTungstenFirewallPolicyCommand) o; + return Objects.equals(firewallPolicyUuid, that.firewallPolicyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), firewallPolicyUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallRuleCommand.java new file mode 100644 index 00000000000..a259cbd0529 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFirewallRuleCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenFirewallRuleCommand extends TungstenCommand { + private final String firewallRuleUuid; + + public DeleteTungstenFirewallRuleCommand(final String firewallRuleUuid) { + this.firewallRuleUuid = firewallRuleUuid; + } + + public String getFirewallRuleUuid() { + return firewallRuleUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenFirewallRuleCommand that = (DeleteTungstenFirewallRuleCommand) o; + return Objects.equals(firewallRuleUuid, that.firewallRuleUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), firewallRuleUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpCommand.java new file mode 100644 index 00000000000..a2458f40ab4 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpCommand.java @@ -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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenFloatingIpCommand extends TungstenCommand { + private final String vnUuid; + private final String fipName; + private final String name; + + public DeleteTungstenFloatingIpCommand(String vnUuid, final String fipName, final String name) { + this.vnUuid = vnUuid; + this.fipName = fipName; + this.name = name; + } + + public String getVnUuid() { + return vnUuid; + } + + public String getFipName() { + return fipName; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenFloatingIpCommand that = (DeleteTungstenFloatingIpCommand) o; + return Objects.equals(vnUuid, that.vnUuid) && Objects.equals(fipName, that.fipName) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), vnUuid, fipName, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpPoolCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpPoolCommand.java new file mode 100644 index 00000000000..5a96a354702 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenFloatingIpPoolCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenFloatingIpPoolCommand extends TungstenCommand { + private final String vnUuid; + private final String fipName; + + public DeleteTungstenFloatingIpPoolCommand(final String vnUuid, final String fipName) { + this.vnUuid = vnUuid; + this.fipName = fipName; + } + + public String getVnUuid() { + return vnUuid; + } + + public String getFipName() { + return fipName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenFloatingIpPoolCommand that = (DeleteTungstenFloatingIpPoolCommand) o; + return Objects.equals(vnUuid, that.vnUuid) && Objects.equals(fipName, that.fipName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), vnUuid, fipName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerCommand.java new file mode 100644 index 00000000000..f9ff15a475b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerCommand.java @@ -0,0 +1,83 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenLoadBalancerCommand extends TungstenCommand { + private final String projectFqn; + private final String publicNetworkUuid; + private final String loadBalancerName; + private final String loadBalancerHealthMonitorName; + private final String loadBalancerVmiName; + private final String fipName; + private final String fiName; + + public DeleteTungstenLoadBalancerCommand(final String projectFqn, final String publicNetworkUuid, + final String loadBalancerName, final String loadBalancerHealthMonitorName, final String loadBalancerVmiName, + final String fipName, final String fiName) { + this.projectFqn = projectFqn; + this.publicNetworkUuid = publicNetworkUuid; + this.loadBalancerName = loadBalancerName; + this.loadBalancerHealthMonitorName = loadBalancerHealthMonitorName; + this.loadBalancerVmiName = loadBalancerVmiName; + this.fipName = fipName; + this.fiName = fiName; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getPublicNetworkUuid() { + return publicNetworkUuid; + } + + public String getLoadBalancerName() { + return loadBalancerName; + } + + public String getLoadBalancerHealthMonitorName() { + return loadBalancerHealthMonitorName; + } + + public String getLoadBalancerVmiName() { + return loadBalancerVmiName; + } + + public String getFipName() { + return fipName; + } + + public String getFiName() { + return fiName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenLoadBalancerCommand that = (DeleteTungstenLoadBalancerCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(publicNetworkUuid, that.publicNetworkUuid) && Objects.equals(loadBalancerName, that.loadBalancerName) && Objects.equals(loadBalancerHealthMonitorName, that.loadBalancerHealthMonitorName) && Objects.equals(loadBalancerVmiName, that.loadBalancerVmiName) && Objects.equals(fipName, that.fipName) && Objects.equals(fiName, that.fiName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, publicNetworkUuid, loadBalancerName, loadBalancerHealthMonitorName, loadBalancerVmiName, fipName, fiName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerListenerCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerListenerCommand.java new file mode 100644 index 00000000000..400ba1fa058 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenLoadBalancerListenerCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenLoadBalancerListenerCommand extends TungstenCommand { + private final String projectFqn; + private final String loadBalancerListenerName; + + public DeleteTungstenLoadBalancerListenerCommand(final String projectFqn, final String loadBalancerListenerName) { + this.projectFqn = projectFqn; + this.loadBalancerListenerName = loadBalancerListenerName; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getLoadBalancerListenerName() { + return loadBalancerListenerName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenLoadBalancerListenerCommand that = (DeleteTungstenLoadBalancerListenerCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(loadBalancerListenerName, that.loadBalancerListenerName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, loadBalancerListenerName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkCommand.java new file mode 100644 index 00000000000..522dbca8aff --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkCommand.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenNetworkCommand extends TungstenCommand { + + private final String networkUuid; + + public DeleteTungstenNetworkCommand(String networkUuid) { + this.networkUuid = networkUuid; + } + + public String getNetworkUuid() { + return networkUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenNetworkCommand that = (DeleteTungstenNetworkCommand) o; + return Objects.equals(networkUuid, that.networkUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkPolicyCommand.java new file mode 100644 index 00000000000..f796ebc0c76 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenNetworkPolicyCommand.java @@ -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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenNetworkPolicyCommand extends TungstenCommand { + private final String name; + private final String projectFqn; + private final String networkUuid; + + public DeleteTungstenNetworkPolicyCommand(final String name, final String projectFqn, final String networkUuid) { + this.name = name; + this.projectFqn = projectFqn; + this.networkUuid = networkUuid; + } + + public String getName() { + return name; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkUuid() { + return networkUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenNetworkPolicyCommand that = (DeleteTungstenNetworkPolicyCommand) o; + return Objects.equals(name, that.name) && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkUuid, that.networkUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), name, projectFqn, networkUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenObjectCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenObjectCommand.java new file mode 100644 index 00000000000..8c5ac080aaf --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenObjectCommand.java @@ -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. +package org.apache.cloudstack.network.tungsten.agent.api; + +import net.juniper.tungsten.api.ApiObjectBase; + +import java.util.Objects; + +public class DeleteTungstenObjectCommand extends TungstenCommand { + private final ApiObjectBase apiObjectBase; + + public DeleteTungstenObjectCommand(final ApiObjectBase apiObjectBase) { + this.apiObjectBase = apiObjectBase; + } + + public ApiObjectBase getApiObjectBase() { + return apiObjectBase; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenObjectCommand that = (DeleteTungstenObjectCommand) o; + return Objects.equals(apiObjectBase, that.apiObjectBase); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), apiObjectBase); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenPolicyCommand.java new file mode 100644 index 00000000000..2e6fe0730c7 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenPolicyCommand.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenPolicyCommand extends TungstenCommand { + + private final String policyUuid; + + public DeleteTungstenPolicyCommand(final String policyUuid) { + this.policyUuid = policyUuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenPolicyCommand that = (DeleteTungstenPolicyCommand) o; + return Objects.equals(policyUuid, that.policyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), policyUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenProjectCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenProjectCommand.java new file mode 100644 index 00000000000..78008732f67 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenProjectCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenProjectCommand extends TungstenCommand { + private final String tungstenProjectUuid; + + public DeleteTungstenProjectCommand(String tungstenProjectUuid) { + this.tungstenProjectUuid = tungstenProjectUuid; + } + + public String getTungstenProjectUuid() { + return tungstenProjectUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenProjectCommand that = (DeleteTungstenProjectCommand) o; + return Objects.equals(tungstenProjectUuid, that.tungstenProjectUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenProjectUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenRoutingLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenRoutingLogicalRouterCommand.java new file mode 100644 index 00000000000..4087fd445bd --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenRoutingLogicalRouterCommand.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenRoutingLogicalRouterCommand extends TungstenCommand { + + private final String logicalRouterUuid; + + public DeleteTungstenRoutingLogicalRouterCommand(String logicalRouterUuid) { + this.logicalRouterUuid = logicalRouterUuid; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenRoutingLogicalRouterCommand that = (DeleteTungstenRoutingLogicalRouterCommand) o; + return Objects.equals(logicalRouterUuid, that.logicalRouterUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), logicalRouterUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenSecurityGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenSecurityGroupCommand.java new file mode 100644 index 00000000000..d96625ed5ba --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenSecurityGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenSecurityGroupCommand extends TungstenCommand { + private final String tungstenSecurityGroupUuid; + + public DeleteTungstenSecurityGroupCommand(String tungstenSecurityGroupUuid) { + this.tungstenSecurityGroupUuid = tungstenSecurityGroupUuid; + } + + public String getTungstenSecurityGroupUuid() { + return tungstenSecurityGroupUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenSecurityGroupCommand that = (DeleteTungstenSecurityGroupCommand) o; + return Objects.equals(tungstenSecurityGroupUuid, that.tungstenSecurityGroupUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenSecurityGroupUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenServiceGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenServiceGroupCommand.java new file mode 100644 index 00000000000..abee1661111 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenServiceGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenServiceGroupCommand extends TungstenCommand { + private final String serviceGroupUuid; + + public DeleteTungstenServiceGroupCommand(final String serviceGroupUuid) { + this.serviceGroupUuid = serviceGroupUuid; + } + + public String getServiceGroupUuid() { + return serviceGroupUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenServiceGroupCommand that = (DeleteTungstenServiceGroupCommand) o; + return Objects.equals(serviceGroupUuid, that.serviceGroupUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), serviceGroupUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagCommand.java new file mode 100644 index 00000000000..4649f12d19e --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagCommand.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenTagCommand extends TungstenCommand { + + private final String tagUuid; + + public DeleteTungstenTagCommand(String tagUuid) { + this.tagUuid = tagUuid; + } + + public String getTagUuid() { + return tagUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenTagCommand that = (DeleteTungstenTagCommand) o; + return Objects.equals(tagUuid, that.tagUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tagUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagTypeCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagTypeCommand.java new file mode 100644 index 00000000000..f692d6f3416 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenTagTypeCommand.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenTagTypeCommand extends TungstenCommand { + + private final String tagTypeUuid; + + public DeleteTungstenTagTypeCommand(String tagTypeUuid) { + this.tagTypeUuid = tagTypeUuid; + } + + public String getTagTypeUuid() { + return tagTypeUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenTagTypeCommand that = (DeleteTungstenTagTypeCommand) o; + return Objects.equals(tagTypeUuid, that.tagTypeUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tagTypeUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVRouterPortCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVRouterPortCommand.java new file mode 100644 index 00000000000..7032038065a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVRouterPortCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenVRouterPortCommand extends TungstenCommand { + private final String host; + private final String portId; + + public DeleteTungstenVRouterPortCommand(final String host, final String portId) { + this.host = host; + this.portId = portId; + } + + public String getPortId() { + return portId; + } + + public String getHost() { + return host; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenVRouterPortCommand that = (DeleteTungstenVRouterPortCommand) o; + return Objects.equals(host, that.host) && Objects.equals(portId, that.portId); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), host, portId); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmCommand.java new file mode 100644 index 00000000000..4f1825afdcf --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmCommand.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenVmCommand extends TungstenCommand { + + private final String virtualMachineUuid; + + public DeleteTungstenVmCommand(String virtualMachineUuid) { + this.virtualMachineUuid = virtualMachineUuid; + } + + public String getVirtualMachineUuid() { + return virtualMachineUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenVmCommand that = (DeleteTungstenVmCommand) o; + return Objects.equals(virtualMachineUuid, that.virtualMachineUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), virtualMachineUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmInterfaceCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmInterfaceCommand.java new file mode 100644 index 00000000000..d127a45b6e1 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/DeleteTungstenVmInterfaceCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class DeleteTungstenVmInterfaceCommand extends TungstenCommand { + private final String projectFqn; + private final String name; + + public DeleteTungstenVmInterfaceCommand(final String projectFqn, String name) { + this.projectFqn = projectFqn; + this.name = name; + } + + public String getName() { + return name; + } + + public String getProjectFqn() { + return projectFqn; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DeleteTungstenVmInterfaceCommand that = (DeleteTungstenVmInterfaceCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFabricNetworkCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFabricNetworkCommand.java new file mode 100644 index 00000000000..871f8e16b4c --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFabricNetworkCommand.java @@ -0,0 +1,21 @@ +// 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.network.tungsten.agent.api; + +public class GetTungstenFabricNetworkCommand extends TungstenCommand { + +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFloatingIpsCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFloatingIpsCommand.java new file mode 100644 index 00000000000..7ae33ea57aa --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenFloatingIpsCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class GetTungstenFloatingIpsCommand extends TungstenCommand { + private final String vnUuid; + private final String fipName; + + public GetTungstenFloatingIpsCommand(final String vnUuid, final String fipName) { + this.vnUuid = vnUuid; + this.fipName = fipName; + } + + public String getVnUuid() { + return vnUuid; + } + + public String getFipName() { + return fipName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + GetTungstenFloatingIpsCommand that = (GetTungstenFloatingIpsCommand) o; + return Objects.equals(vnUuid, that.vnUuid) && Objects.equals(fipName, that.fipName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), vnUuid, fipName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenLoadBalancerCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenLoadBalancerCommand.java new file mode 100644 index 00000000000..82c7ddc4d61 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenLoadBalancerCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class GetTungstenLoadBalancerCommand extends TungstenCommand { + private final String projectFqn; + private final String lbName; + + public GetTungstenLoadBalancerCommand(final String projectFqn, final String lbName) { + this.projectFqn = projectFqn; + this.lbName = lbName; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getLbName() { + return lbName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + GetTungstenLoadBalancerCommand that = (GetTungstenLoadBalancerCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(lbName, that.lbName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, lbName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNatIpCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNatIpCommand.java new file mode 100644 index 00000000000..1899ddb85ed --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNatIpCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class GetTungstenNatIpCommand extends TungstenCommand { + private final String projectFqn; + private final String logicalRouterUuid; + + public GetTungstenNatIpCommand(final String projectFqn, final String logicalRouterUuid) { + this.projectFqn = projectFqn; + this.logicalRouterUuid = logicalRouterUuid; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + GetTungstenNatIpCommand that = (GetTungstenNatIpCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(logicalRouterUuid, that.logicalRouterUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, logicalRouterUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNetworkDnsCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNetworkDnsCommand.java new file mode 100644 index 00000000000..bea7144bf3f --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenNetworkDnsCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class GetTungstenNetworkDnsCommand extends TungstenCommand { + private final String uuid; + private final String subnetName; + + public GetTungstenNetworkDnsCommand(final String uuid, final String subnetName) { + this.uuid = uuid; + this.subnetName = subnetName; + } + + public String getUuid() { + return uuid; + } + + public String getSubnetName() { + return subnetName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + GetTungstenNetworkDnsCommand that = (GetTungstenNetworkDnsCommand) o; + return Objects.equals(uuid, that.uuid) && Objects.equals(subnetName, that.subnetName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), uuid, subnetName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenPolicyCommand.java new file mode 100644 index 00000000000..396cbc87192 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenPolicyCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class GetTungstenPolicyCommand extends TungstenCommand { + private final String projectFqn; + private final String name; + + public GetTungstenPolicyCommand(final String projectFqn, final String name) { + this.projectFqn = projectFqn; + this.name = name; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + GetTungstenPolicyCommand that = (GetTungstenPolicyCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenSecurityGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenSecurityGroupCommand.java new file mode 100644 index 00000000000..7f09a155b6b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/GetTungstenSecurityGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class GetTungstenSecurityGroupCommand extends TungstenCommand { + private final String tungstenSecurityGroupUuid; + + public GetTungstenSecurityGroupCommand(String tungstenSecurityGroupUuid) { + this.tungstenSecurityGroupUuid = tungstenSecurityGroupUuid; + } + + public String getTungstenSecurityGroupUuid() { + return tungstenSecurityGroupUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + GetTungstenSecurityGroupCommand that = (GetTungstenSecurityGroupCommand) o; + return Objects.equals(tungstenSecurityGroupUuid, that.tungstenSecurityGroupUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tungstenSecurityGroupUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenAddressGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenAddressGroupCommand.java new file mode 100644 index 00000000000..a88ce5755e3 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenAddressGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenAddressGroupCommand extends TungstenCommand { + private final String addressGroupUuid; + + public ListTungstenAddressGroupCommand(final String addressGroupUuid) { + this.addressGroupUuid = addressGroupUuid; + } + + public String getAddressGroupUuid() { + return addressGroupUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenAddressGroupCommand that = (ListTungstenAddressGroupCommand) o; + return Objects.equals(addressGroupUuid, that.addressGroupUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), addressGroupUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenApplicationPolicySetCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenApplicationPolicySetCommand.java new file mode 100644 index 00000000000..7c1e87a90c5 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenApplicationPolicySetCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenApplicationPolicySetCommand extends TungstenCommand { + private final String applicationPolicySetUuid; + + public ListTungstenApplicationPolicySetCommand(final String applicationPolicySetUuid) { + this.applicationPolicySetUuid = applicationPolicySetUuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenApplicationPolicySetCommand that = (ListTungstenApplicationPolicySetCommand) o; + return Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), applicationPolicySetUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenConnectedNetworkFromLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenConnectedNetworkFromLogicalRouterCommand.java new file mode 100644 index 00000000000..1cdcc88fe70 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenConnectedNetworkFromLogicalRouterCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenConnectedNetworkFromLogicalRouterCommand extends TungstenCommand { + private final String logicalRouterUuid; + + public ListTungstenConnectedNetworkFromLogicalRouterCommand(final String logicalRouterUuid) { + this.logicalRouterUuid = logicalRouterUuid; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenConnectedNetworkFromLogicalRouterCommand that = (ListTungstenConnectedNetworkFromLogicalRouterCommand) o; + return Objects.equals(logicalRouterUuid, that.logicalRouterUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), logicalRouterUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallPolicyCommand.java new file mode 100644 index 00000000000..b00a7d622a8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallPolicyCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenFirewallPolicyCommand extends TungstenCommand { + private final String applicationPolicySetUuid; + private final String firewallPolicyUuid; + + public ListTungstenFirewallPolicyCommand(final String applicationPolicySetUuid, final String firewallPolicyUuid) { + this.applicationPolicySetUuid = applicationPolicySetUuid; + this.firewallPolicyUuid = firewallPolicyUuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + public String getFirewallPolicyUuid() { + return firewallPolicyUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenFirewallPolicyCommand that = (ListTungstenFirewallPolicyCommand) o; + return Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid) && Objects.equals(firewallPolicyUuid, that.firewallPolicyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), applicationPolicySetUuid, firewallPolicyUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallRuleCommand.java new file mode 100644 index 00000000000..caef6fab952 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenFirewallRuleCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenFirewallRuleCommand extends TungstenCommand { + private final String firewallPolicyUuid; + private final String firewallRuleUuid; + + public ListTungstenFirewallRuleCommand(final String firewallPolicyUuid, final String firewallRuleUuid) { + this.firewallPolicyUuid = firewallPolicyUuid; + this.firewallRuleUuid = firewallRuleUuid; + } + + public String getFirewallPolicyUuid() { + return firewallPolicyUuid; + } + + public String getFirewallRuleUuid() { + return firewallRuleUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenFirewallRuleCommand that = (ListTungstenFirewallRuleCommand) o; + return Objects.equals(firewallPolicyUuid, that.firewallPolicyUuid) && Objects.equals(firewallRuleUuid, that.firewallRuleUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), firewallPolicyUuid, firewallRuleUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNetworkCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNetworkCommand.java new file mode 100644 index 00000000000..9b81540715a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNetworkCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenNetworkCommand extends TungstenCommand { + private final String projectFqn; + private final String networkUuid; + + public ListTungstenNetworkCommand(final String projectFqn, final String networkUuid) { + this.projectFqn = projectFqn; + this.networkUuid = networkUuid; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkUuid() { + return networkUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenNetworkCommand that = (ListTungstenNetworkCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkUuid, that.networkUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, networkUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNicCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNicCommand.java new file mode 100644 index 00000000000..847551e0b2f --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenNicCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenNicCommand extends TungstenCommand { + private final String projectFqn; + private final String nicUuid; + + public ListTungstenNicCommand(final String projectFqn, final String nicUuid) { + this.projectFqn = projectFqn; + this.nicUuid = nicUuid; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNicUuid() { + return nicUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenNicCommand that = (ListTungstenNicCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(nicUuid, that.nicUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, nicUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyCommand.java new file mode 100644 index 00000000000..54162a3425b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenPolicyCommand extends TungstenCommand { + private final String projectFqn; + private final String networkUuid; + private final String policyName; + private final String policyUuid; + + public ListTungstenPolicyCommand(final String projectFqn, final String networkUuid, final String policyName, + final String policyUuid) { + this.projectFqn = projectFqn; + this.networkUuid = networkUuid; + this.policyName = policyName; + this.policyUuid = policyUuid; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getPolicyName() { + return policyName; + } + + public String getPolicyUuid() { + return policyUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenPolicyCommand that = (ListTungstenPolicyCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkUuid, that.networkUuid) && Objects.equals(policyName, that.policyName) && Objects.equals(policyUuid, that.policyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, networkUuid, policyName, policyUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyRuleCommand.java new file mode 100644 index 00000000000..b06009e7b64 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenPolicyRuleCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenPolicyRuleCommand extends TungstenCommand { + private final String policyUuid; + + public ListTungstenPolicyRuleCommand(final String policyUuid) { + this.policyUuid = policyUuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenPolicyRuleCommand that = (ListTungstenPolicyRuleCommand) o; + return Objects.equals(policyUuid, that.policyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), policyUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenRoutingLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenRoutingLogicalRouterCommand.java new file mode 100644 index 00000000000..8828eda0cbc --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenRoutingLogicalRouterCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenRoutingLogicalRouterCommand extends TungstenCommand { + private final String networkUuid; + private final String logicalRouterUuid; + + public ListTungstenRoutingLogicalRouterCommand(final String networkUuid, final String logicalRouterUuid) { + this.networkUuid = networkUuid; + this.logicalRouterUuid = logicalRouterUuid; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenRoutingLogicalRouterCommand that = (ListTungstenRoutingLogicalRouterCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(logicalRouterUuid, that.logicalRouterUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, logicalRouterUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenServiceGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenServiceGroupCommand.java new file mode 100644 index 00000000000..a00b1ce1562 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenServiceGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenServiceGroupCommand extends TungstenCommand { + private final String serviceGroupUuid; + + public ListTungstenServiceGroupCommand(final String serviceGroupUuid) { + this.serviceGroupUuid = serviceGroupUuid; + } + + public String getServiceGroupUuid() { + return serviceGroupUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenServiceGroupCommand that = (ListTungstenServiceGroupCommand) o; + return Objects.equals(serviceGroupUuid, that.serviceGroupUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), serviceGroupUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagCommand.java new file mode 100644 index 00000000000..c3edbb453a6 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagCommand.java @@ -0,0 +1,76 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenTagCommand extends TungstenCommand { + private final String networkUuid; + private final String vmUuid; + private final String nicUuid; + private final String policyUuid; + private final String applicationPolicySetUuid; + private final String tagUuid; + + public ListTungstenTagCommand(final String networkUuid, final String vmUuid, final String nicUuid, + final String policyUuid, final String applicationPolicySetUuid, final String tagUuid) { + this.networkUuid = networkUuid; + this.vmUuid = vmUuid; + this.nicUuid = nicUuid; + this.policyUuid = policyUuid; + this.applicationPolicySetUuid = applicationPolicySetUuid; + this.tagUuid = tagUuid; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getVmUuid() { + return vmUuid; + } + + public String getNicUuid() { + return nicUuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + public String getTagUuid() { + return tagUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenTagCommand that = (ListTungstenTagCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(vmUuid, that.vmUuid) && Objects.equals(nicUuid, that.nicUuid) && Objects.equals(policyUuid, that.policyUuid) && Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid) && Objects.equals(tagUuid, that.tagUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, vmUuid, nicUuid, policyUuid, applicationPolicySetUuid, tagUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagTypeCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagTypeCommand.java new file mode 100644 index 00000000000..e3c7ec2e2f8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenTagTypeCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenTagTypeCommand extends TungstenCommand { + private final String tagTypeUuid; + + public ListTungstenTagTypeCommand(final String tagTypeUuid) { + this.tagTypeUuid = tagTypeUuid; + } + + public String getTagTypeUuid() { + return tagTypeUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenTagTypeCommand that = (ListTungstenTagTypeCommand) o; + return Objects.equals(tagTypeUuid, that.tagTypeUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tagTypeUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenVmCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenVmCommand.java new file mode 100644 index 00000000000..be3699e7ade --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ListTungstenVmCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class ListTungstenVmCommand extends TungstenCommand { + private final String projectFqn; + private final String vmUuid; + + public ListTungstenVmCommand(final String projectFqn, final String vmUuid) { + this.projectFqn = projectFqn; + this.vmUuid = vmUuid; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getVmUuid() { + return vmUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ListTungstenVmCommand that = (ListTungstenVmCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(vmUuid, that.vmUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, vmUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ReleaseTungstenFloatingIpCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ReleaseTungstenFloatingIpCommand.java new file mode 100644 index 00000000000..4ae93b00dc0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/ReleaseTungstenFloatingIpCommand.java @@ -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.network.tungsten.agent.api; + +import java.util.Objects; + +public class ReleaseTungstenFloatingIpCommand extends TungstenCommand { + private final String vnUuid; + private final String fipName; + private final String name; + + public ReleaseTungstenFloatingIpCommand(final String vnUuid, final String fipName, final String name) { + this.vnUuid = vnUuid; + this.fipName = fipName; + this.name = name; + } + + public String getVnUuid() { + return vnUuid; + } + + public String getFipName() { + return fipName; + } + + public String getName() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + ReleaseTungstenFloatingIpCommand that = (ReleaseTungstenFloatingIpCommand) o; + return Objects.equals(vnUuid, that.vnUuid) && Objects.equals(fipName, that.fipName) && Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), vnUuid, fipName, name); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkGatewayFromLogicalRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkGatewayFromLogicalRouterCommand.java new file mode 100644 index 00000000000..e66fa3e5275 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkGatewayFromLogicalRouterCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class RemoveTungstenNetworkGatewayFromLogicalRouterCommand extends TungstenCommand { + private final String networkUuid; + private final String logicalRouterUuid; + + public RemoveTungstenNetworkGatewayFromLogicalRouterCommand(String networkUuid, String logicalRouterUuid) { + this.networkUuid = networkUuid; + this.logicalRouterUuid = logicalRouterUuid; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getLogicalRouterUuid() { + return logicalRouterUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenNetworkGatewayFromLogicalRouterCommand that = (RemoveTungstenNetworkGatewayFromLogicalRouterCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(logicalRouterUuid, that.logicalRouterUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, logicalRouterUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkSubnetCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkSubnetCommand.java new file mode 100644 index 00000000000..d1eda857e1e --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenNetworkSubnetCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class RemoveTungstenNetworkSubnetCommand extends TungstenCommand { + private final String networkUuid; + private final String subnetName; + + public RemoveTungstenNetworkSubnetCommand(final String networkUuid, final String subnetName) { + this.networkUuid = networkUuid; + this.subnetName = subnetName; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getSubnetName() { + return subnetName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenNetworkSubnetCommand that = (RemoveTungstenNetworkSubnetCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(subnetName, that.subnetName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, subnetName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyCommand.java new file mode 100644 index 00000000000..66139d8db47 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class RemoveTungstenPolicyCommand extends TungstenCommand { + private final String networkUuid; + private final String policyUuid; + + public RemoveTungstenPolicyCommand(final String networkUuid, final String policyUuid) { + this.networkUuid = networkUuid; + this.policyUuid = policyUuid; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenPolicyCommand that = (RemoveTungstenPolicyCommand) o; + return Objects.equals(networkUuid, that.networkUuid) && Objects.equals(policyUuid, that.policyUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuid, policyUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyRuleCommand.java new file mode 100644 index 00000000000..0b3f18fae41 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenPolicyRuleCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class RemoveTungstenPolicyRuleCommand extends TungstenCommand { + private final String policyUuid; + private final String ruleUuid; + + public RemoveTungstenPolicyRuleCommand(final String policyUuid, final String ruleUuid) { + this.policyUuid = policyUuid; + this.ruleUuid = ruleUuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public String getRuleUuid() { + return ruleUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenPolicyRuleCommand that = (RemoveTungstenPolicyRuleCommand) o; + return Objects.equals(policyUuid, that.policyUuid) && Objects.equals(ruleUuid, that.ruleUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), policyUuid, ruleUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecondaryIpAddressCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecondaryIpAddressCommand.java new file mode 100644 index 00000000000..25f455650d8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecondaryIpAddressCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class RemoveTungstenSecondaryIpAddressCommand extends TungstenCommand { + private final String iiName; + + public RemoveTungstenSecondaryIpAddressCommand(final String iiName) { + this.iiName = iiName; + } + + public String getIiName() { + return iiName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenSecondaryIpAddressCommand that = (RemoveTungstenSecondaryIpAddressCommand) o; + return Objects.equals(iiName, that.iiName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), iiName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecurityGroupRuleCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecurityGroupRuleCommand.java new file mode 100644 index 00000000000..ffb84995af7 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenSecurityGroupRuleCommand.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import java.util.Objects; + +public class RemoveTungstenSecurityGroupRuleCommand extends TungstenCommand { + private final String securityGroupUuid; + private final String securityGroupRuleUuid; + + public RemoveTungstenSecurityGroupRuleCommand(String securityGroupUuid, String securityGroupRuleUuid) { + this.securityGroupUuid = securityGroupUuid; + this.securityGroupRuleUuid = securityGroupRuleUuid; + } + + public String getSecurityGroupUuid() { + return securityGroupUuid; + } + + public String getSecurityGroupRuleUuid() { + return securityGroupRuleUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenSecurityGroupRuleCommand that = (RemoveTungstenSecurityGroupRuleCommand) o; + return Objects.equals(securityGroupUuid, that.securityGroupUuid) && Objects.equals(securityGroupRuleUuid, that.securityGroupRuleUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), securityGroupUuid, securityGroupRuleUuid); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenTagCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenTagCommand.java new file mode 100644 index 00000000000..fc6af9ba09f --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenTagCommand.java @@ -0,0 +1,77 @@ +// 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.network.tungsten.agent.api; + +import java.util.List; +import java.util.Objects; + +public class RemoveTungstenTagCommand extends TungstenCommand { + private final List networkUuids; + private final List vmUuids; + private final List nicUuids; + private final String policyUuid; + private final String applicationPolicySetUuid; + private final String tagUuid; + + public RemoveTungstenTagCommand(final List networkUuids, final List vmUuids, + final List nicUuids, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid) { + this.networkUuids = networkUuids; + this.vmUuids = vmUuids; + this.nicUuids = nicUuids; + this.policyUuid = policyUuid; + this.applicationPolicySetUuid = applicationPolicySetUuid; + this.tagUuid = tagUuid; + } + + public List getNetworkUuids() { + return networkUuids; + } + + public List getVmUuids() { + return vmUuids; + } + + public List getNicUuids() { + return nicUuids; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public String getApplicationPolicySetUuid() { + return applicationPolicySetUuid; + } + + public String getTagUuid() { + return tagUuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenTagCommand that = (RemoveTungstenTagCommand) o; + return Objects.equals(networkUuids, that.networkUuids) && Objects.equals(vmUuids, that.vmUuids) && Objects.equals(nicUuids, that.nicUuids) && Objects.equals(policyUuid, that.policyUuid) && Objects.equals(applicationPolicySetUuid, that.applicationPolicySetUuid) && Objects.equals(tagUuid, that.tagUuid); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), networkUuids, vmUuids, nicUuids, policyUuid, applicationPolicySetUuid, tagUuid); + } +} \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenVmFromSecurityGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenVmFromSecurityGroupCommand.java new file mode 100644 index 00000000000..775530ba180 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/RemoveTungstenVmFromSecurityGroupCommand.java @@ -0,0 +1,52 @@ +// 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.network.tungsten.agent.api; + +import java.util.List; +import java.util.Objects; + +public class RemoveTungstenVmFromSecurityGroupCommand extends TungstenCommand { + private final String nicUuid; + private final List securityGroupUuidList; + + public RemoveTungstenVmFromSecurityGroupCommand(String nicUuid, List securityGroupUuidList) { + this.nicUuid = nicUuid; + this.securityGroupUuidList = securityGroupUuidList; + } + + public String getNicUuid() { + return nicUuid; + } + + public List getSecurityGroupUuidList() { + return securityGroupUuidList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + RemoveTungstenVmFromSecurityGroupCommand that = (RemoveTungstenVmFromSecurityGroupCommand) o; + return Objects.equals(nicUuid, that.nicUuid) && Objects.equals(securityGroupUuidList, that.securityGroupUuidList); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), nicUuid, securityGroupUuidList); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetTungstenNetworkGatewayCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetTungstenNetworkGatewayCommand.java new file mode 100644 index 00000000000..f882a5e46de --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetTungstenNetworkGatewayCommand.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class SetTungstenNetworkGatewayCommand extends TungstenCommand { + private final String projectFqn; + private final String routerName; + private final long vnId; + private final String vnUuid; + private final String vnGatewayIp; + + public SetTungstenNetworkGatewayCommand(final String projectFqn, final String routerName, final long vnId, + final String vnUuid, final String vnGatewayIp) { + this.projectFqn = projectFqn; + this.routerName = routerName; + this.vnId = vnId; + this.vnUuid = vnUuid; + this.vnGatewayIp = vnGatewayIp; + } + + public String getRouterName() { + return routerName; + } + + public long getVnId() { + return vnId; + } + + public String getVnUuid() { + return vnUuid; + } + + public String getVnGatewayIp() { + return vnGatewayIp; + } + + public String getProjectFqn() { + return projectFqn; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SetTungstenNetworkGatewayCommand that = (SetTungstenNetworkGatewayCommand) o; + return vnId == that.vnId && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(routerName, that.routerName) && Objects.equals(vnUuid, that.vnUuid) && Objects.equals(vnGatewayIp, that.vnGatewayIp); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, routerName, vnId, vnUuid, vnGatewayIp); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTfRouteCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTfRouteCommand.java new file mode 100644 index 00000000000..8ccbff96d79 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTfRouteCommand.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.agent.api; + +import com.cloud.agent.api.Command; + +import java.util.Objects; + +public class SetupTfRouteCommand extends Command { + private final String privateIp; + private final String publicIp; + private final String srcNetwork; + + public SetupTfRouteCommand(final String privateIp, final String publicIp, final String srcNetwork) { + this.privateIp = privateIp; + this.publicIp = publicIp; + this.srcNetwork = srcNetwork; + } + + public String getPrivateIp() { + return privateIp; + } + + public String getPublicIp() { + return publicIp; + } + + public String getSrcNetwork() { + return srcNetwork; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SetupTfRouteCommand that = (SetupTfRouteCommand) o; + return Objects.equals(privateIp, that.privateIp) && Objects.equals(publicIp, that.publicIp) && Objects.equals(srcNetwork, that.srcNetwork); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), privateIp, publicIp, srcNetwork); + } + + @Override + public boolean executeInSequence() { + return false; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTungstenVRouterCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTungstenVRouterCommand.java new file mode 100644 index 00000000000..00fc522363d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/SetupTungstenVRouterCommand.java @@ -0,0 +1,77 @@ +// 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.network.tungsten.agent.api; + +import com.cloud.agent.api.Command; + +import java.util.Objects; + +public class SetupTungstenVRouterCommand extends Command { + private final String oper; + private final String inf; + private final String subnet; + private final String route; + private final String vrf; + + public SetupTungstenVRouterCommand(final String oper, final String inf, final String subnet, final String route, + final String vrf) { + this.oper = oper; + this.inf = inf; + this.subnet = subnet; + this.route = route; + this.vrf = vrf; + } + + public String getOper() { + return oper; + } + + public String getInf() { + return inf; + } + + public String getSubnet() { + return subnet; + } + + public String getRoute() { + return route; + } + + public String getVrf() { + return vrf; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SetupTungstenVRouterCommand that = (SetupTungstenVRouterCommand) o; + return Objects.equals(oper, that.oper) && Objects.equals(inf, that.inf) && Objects.equals(subnet, that.subnet) && Objects.equals(route, that.route) && Objects.equals(vrf, that.vrf); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), oper, inf, subnet, route, vrf); + } + + @Override + public boolean executeInSequence() { + return false; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/StartupTungstenCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/StartupTungstenCommand.java new file mode 100644 index 00000000000..c1a78d80bc8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/StartupTungstenCommand.java @@ -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.network.tungsten.agent.api; + +import com.cloud.agent.api.StartupCommand; +import com.cloud.host.Host; + +public class StartupTungstenCommand extends StartupCommand { + public StartupTungstenCommand() { + super(Host.Type.L2Networking); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenAnswer.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenAnswer.java new file mode 100644 index 00000000000..335af93bb04 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenAnswer.java @@ -0,0 +1,112 @@ +// 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.network.tungsten.agent.api; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import net.juniper.tungsten.api.ApiObjectBase; +import org.apache.cloudstack.network.tungsten.model.TungstenModel; + +import java.util.List; +import java.util.Objects; + +public class TungstenAnswer extends Answer { + + ApiObjectBase apiObjectBase; + List apiObjectBaseList; + TungstenModel tungstenModel; + List tungstenModelList; + + public TungstenAnswer(final Command command, final boolean success, final String details) { + super(command, success, details); + } + + public TungstenAnswer(final Command command, ApiObjectBase apiObjectBase, final boolean success, + final String details) { + super(command, success, details); + setApiObjectBase(apiObjectBase); + } + + public TungstenAnswer(final Command command, List apiObjectBaseList, final boolean success, + final String details) { + super(command, success, details); + setApiObjectBaseList(apiObjectBaseList); + } + + public TungstenAnswer(final Command command, final TungstenModel tungstenModel, final boolean success, + final String details) { + super(command, success, details); + setTungstenModel(tungstenModel); + } + + public TungstenAnswer(final Command command, final boolean success, final List tungstenModelList, + final String details) { + super(command, success, details); + setTungstenModelList(tungstenModelList); + } + + public TungstenAnswer(final Command command, final Exception e) { + super(command, e); + } + + public ApiObjectBase getApiObjectBase() { + return apiObjectBase; + } + + public void setApiObjectBase(ApiObjectBase apiObjectBase) { + this.apiObjectBase = apiObjectBase; + } + + public List getApiObjectBaseList() { + return apiObjectBaseList; + } + + public void setApiObjectBaseList(final List apiObjectBaseList) { + this.apiObjectBaseList = apiObjectBaseList; + } + + public TungstenModel getTungstenModel() { + return tungstenModel; + } + + public void setTungstenModel(final TungstenModel tungstenModel) { + this.tungstenModel = tungstenModel; + } + + public List getTungstenModelList() { + return tungstenModelList; + } + + public void setTungstenModelList(final List tungstenModelList) { + this.tungstenModelList = tungstenModelList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + TungstenAnswer that = (TungstenAnswer) o; + return Objects.equals(apiObjectBase, that.apiObjectBase) && Objects.equals(apiObjectBaseList, + that.apiObjectBaseList) && Objects.equals(tungstenModel, that.tungstenModel) && Objects.equals(tungstenModelList, that.tungstenModelList); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), apiObjectBase, apiObjectBaseList, tungstenModel, tungstenModelList); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenCommand.java new file mode 100644 index 00000000000..59d1196d5d5 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/TungstenCommand.java @@ -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.network.tungsten.agent.api; + +import com.cloud.agent.api.Command; + +public class TungstenCommand extends Command { + @Override + public boolean executeInSequence() { + return false; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateLoadBalancerServiceInstanceCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateLoadBalancerServiceInstanceCommand.java new file mode 100644 index 00000000000..249eeeae7f4 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateLoadBalancerServiceInstanceCommand.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class UpdateLoadBalancerServiceInstanceCommand extends TungstenCommand { + private String publicNetworkUuid; + private String floatingPoolName; + private String floatingIpName; + + public UpdateLoadBalancerServiceInstanceCommand(final String publicNetworkUuid, final String floatingPoolName, + final String floatingIpName) { + this.publicNetworkUuid = publicNetworkUuid; + this.floatingPoolName = floatingPoolName; + this.floatingIpName = floatingIpName; + } + + public String getPublicNetworkUuid() { + return publicNetworkUuid; + } + + public void setPublicNetworkUuid(final String publicNetworkUuid) { + this.publicNetworkUuid = publicNetworkUuid; + } + + public String getFloatingPoolName() { + return floatingPoolName; + } + + public void setFloatingPoolName(final String floatingPoolName) { + this.floatingPoolName = floatingPoolName; + } + + public String getFloatingIpName() { + return floatingIpName; + } + + public void setFloatingIpName(final String floatingIpName) { + this.floatingIpName = floatingIpName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateLoadBalancerServiceInstanceCommand that = (UpdateLoadBalancerServiceInstanceCommand) o; + return Objects.equals(publicNetworkUuid, that.publicNetworkUuid) && Objects.equals(floatingPoolName, that.floatingPoolName) && Objects.equals(floatingIpName, that.floatingIpName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), publicNetworkUuid, floatingPoolName, floatingIpName); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenDefaultSecurityGroupCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenDefaultSecurityGroupCommand.java new file mode 100644 index 00000000000..181c796b91e --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenDefaultSecurityGroupCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class UpdateTungstenDefaultSecurityGroupCommand extends TungstenCommand { + private final String projectFqn; + + public UpdateTungstenDefaultSecurityGroupCommand(final String projectFqn) { + this.projectFqn = projectFqn; + } + + public String getProjectFqn() { + return projectFqn; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenDefaultSecurityGroupCommand that = (UpdateTungstenDefaultSecurityGroupCommand) o; + return Objects.equals(projectFqn, that.projectFqn); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerHealthMonitorCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerHealthMonitorCommand.java new file mode 100644 index 00000000000..3cbc55dea8f --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerHealthMonitorCommand.java @@ -0,0 +1,95 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class UpdateTungstenLoadBalancerHealthMonitorCommand extends TungstenCommand { + private final String projectFqn; + private final String healthMonitorName; + private final String type; + private final int retry; + private final int timeout; + private final int interval; + private final String httpMethod; + private final String expectedCode; + private final String urlPath; + + public UpdateTungstenLoadBalancerHealthMonitorCommand(final String projectFqn, final String healthMonitorName, + final String type, final int retry, final int timeout, final int interval, final String httpMethod, + final String expectedCode, final String urlPath) { + this.projectFqn = projectFqn; + this.healthMonitorName = healthMonitorName; + this.type = type; + this.retry = retry; + this.timeout = timeout; + this.interval = interval; + this.httpMethod = httpMethod; + this.expectedCode = expectedCode; + this.urlPath = urlPath; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getHealthMonitorName() { + return healthMonitorName; + } + + public String getType() { + return type; + } + + public int getRetry() { + return retry; + } + + public int getTimeout() { + return timeout; + } + + public int getInterval() { + return interval; + } + + public String getHttpMethod() { + return httpMethod; + } + + public String getExpectedCode() { + return expectedCode; + } + + public String getUrlPath() { + return urlPath; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenLoadBalancerHealthMonitorCommand that = (UpdateTungstenLoadBalancerHealthMonitorCommand) o; + return retry == that.retry && timeout == that.timeout && interval == that.interval && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(healthMonitorName, that.healthMonitorName) && Objects.equals(type, that.type) && Objects.equals(httpMethod, that.httpMethod) && Objects.equals(expectedCode, that.expectedCode) && Objects.equals(urlPath, that.urlPath); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, healthMonitorName, type, retry, timeout, interval, httpMethod, expectedCode, urlPath); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerListenerCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerListenerCommand.java new file mode 100644 index 00000000000..7fba723c6bb --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerListenerCommand.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class UpdateTungstenLoadBalancerListenerCommand extends TungstenCommand { + private final String projectFqn; + private final String listenerName; + private final String protocol; + private final int port; + private final String url; + + public UpdateTungstenLoadBalancerListenerCommand(final String projectFqn, final String listenerName, + final String protocol, final int port, final String url) { + this.projectFqn = projectFqn; + this.listenerName = listenerName; + this.protocol = protocol; + this.port = port; + this.url = url; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getListenerName() { + return listenerName; + } + + public String getProtocol() { + return protocol; + } + + public int getPort() { + return port; + } + + public String getUrl() { + return url; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenLoadBalancerListenerCommand that = (UpdateTungstenLoadBalancerListenerCommand) o; + return port == that.port && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(listenerName, that.listenerName) && Objects.equals(protocol, that.protocol) && Objects.equals(url, that.url); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, listenerName, protocol, port, url); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerMemberCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerMemberCommand.java new file mode 100644 index 00000000000..eee220cbd22 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerMemberCommand.java @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; + +import java.util.List; +import java.util.Objects; + +public class UpdateTungstenLoadBalancerMemberCommand extends TungstenCommand { + private final String projectFqn; + private final String networkUuid; + private final String lbPoolName; + private final List listTungstenLoadBalancerMember; + + public UpdateTungstenLoadBalancerMemberCommand(final String projectFqn, final String networkUuid, + final String lbPoolName, final List listTungstenLoadBalancerMember) { + this.projectFqn = projectFqn; + this.networkUuid = networkUuid; + this.lbPoolName = lbPoolName; + this.listTungstenLoadBalancerMember = listTungstenLoadBalancerMember; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getNetworkUuid() { + return networkUuid; + } + + public String getLbPoolName() { + return lbPoolName; + } + + public List getListTungstenLoadBalancerMember() { + return listTungstenLoadBalancerMember; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenLoadBalancerMemberCommand that = (UpdateTungstenLoadBalancerMemberCommand) o; + return Objects.equals(projectFqn, that.projectFqn) && Objects.equals(networkUuid, that.networkUuid) && Objects.equals(lbPoolName, that.lbPoolName) && Objects.equals(listTungstenLoadBalancerMember, that.listTungstenLoadBalancerMember); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, networkUuid, lbPoolName, listTungstenLoadBalancerMember); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerPoolCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerPoolCommand.java new file mode 100644 index 00000000000..8c4296dc160 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadBalancerPoolCommand.java @@ -0,0 +1,102 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class UpdateTungstenLoadBalancerPoolCommand extends TungstenCommand { + private final String projectFqn; + private final String lbPoolName; + private final String lbMethod; + private final String lbSessionPersistence; + private final String lbPersistenceCookieName; + private final String lbProtocol; + private final boolean lbStatsEnable; + private final String lbStatsPort; + private final String lbStatsUri; + private final String lbStatsAuth; + + public UpdateTungstenLoadBalancerPoolCommand(final String projectFqn, final String lbPoolName, + final String lbMethod, final String lbSessionPersistence, final String lbPersistenceCookieName, + final String lbProtocol, final boolean lbStatsEnable, final String lbStatsPort, final String lbStatsUri, + final String lbStatsAuth) { + this.projectFqn = projectFqn; + this.lbPoolName = lbPoolName; + this.lbMethod = lbMethod; + this.lbSessionPersistence = lbSessionPersistence; + this.lbPersistenceCookieName = lbPersistenceCookieName; + this.lbProtocol = lbProtocol; + this.lbStatsEnable = lbStatsEnable; + this.lbStatsPort = lbStatsPort; + this.lbStatsUri = lbStatsUri; + this.lbStatsAuth = lbStatsAuth; + } + + public String getProjectFqn() { + return projectFqn; + } + + public String getLbPoolName() { + return lbPoolName; + } + + public String getLbMethod() { + return lbMethod; + } + + public String getLbSessionPersistence() { + return lbSessionPersistence; + } + + public String getLbPersistenceCookieName() { + return lbPersistenceCookieName; + } + + public String getLbProtocol() { + return lbProtocol; + } + + public boolean isLbStatsEnable() { + return lbStatsEnable; + } + + public String getLbStatsPort() { + return lbStatsPort; + } + + public String getLbStatsUri() { + return lbStatsUri; + } + + public String getLbStatsAuth() { + return lbStatsAuth; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenLoadBalancerPoolCommand that = (UpdateTungstenLoadBalancerPoolCommand) o; + return lbStatsEnable == that.lbStatsEnable && Objects.equals(projectFqn, that.projectFqn) && Objects.equals(lbPoolName, that.lbPoolName) && Objects.equals(lbMethod, that.lbMethod) && Objects.equals(lbSessionPersistence, that.lbSessionPersistence) && Objects.equals(lbPersistenceCookieName, that.lbPersistenceCookieName) && Objects.equals(lbProtocol, that.lbProtocol) && Objects.equals(lbStatsPort, that.lbStatsPort) && Objects.equals(lbStatsUri, that.lbStatsUri) && Objects.equals(lbStatsAuth, that.lbStatsAuth); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), projectFqn, lbPoolName, lbMethod, lbSessionPersistence, lbPersistenceCookieName, lbProtocol, lbStatsEnable, lbStatsPort, lbStatsUri, lbStatsAuth); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerSslCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerSslCommand.java new file mode 100644 index 00000000000..5ab24c18aa0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerSslCommand.java @@ -0,0 +1,83 @@ +// 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.network.tungsten.agent.api; + +import com.cloud.agent.api.Command; + +import java.util.Objects; + +public class UpdateTungstenLoadbalancerSslCommand extends Command { + private final String lbUuid; + private final String sslCertName; + private final String certificateKey; + private final String privateKey; + private final String privateIp; + private final String port; + + public UpdateTungstenLoadbalancerSslCommand(final String lbUuid, final String sslCertName, + final String certificateKey, final String privateKey, final String privateIp, final String port) { + this.lbUuid = lbUuid; + this.sslCertName = sslCertName; + this.certificateKey = certificateKey; + this.privateKey = privateKey; + this.privateIp = privateIp; + this.port = port; + } + + public String getLbUuid() { + return lbUuid; + } + + public String getSslCertName() { + return sslCertName; + } + + public String getCertificateKey() { + return certificateKey; + } + + public String getPrivateKey() { + return privateKey; + } + + public String getPrivateIp() { + return privateIp; + } + + public String getPort() { + return port; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenLoadbalancerSslCommand that = (UpdateTungstenLoadbalancerSslCommand) o; + return Objects.equals(lbUuid, that.lbUuid) && Objects.equals(sslCertName, that.sslCertName) && Objects.equals(certificateKey, that.certificateKey) && Objects.equals(privateKey, that.privateKey) && Objects.equals(privateIp, that.privateIp) && Objects.equals(port, that.port); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), lbUuid, sslCertName, certificateKey, privateKey, privateIp, port); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerStatsCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerStatsCommand.java new file mode 100644 index 00000000000..d7b2088bcd7 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenLoadbalancerStatsCommand.java @@ -0,0 +1,71 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.agent.api; + +import com.cloud.agent.api.Command; + +import java.util.Objects; + +public class UpdateTungstenLoadbalancerStatsCommand extends Command { + private final String lbUuid; + private final String lbStatsPort; + private final String lbStatsUri; + private final String lbStatsAuth; + + public UpdateTungstenLoadbalancerStatsCommand(final String lbUuid, final String lbStatsPort, + final String lbStatsUri, final String lbStatsAuth) { + this.lbUuid = lbUuid; + this.lbStatsPort = lbStatsPort; + this.lbStatsUri = lbStatsUri; + this.lbStatsAuth = lbStatsAuth; + } + + public String getLbUuid() { + return lbUuid; + } + + public String getLbStatsPort() { + return lbStatsPort; + } + + public String getLbStatsUri() { + return lbStatsUri; + } + + public String getLbStatsAuth() { + return lbStatsAuth; + } + + @Override + public boolean executeInSequence() { + return false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenLoadbalancerStatsCommand that = (UpdateTungstenLoadbalancerStatsCommand) o; + return Objects.equals(lbUuid, that.lbUuid) && Objects.equals(lbStatsPort, that.lbStatsPort) && Objects.equals(lbStatsUri, that.lbStatsUri) && Objects.equals(lbStatsAuth, that.lbStatsAuth); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), lbUuid, lbStatsPort, lbStatsUri, lbStatsAuth); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenVrouterConfigCommand.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenVrouterConfigCommand.java new file mode 100644 index 00000000000..a2facc1ae5d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/agent/api/UpdateTungstenVrouterConfigCommand.java @@ -0,0 +1,45 @@ +// 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.network.tungsten.agent.api; + +import java.util.Objects; + +public class UpdateTungstenVrouterConfigCommand extends TungstenCommand { + private final String forwardingMode; + + public UpdateTungstenVrouterConfigCommand(final String forwardingMode) { + this.forwardingMode = forwardingMode; + } + + public String getForwardingMode() { + return forwardingMode; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + UpdateTungstenVrouterConfigCommand that = (UpdateTungstenVrouterConfigCommand) o; + return Objects.equals(forwardingMode, that.forwardingMode); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), forwardingMode); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmd.java new file mode 100644 index 00000000000..54d6bbc0d79 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmd.java @@ -0,0 +1,97 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLogicalRouterResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = AddTungstenFabricNetworkGatewayToLogicalRouterCmd.APINAME, description = "add Tungsten-Fabric network gateway to logical router", + responseObject = TungstenFabricLogicalRouterResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class AddTungstenFabricNetworkGatewayToLogicalRouterCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(AddTungstenFabricNetworkGatewayToLogicalRouterCmd.class.getName()); + public static final String APINAME = "addTungstenFabricNetworkGatewayToLogicalRouter"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, required = true, description = "Tungsten-Fabric network uuid") + private String networkUuid; + + @Parameter(name = ApiConstants.LOGICAL_ROUTER_UUID, type = CommandType.STRING, required = true, description = "Tungsten-Fabric logical router uuid") + private String logicalRouterUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List networkList = tungstenService.listConnectedNetworkFromLogicalRouter(zoneId, logicalRouterUuid); + if (networkList.contains(networkUuid)) { + throw new ServerApiException(ApiErrorCode.RESOURCE_IN_USE_ERROR, "Tungsten Fabric network was connected to logical router"); + } + + BaseResponse response = tungstenService.addNetworkGatewayToLogicalRouter(zoneId, networkUuid, logicalRouterUuid); + if (response == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add Tungsten-Fabric network gateway to logical router"); + } else { + response.setResponseName(getCommandName()); + setResponseObject(response); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_ADD_NETWORK_GATEWAY_TO_LOGICAL_ROUTER; + } + + @Override + public String getEventDescription() { + return "add Tungsten-Fabric network gateway to logical router"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmd.java new file mode 100644 index 00000000000..194157c3f66 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmd.java @@ -0,0 +1,131 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import com.cloud.utils.TungstenUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricRuleResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = AddTungstenFabricPolicyRuleCmd.APINAME, description = "add Tungsten-Fabric policy rule", + responseObject = TungstenFabricRuleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class AddTungstenFabricPolicyRuleCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(AddTungstenFabricPolicyRuleCmd.class.getName()); + public static final String APINAME = "addTungstenFabricPolicyRule"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true , description = "the ID of zone") + private long zoneId; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.ACTION, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule action") + private String action; + + @Parameter(name = ApiConstants.DIRECTION, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule direction") + private String direction; + + @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule protocol") + private String protocol; + + @Parameter(name = ApiConstants.SRC_NETWORK, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule source network") + private String srcNetwork; + + @Parameter(name = ApiConstants.SRC_IP_PREFIX, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule source ip prefix") + private String srcIpPrefix; + + @Parameter(name = ApiConstants.SRC_IP_PREFIX_LEN, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric policy rule source ip prefix length") + private int srcIpPrefixLen; + + @Parameter(name = ApiConstants.SRC_START_PORT, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric policy rule source start port") + private int srcStartPort; + + @Parameter(name = ApiConstants.SRC_END_PORT, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric policy rule source end port") + private int srcEndPort; + + @Parameter(name = ApiConstants.DEST_NETWORK, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule destination network") + private String destNetwork; + + @Parameter(name = ApiConstants.DEST_IP_PREFIX, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy rule destination ip prefix") + private String destIpPrefix; + + @Parameter(name = ApiConstants.DEST_IP_PREFIX_LEN, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric policy rule destination ip prefix length") + private int destIpPrefixLen; + + @Parameter(name = ApiConstants.DEST_START_PORT, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric policy rule destination start port") + private int destStartPort; + + @Parameter(name = ApiConstants.DEST_END_PORT, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric policy rule destination end port") + private int destEndPort; + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_ADD_POLICY_RULE; + } + + @Override + public String getEventDescription() { + return "add Tungsten-Fabric policy rule"; + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + String tungstenDirection = + direction.equals(ApiConstants.ONE_WAY) ? TungstenUtils.ONE_WAY_DIRECTION : TungstenUtils.TWO_WAY_DIRECTION; + TungstenFabricRuleResponse tungstenFabricRuleResponse = tungstenService.addTungstenPolicyRule(zoneId, + policyUuid, action, tungstenDirection, protocol, srcNetwork, srcIpPrefix, srcIpPrefixLen, srcStartPort, + srcEndPort, destNetwork, destIpPrefix, destIpPrefixLen, destStartPort, destEndPort); + if (tungstenFabricRuleResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric policy rule"); + } else { + tungstenFabricRuleResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricRuleResponse); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmd.java new file mode 100644 index 00000000000..063e6c09a41 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmd.java @@ -0,0 +1,97 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = ApplyTungstenFabricPolicyCmd.APINAME, description = "apply Tungsten-Fabric policy", + responseObject = TungstenFabricPolicyResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class ApplyTungstenFabricPolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(ApplyTungstenFabricPolicyCmd.class.getName()); + public static final String APINAME = "applyTungstenFabricPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, required = true, description = "the uuid of network") + private String networkUuid; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.MAJOR_SEQUENCE, type = CommandType.INTEGER, required = true, description = "the major sequence of Tungsten-Fabric policy") + private int majorSequence; + + @Parameter(name = ApiConstants.MINOR_SEQUENCE, type = CommandType.INTEGER, required = true, description = "the minor sequence of Tungsten-Fabric policy") + private int minorSequence; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenNetworkPolicyResponse = tungstenService.applyTungstenPolicy(zoneId, + networkUuid, policyUuid, majorSequence, minorSequence); + if (tungstenNetworkPolicyResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to applied Tungsten-Fabric policy"); + } else { + tungstenNetworkPolicyResponse.setResponseName(getCommandName()); + setResponseObject(tungstenNetworkPolicyResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_APPLY_POLICY; + } + + @Override + public String getEventDescription() { + return "apply Tungsten-Fabric network policy"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmd.java new file mode 100644 index 00000000000..1bad31869ae --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmd.java @@ -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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ApplyTungstenFabricTagCmd.APINAME, description = "apply Tungsten-Fabric tag", responseObject = + TungstenFabricTagResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ApplyTungstenFabricTagCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(ApplyTungstenFabricTagCmd.class.getName()); + public static final String APINAME = "applyTungstenFabricTag"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the uuid of networks") + private List networkUuids; + + @Parameter(name = ApiConstants.VM_UUID, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the uuid of vms") + private List vmUuids; + + @Parameter(name = ApiConstants.NIC_UUID, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the uuid of nics") + private List nicUuids; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Parameter(name = ApiConstants.TAG_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric tag") + private String tagUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + if (networkUuids == null && nicUuids == null && vmUuids == null && policyUuid == null && applicationPolicySetUuid == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Need network, vm, nic, policy or applicationpolicyset parameter"); + } + + TungstenFabricTagResponse tungstenFabricTagResponse = tungstenService.applyTungstenTag(zoneId, networkUuids, + vmUuids, nicUuids, policyUuid, applicationPolicySetUuid, tagUuid); + + if (tungstenFabricTagResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to applied Tungsten-Fabric tag"); + } else { + tungstenFabricTagResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricTagResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_APPLY_TAG; + } + + @Override + public String getEventDescription() { + return "apply Tungsten-Fabric network tag"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmd.java new file mode 100644 index 00000000000..1085804fd31 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmd.java @@ -0,0 +1,203 @@ +// 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.network.tungsten.api.command; + +import com.cloud.dc.DataCenter; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.NetworkServiceMapVO; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.NetworkOfferingServiceMapVO; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; +import com.cloud.user.Account; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionStatus; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.PhysicalNetworkResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.log4j.Logger; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +@APICommand(name = ConfigTungstenFabricServiceCmd.APINAME, description = "config Tungsten-Fabric service", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ConfigTungstenFabricServiceCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(ConfigTungstenFabricServiceCmd.class.getName()); + public static final String APINAME = "configTungstenFabricService"; + public static final String NETWORKOFFERING = "DefaultTungstenFarbicNetworkOffering"; + + @Inject + NetworkModel networkModel; + @Inject + NetworkOfferingDao networkOfferingDao; + @Inject + NetworkOfferingServiceMapDao networkOfferingServiceMapDao; + @Inject + NetworkServiceMapDao networkServiceMapDao; + @Inject + PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true + , description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.PHYSICAL_NETWORK_ID, type = CommandType.UUID, entityType = PhysicalNetworkResponse.class, required = true, description = "the ID of physical network") + private Long physicalNetworkId; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(final Long zoneId) { + this.zoneId = zoneId; + } + + public Long getPhysicalNetworkId() { + return physicalNetworkId; + } + + public void setPhysicalNetworkId(final Long physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + DataCenter dataCenter = _entityMgr.findById(DataCenter.class, zoneId); + if (dataCenter.isSecurityGroupEnabled()) { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(final TransactionStatus status) { + Network managementNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Management); + NetworkServiceMapVO managementNetworkServiceMapVO = new NetworkServiceMapVO(managementNetwork.getId(), + Network.Service.Connectivity, Network.Provider.Tungsten); + networkServiceMapDao.persist(managementNetworkServiceMapVO); + + List systemNetworkOffering = networkOfferingDao.listSystemNetworkOfferings(); + for (NetworkOfferingVO networkOffering : systemNetworkOffering) { + if (networkOffering.getTrafficType() == Networks.TrafficType.Management){ + NetworkOfferingServiceMapVO publicNetworkOfferingServiceMapVO = + new NetworkOfferingServiceMapVO( + networkOffering.getId(), Network.Service.Connectivity, Network.Provider.Tungsten); + networkOfferingServiceMapDao.persist(publicNetworkOfferingServiceMapVO); + } + } + } + }); + } else { + persistDefaultSystemNetwork(); + } + + SuccessResponse response = new SuccessResponse(getCommandName()); + response.setDisplayText("configured Tungsten-Fabric service successfully"); + + setResponseObject(response); + } + + private void persistDefaultSystemNetwork() { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(final TransactionStatus status) { + NetworkOfferingVO networkOfferingVO = networkOfferingDao.findByUniqueName(NETWORKOFFERING); + if (networkOfferingVO == null) { + networkOfferingVO = new NetworkOfferingVO(NETWORKOFFERING, + "Default offering for Tungsten-Fabric Network", Networks.TrafficType.Guest, false, false, + null, null, true, NetworkOffering.Availability.Optional, null, Network.GuestType.Isolated, + true, false, false, false, true, false); + networkOfferingVO.setForTungsten(true); + networkOfferingVO.setState(NetworkOffering.State.Enabled); + networkOfferingDao.persist(networkOfferingVO); + + Map tungstenServiceProvider = new HashMap<>(); + tungstenServiceProvider.put(Network.Service.Dhcp, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.Dns, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.SourceNat, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.StaticNat, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.Connectivity, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.Firewall, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.Lb, Network.Provider.Tungsten); + tungstenServiceProvider.put(Network.Service.PortForwarding, Network.Provider.Tungsten); + + for (Map.Entry providerEntry : tungstenServiceProvider.entrySet()) { + NetworkOfferingServiceMapVO networkOfferingServiceMapVO = new NetworkOfferingServiceMapVO( + networkOfferingVO.getId(), providerEntry.getKey(), providerEntry.getValue()); + networkOfferingServiceMapDao.persist(networkOfferingServiceMapVO); + } + } + + PhysicalNetworkServiceProviderVO physicalNetworkServiceProvider = physicalNetworkServiceProviderDao.findByServiceProvider( + physicalNetworkId, Network.Provider.Tungsten.getName()); + physicalNetworkServiceProvider.setState(PhysicalNetworkServiceProvider.State.Enabled); + physicalNetworkServiceProviderDao.persist(physicalNetworkServiceProvider); + + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + NetworkServiceMapVO publicNetworkServiceMapVO = new NetworkServiceMapVO(publicNetwork.getId(), + Network.Service.Connectivity, Network.Provider.Tungsten); + networkServiceMapDao.persist(publicNetworkServiceMapVO); + + Network managementNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Management); + NetworkServiceMapVO managementNetworkServiceMapVO = new NetworkServiceMapVO(managementNetwork.getId(), + Network.Service.Connectivity, Network.Provider.Tungsten); + networkServiceMapDao.persist(managementNetworkServiceMapVO); + + List systemNetworkOffering = networkOfferingDao.listSystemNetworkOfferings(); + for (NetworkOfferingVO networkOffering : systemNetworkOffering) { + if (networkOffering.getTrafficType() == Networks.TrafficType.Public + || networkOffering.getTrafficType() == Networks.TrafficType.Management){ + NetworkOfferingServiceMapVO publicNetworkOfferingServiceMapVO = + new NetworkOfferingServiceMapVO( + networkOffering.getId(), Network.Service.Connectivity, Network.Provider.Tungsten); + networkOfferingServiceMapDao.persist(publicNetworkOfferingServiceMapVO); + } + } + } + }); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmd.java new file mode 100644 index 00000000000..edf19df2e5a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmd.java @@ -0,0 +1,95 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricAddressGroupResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricAddressGroupCmd.APINAME, description = "create Tungsten-Fabric address group", + responseObject = TungstenFabricAddressGroupResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class CreateTungstenFabricAddressGroupCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricAddressGroupCmd.class.getName()); + public static final String APINAME = "createTungstenFabricAddressGroup"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric address group name") + private String name; + + @Parameter(name = ApiConstants.IP_PREFIX, type = CommandType.STRING, required = true, description = "Tungsten-Fabric ip prefix") + private String ipPrefix; + + @Parameter(name = ApiConstants.IP_PREFIX_LEN, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric ip prefix length") + private Integer ipPrefixLen; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricAddressGroupResponse tungstenFabricAddressGroupResponse = + tungstenService.createTungstenAddressGroup( + zoneId, name, ipPrefix, ipPrefixLen); + if (tungstenFabricAddressGroupResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric address group"); + } else { + tungstenFabricAddressGroupResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricAddressGroupResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_ADDRESS_GROUP; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric address group"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmd.java new file mode 100644 index 00000000000..4cf39d675dc --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmd.java @@ -0,0 +1,89 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricApplicationPolicySetResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricApplicationPolicySetCmd.APINAME, description = "create Tungsten-Fabric application policy set", + responseObject = TungstenFabricApplicationPolicySetResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricApplicationPolicySetCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricApplicationPolicySetCmd.class.getName()); + public static final String APINAME = "createTungstenFabricApplicationPolicySet"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric application policy set name") + private String name; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricApplicationPolicySetResponse tungstenFabricApplicationPolicySetResponse = + tungstenService.createTungstenApplicationPolicySet( + zoneId, name); + if (tungstenFabricApplicationPolicySetResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, + "Failed to create Tungsten-Fabric application policy set"); + } else { + tungstenFabricApplicationPolicySetResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricApplicationPolicySetResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_APPLICATION_POLICY_SET; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric application policy set"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmd.java new file mode 100644 index 00000000000..d2c93f5dd63 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmd.java @@ -0,0 +1,96 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricFirewallPolicyCmd.APINAME, description = "create Tungsten-Fabric firewall policy", + responseObject = TungstenFabricFirewallPolicyResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class CreateTungstenFabricFirewallPolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricFirewallPolicyCmd.class.getName()); + public static final String APINAME = "createTungstenFabricFirewallPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric firewall policy name") + private String name; + + @Parameter(name = ApiConstants.SEQUENCE, type = CommandType.INTEGER, required = true, description = "the sequence of Tungsten-Fabric firewall policy") + private int sequence; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricFirewallPolicyResponse tungstenFabricFirewallPolicyResponse = + tungstenService.createTungstenFirewallPolicy( + zoneId, applicationPolicySetUuid, name, sequence); + if (tungstenFabricFirewallPolicyResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, + "Failed to create Tungsten-Fabric firewall policy"); + } else { + tungstenFabricFirewallPolicyResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricFirewallPolicyResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_FIREWALL_POLICY; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric firewall policy"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmd.java new file mode 100644 index 00000000000..f2cd0684e9a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmd.java @@ -0,0 +1,129 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import com.cloud.utils.TungstenUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallRuleResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricFirewallRuleCmd.APINAME, description = "create Tungsten-Fabric firewall", + responseObject = TungstenFabricFirewallRuleResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class CreateTungstenFabricFirewallRuleCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricFirewallRuleCmd.class.getName()); + public static final String APINAME = "createTungstenFabricFirewallRule"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.FIREWALL_POLICY_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric firewall policy") + private String firewallPolicyUuid; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric firewall rule name") + private String name; + + @Parameter(name = ApiConstants.ACTION, type = CommandType.STRING, required = true, description = "Tungsten-Fabric firewall rule action") + private String action; + + @Parameter(name = ApiConstants.SERVICE_GROUP_UUID, type = CommandType.STRING, required = true, description = "Tungsten-Fabric firewall rule service group uuid") + private String serviceGroupUuid; + + @Parameter(name = ApiConstants.SRC_TAG_UUID, type = CommandType.STRING, description = "Tungsten-Fabric firewall rule source tag uuid") + private String srcTagUuid; + + @Parameter(name = ApiConstants.SRC_ADDRESS_GROUP_UUID, type = CommandType.STRING, description = "Tungsten-Fabric firewall rule source address group uuid") + private String srcAddressGroupUuid; + + @Parameter(name = ApiConstants.SRC_NETWORK_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric source network") + private String srcNetworkUuid; + + @Parameter(name = ApiConstants.DIRECTION, type = CommandType.STRING, required = true, description = "Tungsten-Fabric firewall rule direction") + private String direction; + + @Parameter(name = ApiConstants.DEST_TAG_UUID, type = CommandType.STRING, description = "Tungsten-Fabric firewall rule destination tag uuid") + private String destTagUuid; + + @Parameter(name = ApiConstants.DEST_ADDRESS_GROUP_UUID, type = CommandType.STRING, description = "Tungsten-Fabric firewall rule destination address group uuid") + private String destAddressGroupUuid; + + @Parameter(name = ApiConstants.DEST_NETWORK_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric destination network") + private String destNetworkUuid; + + @Parameter(name = ApiConstants.TAG_TYPE_UUID, type = CommandType.STRING, description = "Tungsten-Fabric firewall rule tag type uuid") + private String tagTypeUuid; + + @Parameter(name = ApiConstants.SEQUENCE, type = CommandType.INTEGER, required = true, description = "the sequence of Tungsten-Fabric firewall rule") + private int sequence; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + String tungstenDirection = + direction.equals(ApiConstants.ONE_WAY) ? TungstenUtils.ONE_WAY_DIRECTION : TungstenUtils.TWO_WAY_DIRECTION; + TungstenFabricFirewallRuleResponse tungstenFabricFirewallRuleResponse = + tungstenService.createTungstenFirewallRule( + zoneId, firewallPolicyUuid, name, action, serviceGroupUuid, srcTagUuid, srcAddressGroupUuid, srcNetworkUuid, tungstenDirection, destTagUuid, + destAddressGroupUuid, destNetworkUuid, tagTypeUuid, sequence); + if (tungstenFabricFirewallRuleResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric firewall rule"); + } else { + tungstenFabricFirewallRuleResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricFirewallRuleResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_FIREWALL_RULE; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric firewall rule"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmd.java new file mode 100644 index 00000000000..add6e503e2d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmd.java @@ -0,0 +1,87 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLogicalRouterResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricLogicalRouterCmd.APINAME, description = "create Tungsten-Fabric logical router", + responseObject = TungstenFabricLogicalRouterResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricLogicalRouterCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricLogicalRouterCmd.class.getName()); + public static final String APINAME = "createTungstenFabricLogicalRouter"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric logical router name") + private String name; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + BaseResponse response = tungstenService.createRoutingLogicalRouter(zoneId, null, name); + if (response == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric logical router"); + } else { + response.setResponseName(getCommandName()); + setResponseObject(response); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_LOGICAL_ROUTER; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric logical router"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmd.java new file mode 100644 index 00000000000..bb4414eaecf --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmd.java @@ -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.network.tungsten.api.command; + +import com.cloud.dc.HostPodVO; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +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.PodResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricManagementNetworkCmd.APINAME, description = "create Tungsten-Fabric management network", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class CreateTungstenFabricManagementNetworkCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricManagementNetworkCmd.class.getName()); + public static final String APINAME = "createTungstenFabricManagementNetwork"; + + @Inject + HostPodDao podDao; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, required = true, + description = "the ID of pod") + private Long podId; + + public Long getPodId() { + return podId; + } + + public void setPodId(final Long podId) { + this.podId = podId; + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + HostPodVO pod = podDao.findById(podId); + + if (!tungstenService.createManagementNetwork(pod.getDataCenterId())) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, + "Unable to create Tungsten-Fabric management network"); + } + + if (!tungstenService.addManagementNetworkSubnet(pod)) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, + "Unable to add Tungsten-Fabric management network subnet"); + } + + SuccessResponse response = new SuccessResponse(getCommandName()); + response.setDisplayText("create Tungsten-Fabric management network successfully"); + setResponseObject(response); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmd.java new file mode 100644 index 00000000000..a7251d52b6c --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmd.java @@ -0,0 +1,87 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricPolicyCmd.APINAME, description = "create Tungsten-Fabric policy", + responseObject = TungstenFabricPolicyResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class CreateTungstenFabricPolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricPolicyCmd.class.getName()); + public static final String APINAME = "createTungstenFabricPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric policy name") + private String name; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = tungstenService.createTungstenPolicy(zoneId, name); + if (tungstenFabricPolicyResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric policy"); + } else { + tungstenFabricPolicyResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricPolicyResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_POLICY; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric policy"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmd.java new file mode 100644 index 00000000000..98cb3f671ef --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmd.java @@ -0,0 +1,134 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.user.Account; +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.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricProviderResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenProviderService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricProviderCmd.APINAME, description = "Create Tungsten-Fabric provider in cloudstack", + responseObject = TungstenFabricProviderResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricProviderCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricProviderCmd.class.getName()); + public static final String APINAME = "createTungstenFabricProvider"; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true + , description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric provider name") + private String name; + + @Parameter(name = ApiConstants.TUNGSTEN_PROVIDER_HOSTNAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric provider hostname") + private String hostname; + + @Parameter(name = ApiConstants.TUNGSTEN_PROVIDER_PORT, type = CommandType.STRING, description = "Tungsten-Fabric provider port") + private String port; + + @Parameter(name = ApiConstants.TUNGSTEN_GATEWAY, type = CommandType.STRING, required = true, description = "Tungsten-Fabric provider gateway") + private String gateway; + + @Parameter(name = ApiConstants.TUNGSTEN_PROVIDER_VROUTER_PORT, type = CommandType.STRING, description = "Tungsten-Fabric provider vrouter port") + private String vrouterPort; + + @Parameter(name = ApiConstants.TUNGSTEN_PROVIDER_INTROSPECT_PORT, type = CommandType.STRING, description = "Tungsten-Fabric provider introspect port") + private String introspectPort; + + public String getName() { + return name; + } + + public String getHostname() { + return hostname; + } + + public String getPort() { + return port; + } + + public String getGateway() { + return gateway; + } + + public void setGateway(final String gateway) { + this.gateway = gateway; + } + + public String getIntrospectPort() { + return introspectPort; + } + + public void setIntrospectPort(final String introspectPort) { + this.introspectPort = introspectPort; + } + + public String getVrouterPort() { + return vrouterPort; + } + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(final Long zoneId) { + this.zoneId = zoneId; + } + + @Inject + private TungstenProviderService tungstenProviderService; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenProvider tungstenProvider = tungstenProviderService.addProvider(this); + TungstenFabricProviderResponse tungstenFabricProviderResponse = + tungstenProviderService.createTungstenProviderResponse( + tungstenProvider); + if (tungstenFabricProviderResponse == null) + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric provider"); + else { + tungstenFabricProviderResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricProviderResponse); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmd.java new file mode 100644 index 00000000000..ba1eb90a4b0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmd.java @@ -0,0 +1,105 @@ +// 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.network.tungsten.api.command; + +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.VlanDao; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks; +import com.cloud.user.Account; +import com.cloud.utils.db.SearchCriteria; +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.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricPublicNetworkCmd.APINAME, description = "create Tungsten-Fabric public network", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricPublicNetworkCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricPublicNetworkCmd.class.getName()); + + public static final String APINAME = "createTungstenFabricPublicNetwork"; + + @Inject + VlanDao vlanDao; + @Inject + NetworkModel networkModel; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true + , description = "the ID of zone") + private Long zoneId; + + public Long getZoneId() { + return zoneId; + } + + public void setZoneId(final Long zoneId) { + this.zoneId = zoneId; + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + SearchCriteria sc = vlanDao.createSearchCriteria(); + sc.setParameters("network_id", publicNetwork.getId()); + List pubVlanVOList = vlanDao.listVlansByNetworkId(publicNetwork.getId()); + + if (!tungstenService.createPublicNetwork(zoneId)) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to create Tungsten-Fabric public network"); + } + + for (VlanVO vlanVO : pubVlanVOList) { + if (!tungstenService.addPublicNetworkSubnet(vlanVO)) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to add Tungsten-Fabric public network subnet"); + } + } + + SuccessResponse response = new SuccessResponse(getCommandName()); + response.setDisplayText("create Tungsten-Fabric public network successfully"); + setResponseObject(response); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmd.java new file mode 100644 index 00000000000..ae3b2bf533b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmd.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricServiceGroupResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricServiceGroupCmd.APINAME, description = "create Tungsten-Fabric service group", + responseObject = TungstenFabricServiceGroupResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricServiceGroupCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricServiceGroupCmd.class.getName()); + + public static final String APINAME = "createTungstenFabricServiceGroup"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric service group name") + private String name; + + @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, required = true, description = "Tungsten-Fabric service group protocol") + private String protocol; + + @Parameter(name = ApiConstants.START_PORT, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric service group start port") + private Integer startPort; + + @Parameter(name = ApiConstants.END_PORT, type = CommandType.INTEGER, required = true, description = "Tungsten-Fabric service group end port") + private Integer endPort; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricServiceGroupResponse tungstenFabricServiceGroupResponse = + tungstenService.createTungstenServiceGroup( + zoneId, name, protocol, startPort, endPort); + if (tungstenFabricServiceGroupResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric service group"); + } else { + tungstenFabricServiceGroupResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricServiceGroupResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_SERVICE_GROUP; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric service group"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmd.java new file mode 100644 index 00000000000..b46e5ffef53 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmd.java @@ -0,0 +1,89 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricTagCmd.APINAME, description = "create Tungsten-Fabric tag", + responseObject = TungstenFabricTagResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricTagCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricTagCmd.class.getName()); + public static final String APINAME = "createTungstenFabricTag"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.TAG_TYPE, type = CommandType.STRING, required = true, description = "Tungsten-Fabric tag type") + private String tagType; + + @Parameter(name = ApiConstants.TAG_VALUE, type = CommandType.STRING, required = true, description = "Tungsten-Fabric tag value") + private String tagValue; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagResponse tungstenFabricTagResponse = tungstenService.createTungstenTag(zoneId, tagType, tagValue); + if (tungstenFabricTagResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric tag"); + } else { + tungstenFabricTagResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricTagResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_TAG; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric tag"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmd.java new file mode 100644 index 00000000000..4a6d29d5a0b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmd.java @@ -0,0 +1,87 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagTypeResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = CreateTungstenFabricTagTypeCmd.APINAME, description = "create Tungsten-Fabric tag type", + responseObject = TungstenFabricTagTypeResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateTungstenFabricTagTypeCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateTungstenFabricTagTypeCmd.class.getName()); + public static final String APINAME = "createTungstenFabricTagType"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "Tungsten-Fabric tag type name") + private String name; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagTypeResponse tungstenFabricTagTypeResponse = tungstenService.createTungstenTagType(zoneId, + name); + if (tungstenFabricTagTypeResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Tungsten-Fabric tag type"); + } else { + tungstenFabricTagTypeResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricTagTypeResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_CREATE_TAGTYPE; + } + + @Override + public String getEventDescription() { + return "create Tungsten-Fabric tag type"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmd.java new file mode 100644 index 00000000000..b1b130a4897 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricAddressGroupCmd.APINAME, description = "delete Tungsten-Fabric address group", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricAddressGroupCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricAddressGroupCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricAddressGroup"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.ADDRESS_GROUP_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric address group") + private String addressGroupUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenAddressGroup(zoneId, addressGroupUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric address group"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_ADDRESS_GROUP; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric address group"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmd.java new file mode 100644 index 00000000000..fe1c95230f3 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricApplicationPolicySetCmd.APINAME, description = "delete Tungsten-Fabric application policy set", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricApplicationPolicySetCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricApplicationPolicySetCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricApplicationPolicySet"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenApplicationPolicySet(zoneId, applicationPolicySetUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric application policy set"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_APPLICATION_POLICY_SET; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric application policy set"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmd.java new file mode 100644 index 00000000000..61d166a71fd --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmd.java @@ -0,0 +1,87 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricFirewallPolicyCmd.APINAME, description = "delete Tungsten-Fabric firewall " + + "policy", responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class DeleteTungstenFabricFirewallPolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricFirewallPolicyCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricFirewallPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.FIREWALL_POLICY_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric firewall policy") + private String firewallPolicyUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenFirewallPolicy(zoneId, firewallPolicyUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric firewall policy"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_FIREWALL_POLICY; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric firewall policy"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmd.java new file mode 100644 index 00000000000..536aad72036 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricFirewallRuleCmd.APINAME, description = "delete Tungsten-Fabric firewall rule", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricFirewallRuleCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricFirewallRuleCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricFirewallRule"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.FIREWALL_RULE_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric firewall rule") + private String firewallRuleUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenFirewallRule(zoneId, firewallRuleUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric firewall rule"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_FIREWALL_RULE; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric firewall rule"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmd.java new file mode 100644 index 00000000000..953b74857f8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmd.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricLogicalRouterCmd.APINAME, description = "delete Tungsten-Fabric logical router", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricLogicalRouterCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricLogicalRouterCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricLogicalRouter"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.LOGICAL_ROUTER_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric logical router") + private String logicalRouterUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List networkList = tungstenService.listConnectedNetworkFromLogicalRouter(zoneId, logicalRouterUuid); + if (!networkList.isEmpty()) { + throw new ServerApiException(ApiErrorCode.RESOURCE_IN_USE_ERROR, "Tungsten-Fabric logical router still have connected network"); + } + + boolean result = tungstenService.deleteLogicalRouter(zoneId, logicalRouterUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric logical router"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_LOGICAL_ROUTER; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric logical router"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmd.java new file mode 100644 index 00000000000..4398a109127 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricPolicyCmd.APINAME, description = "delete Tungsten-Fabric policy", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricPolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricPolicyCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, required = true, description = "the Uuid of Tungsten-Fabric tag type") + private String policyUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenPolicy(zoneId, policyUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric policy"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_POLICY; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric policy"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmd.java new file mode 100644 index 00000000000..28be9e59af6 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricServiceGroupCmd.APINAME, description = "delete Tungsten-Fabric service group", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricServiceGroupCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricServiceGroupCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricServiceGroup"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.SERVICE_GROUP_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric service group") + private String serviceGroupUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenServiceGroup(zoneId, serviceGroupUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric service group"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_SERVICE_GROUP; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric service group"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmd.java new file mode 100644 index 00000000000..afc15022bd6 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricTagCmd.APINAME, description = "delete Tungsten-Fabric tag", responseObject = + SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricTagCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricTagCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricTag"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.TAG_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric tag") + private String tagUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenTag(zoneId, tagUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric tag"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_TAG; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric tag"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmd.java new file mode 100644 index 00000000000..418ec5284d4 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmd.java @@ -0,0 +1,86 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = DeleteTungstenFabricTagTypeCmd.APINAME, description = "delete Tungsten-Fabric tag type", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class DeleteTungstenFabricTagTypeCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteTungstenFabricTagTypeCmd.class.getName()); + public static final String APINAME = "deleteTungstenFabricTagType"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.TAG_TYPE_UUID, type = CommandType.STRING, required = true, description = "the ID of Tungsten-Fabric tag type") + private String tagTypeUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.deleteTungstenTagType(zoneId, tagTypeUuid); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete Tungsten-Fabric tag type"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_DELETE_TAGTYPE; + } + + @Override + public String getEventDescription() { + return "delete Tungsten-Fabric tag type"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmd.java new file mode 100644 index 00000000000..3e93adb35d5 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmd.java @@ -0,0 +1,85 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.user.Account; +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.network.tungsten.api.response.TlsDataResponse; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = GetLoadBalancerSslCertificateCmd.APINAME, description = "get load balancer certificate", + responseObject = TlsDataResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class GetLoadBalancerSslCertificateCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(GetLoadBalancerSslCertificateCmd.class.getName()); + public static final String APINAME = "getLoadBalancerSslCertificate"; + + @Inject + private LoadBalancingRulesManager lbMgr; + + @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TlsDataResponse.class, required = true, description = "the ID of Lb") + private Long id; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + LoadBalancingRule.LbSslCert lbSslCert = lbMgr.getLbSslCert(id); + if (lbSslCert != null) { + TlsDataResponse tlsDataResponse = new TlsDataResponse(); + tlsDataResponse.setCrt(Base64.encodeBase64String(lbSslCert.getCert().getBytes())); + tlsDataResponse.setKey(Base64.encodeBase64String(lbSslCert.getKey().getBytes())); + tlsDataResponse.setChain( + lbSslCert.getChain() != null ? Base64.encodeBase64String(lbSslCert.getChain().getBytes()) : + StringUtils.EMPTY); + tlsDataResponse.setResponseName(getCommandName()); + tlsDataResponse.setObjectName("data"); + setResponseObject(tlsDataResponse); + } else { + throw new CloudRuntimeException("can not get tls data"); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + Account account = CallContext.current().getCallingAccount(); + if (account != null) { + return account.getId(); + } + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmd.java new file mode 100644 index 00000000000..a96bbc4d324 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmd.java @@ -0,0 +1,90 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricAddressGroupResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricAddressGroupCmd.APINAME, description = "list Tungsten-Fabric address group", + responseObject = TungstenFabricAddressGroupResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class ListTungstenFabricAddressGroupCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricAddressGroupCmd.class.getName()); + public static final String APINAME = "listTungstenFabricAddressGroup"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.ADDRESS_GROUP_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric address group") + private String addressGroupUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenAddressGroup(zoneId, addressGroupUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenAddressGroup(tungstenProvider.getZoneId(), addressGroupUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmd.java new file mode 100644 index 00000000000..b49bdce0fc2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmd.java @@ -0,0 +1,90 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricApplicationPolicySetResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricApplictionPolicySetCmd.APINAME, description = "list Tungsten-Fabric application " + + "policy set", responseObject = TungstenFabricApplicationPolicySetResponse.class, requestHasSensitiveInfo = + false, responseHasSensitiveInfo = false) +public class ListTungstenFabricApplictionPolicySetCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricApplictionPolicySetCmd.class.getName()); + public static final String APINAME = "listTungstenFabricApplicationPolicySet"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenApplicationPolicySet(zoneId, applicationPolicySetUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenApplicationPolicySet(tungstenProvider.getZoneId(), applicationPolicySetUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmd.java new file mode 100644 index 00000000000..e63e8cb6122 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmd.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricFirewallPolicyCmd.APINAME, description = "list Tungsten-Fabric firewall policy", + responseObject = TungstenFabricFirewallPolicyResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class ListTungstenFabricFirewallPolicyCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricFirewallPolicyCmd.class.getName()); + public static final String APINAME = "listTungstenFabricFirewallPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Parameter(name = ApiConstants.FIREWALL_POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric firewall policy") + private String firewallPolicyUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenFirewallPolicy(zoneId, applicationPolicySetUuid, firewallPolicyUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenFirewallPolicy(tungstenProvider.getZoneId(), applicationPolicySetUuid, firewallPolicyUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmd.java new file mode 100644 index 00000000000..800b0b26929 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmd.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallRuleResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricFirewallRuleCmd.APINAME, description = "list Tungsten-Fabric firewall rule", + responseObject = TungstenFabricFirewallRuleResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class ListTungstenFabricFirewallRuleCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricFirewallRuleCmd.class.getName()); + public static final String APINAME = "listTungstenFabricFirewallRule"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.FIREWALL_POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric firewall policy") + private String firewallPolicyUuid; + + @Parameter(name = ApiConstants.FIREWALL_RULE_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric firewall rule") + private String firewallRuleUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenFirewallRule(zoneId, firewallPolicyUuid, firewallRuleUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenFirewallRule(tungstenProvider.getZoneId(), firewallPolicyUuid, firewallRuleUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmd.java new file mode 100644 index 00000000000..0dfaa18c549 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmd.java @@ -0,0 +1,75 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.FirewallRuleResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLBHealthMonitorResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricLBHealthMonitorCmd.APINAME, description = "list Tungsten-Fabric LB health monitor", responseObject = + TungstenFabricLBHealthMonitorResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricLBHealthMonitorCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricLBHealthMonitorCmd.class.getName()); + public static final String APINAME = "listTungstenFabricLBHealthMonitor"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, required = true, description = "the ID of lb rule") + private Long lbID; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = tungstenService.listTungstenFabricLBHealthMonitor(lbID); + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmd.java new file mode 100644 index 00000000000..4178aa6fd05 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmd.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLogicalRouterResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricLogicalRouterCmd.APINAME, description = "list Tungsten-Fabric logical router", + responseObject = TungstenFabricLogicalRouterResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class ListTungstenFabricLogicalRouterCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricLogicalRouterCmd.class.getName()); + public static final String APINAME = "listTungstenFabricLogicalRouter"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric network") + private String networkUuid; + + @Parameter(name = ApiConstants.LOGICAL_ROUTER_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric logical router") + private String logicalRouterUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listRoutingLogicalRouter(zoneId, networkUuid, logicalRouterUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listRoutingLogicalRouter(tungstenProvider.getZoneId(), networkUuid, logicalRouterUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmd.java new file mode 100644 index 00000000000..907165d349e --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmd.java @@ -0,0 +1,95 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricNetworkResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricNetworkCmd.APINAME, description = "list Tungsten-Fabric network", + responseObject = TungstenFabricNetworkResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class ListTungstenFabricNetworkCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricNetworkCmd.class.getName()); + public static final String APINAME = "listTungstenFabricNetwork"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric network") + private String networkUuid; + + @Parameter(name = ApiConstants.LIST_ALL, + type = CommandType.BOOLEAN, + description = "If set to false, list only resources belonging to the command's caller; if set to true - list resources that include public network. Default value is false") + private Boolean listAll; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenNetwork(zoneId, networkUuid, listAll)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenNetwork(tungstenProvider.getZoneId(), networkUuid, listAll)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmd.java new file mode 100644 index 00000000000..6f19cb698f0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmd.java @@ -0,0 +1,89 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricNicResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricNicCmd.APINAME, description = "list Tungsten-Fabric nic", responseObject = + TungstenFabricNicResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricNicCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricNicCmd.class.getName()); + public static final String APINAME = "listTungstenFabricNic"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NIC_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric nic") + private String nicUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenNic(zoneId, nicUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenNic(tungstenProvider.getZoneId(), nicUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmd.java new file mode 100644 index 00000000000..b5edf2d3232 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmd.java @@ -0,0 +1,97 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.IPAddressResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.NetworkResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricPolicyCmd.APINAME, description = "list Tungsten-Fabric policy", responseObject = + TungstenFabricPolicyResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricPolicyCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricPolicyCmd.class.getName()); + public static final String APINAME = "listTungstenFabricPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_ID, type = CommandType.UUID, entityType = NetworkResponse.class, description = "the ID of network") + private Long networkId; + + @Parameter(name = ApiConstants.IP_ADDRESS_ID, type = CommandType.UUID, entityType = IPAddressResponse.class, description = "the ID of ip address") + private Long addressId; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenPolicy(zoneId, networkId, addressId, policyUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenPolicy(tungstenProvider.getZoneId(), networkId, addressId, policyUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmd.java new file mode 100644 index 00000000000..0bbb292b4f9 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmd.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricRuleResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricPolicyRuleCmd.APINAME, description = "list Tungsten-Fabric policy", + responseObject = TungstenFabricRuleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class ListTungstenFabricPolicyRuleCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricPolicyRuleCmd.class.getName()); + public static final String APINAME = "listTungstenFabricPolicyRule"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.RULE_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric rule") + private String ruleUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenPolicyRule(zoneId, policyUuid, ruleUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenPolicyRule(tungstenProvider.getZoneId(), policyUuid, ruleUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmd.java new file mode 100644 index 00000000000..abc32447783 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmd.java @@ -0,0 +1,88 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricProviderResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenProviderService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricProvidersCmd.APINAME, responseObject = TungstenFabricProviderResponse.class, + description = "Lists Tungsten-Fabric providers", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricProvidersCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricProvidersCmd.class.getName()); + public static final String APINAME = "listTungstenFabricProviders"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class) + private Long zoneId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Inject + private TungstenProviderService tungstenProviderService; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = tungstenProviderService.listTungstenProvider(zoneId); + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } +} + diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmd.java new file mode 100644 index 00000000000..8d65da42550 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmd.java @@ -0,0 +1,90 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricServiceGroupResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricServiceGroupCmd.APINAME, description = "list Tungsten-Fabric service group", + responseObject = TungstenFabricServiceGroupResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class ListTungstenFabricServiceGroupCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricServiceGroupCmd.class.getName()); + public static final String APINAME = "listTungstenFabricServiceGroup"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.SERVICE_GROUP_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric service group") + private String serviceGroupUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenServiceGroup(zoneId, serviceGroupUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenServiceGroup(tungstenProvider.getZoneId(), serviceGroupUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmd.java new file mode 100644 index 00000000000..dd64587ac14 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmd.java @@ -0,0 +1,104 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricTagCmd.APINAME, responseObject = TungstenFabricTagResponse.class, + description = "Lists Tungsten-Fabric tags", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricTagCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricTagCmd.class.getName()); + public static final String APINAME = "listTungstenFabricTag"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric network") + private String networkUuid; + + @Parameter(name = ApiConstants.VM_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric vm") + private String vmUuid; + + @Parameter(name = ApiConstants.NIC_UUID, type = CommandType.STRING, description = "tthe uuid of Tungsten-Fabric nic") + private String nicUuid; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Parameter(name = ApiConstants.TAG_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric tag") + private String tagUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenTags(zoneId, networkUuid, vmUuid, nicUuid, policyUuid, applicationPolicySetUuid, tagUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenTags(tungstenProvider.getZoneId(), networkUuid, vmUuid, nicUuid, policyUuid, applicationPolicySetUuid, tagUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmd.java new file mode 100644 index 00000000000..bda4ef7a04a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmd.java @@ -0,0 +1,90 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagTypeResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricTagTypeCmd.APINAME, responseObject = TungstenFabricTagTypeResponse.class, + description = + "Lists " + "Tungsten-Fabric tags", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricTagTypeCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricTagTypeCmd.class.getName()); + public static final String APINAME = "listTungstenFabricTagType"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.TAG_TYPE_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric tag type") + private String tagTypeUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenTagTypes(zoneId, tagTypeUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenTagTypes(tungstenProvider.getZoneId(), tagTypeUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmd.java new file mode 100644 index 00000000000..02e19c5c423 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmd.java @@ -0,0 +1,89 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.user.Account; +import com.cloud.utils.StringUtils; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricVmResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = ListTungstenFabricVmCmd.APINAME, description = "list Tungsten-Fabric vm", responseObject = + TungstenFabricVmResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ListTungstenFabricVmCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListTungstenFabricVmCmd.class.getName()); + public static final String APINAME = "listTungstenFabricVm"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.VM_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric vm") + private String vmUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List baseResponseList = new ArrayList<>(); + if (zoneId != null) { + baseResponseList.addAll(tungstenService.listTungstenVm(zoneId, vmUuid)); + } else { + List tungstenProviderVOList = tungstenService.getTungstenProviders(); + for (TungstenProvider tungstenProvider : tungstenProviderVOList) { + baseResponseList.addAll(tungstenService.listTungstenVm(tungstenProvider.getZoneId(), vmUuid)); + } + } + List pagingList = StringUtils.applyPagination(baseResponseList, this.getStartIndex(), this.getPageSizeVal()); + ListResponse listResponse = new ListResponse<>(); + listResponse.setResponses(pagingList); + listResponse.setResponseName(getCommandName()); + setResponseObject(listResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.java new file mode 100644 index 00000000000..74536ca4541 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.java @@ -0,0 +1,97 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLogicalRouterResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.APINAME, description = "remove Tungsten-Fabric network gateway from logical router", + responseObject = TungstenFabricLogicalRouterResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.class.getName()); + public static final String APINAME = "removeTungstenFabricNetworkGatewayFromLogicalRouter"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, required = true, description = "Tungsten-Fabric network uuid") + private String networkUuid; + + @Parameter(name = ApiConstants.LOGICAL_ROUTER_UUID, type = CommandType.STRING, required = true, description = "Tungsten-Fabric logical router uuid") + private String logicalRouterUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List networkList = tungstenService.listConnectedNetworkFromLogicalRouter(zoneId, logicalRouterUuid); + if (!networkList.contains(networkUuid)) { + throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, "Tungsten-Fabric network is not connect to logical router"); + } + + BaseResponse response = tungstenService.removeNetworkGatewayFromLogicalRouter(zoneId, networkUuid, logicalRouterUuid); + if (response == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove Tungsten-Fabric network gateway from routing logical router"); + } else { + response.setResponseName(getCommandName()); + setResponseObject(response); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_REMOVE_NETWORK_GATEWAY_FROM_LOGICAL_ROUTER; + } + + @Override + public String getEventDescription() { + return "remove Tungsten-Fabric network gateway from logical router"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmd.java new file mode 100644 index 00000000000..93ed3ba1d27 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmd.java @@ -0,0 +1,91 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = RemoveTungstenFabricPolicyCmd.APINAME, description = "remove Tungsten-Fabric policy", + responseObject = TungstenFabricPolicyResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class RemoveTungstenFabricPolicyCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(RemoveTungstenFabricPolicyCmd.class.getName()); + public static final String APINAME = "removeTungstenFabricPolicy"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric network") + private String networkUuid; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = tungstenService.removeTungstenPolicy(zoneId, + networkUuid, policyUuid); + if (tungstenFabricPolicyResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove Tungsten-Fabric policy"); + } else { + tungstenFabricPolicyResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricPolicyResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_REMOVE_POLICY; + } + + @Override + public String getEventDescription() { + return "remove Tungsten-Fabric policy"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmd.java new file mode 100644 index 00000000000..86ec6555a75 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmd.java @@ -0,0 +1,91 @@ +// 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.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = RemoveTungstenFabricPolicyRuleCmd.APINAME, description = "remove Tungsten-Fabric policy", + responseObject = TungstenFabricPolicyResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = + false) +public class RemoveTungstenFabricPolicyRuleCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(RemoveTungstenFabricPolicyRuleCmd.class.getName()); + public static final String APINAME = "removeTungstenFabricPolicyRule"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, required = true, description = "the Uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.RULE_UUID, type = CommandType.STRING, required = true, description = "the Uuid of Tungsten-Fabric policy rule") + private String ruleUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = tungstenService.removeTungstenPolicyRule(zoneId, + policyUuid, ruleUuid); + if (tungstenFabricPolicyResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove Tungsten-Fabric policy rule"); + } else { + tungstenFabricPolicyResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricPolicyResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_REMOVE_POLICY_RULE; + } + + @Override + public String getEventDescription() { + return "remove Tungsten-Fabric policy rule"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmd.java new file mode 100644 index 00000000000..0214eff881c --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmd.java @@ -0,0 +1,104 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import java.util.List; + +import javax.inject.Inject; + +@APICommand(name = RemoveTungstenFabricTagCmd.APINAME, description = "remove Tungsten-Fabric tag", responseObject = + TungstenFabricTagResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class RemoveTungstenFabricTagCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(RemoveTungstenFabricTagCmd.class.getName()); + public static final String APINAME = "removeTungstenFabricTag"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, required = true, description = "the ID of zone") + private Long zoneId; + + @Parameter(name = ApiConstants.NETWORK_UUID, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the uuid of networks") + private List networkUuids; + + @Parameter(name = ApiConstants.VM_UUID, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the uuid of vms") + private List vmUuids; + + @Parameter(name = ApiConstants.NIC_UUID, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the uuid of nics") + private List nicUuids; + + @Parameter(name = ApiConstants.POLICY_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric policy") + private String policyUuid; + + @Parameter(name = ApiConstants.APPLICATION_POLICY_SET_UUID, type = CommandType.STRING, description = "the uuid of Tungsten-Fabric application policy set") + private String applicationPolicySetUuid; + + @Parameter(name = ApiConstants.TAG_UUID, type = CommandType.STRING, required = true, description = "the uuid of Tungsten-Fabric tag") + private String tagUuid; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagResponse tungstenFabricTagResponse = tungstenService.removeTungstenTag(zoneId, networkUuids, + vmUuids, nicUuids, policyUuid, applicationPolicySetUuid, tagUuid); + if (tungstenFabricTagResponse == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove Tungsten-Fabric tag"); + } else { + tungstenFabricTagResponse.setResponseName(getCommandName()); + setResponseObject(tungstenFabricTagResponse); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_REMOVE_TAG; + } + + @Override + public String getEventDescription() { + return "remove Tungsten-Fabric tag"; + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmd.java new file mode 100644 index 00000000000..458d915956d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmd.java @@ -0,0 +1,80 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +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.network.tungsten.api.response.TungstenFabricProviderResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = SynchronizeTungstenFabricDataCmd.APINAME, description = "Synchronize Tungsten-Fabric data", + responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class SynchronizeTungstenFabricDataCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(SynchronizeTungstenFabricDataCmd.class.getName()); + public static final String APINAME = "synchronizeTungstenFabricData"; + + @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TungstenFabricProviderResponse.class, + required = true, description = "provider id") + private Long tungstenProviderId; + + @Inject + TungstenService tungstenService; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + boolean result = tungstenService.synchronizeTungstenData(tungstenProviderId); + if (result) { + SuccessResponse successResponse = new SuccessResponse(getCommandName()); + setResponseObject(successResponse); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Unable to synchronize Tungsten-Fabric data"); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + public Long getTungstenProviderId() { + return tungstenProviderId; + } + + public void setTungstenProviderId(final Long tungstenProviderId) { + this.tungstenProviderId = tungstenProviderId; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmd.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmd.java new file mode 100644 index 00000000000..9e7cce66e34 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmd.java @@ -0,0 +1,161 @@ +// 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.network.tungsten.api.command; + +import com.cloud.dc.DataCenter; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.Network; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.user.Account; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCreateCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.FirewallRuleResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLBHealthMonitorResponse; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = UpdateTungstenFabricLBHealthMonitorCmd.APINAME, description = "update Tungsten-Fabric loadbalancer health monitor", + responseObject = TungstenFabricLBHealthMonitorResponse.class, requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false) +public class UpdateTungstenFabricLBHealthMonitorCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(UpdateTungstenFabricLBHealthMonitorCmd.class.getName()); + public static final String APINAME = "updateTungstenFabricLBHealthMonitor"; + + @Inject + TungstenService tungstenService; + + @Parameter(name = ApiConstants.LBID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, required = true, description = "the ID of lb rule") + private Long lbId; + + @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, required = true, description = "loadbalancer health monitor type") + private String type; + + @Parameter(name = ApiConstants.RETRY, type = CommandType.INTEGER, required = true, description = "loadbalancer health monitor retry") + private int retry; + + @Parameter(name = ApiConstants.TIMEOUT, type = CommandType.INTEGER, required = true, description = "loadbalancer health monitor timeout") + private int timeout; + + @Parameter(name = ApiConstants.INTERVAL, type = CommandType.INTEGER, required = true, description = "loadbalancer health monitor interval") + private int interval; + + @Parameter(name = ApiConstants.HTTP_METHOD, type = CommandType.STRING, description = "loadbalancer health monitor http method") + private String httpMethod; + + @Parameter(name = ApiConstants.EXPECTED_CODE, type = CommandType.STRING, description = "loadbalancer health monitor expected code") + private String expectedCode; + + @Parameter(name = ApiConstants.URL_PATH, type = CommandType.STRING, description = "loadbalancer health monitor url path") + private String urlPath; + + @Override + public void create() throws ResourceAllocationException { + TungstenService.MonitorType monitorType; + try { + monitorType = TungstenService.MonitorType.valueOf(type); + } catch (IllegalArgumentException e) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid parameter:" + type); + } + + if (monitorType == TungstenService.MonitorType.HTTP) { + if (httpMethod == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid http method parameter"); + } + + try { + TungstenService.HttpType.valueOf(httpMethod); + } catch (IllegalArgumentException e) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid parameter:" + httpMethod); + } + + if (expectedCode == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid expected code parameter"); + } + + if (urlPath == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid url path parameter"); + } + } + + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = + tungstenService.updateTungstenFabricLBHealthMonitor( + lbId, type, retry, timeout, interval, httpMethod, expectedCode, urlPath); + + if (tungstenFabricLBHealthMonitorVO != null) { + setEntityId(tungstenFabricLBHealthMonitorVO.getId()); + setEntityUuid(tungstenFabricLBHealthMonitorVO.getUuid()); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, + "Failed to create Tungsten Fabric Health Monitor entity"); + } + } + + @Override + public String getEventType() { + return EventTypes.EVENT_TUNGSTEN_UPDATE_LB_HEALTH_MONITOR; + } + + @Override + public String getEventDescription() { + return "update Tungsten-Fabric LoadBalancer health monitor"; + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO; + boolean result = tungstenService.applyLBHealthMonitor(lbId); + + if (result) { + tungstenFabricLBHealthMonitorVO = _entityMgr.findById(TungstenFabricLBHealthMonitorVO.class, getEntityId()); + LoadBalancer loadBalancer = _entityMgr.findById(LoadBalancer.class, lbId); + Network network = _entityMgr.findById(Network.class, loadBalancer.getNetworkId()); + DataCenter dataCenter = _entityMgr.findById(DataCenter.class, network.getDataCenterId()); + TungstenFabricLBHealthMonitorResponse response = new TungstenFabricLBHealthMonitorResponse( + tungstenFabricLBHealthMonitorVO, dataCenter); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } + + if (!result) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update health monitor"); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TlsDataResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TlsDataResponse.java new file mode 100644 index 00000000000..2728cea6ff9 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TlsDataResponse.java @@ -0,0 +1,62 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.network.rules.FirewallRule; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +@EntityReference(value = FirewallRule.class) +public class TlsDataResponse extends BaseResponse { + @SerializedName("crt") + @Param(description = "crt") + private String crt; + + @SerializedName("key") + @Param(description = "key") + private String key; + + @SerializedName("chain") + @Param(description = "chain") + private String chain; + + public String getCrt() { + return crt; + } + + public void setCrt(final String crt) { + this.crt = crt; + } + + public String getKey() { + return key; + } + + public void setKey(final String key) { + this.key = key; + } + + public String getChain() { + return chain; + } + + public void setChain(final String chain) { + this.chain = chain; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricAddressGroupResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricAddressGroupResponse.java new file mode 100644 index 00000000000..5552a814d0a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricAddressGroupResponse.java @@ -0,0 +1,116 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.AddressGroup; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class TungstenFabricAddressGroupResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric address group uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric address group name") + private String name; + + @SerializedName(ApiConstants.IP_PREFIX) + @Param(description = "Tungsten-Fabric address group ip prefix") + private String ipPrefix; + + @SerializedName(ApiConstants.IP_PREFIX_LEN) + @Param(description = "Tungsten-Fabric address group ip prefix length") + private int ipPrefixLen; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricAddressGroupResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("addressgroup"); + } + + public TungstenFabricAddressGroupResponse(AddressGroup addressGroup, DataCenter zone) { + this.uuid = addressGroup.getUuid(); + this.name = addressGroup.getName(); + this.ipPrefix = addressGroup.getPrefix().getSubnet().get(0).getIpPrefix(); + this.ipPrefixLen = addressGroup.getPrefix().getSubnet().get(0).getIpPrefixLen(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("addressgroup"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getIpPrefix() { + return ipPrefix; + } + + public void setIpPrefix(final String ipPrefix) { + this.ipPrefix = ipPrefix; + } + + public int getIpPrefixLen() { + return ipPrefixLen; + } + + public void setIpPrefixLen(final int ipPrefixLen) { + this.ipPrefixLen = ipPrefixLen; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricApplicationPolicySetResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricApplicationPolicySetResponse.java new file mode 100644 index 00000000000..009887c2d1d --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricApplicationPolicySetResponse.java @@ -0,0 +1,136 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.FirewallSequence; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import java.util.ArrayList; +import java.util.List; + +public class TungstenFabricApplicationPolicySetResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric application policy uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric policy name") + private String name; + + @SerializedName(ApiConstants.FIREWALL_POLICY) + @Param(description = "list Tungsten-Fabric firewall policy") + private List firewallPolicys; + + @SerializedName(ApiConstants.TAG) + @Param(description = "list Tungsten-Fabric tag") + private List tags; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricApplicationPolicySetResponse(ApplicationPolicySet applicationPolicySet, DataCenter zone) { + this.uuid = applicationPolicySet.getUuid(); + this.name = applicationPolicySet.getName(); + List responsesTags = new ArrayList<>(); + List> objectReferenceTagList = applicationPolicySet.getTag(); + if (objectReferenceTagList != null) { + for (ObjectReference objectReference : objectReferenceTagList) { + TungstenFabricTagResponse tungstenFabricTagResponse = new TungstenFabricTagResponse( + objectReference.getUuid(), + objectReference.getReferredName().get(objectReference.getReferredName().size() - 1), zone); + responsesTags.add(tungstenFabricTagResponse); + } + } + this.tags = responsesTags; + List responsesFirewallPolicys = new ArrayList<>(); + List> objectReferenceFirewallPolicyList = + applicationPolicySet.getFirewallPolicy(); + if (objectReferenceFirewallPolicyList != null) { + for (ObjectReference objectReference : objectReferenceFirewallPolicyList) { + TungstenFabricFirewallPolicyResponse tungstenFabricFirewallPolicyResponse = + new TungstenFabricFirewallPolicyResponse( + objectReference.getUuid(), + objectReference.getReferredName().get(objectReference.getReferredName().size() - 1), zone); + responsesFirewallPolicys.add(tungstenFabricFirewallPolicyResponse); + } + } + this.firewallPolicys = responsesFirewallPolicys; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("applicationpolicyset"); + } + + public List getFirewallPolicys() { + return firewallPolicys; + } + + public void setFirewallPolicys(final List firewallPolicys) { + this.firewallPolicys = firewallPolicys; + } + + public List getTags() { + return tags; + } + + public void setTags(final List tags) { + this.tags = tags; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallPolicyResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallPolicyResponse.java new file mode 100644 index 00000000000..0c6f0e4a23e --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallPolicyResponse.java @@ -0,0 +1,119 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.FirewallSequence; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import java.util.ArrayList; +import java.util.List; + +public class TungstenFabricFirewallPolicyResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric firewall policy uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric firewall policy name") + private String name; + + @SerializedName(ApiConstants.FIREWALL_RULE) + @Param(description = "list Tungsten-Fabric firewall rule") + private List firewallRules; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricFirewallPolicyResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("firewallpolicy"); + } + + public TungstenFabricFirewallPolicyResponse(FirewallPolicy firewallPolicy, DataCenter zone) { + this.uuid = firewallPolicy.getUuid(); + this.name = firewallPolicy.getName(); + this.setObjectName("firewallpolicy"); + + List responsesFirewallRules = new ArrayList<>(); + List> objectReferenceFirewallRuleList = firewallPolicy.getFirewallRule(); + if (objectReferenceFirewallRuleList != null) { + for (ObjectReference objectReference : objectReferenceFirewallRuleList) { + TungstenFabricFirewallRuleResponse tungstenFabricFirewallRuleResponse = new TungstenFabricFirewallRuleResponse( + objectReference.getUuid(), + objectReference.getReferredName().get(objectReference.getReferredName().size() - 1), zone); + responsesFirewallRules.add(tungstenFabricFirewallRuleResponse); + } + } + this.firewallRules = responsesFirewallRules; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + } + + public List getFirewallRules() { + return firewallRules; + } + + public void setFirewallRules(final List firewallRules) { + this.firewallRules = firewallRules; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallRuleResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallRuleResponse.java new file mode 100644 index 00000000000..85fee526fcb --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricFirewallRuleResponse.java @@ -0,0 +1,279 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.cloud.utils.TungstenUtils; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.FirewallRule; +import net.juniper.tungsten.api.types.FirewallRuleEndpointType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +public class TungstenFabricFirewallRuleResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric firewall rule uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric firewall rule name") + private String name; + + @SerializedName(ApiConstants.ACTION) + @Param(description = "Tungsten-Fabric firewall rule action") + private String action; + + @SerializedName(ApiConstants.SERVICE_GROUP) + @Param(description = "Tungsten-Fabric firewall rule service group") + private String serviceGroup; + + @SerializedName(ApiConstants.SRC_TAG) + @Param(description = "Tungsten-Fabric firewall rule source tag") + private String srcTag; + + @SerializedName(ApiConstants.SRC_ADDRESS_GROUP) + @Param(description = "Tungsten-Fabric firewall rule source address group") + private String srcAddressGroup; + + @SerializedName(ApiConstants.SRC_NETWORK) + @Param(description = "Tungsten-Fabric firewall rule source network") + private String srcNetwork; + + @SerializedName(ApiConstants.DIRECTION) + @Param(description = "Tungsten-Fabric firewall rule direction") + private String direction; + + @SerializedName(ApiConstants.DEST_TAG) + @Param(description = "Tungsten-Fabric firewall rule destination tag") + private String destTag; + + @SerializedName(ApiConstants.DEST_ADDRESS_GROUP) + @Param(description = "Tungsten-Fabric firewall rule destination address group") + private String destAddressGroup; + + @SerializedName(ApiConstants.DEST_NETWORK) + @Param(description = "Tungsten-Fabric firewall rule destination network") + private String destNetwork; + + @SerializedName(ApiConstants.TAG_TYPE) + @Param(description = "Tungsten-Fabric firewall rule tag type") + private String tagType; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricFirewallRuleResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("firewallrule"); + } + + public TungstenFabricFirewallRuleResponse(FirewallRule firewallRule, DataCenter zone) { + this.uuid = firewallRule.getUuid(); + this.name = firewallRule.getName(); + this.action = firewallRule.getActionList().getSimpleAction(); + this.direction = firewallRule.getDirection(); + List> serviceGroupList = firewallRule.getServiceGroup(); + if (serviceGroupList != null) { + List serviceGroupNameList = serviceGroupList.get(0).getReferredName(); + this.serviceGroup = serviceGroupNameList.get(serviceGroupNameList.size() - 1); + } + + settingEndPoint1(firewallRule); + + settingEndPoint2(firewallRule); + + if (firewallRule.getMatchTags() != null && !firewallRule.getMatchTags().getTagList().isEmpty()) { + this.tagType = firewallRule.getMatchTags().getTagList().get(0); + } + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + + this.setObjectName("firewallrule"); + } + + private void settingEndPoint1(FirewallRule firewallRule) { + if (firewallRule.getEndpoint1() != null) { + FirewallRuleEndpointType srcEndpoint = firewallRule.getEndpoint1(); + if (srcEndpoint.getTags() != null && !srcEndpoint.getTags().isEmpty()) { + String[] srcTagList = srcEndpoint.getTags().get(0).split(":"); + this.srcTag = srcTagList[srcTagList.length - 1]; + } + + if (srcEndpoint.getAddressGroup() != null) { + String addressGroup = srcEndpoint.getAddressGroup(); + String[] addressGroupList = StringUtils.split(addressGroup, ":"); + this.srcAddressGroup = addressGroupList[addressGroupList.length - 1]; + } + + if (srcEndpoint.getVirtualNetwork() != null) { + String network = srcEndpoint.getVirtualNetwork(); + String[] networkList = StringUtils.split(network, ":"); + String networkName = networkList[networkList.length - 1]; + this.srcNetwork = TungstenUtils.getNameFromNetwork(networkName); + } + } + } + + private void settingEndPoint2(FirewallRule firewallRule) { + if (firewallRule.getEndpoint2() != null) { + FirewallRuleEndpointType destEndpoint = firewallRule.getEndpoint2(); + if (destEndpoint.getTags() != null && !destEndpoint.getTags().isEmpty()) { + String[] destTagList = destEndpoint.getTags().get(0).split(":"); + this.destTag = destTagList[destTagList.length - 1]; + } + + if (destEndpoint.getAddressGroup() != null) { + String addressGroup = destEndpoint.getAddressGroup(); + String[] addressGroupList = StringUtils.split(addressGroup, ":"); + this.destAddressGroup = addressGroupList[addressGroupList.length - 1]; + } + + if (destEndpoint.getVirtualNetwork() != null) { + String network = destEndpoint.getVirtualNetwork(); + String[] networkList = StringUtils.split(network, ":"); + String networkName = networkList[networkList.length - 1]; + this.destNetwork = TungstenUtils.getNameFromNetwork(networkName); + } + } + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getAction() { + return action; + } + + public void setAction(final String action) { + this.action = action; + } + + public String getDirection() { + return direction; + } + + public void setDirection(final String direction) { + this.direction = direction; + } + + public String getServiceGroup() { + return serviceGroup; + } + + public void setServiceGroup(final String serviceGroup) { + this.serviceGroup = serviceGroup; + } + + public String getSrcAddressGroup() { + return srcAddressGroup; + } + + public void setSrcAddressGroup(final String srcAddressGroup) { + this.srcAddressGroup = srcAddressGroup; + } + + public String getDestAddressGroup() { + return destAddressGroup; + } + + public void setDestAddressGroup(final String destAddressGroup) { + this.destAddressGroup = destAddressGroup; + } + + public String getTagType() { + return tagType; + } + + public void setTagType(final String tagType) { + this.tagType = tagType; + } + + public String getSrcTag() { + return srcTag; + } + + public void setSrcTag(final String srcTag) { + this.srcTag = srcTag; + } + + public String getDestTag() { + return destTag; + } + + public void setDestTag(final String destTag) { + this.destTag = destTag; + } + + public String getSrcNetwork() { + return srcNetwork; + } + + public void setSrcNetwork(final String srcNetwork) { + this.srcNetwork = srcNetwork; + } + + public String getDestNetwork() { + return destNetwork; + } + + public void setDestNetwork(final String destNetwork) { + this.destNetwork = destNetwork; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLBHealthMonitorResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLBHealthMonitorResponse.java new file mode 100644 index 00000000000..2702c083d2f --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLBHealthMonitorResponse.java @@ -0,0 +1,185 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; + +public class TungstenFabricLBHealthMonitorResponse extends BaseResponse { + @SerializedName("lbruleid") + @Param(description = "the LB rule ID") + private String lbRuleId; + + @SerializedName("id") + @Param(description = "the health monitor ID") + private long id; + + @SerializedName("uuid") + @Param(description = "the health monitor UUID") + private String uuid; + + @SerializedName("type") + @Param(description = "the health monitor type") + private String type; + + @SerializedName("retry") + @Param(description = "the health monitor retry") + private int retry; + + @SerializedName("timeout") + @Param(description = "the health monitor timeout") + private int timeout; + + @SerializedName("interval") + @Param(description = "the health monitor interval") + private int interval; + + @SerializedName("httpmethod") + @Param(description = "the health monitor http method") + private String httpMethod; + + @SerializedName("expectedcode") + @Param(description = "the health monitor expected code") + private String expectedCode; + + @SerializedName("urlpath") + @Param(description = "the health monitor url path") + private String urlPath; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricLBHealthMonitorResponse(TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO, DataCenter zone) { + this.id = tungstenFabricLBHealthMonitorVO.getId(); + this.uuid = tungstenFabricLBHealthMonitorVO.getUuid(); + this.type = tungstenFabricLBHealthMonitorVO.getType(); + this.retry = tungstenFabricLBHealthMonitorVO.getRetry(); + this.timeout = tungstenFabricLBHealthMonitorVO.getTimeout(); + this.interval = tungstenFabricLBHealthMonitorVO.getInterval(); + this.httpMethod = tungstenFabricLBHealthMonitorVO.getHttpMethod(); + this.expectedCode = tungstenFabricLBHealthMonitorVO.getExpectedCode(); + this.urlPath = tungstenFabricLBHealthMonitorVO.getUrlPath(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("healthmonitor"); + } + + public String getLbRuleId() { + return lbRuleId; + } + + public void setLbRuleId(final String lbRuleId) { + this.lbRuleId = lbRuleId; + } + + public long getId() { + return id; + } + + public void setId(final long id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getType() { + return type; + } + + public void setType(final String type) { + this.type = type; + } + + public String getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(final String httpMethod) { + this.httpMethod = httpMethod; + } + + public int getRetry() { + return retry; + } + + public void setRetry(final int retry) { + this.retry = retry; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(final int timeout) { + this.timeout = timeout; + } + + public int getInterval() { + return interval; + } + + public void setInterval(final int interval) { + this.interval = interval; + } + + public String getExpectedCode() { + return expectedCode; + } + + public void setExpectedCode(final String expectedCode) { + this.expectedCode = expectedCode; + } + + public String getUrlPath() { + return urlPath; + } + + public void setUrlPath(final String urlPath) { + this.urlPath = urlPath; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLogicalRouterResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLogicalRouterResponse.java new file mode 100644 index 00000000000..00f74a37a53 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricLogicalRouterResponse.java @@ -0,0 +1,103 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.network.tungsten.model.TungstenLogicalRouter; + +import java.util.ArrayList; +import java.util.List; + +public class TungstenFabricLogicalRouterResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric logical router uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric logical router name") + private String name; + + @SerializedName(ApiConstants.NETWORK) + @Param(description = "list Tungsten-Fabric policy network name") + private List networks; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricLogicalRouterResponse(TungstenLogicalRouter tungstenLogicalRouter, DataCenter zone) { + this.uuid = tungstenLogicalRouter.getLogicalRouter().getUuid(); + this.name = tungstenLogicalRouter.getLogicalRouter().getDisplayName(); + List responseNetworks = new ArrayList<>(); + for (VirtualNetwork virtualNetwork : tungstenLogicalRouter.getVirtualNetworkList()) { + responseNetworks.add(new TungstenFabricNetworkResponse(virtualNetwork, zone)); + } + this.networks = responseNetworks; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("logicalrouter"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public List getNetworks() { + return networks; + } + + public void setNetworks(final List networks) { + this.networks = networks; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNetworkResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNetworkResponse.java new file mode 100644 index 00000000000..787739c8ebb --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNetworkResponse.java @@ -0,0 +1,88 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class TungstenFabricNetworkResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric network uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric network name") + private String name; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricNetworkResponse(String uuid, String name) { + this.uuid = uuid; + this.name = name; + this.setObjectName("network"); + } + + public TungstenFabricNetworkResponse(VirtualNetwork virtualNetwork, DataCenter zone) { + this.uuid = virtualNetwork.getUuid(); + this.name = virtualNetwork.getDisplayName(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("network"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNicResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNicResponse.java new file mode 100644 index 00000000000..8398da1ffb9 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricNicResponse.java @@ -0,0 +1,90 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class TungstenFabricNicResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric nic uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric nic name") + private String name; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricNicResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("nic"); + } + + public TungstenFabricNicResponse(VirtualMachineInterface virtualMachineInterface, DataCenter zone) { + this.uuid = virtualMachineInterface.getUuid(); + this.name = virtualMachineInterface.getName(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("nic"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricPolicyResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricPolicyResponse.java new file mode 100644 index 00000000000..fef1f7a3e74 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricPolicyResponse.java @@ -0,0 +1,135 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.VirtualNetwork; +import net.juniper.tungsten.api.types.VirtualNetworkPolicyType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.network.tungsten.model.TungstenNetworkPolicy; + +import java.util.ArrayList; +import java.util.List; + +public class TungstenFabricPolicyResponse extends BaseResponse { + private static final String OBJECTNAME = "policy"; + + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric tag type uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric policy name") + private String name; + + @SerializedName(ApiConstants.NETWORK) + @Param(description = "list Tungsten-Fabric policy network name") + private List networks; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricPolicyResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName(OBJECTNAME); + } + + public TungstenFabricPolicyResponse(NetworkPolicy networkPolicy, DataCenter zone) { + this.uuid = networkPolicy.getUuid(); + this.name = networkPolicy.getName(); + List responseNetworks = new ArrayList<>(); + List> objectReferenceList = networkPolicy.getVirtualNetworkBackRefs(); + if (objectReferenceList != null) { + for (ObjectReference objectReference : objectReferenceList) { + TungstenFabricNetworkResponse tungstenFabricNetworkResponse = new TungstenFabricNetworkResponse(objectReference.getUuid(), + objectReference.getReferredName().get(objectReference.getReferredName().size() - 1)); + responseNetworks.add(tungstenFabricNetworkResponse); + } + } + this.networks = responseNetworks; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName(OBJECTNAME); + } + + public TungstenFabricPolicyResponse(TungstenNetworkPolicy tungstenNetworkPolicy, DataCenter zone) { + this.uuid = tungstenNetworkPolicy.getNetworkPolicy().getUuid(); + this.name = tungstenNetworkPolicy.getNetworkPolicy().getName(); + List responseNetworks = new ArrayList<>(); + List virtualNetworkList = tungstenNetworkPolicy.getVirtualNetworkList(); + for(VirtualNetwork virtualNetwork : virtualNetworkList) { + responseNetworks.add(new TungstenFabricNetworkResponse(virtualNetwork, zone)); + } + this.networks = responseNetworks; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName(OBJECTNAME); + } + + public List getNetworks() { + return networks; + } + + public void setNetworks(final List networks) { + this.networks = networks; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricProviderResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricProviderResponse.java new file mode 100644 index 00000000000..1e74818f60b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricProviderResponse.java @@ -0,0 +1,148 @@ +// 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.network.tungsten.api.response; + +import com.cloud.network.TungstenProvider; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +@EntityReference(value = {TungstenProvider.class}) +public class TungstenFabricProviderResponse extends BaseResponse { + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric provider name") + private String name; + + @SerializedName(ApiConstants.TUNGSTEN_PROVIDER_UUID) + @Param(description = "Tungsten-Fabric provider uuid") + private String uuid; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + @SerializedName("securitygroupsenabled") + @Param(description = "true if security groups support is enabled, false otherwise") + private boolean securityGroupsEnabled; + + @SerializedName(ApiConstants.TUNGSTEN_PROVIDER_HOSTNAME) + @Param(description = "Tungsten-Fabric provider hostname") + private String hostname; + + @SerializedName(ApiConstants.TUNGSTEN_PROVIDER_PORT) + @Param(description = "Tungsten-Fabric provider port") + private String port; + + @SerializedName(ApiConstants.TUNGSTEN_GATEWAY) + @Param(description = "Tungsten-Fabric provider gateway") + private String gateway; + + @SerializedName(ApiConstants.TUNGSTEN_PROVIDER_VROUTER_PORT) + @Param(description = "Tungsten-Fabric provider vrouter port") + private String vrouterPort; + + @SerializedName(ApiConstants.TUNGSTEN_PROVIDER_INTROSPECT_PORT) + @Param(description = "Tungsten-Fabric provider introspect port") + private String introspectPort; + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } + + public boolean isSecurityGroupsEnabled() { + return securityGroupsEnabled; + } + + public void setSecurityGroupsEnabled(final boolean securityGroupsEnabled) { + this.securityGroupsEnabled = securityGroupsEnabled; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getGateway() { + return gateway; + } + + public void setGateway(final String gateway) { + this.gateway = gateway; + } + + public String getIntrospectPort() { + return introspectPort; + } + + public void setIntrospectPort(final String introspectPort) { + this.introspectPort = introspectPort; + } + + public String getVrouterPort() { + return vrouterPort; + } + + public void setVrouterPort(final String vrouterPort) { + this.vrouterPort = vrouterPort; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricRuleResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricRuleResponse.java new file mode 100644 index 00000000000..7b6f4b2bc62 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricRuleResponse.java @@ -0,0 +1,278 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.AddressType; +import net.juniper.tungsten.api.types.PolicyRuleType; +import net.juniper.tungsten.api.types.PortType; +import net.juniper.tungsten.api.types.SubnetType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import java.util.List; + +public class TungstenFabricRuleResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric rule uuid") + private String uuid; + + @SerializedName(ApiConstants.POLICY_UUID) + @Param(description = "Tungsten-Fabric policy uuid") + private String policyUuid; + + @SerializedName(ApiConstants.DIRECTION) + @Param(description = "Tungsten-Fabric policy name") + private String direction; + + @SerializedName(ApiConstants.ACTION) + @Param(description = "Tungsten-Fabric policy action") + private String action; + + @SerializedName(ApiConstants.PROTOCOL) + @Param(description = "Tungsten-Fabric policy protocol") + private String protocol; + + @SerializedName(ApiConstants.SRC_NETWORK) + @Param(description = "Tungsten-Fabric policy source network") + private String srcNetwork; + + @SerializedName(ApiConstants.SRC_IP_PREFIX) + @Param(description = "Tungsten-Fabric policy source ip prefix") + private String srcIpPrefix; + + @SerializedName(ApiConstants.SRC_IP_PREFIX_LEN) + @Param(description = "Tungsten-Fabric policy source ip prefix length") + private int srcIpPrefixLen; + + @SerializedName(ApiConstants.SRC_START_PORT) + @Param(description = "Tungsten-Fabric policy source start port") + private int srcStartPort; + + @SerializedName(ApiConstants.SRC_END_PORT) + @Param(description = "Tungsten-Fabric policy source end port") + private int srcEndPort; + + @SerializedName(ApiConstants.DEST_NETWORK) + @Param(description = "Tungsten-Fabric policy destination network") + private String destNetwork; + + @SerializedName(ApiConstants.DEST_IP_PREFIX) + @Param(description = "Tungsten-Fabric policy destination ip prefix") + private String destIpPrefix; + + @SerializedName(ApiConstants.DEST_IP_PREFIX_LEN) + @Param(description = "Tungsten-Fabric policy destination ip prefix length") + private int destIpPrefixLen; + + @SerializedName(ApiConstants.DEST_START_PORT) + @Param(description = "Tungsten-Fabric policy destination start port") + private int destStartPort; + + @SerializedName(ApiConstants.DEST_END_PORT) + @Param(description = "Tungsten-Fabric policy destination end port") + private int destEndPort; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricRuleResponse(String policyUuid, PolicyRuleType policyRuleType, DataCenter zone) { + this.uuid = policyRuleType.getRuleUuid(); + this.policyUuid = policyUuid; + this.action = policyRuleType.getActionList().getSimpleAction(); + this.direction = policyRuleType.getDirection(); + this.protocol = policyRuleType.getProtocol(); + List srcAddress = policyRuleType.getSrcAddresses(); + if (srcAddress != null && !srcAddress.isEmpty()) { + this.srcNetwork = srcAddress.get(0).getVirtualNetwork(); + SubnetType subnetType = srcAddress.get(0).getSubnet(); + if (subnetType != null) { + this.srcIpPrefix = subnetType.getIpPrefix(); + this.srcIpPrefixLen = subnetType.getIpPrefixLen(); + } + } + + List srcPortList = policyRuleType.getSrcPorts(); + if (srcPortList != null && !srcPortList.isEmpty()) { + this.srcStartPort = srcPortList.get(0).getStartPort(); + this.srcEndPort = srcPortList.get(0).getEndPort(); + } + + List destAddress = policyRuleType.getDstAddresses(); + if (destAddress != null && !destAddress.isEmpty()) { + this.destNetwork = policyRuleType.getDstAddresses().get(0).getVirtualNetwork(); + SubnetType subnetType = destAddress.get(0).getSubnet(); + if (subnetType != null) { + this.destIpPrefix = subnetType.getIpPrefix(); + this.destIpPrefixLen = subnetType.getIpPrefixLen(); + } + } + + List destPortList = policyRuleType.getDstPorts(); + if (destPortList != null && !destPortList.isEmpty()) { + this.destStartPort = destPortList.get(0).getStartPort(); + this.destEndPort = destPortList.get(0).getEndPort(); + } + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + + this.setObjectName("rule"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getPolicyUuid() { + return policyUuid; + } + + public void setPolicyUuid(final String policyUuid) { + this.policyUuid = policyUuid; + } + + public String getDirection() { + return direction; + } + + public void setDirection(final String direction) { + this.direction = direction; + } + + public String getAction() { + return action; + } + + public void setAction(final String action) { + this.action = action; + } + + public String getProtocol() { + return protocol; + } + + public void setProtocol(final String protocol) { + this.protocol = protocol; + } + + public String getSrcNetwork() { + return srcNetwork; + } + + public void setSrcNetwork(final String srcNetwork) { + this.srcNetwork = srcNetwork; + } + + public String getSrcIpPrefix() { + return srcIpPrefix; + } + + public void setSrcIpPrefix(final String srcIpPrefix) { + this.srcIpPrefix = srcIpPrefix; + } + + public int getSrcIpPrefixLen() { + return srcIpPrefixLen; + } + + public void setSrcIpPrefixLen(final int srcIpPrefixLen) { + this.srcIpPrefixLen = srcIpPrefixLen; + } + + public int getSrcStartPort() { + return srcStartPort; + } + + public void setSrcStartPort(final int srcStartPort) { + this.srcStartPort = srcStartPort; + } + + public int getSrcEndPort() { + return srcEndPort; + } + + public void setSrcEndPort(final int srcEndPort) { + this.srcEndPort = srcEndPort; + } + + public String getDestNetwork() { + return destNetwork; + } + + public void setDestNetwork(final String destNetwork) { + this.destNetwork = destNetwork; + } + + public String getDestIpPrefix() { + return destIpPrefix; + } + + public void setDestIpPrefix(final String destIpPrefix) { + this.destIpPrefix = destIpPrefix; + } + + public int getDestIpPrefixLen() { + return destIpPrefixLen; + } + + public void setDestIpPrefixLen(final int destIpPrefixLen) { + this.destIpPrefixLen = destIpPrefixLen; + } + + public int getDestStartPort() { + return destStartPort; + } + + public void setDestStartPort(final int destStartPort) { + this.destStartPort = destStartPort; + } + + public int getDestEndPort() { + return destEndPort; + } + + public void setDestEndPort(final int destEndPort) { + this.destEndPort = destEndPort; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricServiceGroupResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricServiceGroupResponse.java new file mode 100644 index 00000000000..24c024be1e8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricServiceGroupResponse.java @@ -0,0 +1,129 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.ServiceGroup; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class TungstenFabricServiceGroupResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric service group uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric service group name") + private String name; + + @SerializedName(ApiConstants.PROTOCOL) + @Param(description = "Tungsten-Fabric service group protocol") + private String protocol; + + @SerializedName(ApiConstants.START_PORT) + @Param(description = "Tungsten-Fabric service group start port") + private int startPort; + + @SerializedName(ApiConstants.END_PORT) + @Param(description = "Tungsten-Fabric service group end port") + private int endPort; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricServiceGroupResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("servicegroup"); + } + + public TungstenFabricServiceGroupResponse(ServiceGroup serviceGroup, DataCenter zone) { + this.uuid = serviceGroup.getUuid(); + this.name = serviceGroup.getName(); + this.protocol = serviceGroup.getFirewallServiceList().getFirewallService().get(0).getProtocol(); + this.startPort = serviceGroup.getFirewallServiceList().getFirewallService().get(0).getDstPorts().getStartPort(); + this.endPort = serviceGroup.getFirewallServiceList().getFirewallService().get(0).getDstPorts().getEndPort(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("servicegroup"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public String getProtocol() { + return protocol; + } + + public void setProtocol(final String protocol) { + this.protocol = protocol; + } + + public int getStartPort() { + return startPort; + } + + public void setStartPort(final int startPort) { + this.startPort = startPort; + } + + public int getEndPort() { + return endPort; + } + + public void setEndPort(final int endPort) { + this.endPort = endPort; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagResponse.java new file mode 100644 index 00000000000..2e424372f03 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagResponse.java @@ -0,0 +1,222 @@ +// 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.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.network.tungsten.model.TungstenTag; + +import java.util.ArrayList; +import java.util.List; + +public class TungstenFabricTagResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric tag type uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric tag name") + private String name; + + @SerializedName(ApiConstants.NETWORK) + @Param(description = "list Tungsten-Fabric network") + private List networks; + + @SerializedName(ApiConstants.VM) + @Param(description = "list Tungsten-Fabric vm") + private List vms; + + @SerializedName(ApiConstants.NIC) + @Param(description = "list Tungsten-Fabric nic") + private List nics; + + @SerializedName(ApiConstants.POLICY) + @Param(description = "list Tungsten-Fabric policy") + private List policys; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricTagResponse(String uuid, String name, DataCenter zone) { + this.uuid = uuid; + this.name = name; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("tag"); + } + + public TungstenFabricTagResponse(Tag tag, DataCenter zone) { + this.uuid = tag.getUuid(); + this.name = tag.getName(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("tag"); + List responseNetworks = new ArrayList<>(); + List> networkReferenceList = tag.getVirtualNetworkBackRefs(); + if (networkReferenceList != null) { + for (ObjectReference network : networkReferenceList) { + TungstenFabricNetworkResponse tungstenFabricNetworkResponse = new TungstenFabricNetworkResponse( + network.getUuid(), network.getReferredName().get(network.getReferredName().size() - 1)); + responseNetworks.add(tungstenFabricNetworkResponse); + } + } + this.networks = responseNetworks; + + List responseVms = new ArrayList<>(); + List> vmReferenceList = tag.getVirtualMachineBackRefs(); + if (vmReferenceList != null) { + for (ObjectReference vm : vmReferenceList) { + TungstenFabricVmResponse tungstenFabricVmResponse = new TungstenFabricVmResponse(vm.getUuid(), + vm.getReferredName().get(vm.getReferredName().size() - 1)); + responseVms.add(tungstenFabricVmResponse); + } + } + this.vms = responseVms; + + List responsesNics = new ArrayList<>(); + List> nicReferenceList = tag.getVirtualMachineInterfaceBackRefs(); + if (nicReferenceList != null) { + for (ObjectReference nic : nicReferenceList) { + TungstenFabricNicResponse tungstenFabricNicResponse = new TungstenFabricNicResponse(nic.getUuid(), + nic.getReferredName().get(nic.getReferredName().size() - 1), zone); + responsesNics.add(tungstenFabricNicResponse); + } + } + this.nics = responsesNics; + + List responsePolicys = new ArrayList<>(); + List> policyReferenceList = tag.getNetworkPolicyBackRefs(); + if (policyReferenceList != null) { + for (ObjectReference policy : policyReferenceList) { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = new TungstenFabricPolicyResponse( + policy.getUuid(), policy.getReferredName().get(policy.getReferredName().size() - 1), zone); + responsePolicys.add(tungstenFabricPolicyResponse); + } + } + this.policys = responsePolicys; + } + + public TungstenFabricTagResponse(TungstenTag tungstenTag, DataCenter zone) { + this.uuid = tungstenTag.getTag().getUuid(); + this.name = tungstenTag.getTag().getName(); + this.setObjectName("tag"); + List responseNetworks = new ArrayList<>(); + for (VirtualNetwork virtualNetwork : tungstenTag.getVirtualNetworkList()) { + responseNetworks.add(new TungstenFabricNetworkResponse(virtualNetwork, zone)); + } + this.networks = responseNetworks; + + List responseVms = new ArrayList<>(); + for (VirtualMachine virtualMachine : tungstenTag.getVirtualMachineList()) { + responseVms.add(new TungstenFabricVmResponse(virtualMachine, zone)); + } + this.vms = responseVms; + + List responseNics = new ArrayList<>(); + for (VirtualMachineInterface virtualMachineInterface : tungstenTag.getVirtualMachineInterfaceList()) { + responseNics.add(new TungstenFabricNicResponse(virtualMachineInterface, zone)); + } + this.nics = responseNics; + + List responsePolicys = new ArrayList<>(); + for (NetworkPolicy networkPolicy : tungstenTag.getNetworkPolicyList()) { + responsePolicys.add(new TungstenFabricPolicyResponse(networkPolicy, zone)); + } + this.policys = responsePolicys; + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public List getNetworks() { + return networks; + } + + public void setNetworks(final List networks) { + this.networks = networks; + } + + public List getNics() { + return nics; + } + + public void setNics(final List nics) { + this.nics = nics; + } + + public List getPolicys() { + return policys; + } + + public void setPolicys(final List policys) { + this.policys = policys; + } + + public List getVms() { + return vms; + } + + public void setVms(final List vms) { + this.vms = vms; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagTypeResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagTypeResponse.java new file mode 100644 index 00000000000..6e0c2e3644c --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricTagTypeResponse.java @@ -0,0 +1,82 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.TagType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class TungstenFabricTagTypeResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric tag type uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric tag type name") + private String name; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricTagTypeResponse(TagType tagType, DataCenter zone) { + this.uuid = tagType.getUuid(); + this.name = tagType.getName(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("tagtype"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricVmResponse.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricVmResponse.java new file mode 100644 index 00000000000..3c3eb63ef4a --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/api/response/TungstenFabricVmResponse.java @@ -0,0 +1,88 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.response; + +import com.cloud.dc.DataCenter; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import net.juniper.tungsten.api.types.VirtualMachine; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +public class TungstenFabricVmResponse extends BaseResponse { + @SerializedName(ApiConstants.UUID) + @Param(description = "Tungsten-Fabric nic uuid") + private String uuid; + + @SerializedName(ApiConstants.NAME) + @Param(description = "Tungsten-Fabric vm name") + private String name; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "Tungsten-Fabric provider zone id") + private long zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "Tungsten-Fabric provider zone name") + private String zoneName; + + public TungstenFabricVmResponse(String uuid, String name) { + this.uuid = uuid; + this.name = name; + this.setObjectName("vm"); + } + + public TungstenFabricVmResponse(VirtualMachine virtualMachine, DataCenter zone) { + this.uuid = virtualMachine.getUuid(); + this.name = virtualMachine.getName(); + this.zoneId = zone.getId(); + this.zoneName = zone.getName(); + this.setObjectName("vm"); + } + + public String getUuid() { + return uuid; + } + + public void setUuid(final String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public long getZoneId() { + return zoneId; + } + + public void setZoneId(final long zoneId) { + this.zoneId = zoneId; + } + + public String getZoneName() { + return zoneName; + } + + public void setZoneName(final String zoneName) { + this.zoneName = zoneName; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDao.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDao.java new file mode 100644 index 00000000000..3fdb9976e59 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDao.java @@ -0,0 +1,23 @@ +// 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.network.tungsten.dao; + +import com.cloud.utils.db.GenericDao; + +public interface TungstenFabricLBHealthMonitorDao extends GenericDao { + TungstenFabricLBHealthMonitorVO findByLbId(long lbId); +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDaoImpl.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDaoImpl.java new file mode 100644 index 00000000000..c010fa1ee90 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorDaoImpl.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.dao; + +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +public class TungstenFabricLBHealthMonitorDaoImpl extends GenericDaoBase + implements TungstenFabricLBHealthMonitorDao { + final SearchBuilder allFieldsSearch; + + public TungstenFabricLBHealthMonitorDaoImpl() { + allFieldsSearch = createSearchBuilder(); + allFieldsSearch.and("id", allFieldsSearch.entity().getId(), SearchCriteria.Op.EQ); + allFieldsSearch.and("load_balancer_id", allFieldsSearch.entity().getLoadBalancerId(), SearchCriteria.Op.EQ); + allFieldsSearch.and("method", allFieldsSearch.entity().getType(), SearchCriteria.Op.EQ); + allFieldsSearch.and("retry", allFieldsSearch.entity().getRetry(), SearchCriteria.Op.EQ); + allFieldsSearch.and("timeout", allFieldsSearch.entity().getTimeout(), SearchCriteria.Op.EQ); + allFieldsSearch.and("interval", allFieldsSearch.entity().getInterval(), SearchCriteria.Op.EQ); + allFieldsSearch.and("http", allFieldsSearch.entity().getHttpMethod(), SearchCriteria.Op.EQ); + allFieldsSearch.and("expected_code", allFieldsSearch.entity().getExpectedCode(), SearchCriteria.Op.EQ); + allFieldsSearch.and("url_path", allFieldsSearch.entity().getUrlPath(), SearchCriteria.Op.EQ); + } + + @Override + public TungstenFabricLBHealthMonitorVO findByLbId(final long lbId) { + SearchCriteria searchCriteria = allFieldsSearch.create(); + searchCriteria.setParameters("load_balancer_id", lbId); + return findOneBy(searchCriteria); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorVO.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorVO.java new file mode 100644 index 00000000000..e7b93798942 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/dao/TungstenFabricLBHealthMonitorVO.java @@ -0,0 +1,159 @@ +// 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.network.tungsten.dao; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +import java.util.UUID; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.PrimaryKeyJoinColumn; +import javax.persistence.Table; + +@Entity +@Table(name = "tungsten_lb_health_monitor") +@PrimaryKeyJoinColumn(name = "load_balancer_id", referencedColumnName = "id") +public class TungstenFabricLBHealthMonitorVO implements InternalIdentity, Identity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "load_balancer_id") + private long loadBalancerId; + + @Column(name = "uuid") + private final String uuid; + + @Column(name = "type") + private String type; + + @Column(name = "retry") + private int retry; + + @Column(name = "timeout") + private int timeout; + + @Column(name = "interval") + private int interval; + + @Column(name = "http_method") + private String httpMethod; + + @Column(name = "expected_code") + private String expectedCode; + + @Column(name = "url_path") + private String urlPath; + + public TungstenFabricLBHealthMonitorVO() { + this.uuid = UUID.randomUUID().toString(); + } + + public TungstenFabricLBHealthMonitorVO(final long loadBalancerId, final String type, final int retry, final int timeout, + final int interval, final String httpMethod, final String expectedCode, final String urlPath) { + this.loadBalancerId = loadBalancerId; + this.uuid = UUID.randomUUID().toString(); + this.type = type; + this.retry = retry; + this.timeout = timeout; + this.interval = interval; + this.httpMethod = httpMethod; + this.expectedCode = expectedCode; + this.urlPath = urlPath; + } + + @Override + public long getId() { + return id; + } + + @Override + public String getUuid() { + return uuid; + } + + public long getLoadBalancerId() { + return loadBalancerId; + } + + public void setLoadBalancerId(final long loadBalancerId) { + this.loadBalancerId = loadBalancerId; + } + + public String getType() { + return type; + } + + public void setType(final String type) { + this.type = type; + } + + public int getRetry() { + return retry; + } + + public void setRetry(final int retry) { + this.retry = retry; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(final int timeout) { + this.timeout = timeout; + } + + public int getInterval() { + return interval; + } + + public void setInterval(final int interval) { + this.interval = interval; + } + + public String getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(final String httpMethod) { + this.httpMethod = httpMethod; + } + + public String getExpectedCode() { + return expectedCode; + } + + public void setExpectedCode(final String expectedCode) { + this.expectedCode = expectedCode; + } + + public String getUrlPath() { + return urlPath; + } + + public void setUrlPath(final String urlPath) { + this.urlPath = urlPath; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLoadBalancerMember.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLoadBalancerMember.java new file mode 100644 index 00000000000..c1e52f988c6 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLoadBalancerMember.java @@ -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. +package org.apache.cloudstack.network.tungsten.model; + +public class TungstenLoadBalancerMember { + private final String name; + private final String ipAddress; + private final int port; + private final int weight; + + public TungstenLoadBalancerMember(final String name, final String ipAddress, final int port, final int weight) { + this.name = name; + this.ipAddress = ipAddress; + this.port = port; + this.weight = weight; + } + + public String getName() { + return name; + } + + public String getIpAddress() { + return ipAddress; + } + + public int getPort() { + return port; + } + + public int getWeight() { + return weight; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLogicalRouter.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLogicalRouter.java new file mode 100644 index 00000000000..832254e1653 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenLogicalRouter.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.model; + +import net.juniper.tungsten.api.types.LogicalRouter; +import net.juniper.tungsten.api.types.VirtualNetwork; + +import java.util.List; + +public class TungstenLogicalRouter implements TungstenModel { + private LogicalRouter logicalRouter; + private List virtualNetworkList; + + public TungstenLogicalRouter() { + } + + public TungstenLogicalRouter(final LogicalRouter logicalRouter, final List virtualNetworkList) { + this.logicalRouter = logicalRouter; + this.virtualNetworkList = virtualNetworkList; + } + + public LogicalRouter getLogicalRouter() { + return logicalRouter; + } + + public void setLogicalRouter(final LogicalRouter logicalRouter) { + this.logicalRouter = logicalRouter; + } + + public List getVirtualNetworkList() { + return virtualNetworkList; + } + + public void setVirtualNetworkList(final List virtualNetworkList) { + this.virtualNetworkList = virtualNetworkList; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenModel.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenModel.java new file mode 100644 index 00000000000..f4c012546f6 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenModel.java @@ -0,0 +1,20 @@ +// 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.network.tungsten.model; + +public interface TungstenModel { +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenNetworkPolicy.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenNetworkPolicy.java new file mode 100644 index 00000000000..43c95c88706 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenNetworkPolicy.java @@ -0,0 +1,51 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.model; + +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.VirtualNetwork; + +import java.util.List; + +public class TungstenNetworkPolicy implements TungstenModel { + private NetworkPolicy networkPolicy; + private List virtualNetworkList; + + public TungstenNetworkPolicy() { + } + + public TungstenNetworkPolicy(final NetworkPolicy networkPolicy, final List virtualNetworkList) { + this.networkPolicy = networkPolicy; + this.virtualNetworkList = virtualNetworkList; + } + + public NetworkPolicy getNetworkPolicy() { + return networkPolicy; + } + + public void setNetworkPolicy(final NetworkPolicy networkPolicy) { + this.networkPolicy = networkPolicy; + } + + public List getVirtualNetworkList() { + return virtualNetworkList; + } + + public void setVirtualNetworkList(final List virtualNetworkList) { + this.virtualNetworkList = virtualNetworkList; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenRule.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenRule.java new file mode 100644 index 00000000000..61909fc66d9 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenRule.java @@ -0,0 +1,132 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.model; + +import java.util.UUID; + +public class TungstenRule { + private final String uuid; + private final String action; + private final String direction; + private final String protocol; + private final String srcNetwork; + private final String srcIpPrefix; + private final int srcIpPrefixLen; + private final int srcStartPort; + private final int srcEndPort; + private final String dstNetwork; + private final String dstIpPrefix; + private final int dstIpPrefixLen; + private final int dstStartPort; + private final int dstEndPort; + + public TungstenRule(final String uuid, final String action, final String direction, final String protocol, + final String srcNetwork, final String srcIpPrefix, final int srcIpPrefixLen, final int srcStartPort, + final int srcEndPort, final String dstNetwork, final String dstIpPrefix, final int dstIpPrefixLen, + final int dstStartPort, final int dstEndPort) { + this.uuid = uuid; + this.action = action; + this.direction = direction; + this.protocol = protocol; + this.srcNetwork = srcNetwork; + this.srcIpPrefix = srcIpPrefix; + this.srcIpPrefixLen = srcIpPrefixLen; + this.srcStartPort = srcStartPort; + this.srcEndPort = srcEndPort; + this.dstNetwork = dstNetwork; + this.dstIpPrefix = dstIpPrefix; + this.dstIpPrefixLen = dstIpPrefixLen; + this.dstStartPort = dstStartPort; + this.dstEndPort = dstEndPort; + } + + public TungstenRule(final String action, final String direction, final String protocol, final String srcNetwork, + final String srcIpPrefix, final int srcIpPrefixLen, final int srcStartPort, final int srcEndPort, + final String dstNetwork, final String dstIpPrefix, final int dstIpPrefixLen, final int dstStartPort, + final int dstEndPort) { + this.uuid = UUID.randomUUID().toString(); + this.action = action; + this.direction = direction; + this.protocol = protocol; + this.srcNetwork = srcNetwork; + this.srcIpPrefix = srcIpPrefix; + this.srcIpPrefixLen = srcIpPrefixLen; + this.srcStartPort = srcStartPort; + this.srcEndPort = srcEndPort; + this.dstNetwork = dstNetwork; + this.dstIpPrefix = dstIpPrefix; + this.dstIpPrefixLen = dstIpPrefixLen; + this.dstStartPort = dstStartPort; + this.dstEndPort = dstEndPort; + } + + public String getUuid() { + return uuid; + } + + public String getAction() { + return action; + } + + public String getDirection() { + return direction; + } + + public String getProtocol() { + return protocol; + } + + public String getSrcNetwork() { + return srcNetwork; + } + + public String getSrcIpPrefix() { + return srcIpPrefix; + } + + public int getSrcIpPrefixLen() { + return srcIpPrefixLen; + } + + public int getSrcStartPort() { + return srcStartPort; + } + + public int getSrcEndPort() { + return srcEndPort; + } + + public String getDstNetwork() { + return dstNetwork; + } + + public String getDstIpPrefix() { + return dstIpPrefix; + } + + public int getDstIpPrefixLen() { + return dstIpPrefixLen; + } + + public int getDstStartPort() { + return dstStartPort; + } + + public int getDstEndPort() { + return dstEndPort; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenTag.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenTag.java new file mode 100644 index 00000000000..50ffa0e6f72 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/model/TungstenTag.java @@ -0,0 +1,97 @@ +// 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.network.tungsten.model; + +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; + +import java.util.List; + +public class TungstenTag implements TungstenModel { + private Tag tag; + private List virtualNetworkList; + private List virtualMachineList; + private List virtualMachineInterfaceList; + private List networkPolicyList; + private List applicationPolicySetList; + + public TungstenTag() { + } + + public TungstenTag(final Tag tag, final List virtualNetworkList, + final List virtualMachineList, final List virtualMachineInterfaceList, + final List networkPolicyList, final List applicationPolicySetList) { + this.tag = tag; + this.virtualNetworkList = virtualNetworkList; + this.virtualMachineList = virtualMachineList; + this.virtualMachineInterfaceList = virtualMachineInterfaceList; + this.networkPolicyList = networkPolicyList; + this.applicationPolicySetList = applicationPolicySetList; + } + + public Tag getTag() { + return tag; + } + + public void setTag(final Tag tag) { + this.tag = tag; + } + + public List getVirtualMachineList() { + return virtualMachineList; + } + + public void setVirtualMachineList(final List virtualMachineList) { + this.virtualMachineList = virtualMachineList; + } + + public List getVirtualMachineInterfaceList() { + return virtualMachineInterfaceList; + } + + public void setVirtualMachineInterfaceList(final List virtualMachineInterfaceList) { + this.virtualMachineInterfaceList = virtualMachineInterfaceList; + } + + public List getNetworkPolicyList() { + return networkPolicyList; + } + + public void setNetworkPolicyList(final List networkPolicyList) { + this.networkPolicyList = networkPolicyList; + } + + public List getVirtualNetworkList() { + return virtualNetworkList; + } + + public void setVirtualNetworkList(final List virtualNetworkList) { + this.virtualNetworkList = virtualNetworkList; + } + + public List getApplicationPolicySetList() { + return applicationPolicySetList; + } + + public void setApplicationPolicySetList(final List applicationPolicySetList) { + this.applicationPolicySetList = applicationPolicySetList; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/resource/TungstenResource.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/resource/TungstenResource.java new file mode 100644 index 00000000000..0e14dd41aeb --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/resource/TungstenResource.java @@ -0,0 +1,2366 @@ +// 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.network.tungsten.resource; + +import com.cloud.agent.IAgentControl; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.MaintainAnswer; +import com.cloud.agent.api.MaintainCommand; +import com.cloud.agent.api.PingCommand; +import com.cloud.agent.api.ReadyAnswer; +import com.cloud.agent.api.ReadyCommand; +import com.cloud.agent.api.StartupCommand; +import com.cloud.host.Host; +import com.cloud.resource.ServerResource; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; +import net.juniper.tungsten.api.ApiConnectorFactory; +import net.juniper.tungsten.api.ApiObjectBase; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.AddressGroup; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.FirewallRule; +import net.juniper.tungsten.api.types.FirewallSequence; +import net.juniper.tungsten.api.types.FloatingIp; +import net.juniper.tungsten.api.types.FloatingIpPool; +import net.juniper.tungsten.api.types.InstanceIp; +import net.juniper.tungsten.api.types.Loadbalancer; +import net.juniper.tungsten.api.types.LoadbalancerHealthmonitor; +import net.juniper.tungsten.api.types.LoadbalancerListener; +import net.juniper.tungsten.api.types.LoadbalancerMember; +import net.juniper.tungsten.api.types.LoadbalancerPool; +import net.juniper.tungsten.api.types.LogicalRouter; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.Project; +import net.juniper.tungsten.api.types.SecurityGroup; +import net.juniper.tungsten.api.types.SequenceType; +import net.juniper.tungsten.api.types.ServiceGroup; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.TagType; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import net.juniper.tungsten.api.types.VirtualNetworkPolicyType; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkGatewayToLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenVmToSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenPortForwardingCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AssignTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ClearTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDefaultProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkLoadbalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenVirtualMachineCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenObjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVRouterPortCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmInterfaceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenFabricNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenFloatingIpsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNatIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNetworkDnsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenConnectedNetworkFromLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNicCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ReleaseTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkGatewayFromLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenVmFromSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.StartupTungstenCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateLoadBalancerServiceInstanceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenDefaultSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerHealthMonitorCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerMemberCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenVrouterConfigCommand; +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; +import org.apache.cloudstack.network.tungsten.model.TungstenLogicalRouter; +import org.apache.cloudstack.network.tungsten.model.TungstenModel; +import org.apache.cloudstack.network.tungsten.model.TungstenNetworkPolicy; +import org.apache.cloudstack.network.tungsten.model.TungstenTag; +import org.apache.cloudstack.network.tungsten.service.TungstenApi; +import org.apache.cloudstack.network.tungsten.service.TungstenVRouterApi; +import org.apache.cloudstack.network.tungsten.vrouter.Port; +import org.apache.log4j.Logger; + +import javax.naming.ConfigurationException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TungstenResource implements ServerResource { + + private static final Logger s_logger = Logger.getLogger(TungstenResource.class); + + private String name; + private String guid; + private String zoneId; + private int numRetries; + private String vrouterPort; + + protected TungstenApi tungstenApi; + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + + this.name = (String) params.get("name"); + if (this.name == null) { + throw new ConfigurationException("Unable to find name"); + } + + guid = (String) params.get("guid"); + if (guid == null) { + throw new ConfigurationException("Unable to find the guid"); + } + + zoneId = (String) params.get("zoneId"); + if (zoneId == null) { + throw new ConfigurationException("Unable to find zone"); + } + + numRetries = 2; + + String hostname = (String) params.get("hostname"); + if (hostname == null) { + throw new ConfigurationException("Missing Tungsten-Fabric hostname from params: " + params); + } + + String port = (String) params.get("port"); + if (port == null) { + throw new ConfigurationException("Missing Tungsten-Fabric port from params: " + params); + } + + vrouterPort = (String) params.get("vrouterPort"); + if (vrouterPort == null) { + throw new ConfigurationException("Missing Tungsten-Fabric vrouter port from params: " + params); + } + + String introspectPort = (String) params.get("introspectPort"); + if (introspectPort == null) { + throw new ConfigurationException("Missing Tungsten-Fabric introspect port from params: " + params); + } + + tungstenApi = new TungstenApi(); + tungstenApi.setHostname(hostname); + tungstenApi.setPort(port); + tungstenApi.setApiConnector(ApiConnectorFactory.build(hostname, Integer.parseInt(port))); + return true; + } + + @Override + public Host.Type getType() { + return Host.Type.L2Networking; + } + + @Override + public String getName() { + return name; + } + + @Override + public StartupCommand[] initialize() { + StartupTungstenCommand sc = new StartupTungstenCommand(); + sc.setGuid(guid); + sc.setName(name); + sc.setDataCenter(zoneId); + sc.setPod(""); + sc.setPrivateIpAddress(""); + sc.setStorageIpAddress(""); + sc.setVersion(""); + return new StartupCommand[] {sc}; + } + + @Override + public PingCommand getCurrentStatus(long id) { + try { + tungstenApi.checkTungstenProviderConnection(); + } catch (ServerApiException e) { + s_logger.error("Check Tungsten-Fabric provider connection failed", e); + return null; + } + return new PingCommand(Host.Type.L2Networking, id); + } + + @Override + public Answer executeRequest(Command cmd) { + return executeRequestGroup1(cmd, numRetries); + } + + private Answer executeRequestGroup1(Command cmd, int numRetries) { + if (cmd instanceof ReadyCommand) { + return executeRequest((ReadyCommand) cmd); + } else if (cmd instanceof MaintainCommand) { + return executeRequest((MaintainCommand) cmd); + } else if (cmd instanceof CreateTungstenNetworkCommand) { + return executeRequest((CreateTungstenNetworkCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenNetworkCommand) { + return executeRequest((DeleteTungstenNetworkCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenVmInterfaceCommand) { + return executeRequest((DeleteTungstenVmInterfaceCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenVmCommand) { + return executeRequest((DeleteTungstenVmCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenLogicalRouterCommand) { + return executeRequest((CreateTungstenLogicalRouterCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenVirtualMachineCommand) { + return executeRequest((CreateTungstenVirtualMachineCommand) cmd); + } else if (cmd instanceof SetTungstenNetworkGatewayCommand) { + return executeRequest((SetTungstenNetworkGatewayCommand) cmd); + } else if (cmd instanceof DeleteTungstenVRouterPortCommand) { + return executeRequest((DeleteTungstenVRouterPortCommand) cmd); + } else if (cmd instanceof GetTungstenNetworkDnsCommand) { + return executeRequest((GetTungstenNetworkDnsCommand) cmd); + } else if (cmd instanceof GetTungstenPolicyCommand) { + return executeRequest((GetTungstenPolicyCommand) cmd); + } else if (cmd instanceof ClearTungstenNetworkGatewayCommand) { + return executeRequest((ClearTungstenNetworkGatewayCommand) cmd); + } else { + return executeRequestGroup2(cmd, numRetries); + } + } + + private Answer executeRequestGroup2(Command cmd, int numRetries) { + if (cmd instanceof CreateTungstenFloatingIpPoolCommand) { + return executeRequest((CreateTungstenFloatingIpPoolCommand) cmd); + } else if (cmd instanceof CreateTungstenFloatingIpCommand) { + return executeRequest((CreateTungstenFloatingIpCommand) cmd); + } else if (cmd instanceof DeleteTungstenFloatingIpCommand) { + return executeRequest((DeleteTungstenFloatingIpCommand) cmd); + } else if (cmd instanceof DeleteTungstenFloatingIpPoolCommand) { + return executeRequest((DeleteTungstenFloatingIpPoolCommand) cmd); + } else if (cmd instanceof AssignTungstenFloatingIpCommand) { + return executeRequest((AssignTungstenFloatingIpCommand) cmd); + } else if (cmd instanceof ReleaseTungstenFloatingIpCommand) { + return executeRequest((ReleaseTungstenFloatingIpCommand) cmd); + } else if (cmd instanceof GetTungstenNatIpCommand) { + return executeRequest((GetTungstenNatIpCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenNetworkPolicyCommand) { + return executeRequest((CreateTungstenNetworkPolicyCommand) cmd); + } else if (cmd instanceof ApplyTungstenNetworkPolicyCommand) { + return executeRequest((ApplyTungstenNetworkPolicyCommand) cmd); + } else if (cmd instanceof DeleteTungstenNetworkPolicyCommand) { + return executeRequest((DeleteTungstenNetworkPolicyCommand) cmd, numRetries); + } else if (cmd instanceof GetTungstenFloatingIpsCommand) { + return executeRequest((GetTungstenFloatingIpsCommand) cmd); + } else if (cmd instanceof GetTungstenFabricNetworkCommand) { + return executeRequest((GetTungstenFabricNetworkCommand) cmd); + } else if (cmd instanceof CreateTungstenNetworkLoadbalancerCommand) { + return executeRequest((CreateTungstenNetworkLoadbalancerCommand) cmd); + } else if (cmd instanceof UpdateLoadBalancerServiceInstanceCommand) { + return executeRequest((UpdateLoadBalancerServiceInstanceCommand) cmd, numRetries); + } else { + return executeRequestGroup3(cmd, numRetries); + } + } + + private Answer executeRequestGroup3(Command cmd, int numRetries) { + if (cmd instanceof DeleteTungstenLoadBalancerCommand) { + return executeRequest((DeleteTungstenLoadBalancerCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenLoadBalancerListenerCommand) { + return executeRequest((DeleteTungstenLoadBalancerListenerCommand) cmd, numRetries); + } else if (cmd instanceof UpdateTungstenLoadBalancerPoolCommand) { + return executeRequest((UpdateTungstenLoadBalancerPoolCommand) cmd, numRetries); + } else if (cmd instanceof UpdateTungstenLoadBalancerMemberCommand) { + return executeRequest((UpdateTungstenLoadBalancerMemberCommand) cmd, numRetries); + } else if (cmd instanceof UpdateTungstenLoadBalancerListenerCommand) { + return executeRequest((UpdateTungstenLoadBalancerListenerCommand) cmd, numRetries); + } else if (cmd instanceof UpdateTungstenLoadBalancerHealthMonitorCommand) { + return executeRequest((UpdateTungstenLoadBalancerHealthMonitorCommand) cmd, numRetries); + } else if (cmd instanceof GetTungstenLoadBalancerCommand) { + return executeRequest((GetTungstenLoadBalancerCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenDomainCommand) { + return executeRequest((CreateTungstenDomainCommand) cmd); + } else if (cmd instanceof DeleteTungstenDomainCommand) { + return executeRequest((DeleteTungstenDomainCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenProjectCommand) { + return executeRequest((CreateTungstenProjectCommand) cmd); + } else if (cmd instanceof DeleteTungstenProjectCommand) { + return executeRequest((DeleteTungstenProjectCommand) cmd, numRetries); + } else if (cmd instanceof ApplyTungstenPortForwardingCommand) { + return executeRequest((ApplyTungstenPortForwardingCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenObjectCommand) { + return executeRequest((DeleteTungstenObjectCommand) cmd, numRetries); + } else if (cmd instanceof AddTungstenNetworkSubnetCommand) { + return executeRequest((AddTungstenNetworkSubnetCommand) cmd, numRetries); + } else { + return executeRequestGroup4(cmd, numRetries); + } + } + + private Answer executeRequestGroup4(Command cmd, int numRetries) { + if (cmd instanceof RemoveTungstenNetworkSubnetCommand) { + return executeRequest((RemoveTungstenNetworkSubnetCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenSecurityGroupCommand) { + return executeRequest((CreateTungstenSecurityGroupCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenSecurityGroupCommand) { + return executeRequest((DeleteTungstenSecurityGroupCommand) cmd, numRetries); + } else if (cmd instanceof AddTungstenSecurityGroupRuleCommand) { + return executeRequest((AddTungstenSecurityGroupRuleCommand) cmd, numRetries); + } else if (cmd instanceof AddTungstenVmToSecurityGroupCommand) { + return executeRequest((AddTungstenVmToSecurityGroupCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenVmFromSecurityGroupCommand) { + return executeRequest((RemoveTungstenVmFromSecurityGroupCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenSecurityGroupRuleCommand) { + return executeRequest((RemoveTungstenSecurityGroupRuleCommand) cmd, numRetries); + } else if (cmd instanceof AddTungstenSecondaryIpAddressCommand) { + return executeRequest((AddTungstenSecondaryIpAddressCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenSecondaryIpAddressCommand) { + return executeRequest((RemoveTungstenSecondaryIpAddressCommand) cmd, numRetries); + } else if (cmd instanceof GetTungstenSecurityGroupCommand) { + return executeRequest((GetTungstenSecurityGroupCommand) cmd); + } else if (cmd instanceof CreateTungstenPolicyCommand) { + return executeRequest((CreateTungstenPolicyCommand) cmd, numRetries); + } else if (cmd instanceof AddTungstenPolicyRuleCommand) { + return executeRequest((AddTungstenPolicyRuleCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenPolicyCommand) { + return executeRequest((ListTungstenPolicyCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenNetworkCommand) { + return executeRequest((ListTungstenNetworkCommand) cmd, numRetries); + } else { + return executeRequestGroup5(cmd, numRetries); + } + } + + private Answer executeRequestGroup5(Command cmd, int numRetries) { + if (cmd instanceof ListTungstenNicCommand) { + return executeRequest((ListTungstenNicCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenVmCommand) { + return executeRequest((ListTungstenVmCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenPolicyRuleCommand) { + return executeRequest((ListTungstenPolicyRuleCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenPolicyCommand) { + return executeRequest((DeleteTungstenPolicyCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenPolicyRuleCommand) { + return executeRequest((RemoveTungstenPolicyRuleCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenTagCommand) { + return executeRequest((CreateTungstenTagCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenTagTypeCommand) { + return executeRequest((CreateTungstenTagTypeCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenTagCommand) { + return executeRequest((DeleteTungstenTagCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenTagTypeCommand) { + return executeRequest((DeleteTungstenTagTypeCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenTagCommand) { + return executeRequest((ListTungstenTagCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenTagTypeCommand) { + return executeRequest((ListTungstenTagTypeCommand) cmd, numRetries); + } else if (cmd instanceof ApplyTungstenTagCommand) { + return executeRequest((ApplyTungstenTagCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenPolicyCommand) { + return executeRequest((RemoveTungstenPolicyCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenTagCommand) { + return executeRequest((RemoveTungstenTagCommand) cmd, numRetries); + } else { + return executeRequestGroup6(cmd, numRetries); + } + } + + private Answer executeRequestGroup6(Command cmd, int numRetries) { + if (cmd instanceof CreateTungstenApplicationPolicySetCommand) { + return executeRequest((CreateTungstenApplicationPolicySetCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenFirewallPolicyCommand) { + return executeRequest((CreateTungstenFirewallPolicyCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenFirewallRuleCommand) { + return executeRequest((CreateTungstenFirewallRuleCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenServiceGroupCommand) { + return executeRequest((CreateTungstenServiceGroupCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenAddressGroupCommand) { + return executeRequest((CreateTungstenAddressGroupCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenApplicationPolicySetCommand) { + return executeRequest((ListTungstenApplicationPolicySetCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenFirewallPolicyCommand) { + return executeRequest((ListTungstenFirewallPolicyCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenFirewallRuleCommand) { + return executeRequest((ListTungstenFirewallRuleCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenServiceGroupCommand) { + return executeRequest((ListTungstenServiceGroupCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenAddressGroupCommand) { + return executeRequest((ListTungstenAddressGroupCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenApplicationPolicySetCommand) { + return executeRequest((DeleteTungstenApplicationPolicySetCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenFirewallPolicyCommand) { + return executeRequest((DeleteTungstenFirewallPolicyCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenFirewallRuleCommand) { + return executeRequest((DeleteTungstenFirewallRuleCommand) cmd, numRetries); + } else if (cmd instanceof DeleteTungstenServiceGroupCommand) { + return executeRequest((DeleteTungstenServiceGroupCommand) cmd, numRetries); + } else { + return executeRequestGroup7(cmd, numRetries); + } + } + + private Answer executeRequestGroup7(Command cmd, int numRetries) { + if (cmd instanceof DeleteTungstenAddressGroupCommand) { + return executeRequest((DeleteTungstenAddressGroupCommand) cmd, numRetries); + } else if (cmd instanceof UpdateTungstenVrouterConfigCommand) { + return executeRequest((UpdateTungstenVrouterConfigCommand) cmd, numRetries); + } else if (cmd instanceof UpdateTungstenDefaultSecurityGroupCommand) { + return executeRequest((UpdateTungstenDefaultSecurityGroupCommand) cmd, numRetries); + } else if (cmd instanceof CreateTungstenRoutingLogicalRouterCommand) { + return executeRequest((CreateTungstenRoutingLogicalRouterCommand) cmd, numRetries); + } else if (cmd instanceof AddTungstenNetworkGatewayToLogicalRouterCommand) { + return executeRequest((AddTungstenNetworkGatewayToLogicalRouterCommand) cmd); + } else if (cmd instanceof ListTungstenRoutingLogicalRouterCommand) { + return executeRequest((ListTungstenRoutingLogicalRouterCommand) cmd, numRetries); + } else if (cmd instanceof RemoveTungstenNetworkGatewayFromLogicalRouterCommand) { + return executeRequest((RemoveTungstenNetworkGatewayFromLogicalRouterCommand) cmd); + } else if (cmd instanceof DeleteTungstenRoutingLogicalRouterCommand) { + return executeRequest((DeleteTungstenRoutingLogicalRouterCommand) cmd, numRetries); + } else if (cmd instanceof ListTungstenConnectedNetworkFromLogicalRouterCommand) { + return executeRequest((ListTungstenConnectedNetworkFromLogicalRouterCommand) cmd); + } else if (cmd instanceof CreateTungstenDefaultProjectCommand) { + return executeRequest((CreateTungstenDefaultProjectCommand) cmd); + } + + s_logger.debug("Received unsupported command " + cmd.toString()); + return Answer.createUnsupportedCommandAnswer(cmd); + } + + private Answer executeRequest(CreateTungstenNetworkCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + VirtualNetwork virtualNetwork = tungstenApi.createTungstenNetwork(cmd.getUuid(), cmd.getName(), + cmd.getDisplayName(), project.getUuid(), cmd.isRouterExternal(), cmd.isShared(), cmd.getIpPrefix(), + cmd.getIpPrefixLen(), cmd.getGateway(), cmd.isDhcpEnable(), cmd.getDnsServer(), cmd.getAllocationStart(), + cmd.getAllocationEnd(), cmd.isIpFromStart(), cmd.isManagementNetwork(), cmd.getSubnetName()); + + if (virtualNetwork != null) + return new TungstenAnswer(cmd, virtualNetwork, true, "Tungsten-Fabric network created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenVmInterfaceCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + VirtualMachineInterface vmi = (VirtualMachineInterface) tungstenApi.getTungstenObjectByName( + VirtualMachineInterface.class, project.getQualifiedName(), cmd.getName()); + if (vmi != null) { + cleanUpVmiFloatingIp(vmi); + boolean deleted = tungstenApi.deleteTungstenVmInterface(vmi); + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric virtual machine interface deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + return new TungstenAnswer(cmd, true, "Tungsten-Fabric virtual machine interface is not exist"); + } + + private void cleanUpVmiFloatingIp(VirtualMachineInterface vmi) { + List> objectReferenceList = vmi.getFloatingIpBackRefs(); + if (objectReferenceList != null) { + for(ObjectReference objectReference : objectReferenceList) { + FloatingIp floatingIp = (FloatingIp) tungstenApi.getTungstenObject(FloatingIp.class, objectReference.getUuid()); + floatingIp.clearVirtualMachineInterface(); + boolean cleared = tungstenApi.updateTungstenObject(floatingIp); + if (!cleared) { + throw new CloudRuntimeException("Can not clear virtual machine interface from floating ip "); + } + } + } + } + + private Answer executeRequest(DeleteTungstenVmCommand cmd, int numRetries) { + VirtualMachine vm = (VirtualMachine) tungstenApi.getTungstenObject(VirtualMachine.class, cmd.getVirtualMachineUuid()); + if(vm != null && vm.getVirtualMachineInterfaceBackRefs() != null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric virtual machine is not deleted because there are nics attached to this vm"); + } + boolean deleted = tungstenApi.deleteTungstenObject(VirtualMachine.class, cmd.getVirtualMachineUuid()); + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric virtual machine deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenNetworkCommand cmd, int numRetries) { + boolean deleted = tungstenApi.deleteTungstenObject(VirtualNetwork.class, cmd.getNetworkUuid()); + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric network deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenLogicalRouterCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.createTungstenLogicalRouter(cmd.getName(), + project.getUuid(), cmd.getPubNetworkUuid()); + if (logicalRouter != null) + return new TungstenAnswer(cmd, logicalRouter, true, "Tungsten-Fabric logical router created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenVirtualMachineCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + cmd.getVnUuid()); + if (virtualNetwork == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + VirtualMachine virtualMachine = (VirtualMachine) tungstenApi.getTungstenObject(VirtualMachine.class, + cmd.getVmUuid()); + if (virtualMachine == null) { + virtualMachine = tungstenApi.createTungstenVirtualMachine(cmd.getVmUuid(), cmd.getVmName()); + } + if (virtualMachine == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + String vmiName = TungstenUtils.getVmiName(cmd.getTrafficType(), cmd.getVmType(), cmd.getVmName(), + cmd.getNicId()); + VirtualMachineInterface virtualMachineInterface = + (VirtualMachineInterface) tungstenApi.getTungstenObjectByName( + VirtualMachineInterface.class, project.getQualifiedName(), vmiName); + if (virtualMachineInterface == null) { + virtualMachineInterface = tungstenApi.createTungstenVmInterface(cmd.getNicUuid(), vmiName, cmd.getMac(), + cmd.getVnUuid(), cmd.getVmUuid(), project.getUuid(), cmd.getGateway(), cmd.isDefaultNic()); + } + if (virtualMachineInterface == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + String iiName = TungstenUtils.getInstanceIpName(cmd.getTrafficType(), cmd.getVmType(), cmd.getVmName(), + cmd.getNicId()); + InstanceIp instanceIp = (InstanceIp) tungstenApi.getTungstenObjectByName(InstanceIp.class, null, iiName); + if (instanceIp == null) { + instanceIp = tungstenApi.createTungstenInstanceIp(iiName, cmd.getIp(), cmd.getVnUuid(), + virtualMachineInterface.getUuid()); + } + if (instanceIp == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + if (cmd.getIpv6() != null) { + String iiV6Name = TungstenUtils.getV6InstanceIpName(cmd.getTrafficType(), cmd.getVmType(), cmd.getVmName(), + cmd.getNicId()); + InstanceIp instanceV6Ip = (InstanceIp) tungstenApi.getTungstenObjectByName(InstanceIp.class, null, + iiV6Name); + if (instanceV6Ip == null) { + instanceV6Ip = tungstenApi.createTungstenInstanceIp(iiV6Name, cmd.getIpv6(), cmd.getVnUuid(), + virtualMachineInterface.getUuid()); + } + if (instanceV6Ip == null) { + return new TungstenAnswer(cmd, new IOException()); + } + } + if (!addTungstenVrouterPort(virtualMachineInterface.getUuid() + , virtualNetwork.getUuid() + , virtualMachine.getName() + , project.getUuid() + , cmd.getMac() + , cmd.getIp() + , cmd.getIpv6() + , virtualMachine.getUuid() + , cmd.getHost() + )) { + return new TungstenAnswer(cmd, new IOException()); + } + + return new TungstenAnswer(cmd, virtualMachine, true, null); + } + + private boolean addTungstenVrouterPort(String vmiUuid, String networkUuid, String vmName, String projectUuid, + String mac, String ip, String ipv6, String vmUuid, String host) { + Port vPort = new Port(); + vPort.setId(vmiUuid); + vPort.setVnId(networkUuid); + vPort.setDisplayName(vmName); + vPort.setVmProjectId(projectUuid); + vPort.setMacAddress(mac); + if (NetUtils.isValidIp4(ip)) { + vPort.setIpAddress(ip); + } else { + vPort.setIpv6Address(ip); + } + + if (ipv6 != null) { + vPort.setIpv6Address(ipv6); + } + + vPort.setInstanceId(vmUuid); + vPort.setTapInterfaceName(TungstenUtils.getTapName(mac)); + return TungstenVRouterApi.addTungstenVrouterPort(host, vrouterPort, vPort); + } + + private Answer executeRequest(SetTungstenNetworkGatewayCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.getTungstenObjectByName(LogicalRouter.class, + project.getQualifiedName(), cmd.getRouterName()); + if (logicalRouter == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + VirtualMachineInterface virtualMachineInterface = + (VirtualMachineInterface) tungstenApi.getTungstenObjectByName( + VirtualMachineInterface.class, project.getQualifiedName(), + TungstenUtils.getNetworkGatewayVmiName(cmd.getVnId())); + if (virtualMachineInterface == null) { + virtualMachineInterface = (VirtualMachineInterface) tungstenApi.createTungstenGatewayVmi( + TungstenUtils.getNetworkGatewayVmiName(cmd.getVnId()), project.getUuid(), cmd.getVnUuid()); + } + if (virtualMachineInterface == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + InstanceIp instanceIp = (InstanceIp) tungstenApi.getTungstenObjectByName(InstanceIp.class, null, + TungstenUtils.getNetworkGatewayIiName(cmd.getVnId())); + if (instanceIp == null) { + instanceIp = tungstenApi.createTungstenInstanceIp(TungstenUtils.getNetworkGatewayIiName(cmd.getVnId()), + cmd.getVnGatewayIp(), cmd.getVnUuid(), virtualMachineInterface.getUuid()); + } + if (instanceIp == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + logicalRouter.addVirtualMachineInterface(virtualMachineInterface); + boolean updateLRResult = tungstenApi.updateTungstenObject(logicalRouter); + if (!updateLRResult) { + return new TungstenAnswer(cmd, new IOException()); + } + + return new TungstenAnswer(cmd, virtualMachineInterface, true, null); + } + + private Answer executeRequest(GetTungstenNetworkDnsCommand cmd) { + String dnsIpAddress = tungstenApi.getTungstenNetworkDns(cmd.getUuid(), cmd.getSubnetName()); + return new TungstenAnswer(cmd, true, dnsIpAddress); + } + + private Answer executeRequest(GetTungstenPolicyCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObjectByName(NetworkPolicy.class, + project.getQualifiedName(), cmd.getName()); + return new TungstenAnswer(cmd, apiObjectBase, true, null); + } + + private Answer executeRequest(ClearTungstenNetworkGatewayCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.getTungstenObjectByName(LogicalRouter.class, + project.getQualifiedName(), cmd.getRouterName()); + if (logicalRouter == null) { + return new TungstenAnswer(cmd, true, null); + } + + boolean deleteLRResult = tungstenApi.deleteTungstenObject(logicalRouter); + if (!deleteLRResult) { + return new TungstenAnswer(cmd, new IOException()); + } + + VirtualMachineInterface virtualMachineInterface = + (VirtualMachineInterface) tungstenApi.getTungstenObjectByName( + VirtualMachineInterface.class, project.getQualifiedName(), + TungstenUtils.getNetworkGatewayVmiName(cmd.getVnId())); + + if (virtualMachineInterface != null) { + boolean deleteVmi = tungstenApi.deleteTungstenVmInterface(virtualMachineInterface); + if (!deleteVmi) { + return new TungstenAnswer(cmd, new IOException()); + } + } + + return new TungstenAnswer(cmd, true, null); + } + + private Answer executeRequest(CreateTungstenFloatingIpPoolCommand cmd) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenFloatingIpPool(cmd.getNetworkUuid(), cmd.getFipName()); + if (apiObjectBase != null) { + return new TungstenAnswer(cmd, apiObjectBase, true, null); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + private Answer executeRequest(CreateTungstenFloatingIpCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + ApiObjectBase apiObjectBase = tungstenApi.createTungstenFloatingIp(project.getUuid(), cmd.getNetworkUuid(), + cmd.getFipName(), cmd.getName(), cmd.getPublicIp()); + if (apiObjectBase != null) { + return new TungstenAnswer(cmd, apiObjectBase, true, null); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + private Answer executeRequest(AssignTungstenFloatingIpCommand cmd) { + boolean result = tungstenApi.assignTungstenFloatingIp(cmd.getNetworkUuid(), cmd.getVmiUuid(), cmd.getFipName(), + cmd.getName(), cmd.getPrivateIp()); + if (result) { + return new TungstenAnswer(cmd, true, null); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + private Answer executeRequest(ReleaseTungstenFloatingIpCommand cmd) { + boolean result = tungstenApi.releaseTungstenFloatingIp(cmd.getVnUuid(), cmd.getFipName(), cmd.getName()); + if (result) { + return new TungstenAnswer(cmd, true, null); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + private Answer executeRequest(GetTungstenNatIpCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + String natIp = tungstenApi.getTungstenNatIp(project.getUuid(), cmd.getLogicalRouterUuid()); + if (natIp != null) { + return new TungstenAnswer(cmd, true, natIp); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenVRouterPortCommand cmd) { + boolean deletePort = TungstenVRouterApi.deleteTungstenVrouterPort(cmd.getHost(), vrouterPort, cmd.getPortId()); + return new TungstenAnswer(cmd, deletePort, null); + } + + private Answer executeRequest(DeleteTungstenFloatingIpCommand cmd) { + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + cmd.getVnUuid()); + FloatingIpPool floatingIpPool = (FloatingIpPool) tungstenApi.getTungstenObjectByName(FloatingIpPool.class, + virtualNetwork.getQualifiedName(), cmd.getFipName()); + FloatingIp floatingIp = (FloatingIp) tungstenApi.getTungstenObjectByName(FloatingIp.class, + floatingIpPool.getQualifiedName(), cmd.getName()); + boolean deleteFip = tungstenApi.deleteTungstenObject(floatingIp); + return new TungstenAnswer(cmd, deleteFip, null); + } + + private Answer executeRequest(DeleteTungstenFloatingIpPoolCommand cmd) { + boolean deleteFip = true; + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + cmd.getVnUuid()); + if (virtualNetwork != null) { + FloatingIpPool floatingIpPool = (FloatingIpPool) tungstenApi.getTungstenObjectByName(FloatingIpPool.class, + virtualNetwork.getQualifiedName(), cmd.getFipName()); + if (floatingIpPool != null) { + deleteFip = tungstenApi.deleteTungstenObject(floatingIpPool); + } + } + return new TungstenAnswer(cmd, deleteFip, null); + } + + private Answer executeRequest(CreateTungstenNetworkPolicyCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + ApiObjectBase apiObjectBase = tungstenApi.createOrUpdateTungstenNetworkPolicy(cmd.getName(), project.getUuid(), + cmd.getTungstenRuleList()); + if (apiObjectBase != null) { + return new TungstenAnswer(cmd, apiObjectBase, true, null); + } else { + return new TungstenAnswer(cmd, false, null); + } + } + + private Answer executeRequest(DeleteTungstenNetworkPolicyCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + cmd.getNetworkUuid()); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.getTungstenObjectByName(NetworkPolicy.class, + project.getQualifiedName(), cmd.getName()); + if (networkPolicy != null) { + virtualNetwork.removeNetworkPolicy(networkPolicy, new VirtualNetworkPolicyType(new SequenceType(-1, -1))); + boolean updated = tungstenApi.updateTungstenObject(virtualNetwork); + if (!updated) { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + boolean deleted = tungstenApi.deleteTungstenObject(networkPolicy); + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric network policy deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + return new TungstenAnswer(cmd, true, "Tungsten-Fabric network policy is not exist"); + } + + private Answer executeRequest(GetTungstenFloatingIpsCommand cmd) { + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + cmd.getVnUuid()); + List floatingIpList; + if (virtualNetwork != null) { + FloatingIpPool floatingIpPool = (FloatingIpPool) tungstenApi.getTungstenObjectByName(FloatingIpPool.class, + virtualNetwork.getQualifiedName(), cmd.getFipName()); + floatingIpList = tungstenApi.getTungstenListObject(FloatingIp.class, floatingIpPool,null); + } else { + floatingIpList = new ArrayList<>(); + } + return new TungstenAnswer(cmd, floatingIpList, true, null); + } + + private Answer executeRequest(ApplyTungstenNetworkPolicyCommand cmd) { + ApiObjectBase apiObjectBase; + String networkPolicyUuid = cmd.getPolicyUuid(); + + if (networkPolicyUuid == null) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + ApiObjectBase networkPolicy = tungstenApi.getTungstenObjectByName(NetworkPolicy.class, project.getQualifiedName(), cmd.getNetworkPolicyName()); + if (networkPolicy == null) { + return new TungstenAnswer(cmd, new IOException()); + } + networkPolicyUuid = networkPolicy.getUuid(); + } + + apiObjectBase = tungstenApi.applyTungstenNetworkPolicy(networkPolicyUuid, cmd.getNetworkUuid(), + cmd.getMajorSequence(), cmd.getMinorSequence()); + + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + NetworkPolicy networkPolicy = (NetworkPolicy) apiObjectBase; + List virtualNetworkList = tungstenApi.getNetworksFromNetworkPolicy(networkPolicy); + TungstenNetworkPolicy tungstenModel = new TungstenNetworkPolicy(networkPolicy, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric network policy is applied"); + } + + private Answer executeRequest(GetTungstenFabricNetworkCommand cmd) { + ApiObjectBase fabricNetwork = tungstenApi.getTungstenFabricNetwork(); + if (fabricNetwork != null) { + return new TungstenAnswer(cmd, fabricNetwork, true, null); + } else { + return new TungstenAnswer(cmd, false, "Tungsten-Fabric fabric network doesn't exist"); + } + } + + private Answer executeRequest(CreateTungstenDomainCommand cmd) { + ApiObjectBase tungstenDomain = tungstenApi.createTungstenDomain(cmd.getTungstenDomainName(), + cmd.getTungstenDomainUuid()); + if (tungstenDomain != null) { + return new TungstenAnswer(cmd, tungstenDomain, true, null); + } else { + return new TungstenAnswer(cmd, false, null); + } + } + + private Answer executeRequest(CreateTungstenProjectCommand cmd) { + ApiObjectBase tungstenProject = tungstenApi.createTungstenProject(cmd.getTungstenProjectName(), + cmd.getTungstenProjectUuid(), cmd.getTungstenDomainUuid(), cmd.getTungstenDomainName()); + if (tungstenProject != null) { + return new TungstenAnswer(cmd, tungstenProject, true, null); + } else { + return new TungstenAnswer(cmd, false, null); + } + } + + private Answer executeRequest(DeleteTungstenDomainCommand cmd, int numRetries) { + boolean deleted = tungstenApi.deleteTungstenDomain(cmd.getTungstenDomainUuid()); + if (deleted) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric domain deleted"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenProjectCommand cmd, int numRetries) { + boolean deleted = tungstenApi.deleteTungstenProject(cmd.getTungstenProjectUuid()); + if (deleted) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric project deleted"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenNetworkLoadbalancerCommand cmd) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + cmd.getNetworkUuid()); + if (virtualNetwork == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + String subnetUuid = tungstenApi.getSubnetUuid(cmd.getNetworkUuid()); + if (subnetUuid == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + // create loadbalancer vmi + VirtualMachineInterface virtualMachineInterface = + (VirtualMachineInterface) tungstenApi.getTungstenObjectByName( + VirtualMachineInterface.class, project.getQualifiedName(), cmd.getLoadBalancerVmiName()); + if (virtualMachineInterface == null) { + virtualMachineInterface = (VirtualMachineInterface) tungstenApi.createTungstenLbVmi( + cmd.getLoadBalancerVmiName(), project.getUuid(), virtualNetwork.getUuid()); + } + + if (virtualMachineInterface == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + // create loadbalancer ii + InstanceIp instanceIp = (InstanceIp) tungstenApi.getTungstenObjectByName(InstanceIp.class, null, + cmd.getLoadBalancerIiName()); + if (instanceIp == null) { + instanceIp = tungstenApi.createTungstenInstanceIp(cmd.getLoadBalancerIiName(), cmd.getPrivateIp(), + cmd.getNetworkUuid(), virtualMachineInterface.getUuid(), subnetUuid); + } + if (instanceIp == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + // update loadbalancer floating ip + // must not source nat ip or static nat ip + // UI : don't allow add loadbalancer on source nat & static nat ip + // check this on tungsten create load balance rule + boolean result = tungstenApi.assignTungstenFloatingIp(cmd.getPublicNetworkUuid(), + virtualMachineInterface.getUuid(), cmd.getFipName(), cmd.getFiName(), cmd.getPrivateIp()); + if (!result) { + return new TungstenAnswer(cmd, new IOException()); + } + + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.getTungstenObjectByName(Loadbalancer.class, + project.getQualifiedName(), cmd.getLoadBalancerName()); + if (loadbalancer == null) { + loadbalancer = (Loadbalancer) tungstenApi.createTungstenLoadbalancer(project.getUuid(), + cmd.getLoadBalancerName(), virtualMachineInterface.getUuid(), subnetUuid, cmd.getPrivateIp()); + } + + if (loadbalancer == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + LoadbalancerListener loadbalancerListener = (LoadbalancerListener) tungstenApi.getTungstenObjectByName( + LoadbalancerListener.class, project.getQualifiedName(), cmd.getLoadBalancerListenerName()); + if (loadbalancerListener == null) { + loadbalancerListener = (LoadbalancerListener) tungstenApi.createTungstenLoadbalancerListener( + project.getUuid(), loadbalancer.getUuid(), cmd.getLoadBalancerListenerName(), cmd.getProtocol(), + cmd.getSrcPort()); + } + + if (loadbalancerListener == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + LoadbalancerHealthmonitor loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.getTungstenObjectByName( + LoadbalancerHealthmonitor.class, project.getQualifiedName(), cmd.getLoadBalancerHealthMonitorName()); + if (loadbalancerHealthmonitor == null) { + loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.createTungstenLoadbalancerHealthMonitor( + project.getUuid(), cmd.getLoadBalancerHealthMonitorName(), cmd.getMonitorType(), cmd.getMaxRetries(), + cmd.getDelay(), cmd.getTimeout(), cmd.getHttpMethod(), cmd.getUrlPath(), cmd.getExpectedCodes()); + } + + if (loadbalancerHealthmonitor == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + LoadbalancerPool loadbalancerPool = createLoadBalancerPool(cmd.getLoadBalancerPoolName(), + cmd.getLoadBalancerMethod(), + cmd.getProtocol(), project.getUuid(), project.getQualifiedName(), loadbalancerListener.getUuid(), + loadbalancerHealthmonitor.getUuid()); + + createLoadBalancerMember(cmd.getListMember(), loadbalancerPool, subnetUuid); + + return new TungstenAnswer(cmd, loadbalancer, true, null); + } + + private LoadbalancerPool createLoadBalancerPool(String poolName, String method, String protocol, String projectUuid, + List projectQualifiedName, + String loadbalancerListenerUuid, + String loadbalancerHealthmonitorUuid) { + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) tungstenApi.getTungstenObjectByName( + LoadbalancerPool.class, projectQualifiedName, poolName); + + if (loadbalancerPool == null) { + loadbalancerPool = (LoadbalancerPool) tungstenApi.createTungstenLoadbalancerPool(projectUuid, + loadbalancerListenerUuid, loadbalancerHealthmonitorUuid, poolName, + method, protocol); + } + + if (loadbalancerPool == null) { + throw new CloudRuntimeException("Can not create load balancer pool"); + } + + return loadbalancerPool; + } + + private void createLoadBalancerMember(List members, LoadbalancerPool loadbalancerPool, String subnetUuid) { + for (TungstenLoadBalancerMember member : members) { + LoadbalancerMember loadbalancerMember = (LoadbalancerMember) tungstenApi.getTungstenObjectByName( + LoadbalancerMember.class, loadbalancerPool.getQualifiedName(), member.getName()); + if (loadbalancerMember == null) { + loadbalancerMember = (LoadbalancerMember) tungstenApi.createTungstenLoadbalancerMember( + loadbalancerPool.getUuid(), member.getName(), member.getIpAddress(), subnetUuid, member.getPort(), + member.getWeight()); + } + + if (loadbalancerMember == null) { + throw new CloudRuntimeException("Can not create load balancer members"); + } + } + } + + private Answer executeRequest(UpdateLoadBalancerServiceInstanceCommand cmd, int numRetries) { + boolean result = tungstenApi.updateLBServiceInstanceFatFlow(cmd.getPublicNetworkUuid(), + cmd.getFloatingPoolName(), cmd.getFloatingIpName()); + + if (result) { + return new TungstenAnswer(cmd, true, null); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenLoadBalancerCommand cmd, int numRetries) { + boolean result; + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.getTungstenObjectByName(Loadbalancer.class, + project.getQualifiedName(), cmd.getLoadBalancerName()); + if (loadbalancer != null) { + result= deleteLoadBalancerListener(loadbalancer); + + // delete load balancer + result = result && tungstenApi.deleteTungstenObject(loadbalancer); + + // release floating ip + result = result && tungstenApi.releaseTungstenFloatingIp(cmd.getPublicNetworkUuid(), cmd.getFipName(), + cmd.getFiName()); + + // delete load balancer vmi + VirtualMachineInterface virtualMachineInterface = + (VirtualMachineInterface) tungstenApi.getTungstenObjectByName( + VirtualMachineInterface.class, project.getQualifiedName(), cmd.getLoadBalancerVmiName()); + + result = result && tungstenApi.deleteTungstenVmInterface(virtualMachineInterface); + + // delete load balancer health monitor + LoadbalancerHealthmonitor loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.getTungstenObjectByName( + LoadbalancerHealthmonitor.class, project.getQualifiedName(), cmd.getLoadBalancerHealthMonitorName()); + result = result && tungstenApi.deleteTungstenObject(loadbalancerHealthmonitor); + + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer is not exist"); + } + + private boolean deleteLoadBalancerListener(Loadbalancer loadBalancer) { + boolean result = true; + List> listLoadBalancerListener = + loadBalancer.getLoadbalancerListenerBackRefs(); + if (listLoadBalancerListener != null && !listLoadBalancerListener.isEmpty()) { + for (ObjectReference listener : listLoadBalancerListener) { + LoadbalancerListener loadbalancerListener = (LoadbalancerListener) tungstenApi.getTungstenObject( + LoadbalancerListener.class, listener.getUuid()); + result = result && deleteLoadBalancerListener(loadbalancerListener); + } + } + return result; + } + + private Answer executeRequest(DeleteTungstenLoadBalancerListenerCommand cmd, int numRetries) { + boolean result; + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + LoadbalancerListener loadbalancerListener = (LoadbalancerListener) tungstenApi.getTungstenObjectByName( + LoadbalancerListener.class, project.getQualifiedName(), cmd.getLoadBalancerListenerName()); + if (loadbalancerListener != null) { + result = deleteLoadBalancerListener(loadbalancerListener); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer listener deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer listener is not exist"); + } + + private Answer executeRequest(UpdateTungstenLoadBalancerPoolCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + boolean result = tungstenApi.updateLoadBalancerPool(project.getUuid(), cmd.getLbPoolName(), cmd.getLbMethod(), + cmd.getLbSessionPersistence(), cmd.getLbPersistenceCookieName(), cmd.getLbProtocol(), cmd.isLbStatsEnable(), + cmd.getLbStatsPort(), cmd.getLbStatsUri(), cmd.getLbStatsAuth()); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer pool updated"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(UpdateTungstenLoadBalancerListenerCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + boolean result = tungstenApi.updateLoadBalancerListener(project.getUuid(), cmd.getListenerName(), + cmd.getProtocol(), cmd.getPort(), cmd.getUrl()); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer listener updated"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(UpdateTungstenLoadBalancerHealthMonitorCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + boolean result = tungstenApi.updateLoadBalancerHealthMonitor(project.getUuid(), cmd.getHealthMonitorName() + , cmd.getType(), cmd.getRetry(), cmd.getTimeout(), cmd.getInterval(), cmd.getHttpMethod(), cmd.getExpectedCode(), cmd.getUrlPath()); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer health monitor updated"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(UpdateTungstenLoadBalancerMemberCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + String subnetUuid = tungstenApi.getSubnetUuid(cmd.getNetworkUuid()); + if (subnetUuid == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + boolean result = tungstenApi.updateLoadBalancerMember(project.getUuid(), cmd.getLbPoolName(), + cmd.getListTungstenLoadBalancerMember(), subnetUuid); + + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric loadbalancer member updated"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private boolean deleteLoadBalancerListener(LoadbalancerListener loadbalancerListener) { + boolean result = true; + List> listPool = loadbalancerListener.getLoadbalancerPoolBackRefs(); + if (listPool != null && !listPool.isEmpty()) { + for (ObjectReference pool : listPool) { + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) tungstenApi.getTungstenObject( + LoadbalancerPool.class, pool.getUuid()); + List> listMember = loadbalancerPool.getLoadbalancerMembers(); + if (listMember != null && !listMember.isEmpty()) { + for (ObjectReference member : listMember) { + LoadbalancerMember loadbalancerMember = (LoadbalancerMember) tungstenApi.getTungstenObject( + LoadbalancerMember.class, member.getUuid()); + result = result && tungstenApi.deleteTungstenObject(loadbalancerMember); + } + } + result = result && tungstenApi.deleteTungstenObject(loadbalancerPool); + } + } + + result = result && tungstenApi.deleteTungstenObject(loadbalancerListener); + return result; + } + + private Answer executeRequest(GetTungstenLoadBalancerCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObjectByName(Loadbalancer.class, + project.getQualifiedName(), cmd.getLbName()); + if (apiObjectBase != null) { + return new TungstenAnswer(cmd, apiObjectBase, true, ""); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ApplyTungstenPortForwardingCommand cmd, int numRetries) { + boolean result = tungstenApi.applyTungstenPortForwarding(cmd.isAdd(), cmd.getPublicNetworkUuid(), + cmd.getFloatingIpPoolName(), cmd.getFloatingIpName(), cmd.getVmiUuid(), cmd.getProtocol(), + cmd.getPublicPort(), cmd.getPrivatePort()); + + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric port forwarding floating ip enabled"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenObjectCommand cmd, int numRetries) { + boolean result = tungstenApi.deleteTungstenObject(cmd.getApiObjectBase()); + + if (result) + return new TungstenAnswer(cmd, true, "Deleted Tungsten-Fabric object"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(AddTungstenNetworkSubnetCommand cmd, int numRetries) { + boolean result = tungstenApi.addTungstenNetworkSubnetCommand(cmd.getNetworkUuid(), cmd.getIpPrefix(), + cmd.getIpPrefixLen(), cmd.getGateway(), cmd.isDhcpEnable(), cmd.getDnsServer(), cmd.getAllocationStart(), + cmd.getAllocationEnd(), cmd.isIpFromStart(), cmd.getSubnetName()); + + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric network subnet is added"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenNetworkSubnetCommand cmd, int numRetries) { + boolean result = tungstenApi.removeTungstenNetworkSubnetCommand(cmd.getNetworkUuid(), cmd.getSubnetName()); + + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric network subnet is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenSecurityGroupCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenSecurityGroup(cmd.getSecurityGroupUuid(), + cmd.getSecurityGroupName(), cmd.getSecurityGroupDescription(), cmd.getProjectFqn()); + if (apiObjectBase != null) { + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric security group created"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenSecurityGroupCommand cmd, int numRetries) { + boolean result = tungstenApi.deleteTungstenObject(SecurityGroup.class, cmd.getTungstenSecurityGroupUuid()); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric security group deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(GetTungstenSecurityGroupCommand cmd) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(SecurityGroup.class, + cmd.getTungstenSecurityGroupUuid()); + return new TungstenAnswer(cmd, apiObjectBase, true, "Get Tungsten-Fabric security group"); + } + + private Answer executeRequest(AddTungstenSecurityGroupRuleCommand cmd, int numRetries) { + boolean result = tungstenApi.addTungstenSecurityGroupRule(cmd.getTungstenSecurityGroupUuid(), + cmd.getTungstenGroupRuleUuid(), cmd.getSecurityGroupRuleType(), cmd.getStartPort(), cmd.getEndPort(), + cmd.getTarget(), cmd.getEtherType(), cmd.getProtocol()); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric security group rule added"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(AddTungstenVmToSecurityGroupCommand cmd, int numRetries) { + boolean result = tungstenApi.addInstanceToSecurityGroup(cmd.getNicUuid(), cmd.getSecurityGroupUuidList()); + if (result) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric instance added to security groups"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenVmFromSecurityGroupCommand cmd, int numRetries) { + boolean result = tungstenApi.removeInstanceFromSecurityGroup(cmd.getNicUuid(), cmd.getSecurityGroupUuidList()); + if (result) + return new TungstenAnswer(cmd, true, "removed Tungsten-Fabric instance from security groups"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenSecurityGroupRuleCommand cmd, int numRetries) { + boolean tungstenSecurityGroupRuleRemoved = tungstenApi.removeTungstenSecurityGroupRule( + cmd.getSecurityGroupUuid(), cmd.getSecurityGroupRuleUuid()); + if (tungstenSecurityGroupRuleRemoved) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric security group rule removed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(AddTungstenSecondaryIpAddressCommand cmd, int numRetries) { + boolean addSecondaryIpAddress = tungstenApi.addSecondaryIpAddress(cmd.getNetworkUuid(), cmd.getNicUuid(), + cmd.getIiName(), cmd.getAddress()); + if (addSecondaryIpAddress) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric secondary ip is added"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenSecondaryIpAddressCommand cmd, int numRetries) { + boolean removeSecondaryIpAddress = tungstenApi.removeSecondaryIpAddress(cmd.getIiName()); + if (removeSecondaryIpAddress) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric secondary ip is removed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenPolicyCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + ApiObjectBase apiObjectBase = tungstenApi.createTungstenPolicy(cmd.getUuid(), cmd.getName(), project.getUuid()); + + if (apiObjectBase != null) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiObjectBase; + List virtualNetworkList = tungstenApi.getNetworksFromNetworkPolicy(networkPolicy); + TungstenModel tungstenModel = new TungstenNetworkPolicy(networkPolicy, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric policy is created"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(AddTungstenPolicyRuleCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.addTungstenPolicyRule(cmd.getUuid(), cmd.getPolicyUuid(), + cmd.getAction(), cmd.getProtocol(), cmd.getDirection(), cmd.getSrcNetwork(), cmd.getSrcIpPrefix(), + cmd.getSrcIpPrefixLen(), cmd.getSrcStartPort(), cmd.getSrcEndPort(), cmd.getDestNetwork(), + cmd.getDestIpPrefix(), cmd.getDestIpPrefixLen(), cmd.getDestStartPort(), cmd.getDestEndPort()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric policy rule is added"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenPolicyRuleCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.removeTungstenNetworkPolicyRule(cmd.getPolicyUuid(), + cmd.getRuleUuid()); + + if (apiObjectBase != null) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiObjectBase; + List virtualNetworkList = tungstenApi.getNetworksFromNetworkPolicy(networkPolicy); + TungstenModel tungstenModel = new TungstenNetworkPolicy(networkPolicy, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric policy rule is removed"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenPolicyCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(NetworkPolicy.class, cmd.getPolicyUuid()); + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric policy is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(apiObjectBase); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric policy is delete"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenPolicyRuleCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(NetworkPolicy.class, cmd.getPolicyUuid()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric policy rule is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenPolicyCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + List apiObjectBaseList; + if (cmd.getPolicyName() != null) { + apiObjectBaseList = tungstenApi.listTungstenAddressPolicy(project.getUuid(), cmd.getPolicyName()); + } else if (cmd.getNetworkUuid() != null) { + apiObjectBaseList = tungstenApi.listTungstenNetworkPolicy(cmd.getNetworkUuid(), cmd.getPolicyUuid()); + } else { + apiObjectBaseList = tungstenApi.listTungstenPolicy(project.getUuid(), cmd.getPolicyUuid()); + } + + if (apiObjectBaseList != null) { + List tungstenModelList = new ArrayList<>(); + for(ApiObjectBase apiObjectBase : apiObjectBaseList) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiObjectBase; + List virtualNetworkList = tungstenApi.getNetworksFromNetworkPolicy(networkPolicy); + TungstenModel tungstenModel = new TungstenNetworkPolicy(networkPolicy, virtualNetworkList); + tungstenModelList.add(tungstenModel); + } + return new TungstenAnswer(cmd, true, tungstenModelList, "Tungsten-Fabric policy is listed"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenNetworkCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + List apiObjectBaseList = tungstenApi.listTungstenNetwork(project.getUuid(), + cmd.getNetworkUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric network is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenVmCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + List apiObjectBaseList = tungstenApi.listTungstenVm(project.getUuid(), cmd.getVmUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric vm is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenNicCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + List apiObjectBaseList = tungstenApi.listTungstenNic(project.getUuid(), + cmd.getNicUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric nic is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenTagCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenTag(cmd.getUuid(), cmd.getTagType(), cmd.getTagValue(), null); + + if (apiObjectBase != null) { + Tag tag = (Tag) apiObjectBase; + List virtualNetworkList = tungstenApi.getBackRefFromVirtualNetwork(VirtualNetwork.class, tag.getVirtualNetworkBackRefs()); + List virtualMachineList = tungstenApi.getBackRefFromVirtualMachine(VirtualMachine.class, tag.getVirtualMachineBackRefs()); + List virtualMachineInterfaceList = tungstenApi.getBackRefFromVirtualMachineInterface(VirtualMachineInterface.class, tag.getVirtualMachineInterfaceBackRefs()); + List networkPolicyList = tungstenApi.getBackRefFromNetworkPolicy(NetworkPolicy.class, tag.getNetworkPolicyBackRefs()); + List applicationPolicySetList = tungstenApi.getBackRefFromApplicationPolicySet(ApplicationPolicySet.class, tag.getApplicationPolicySetBackRefs()); + TungstenModel tungstenModel = new TungstenTag((Tag) apiObjectBase, virtualNetworkList, virtualMachineList, virtualMachineInterfaceList, networkPolicyList, applicationPolicySetList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric tag is created"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenTagTypeCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenTagType(cmd.getUuid(), cmd.getName()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric tag type is created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenTagCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(Tag.class, cmd.getTagUuid()); + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric tag is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(apiObjectBase); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric tag is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenTagTypeCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(TagType.class, cmd.getTagTypeUuid()); + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric tag type is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(apiObjectBase); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric tag type is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenTagCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenTag(cmd.getNetworkUuid(), + cmd.getVmUuid(), cmd.getNicUuid(), cmd.getPolicyUuid(), cmd.getApplicationPolicySetUuid(), cmd.getTagUuid()); + + if (apiObjectBaseList != null) { + List tungstenModelList = new ArrayList<>(); + for (ApiObjectBase apiObjectBase : apiObjectBaseList) { + Tag tag = (Tag) apiObjectBase; + List virtualNetworkList = tungstenApi.getBackRefFromVirtualNetwork(VirtualNetwork.class, tag.getVirtualNetworkBackRefs()); + List virtualMachineList = tungstenApi.getBackRefFromVirtualMachine(VirtualMachine.class, tag.getVirtualMachineBackRefs()); + List virtualMachineInterfaceList = tungstenApi.getBackRefFromVirtualMachineInterface(VirtualMachineInterface.class, tag.getVirtualMachineInterfaceBackRefs()); + List networkPolicyList = tungstenApi.getBackRefFromNetworkPolicy(NetworkPolicy.class, tag.getNetworkPolicyBackRefs()); + List applicationPolicySetList = tungstenApi.getBackRefFromApplicationPolicySet(ApplicationPolicySet.class, tag.getApplicationPolicySetBackRefs()); + TungstenModel tungstenModel = new TungstenTag((Tag) apiObjectBase, virtualNetworkList, virtualMachineList, virtualMachineInterfaceList, networkPolicyList, applicationPolicySetList); + tungstenModelList.add(tungstenModel); + } + return new TungstenAnswer(cmd, true, tungstenModelList, "Tungsten-Fabric tag list is got"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenTagTypeCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenTagType(cmd.getTagTypeUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric tag type list is got"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ApplyTungstenTagCommand cmd, int numRetries) { + boolean applied = true; + + if (cmd.getNetworkUuids() != null) { + applied = tungstenApi.applyTungstenNetworkTag(cmd.getNetworkUuids(), cmd.getTagUuid()); + } + + if (cmd.getVmUuids() != null) { + applied = applied && tungstenApi.applyTungstenVmTag(cmd.getVmUuids(), cmd.getTagUuid()); + } + + if (cmd.getNicUuids() != null) { + applied = applied && tungstenApi.applyTungstenNicTag(cmd.getNicUuids(), cmd.getTagUuid()); + } + + if (cmd.getPolicyUuid() != null) { + applied = applied && tungstenApi.applyTungstenPolicyTag(cmd.getPolicyUuid(), cmd.getTagUuid()); + } + + if (cmd.getApplicationPolicySetUuid() != null) { + applied = applied && tungstenApi.applyTungstenApplicationPolicySetTag(cmd.getApplicationPolicySetUuid(), cmd.getTagUuid()); + } + + if (applied) { + Tag tag = (Tag) tungstenApi.getTungstenObject(Tag.class, cmd.getTagUuid()); + List virtualNetworkList = tungstenApi.getBackRefFromVirtualNetwork(VirtualNetwork.class, tag.getVirtualNetworkBackRefs()); + List virtualMachineList = tungstenApi.getBackRefFromVirtualMachine(VirtualMachine.class, tag.getVirtualMachineBackRefs()); + List virtualMachineInterfaceList = tungstenApi.getBackRefFromVirtualMachineInterface(VirtualMachineInterface.class, tag.getVirtualMachineInterfaceBackRefs()); + List networkPolicyList = tungstenApi.getBackRefFromNetworkPolicy(NetworkPolicy.class, tag.getNetworkPolicyBackRefs()); + List applicationPolicySetList = tungstenApi.getBackRefFromApplicationPolicySet(ApplicationPolicySet.class, tag.getApplicationPolicySetBackRefs()); + TungstenModel tungstenModel = new TungstenTag(tag, virtualNetworkList, virtualMachineList, virtualMachineInterfaceList, networkPolicyList, applicationPolicySetList); + return new TungstenAnswer(cmd, tungstenModel,true, "Tungsten-Fabric tag is applied"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenPolicyCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.removeTungstenPolicy(cmd.getNetworkUuid(), cmd.getPolicyUuid()); + + if (apiObjectBase != null) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiObjectBase; + List virtualNetworkList = tungstenApi.getNetworksFromNetworkPolicy(networkPolicy); + TungstenModel tungstenModel = new TungstenNetworkPolicy(networkPolicy, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric policy is removed"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(RemoveTungstenTagCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.removeTungstenTag(cmd.getNetworkUuids(), cmd.getVmUuids(), + cmd.getNicUuids(), cmd.getPolicyUuid(), cmd.getApplicationPolicySetUuid(), cmd.getTagUuid()); + + if (apiObjectBase != null) { + Tag tag = (Tag) apiObjectBase; + List virtualNetworkList = tungstenApi.getBackRefFromVirtualNetwork(VirtualNetwork.class, tag.getVirtualNetworkBackRefs()); + List virtualMachineList = tungstenApi.getBackRefFromVirtualMachine(VirtualMachine.class, tag.getVirtualMachineBackRefs()); + List virtualMachineInterfaceList = tungstenApi.getBackRefFromVirtualMachineInterface(VirtualMachineInterface.class, tag.getVirtualMachineInterfaceBackRefs()); + List networkPolicyList = tungstenApi.getBackRefFromNetworkPolicy(NetworkPolicy.class, tag.getNetworkPolicyBackRefs()); + List applicationPolicySetList = tungstenApi.getBackRefFromApplicationPolicySet(ApplicationPolicySet.class, tag.getApplicationPolicySetBackRefs()); + TungstenModel tungstenModel = new TungstenTag(tag, virtualNetworkList, virtualMachineList, virtualMachineInterfaceList, networkPolicyList, applicationPolicySetList); + return new TungstenAnswer(cmd, tungstenModel,true, "Tungsten-Fabric tag is removed"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenApplicationPolicySetCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenApplicationPolicySet(cmd.getUuid(), cmd.getName()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric application policy set is created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenFirewallPolicyCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenFirewallPolicy(cmd.getUuid(), cmd.getApplicationPolicySetUuid(), cmd.getName(), cmd.getSequence()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric firewall policy is created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenFirewallRuleCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenFirewallRule(cmd.getUuid(), cmd.getFirewallPolicyUuid(), cmd.getName(), + cmd.getAction(), cmd.getServiceGroupUuid(), cmd.getSrcTagUuid(), cmd.getSrcAddressGroupUuid(), cmd.getSrcNetworkUuid(), + cmd.getDirection(), cmd.getDestTagUuid(), cmd.getDestAddressGroupUuid(), cmd.getDestNetworkUuid(), cmd.getTagTypeUuid(), cmd.getSequence()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric firewall rule is created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenServiceGroupCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenServiceGroup(cmd.getUuid(), cmd.getName(), + cmd.getProtocol(), cmd.getStartPort(), cmd.getEndPort()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric service group is created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenAddressGroupCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.createTungstenAddressGroup(cmd.getUuid(), cmd.getName(), + cmd.getIpPrefix(), cmd.getIpPrefixLen()); + + if (apiObjectBase != null) + return new TungstenAnswer(cmd, apiObjectBase, true, "Tungsten-Fabric address group is created"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenApplicationPolicySetCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenApplicationPolicySet( + cmd.getApplicationPolicySetUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric application policy set is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenFirewallPolicyCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenFirewallPolicy( + cmd.getApplicationPolicySetUuid(), cmd.getFirewallPolicyUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric firewall policy is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenFirewallRuleCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenFirewallRule( + cmd.getFirewallPolicyUuid(), cmd.getFirewallRuleUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric firewall rule is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenServiceGroupCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenServiceGroup( + cmd.getServiceGroupUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric service group is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenAddressGroupCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listTungstenAddressGroup( + cmd.getAddressGroupUuid()); + + if (apiObjectBaseList != null) + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric address group is listed"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenApplicationPolicySetCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(ApplicationPolicySet.class, + cmd.getApplicationPolicySetUuid()); + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric application policy set is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(apiObjectBase); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric application policy set is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenFirewallPolicyCommand cmd, int numRetries) { + FirewallPolicy firewallPolicy = (FirewallPolicy) tungstenApi.getTungstenObject(FirewallPolicy.class, cmd.getFirewallPolicyUuid()); + if (firewallPolicy == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric firewall policy is not founded"); + } + + List> objectReferenceList = firewallPolicy.getApplicationPolicySetBackRefs(); + if (objectReferenceList != null) { + for(ObjectReference objectReference : objectReferenceList) { + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) tungstenApi.getTungstenObject(ApplicationPolicySet.class, + objectReference.getUuid()); + applicationPolicySet.removeFirewallPolicy(firewallPolicy, new FirewallSequence()); + boolean updated = tungstenApi.updateTungstenObject(applicationPolicySet); + if (!updated) { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + boolean deleted = tungstenApi.deleteTungstenObject(firewallPolicy); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric firewall policy is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenFirewallRuleCommand cmd, int numRetries) { + FirewallRule firewallRule = (FirewallRule) tungstenApi.getTungstenObject(FirewallRule.class, cmd.getFirewallRuleUuid()); + if (firewallRule == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric firewall rule is not founded"); + } + + List> objectReferenceList = firewallRule.getFirewallPolicyBackRefs(); + if (objectReferenceList != null) { + for(ObjectReference objectReference : objectReferenceList) { + FirewallPolicy firewallPolicy = (FirewallPolicy) tungstenApi.getTungstenObject(FirewallPolicy.class, objectReference.getUuid()); + firewallPolicy.removeFirewallRule(firewallRule, new FirewallSequence()); + boolean updated = tungstenApi.updateTungstenObject(firewallPolicy); + if (!updated) { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + boolean deleted = tungstenApi.deleteTungstenObject(firewallRule); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric firewall rule is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenServiceGroupCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(ServiceGroup.class, cmd.getServiceGroupUuid()); + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric service group is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(apiObjectBase); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric service group is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(DeleteTungstenAddressGroupCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(AddressGroup.class, cmd.getAddressGroupUuid()); + if (apiObjectBase == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric address group is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(apiObjectBase); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric address group is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(UpdateTungstenVrouterConfigCommand cmd, int numRetries) { + ApiObjectBase apiObjectBase = tungstenApi.updateTungstenVrouterConfig(cmd.getForwardingMode()); + if (apiObjectBase != null) { + return new TungstenAnswer(cmd, apiObjectBase, true, + "Update Tungsten-Fabric vrouter config is successfully"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(UpdateTungstenDefaultSecurityGroupCommand cmd, int numRetries) { + boolean isUpdated = tungstenApi.updateTungstenDefaultSecurityGroup(cmd.getProjectFqn()); + if (isUpdated) + return new TungstenAnswer(cmd, true, "Update Tungsten-Fabric default security group is successfully"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(CreateTungstenRoutingLogicalRouterCommand cmd, int numRetries) { + Project project = (Project) tungstenApi.getTungstenProjectByFqn(cmd.getProjectFqn()); + if (project == null) { + return new TungstenAnswer(cmd, new IOException()); + } + + ApiObjectBase apiObjectBase = tungstenApi.createRoutingLogicalRouter(project.getUuid(), cmd.getUuid(), cmd.getName()); + + if (apiObjectBase != null) { + List virtualNetworkList = tungstenApi.listConnectedNetworkFromLogicalRouter((LogicalRouter) apiObjectBase); + TungstenModel tungstenModel = new TungstenLogicalRouter((LogicalRouter) apiObjectBase, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric logical router is created"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(AddTungstenNetworkGatewayToLogicalRouterCommand cmd) { + ApiObjectBase apiObjectBase = tungstenApi.addNetworkGatewayToLogicalRouter(cmd.getNetworkUuid(), cmd.getLogicalRouterUuid(), cmd.getIpAddress()); + if (apiObjectBase != null) { + List virtualNetworkList = tungstenApi.listConnectedNetworkFromLogicalRouter((LogicalRouter) apiObjectBase); + TungstenModel tungstenModel = new TungstenLogicalRouter((LogicalRouter) apiObjectBase, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric network was added to logical router"); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + private Answer executeRequest(RemoveTungstenNetworkGatewayFromLogicalRouterCommand cmd) { + ApiObjectBase apiObjectBase = tungstenApi.removeNetworkGatewayFromLogicalRouter(cmd.getNetworkUuid(), cmd.getLogicalRouterUuid()); + + if (apiObjectBase != null) { + List virtualNetworkList = tungstenApi.listConnectedNetworkFromLogicalRouter((LogicalRouter) apiObjectBase); + TungstenModel tungstenModel = new TungstenLogicalRouter((LogicalRouter) apiObjectBase, virtualNetworkList); + return new TungstenAnswer(cmd, tungstenModel, true, "Tungsten-Fabric network was removed from logical router"); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + + private Answer executeRequest(ListTungstenRoutingLogicalRouterCommand cmd, int numRetries) { + List apiObjectBaseList = tungstenApi.listRoutingLogicalRouter(cmd.getLogicalRouterUuid()); + + if (apiObjectBaseList != null) { + List tungstenModelList = new ArrayList<>(); + for(ApiObjectBase apiObjectBase : apiObjectBaseList) { + tungstenModelList.addAll(getTungstenLogicalRouterFromVirtualNetwork(apiObjectBase, cmd.getNetworkUuid())); + } + return new TungstenAnswer(cmd, true, tungstenModelList, "Tungsten-Fabric logical router is listed"); + } else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private List getTungstenLogicalRouterFromVirtualNetwork(ApiObjectBase apiObjectBase, String networkUuid) { + List tungstenModelList = new ArrayList<>(); + List virtualNetworkList = tungstenApi.listConnectedNetworkFromLogicalRouter((LogicalRouter) apiObjectBase); + if (networkUuid != null) { + for(VirtualNetwork virtualNetwork : virtualNetworkList) { + if (virtualNetwork.getUuid().equals(networkUuid)) { + tungstenModelList.add( + new TungstenLogicalRouter((LogicalRouter) apiObjectBase, virtualNetworkList)); + } + } + } else { + tungstenModelList.add(new TungstenLogicalRouter((LogicalRouter) apiObjectBase, virtualNetworkList)); + } + return tungstenModelList; + } + + private Answer executeRequest(DeleteTungstenRoutingLogicalRouterCommand cmd, int numRetries) { + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, cmd.getLogicalRouterUuid()); + if (logicalRouter == null) { + return new TungstenAnswer(cmd, true, "Tungsten-Fabric logical router is not founded"); + } + + boolean deleted = tungstenApi.deleteTungstenObject(logicalRouter); + + if (deleted) + return new TungstenAnswer(cmd, true, "Tungsten-Fabric logical router is deleted"); + else { + if (numRetries > 0) { + return retry(cmd, --numRetries); + } else { + return new TungstenAnswer(cmd, new IOException()); + } + } + } + + private Answer executeRequest(ListTungstenConnectedNetworkFromLogicalRouterCommand cmd) { + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, cmd.getLogicalRouterUuid()); + List networkList = tungstenApi.listConnectedNetworkFromLogicalRouter(logicalRouter); + List apiObjectBaseList = new ArrayList<>(networkList); + return new TungstenAnswer(cmd, apiObjectBaseList, true, "Tungsten-Fabric logical router connected network is listed"); + } + + private Answer executeRequest(CreateTungstenDefaultProjectCommand cmd) { + Project project = tungstenApi.createDefaultTungstenProject(); + return new TungstenAnswer(cmd, project, true, "Tungsten-Fabric default project is created"); + } + + private Answer retry(Command cmd, int numRetries) { + s_logger.warn("Retrying " + cmd.getClass().getSimpleName() + ". Number of retries remaining: " + numRetries); + return executeRequestGroup1(cmd, numRetries); + } + + @Override + public void disconnected() { + // Do nothing + } + + @Override + public boolean start() { + return true; + } + + @Override + public boolean stop() { + return true; + } + + @Override + public IAgentControl getAgentControl() { + return null; + } + + @Override + public void setAgentControl(IAgentControl agentControl) { + // Do nothing + } + + private Answer executeRequest(ReadyCommand cmd) { + return new ReadyAnswer(cmd); + } + + private Answer executeRequest(MaintainCommand cmd) { + return new MaintainAnswer(cmd); + } + + @Override + public void setName(final String name) { + this.name = name; + } + + @Override + public void setConfigParams(final Map params) { + // Do nothing + } + + @Override + public Map getConfigParams() { + return new HashMap<>(); + } + + @Override + public int getRunLevel() { + return 0; + } + + @Override + public void setRunLevel(final int level) { + // Do nothing + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenApi.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenApi.java new file mode 100644 index 00000000000..965ce691b55 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenApi.java @@ -0,0 +1,2790 @@ +// 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.network.tungsten.service; + +import com.cloud.utils.Pair; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; +import net.juniper.tungsten.api.ApiConnector; +import net.juniper.tungsten.api.ApiObjectBase; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.Status; +import net.juniper.tungsten.api.types.ActionListType; +import net.juniper.tungsten.api.types.AddressGroup; +import net.juniper.tungsten.api.types.AddressType; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.ConfigRoot; +import net.juniper.tungsten.api.types.DhcpOptionType; +import net.juniper.tungsten.api.types.DhcpOptionsListType; +import net.juniper.tungsten.api.types.Domain; +import net.juniper.tungsten.api.types.FatFlowProtocols; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.FirewallRule; +import net.juniper.tungsten.api.types.FirewallRuleEndpointType; +import net.juniper.tungsten.api.types.FirewallRuleMatchTagsType; +import net.juniper.tungsten.api.types.FirewallSequence; +import net.juniper.tungsten.api.types.FirewallServiceGroupType; +import net.juniper.tungsten.api.types.FirewallServiceType; +import net.juniper.tungsten.api.types.FloatingIp; +import net.juniper.tungsten.api.types.FloatingIpPool; +import net.juniper.tungsten.api.types.GlobalSystemConfig; +import net.juniper.tungsten.api.types.GlobalVrouterConfig; +import net.juniper.tungsten.api.types.InstanceIp; +import net.juniper.tungsten.api.types.IpamSubnetType; +import net.juniper.tungsten.api.types.KeyValuePairs; +import net.juniper.tungsten.api.types.Loadbalancer; +import net.juniper.tungsten.api.types.LoadbalancerHealthmonitor; +import net.juniper.tungsten.api.types.LoadbalancerHealthmonitorType; +import net.juniper.tungsten.api.types.LoadbalancerListener; +import net.juniper.tungsten.api.types.LoadbalancerListenerType; +import net.juniper.tungsten.api.types.LoadbalancerMember; +import net.juniper.tungsten.api.types.LoadbalancerMemberType; +import net.juniper.tungsten.api.types.LoadbalancerPool; +import net.juniper.tungsten.api.types.LoadbalancerPoolType; +import net.juniper.tungsten.api.types.LoadbalancerType; +import net.juniper.tungsten.api.types.LogicalRouter; +import net.juniper.tungsten.api.types.MacAddressesType; +import net.juniper.tungsten.api.types.NetworkIpam; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.PolicyEntriesType; +import net.juniper.tungsten.api.types.PolicyManagement; +import net.juniper.tungsten.api.types.PolicyRuleType; +import net.juniper.tungsten.api.types.PortMap; +import net.juniper.tungsten.api.types.PortMappings; +import net.juniper.tungsten.api.types.PortType; +import net.juniper.tungsten.api.types.Project; +import net.juniper.tungsten.api.types.SecurityGroup; +import net.juniper.tungsten.api.types.SequenceType; +import net.juniper.tungsten.api.types.ServiceGroup; +import net.juniper.tungsten.api.types.SubnetListType; +import net.juniper.tungsten.api.types.SubnetType; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.TagType; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import net.juniper.tungsten.api.types.VirtualNetworkPolicyType; +import net.juniper.tungsten.api.types.VnSubnetsType; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +public class TungstenApi { + + private static final Logger S_LOGGER = Logger.getLogger(TungstenApi.class); + private static final Status.ErrorHandler errorHandler = S_LOGGER::error; + + public static final String TUNGSTEN_DEFAULT_DOMAIN = "default-domain"; + public static final String TUNGSTEN_DEFAULT_PROJECT = "admin"; + public static final String TUNGSTEN_DEFAULT_IPAM = "default-network-ipam"; + public static final String TUNGSTEN_DEFAULT_POLICY_MANAGEMENT = "default-policy-management"; + public static final String TUNGSTEN_GLOBAL_SYSTEM_CONFIG = "default-global-system-config"; + public static final String TUNGSTEN_GLOBAL_VROUTER_CONFIG = "default-global-vrouter-config"; + public static final String TUNGSTEN_LOCAL_SECURITY_GROUP = "local"; + public static final String TUNGSTEN_DEFAULT = "default"; + + private String hostname; + private String port; + private ApiConnector apiConnector; + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public String getPort() { + return port; + } + + public void setPort(String port) { + this.port = port; + } + + public ApiConnector getApiConnector() { + return apiConnector; + } + + public void setApiConnector(ApiConnector apiConnector) { + this.apiConnector = apiConnector; + } + + public void checkTungstenProviderConnection() { + try { + URL url = new URL("http://" + hostname + ":" + port); + HttpURLConnection huc = (HttpURLConnection) url.openConnection(); + + if (huc.getResponseCode() != 200) { + throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, + "There is not a Tungsten-Fabric provider using hostname: " + hostname + " and port: " + port); + } + } catch (IOException e) { + throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, + "There is not a Tungsten-Fabric provider using hostname: " + hostname + " and port: " + port); + } + } + + public VirtualNetwork createTungstenNetwork(String uuid, String name, String displayName, String parent, + boolean routerExternal, boolean shared, String ipPrefix, int ipPrefixLen, String gateway, boolean dhcpEnable, + String dnsServer, String allocationStart, String allocationEnd, boolean ipFromStart, + boolean isManagementNetwork, String subnetName) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, uuid); + if (virtualNetwork != null) + return virtualNetwork; + Project project = (Project) apiConnector.findById(Project.class, parent); + virtualNetwork = new VirtualNetwork(); + if (subnetName != null) { + NetworkIpam networkIpam = getDefaultProjectNetworkIpam(project); + VnSubnetsType vnSubnetsType = new VnSubnetsType(); + IpamSubnetType ipamSubnetType = getIpamSubnetType(ipPrefix, ipPrefixLen, gateway, dhcpEnable, + ipFromStart, allocationStart, allocationEnd, subnetName, dnsServer); + vnSubnetsType.addIpamSubnets(ipamSubnetType); + virtualNetwork.addNetworkIpam(networkIpam, vnSubnetsType); + } + + if (uuid != null) { + virtualNetwork.setUuid(uuid); + } + + virtualNetwork.setName(name); + virtualNetwork.setDisplayName(displayName); + virtualNetwork.setParent(project); + virtualNetwork.setRouterExternal(routerExternal); + virtualNetwork.setIsShared(shared); + + if (isManagementNetwork) { + VirtualNetwork fabricNetwork = (VirtualNetwork) apiConnector.findByFQN(VirtualNetwork.class, + TungstenUtils.FABRIC_NETWORK_FQN); + if (fabricNetwork != null) { + virtualNetwork.setVirtualNetwork(fabricNetwork); + } + } + + Status status = apiConnector.create(virtualNetwork); + status.ifFailure(errorHandler); + return (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, virtualNetwork.getUuid()); + } catch (IOException e) { + return null; + } + } + + public VirtualMachine createTungstenVirtualMachine(String vmUuid, String vmName) { + try { + VirtualMachine virtualMachine = new VirtualMachine(); + virtualMachine.setName(vmName); + virtualMachine.setUuid(vmUuid); + Status status = apiConnector.create(virtualMachine); + status.ifFailure(errorHandler); + return (VirtualMachine) apiConnector.findById(VirtualMachine.class, virtualMachine.getUuid()); + } catch (IOException e) { + S_LOGGER.error("Unable to create Tungsten-Fabric vm " + vmUuid, e); + return null; + } + } + + public VirtualMachineInterface createTungstenVmInterface(String nicUuid, String nicName, String mac, + String virtualNetworkUuid, String virtualMachineUuid, String projectUuid, String gateway, boolean defaultNic) { + VirtualNetwork virtualNetwork = null; + VirtualMachine virtualMachine = null; + Project project = null; + + try { + virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, virtualNetworkUuid); + virtualMachine = (VirtualMachine) apiConnector.findById(VirtualMachine.class, virtualMachineUuid); + project = (Project) apiConnector.findById(Project.class, projectUuid); + } catch (IOException e) { + S_LOGGER.error("Failed getting the resources needed for virtual machine interface creation from Tungsten-Fabric"); + } + + VirtualMachineInterface virtualMachineInterface = new VirtualMachineInterface(); + try { + virtualMachineInterface.setUuid(nicUuid); + virtualMachineInterface.setName(nicName); + virtualMachineInterface.setVirtualNetwork(virtualNetwork); + virtualMachineInterface.setVirtualMachine(virtualMachine); + virtualMachineInterface.setParent(project); + virtualMachineInterface.setPortSecurityEnabled(false); + MacAddressesType macAddressesType = new MacAddressesType(); + macAddressesType.addMacAddress(mac); + virtualMachineInterface.setMacAddresses(macAddressesType); + if (defaultNic) { + DhcpOptionsListType dhcpOptionsListType = new DhcpOptionsListType(); + dhcpOptionsListType.addDhcpOption(new DhcpOptionType("3", gateway)); + virtualMachineInterface.setDhcpOptionList(dhcpOptionsListType); + } + Status status = apiConnector.create(virtualMachineInterface); + status.ifFailure(errorHandler); + return (VirtualMachineInterface) apiConnector.findById(VirtualMachineInterface.class, + virtualMachineInterface.getUuid()); + } catch (IOException e) { + S_LOGGER.error("Failed creating virtual machine interface in Tungsten-Fabric"); + return null; + } + } + + public InstanceIp createTungstenInstanceIp(String instanceIpName, String ip, String virtualNetworkUuid, + String vmInterfaceUuid) { + VirtualNetwork virtualNetwork; + VirtualMachineInterface virtualMachineInterface; + + try { + virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, virtualNetworkUuid); + virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById(VirtualMachineInterface.class, + vmInterfaceUuid); + } catch (IOException e) { + S_LOGGER.error("Failed getting the resources needed for instance ip creation from Tungsten-Fabric"); + return null; + } + + try { + InstanceIp instanceIp = new InstanceIp(); + instanceIp.setName(instanceIpName); + instanceIp.setVirtualNetwork(virtualNetwork); + instanceIp.setVirtualMachineInterface(virtualMachineInterface); + instanceIp.setAddress(ip); + Status status = apiConnector.create(instanceIp); + status.ifFailure(errorHandler); + return (InstanceIp) apiConnector.findById(InstanceIp.class, instanceIp.getUuid()); + } catch (IOException e) { + S_LOGGER.error("Failed creating instance ip in Tungsten-Fabric"); + return null; + } + } + + public InstanceIp createTungstenInstanceIp(String instanceIpName, String ip, String virtualNetworkUuid, + String vmInterfaceUuid, String subnetUuid) { + VirtualNetwork virtualNetwork; + VirtualMachineInterface virtualMachineInterface; + + try { + virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, virtualNetworkUuid); + virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById(VirtualMachineInterface.class, + vmInterfaceUuid); + } catch (IOException e) { + S_LOGGER.error("Failed getting the resources needed for instance ip creation with subnet from Tungsten-Fabric"); + return null; + } + + try { + InstanceIp instanceIp = new InstanceIp(); + instanceIp.setName(instanceIpName); + instanceIp.setVirtualNetwork(virtualNetwork); + instanceIp.setVirtualMachineInterface(virtualMachineInterface); + instanceIp.setAddress(ip); + instanceIp.setSubnetUuid(subnetUuid); + Status status = apiConnector.create(instanceIp); + status.ifFailure(errorHandler); + return (InstanceIp) apiConnector.findById(InstanceIp.class, instanceIp.getUuid()); + } catch (IOException e) { + S_LOGGER.error("Failed creating instance ip in Tungsten-Fabric"); + return null; + } + } + + public boolean deleteTungstenVmInterface(VirtualMachineInterface vmi) { + try { + List> instanceIpORs = vmi.getInstanceIpBackRefs(); + if (instanceIpORs != null) { + for (ObjectReference instanceIpOR : instanceIpORs) { + Status status = apiConnector.delete(InstanceIp.class, instanceIpOR.getUuid()); + status.ifFailure(errorHandler); + } + } + Status status = apiConnector.delete(vmi); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + S_LOGGER.error("Failed deleting the virtual machine interface from Tungsten-Fabric"); + return false; + } + } + + public NetworkIpam getDefaultProjectNetworkIpam(Project project) { + try { + List names = new ArrayList<>(); + Domain domain = (Domain) apiConnector.findById(Domain.class, project.getParentUuid()); + names.add(domain.getName()); + names.add(project.getName()); + names.add(TUNGSTEN_DEFAULT_IPAM); + String ipamUuid = apiConnector.findByName(NetworkIpam.class, names); + if (ipamUuid == null) { + NetworkIpam defaultIpam = new NetworkIpam(); + defaultIpam.setName(TUNGSTEN_DEFAULT_IPAM); + defaultIpam.setParent(project); + Status status = apiConnector.create(defaultIpam); + status.ifFailure(errorHandler); + ipamUuid = defaultIpam.getUuid(); + } + return (NetworkIpam) apiConnector.findById(NetworkIpam.class, ipamUuid); + } catch (IOException ex) { + return null; + } + } + + public ApiObjectBase getTungstenObject(Class aClass, String uuid) { + try { + return apiConnector.findById(aClass, uuid); + } catch (IOException ex) { + return null; + } + } + + public ApiObjectBase getTungstenProjectByFqn(String fqn) { + try { + return apiConnector.findByFQN(Project.class, Objects.requireNonNullElse(fqn, TUNGSTEN_DEFAULT_DOMAIN + ":" + TUNGSTEN_DEFAULT_PROJECT)); + } catch (IOException ex) { + return null; + } + } + + public ApiObjectBase getTungstenObjectByName(Class aClass, List parent, + String name) { + try { + if (parent == null) { + List names = new ArrayList<>(); + names.add(name); + String uuid = apiConnector.findByName(aClass, names); + return apiConnector.findById(aClass, uuid); + } else { + List names = new ArrayList<>(parent); + names.add(name); + String uuid = apiConnector.findByName(aClass, names); + return apiConnector.findById(aClass, uuid); + } + } catch (IOException ex) { + return null; + } + } + + public ApiObjectBase createTungstenLogicalRouter(String name, String parentUuid, String pubNetworkUuid) { + try { + Project project = (Project) apiConnector.findById(Project.class, parentUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, + pubNetworkUuid); + LogicalRouter logicalRouter = (LogicalRouter) apiConnector.find(LogicalRouter.class, project, name); + if (logicalRouter == null) { + logicalRouter = new LogicalRouter(); + logicalRouter.setName(name); + logicalRouter.setParent(project); + logicalRouter.setVirtualNetwork(virtualNetwork, null); + Status status = apiConnector.create(logicalRouter); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(LogicalRouter.class, logicalRouter.getUuid()); + } else { + return null; + } + } else { + return logicalRouter; + } + } catch (IOException ex) { + return null; + } + } + + public ApiObjectBase createTungstenGatewayVmi(String name, String projectUuid, String vnUuid) { + try { + Project project = (Project) apiConnector.findById(Project.class, projectUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, vnUuid); + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.find( + VirtualMachineInterface.class, project, name); + + if (virtualMachineInterface != null) { + S_LOGGER.error("interface " + name + " is existed"); + return null; + } + + virtualMachineInterface = new VirtualMachineInterface(); + virtualMachineInterface.setName(name); + virtualMachineInterface.setParent(project); + virtualMachineInterface.setVirtualNetwork(virtualNetwork); + virtualMachineInterface.setPortSecurityEnabled(false); + Status status = apiConnector.create(virtualMachineInterface); + status.ifFailure(errorHandler); + return apiConnector.findById(VirtualMachineInterface.class, virtualMachineInterface.getUuid()); + } catch (IOException ex) { + return null; + } + } + + public ApiObjectBase createTungstenLbVmi(String name, String projectUuid, String vnUuid) { + try { + Project project = (Project) apiConnector.findById(Project.class, projectUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, vnUuid); + VirtualMachineInterface virtualMachineInterface = new VirtualMachineInterface(); + virtualMachineInterface.setName(name); + virtualMachineInterface.setParent(project); + virtualMachineInterface.setVirtualNetwork(virtualNetwork); + //add this when tungsten support cloudstack + virtualMachineInterface.setDeviceOwner("CS:LOADBALANCER"); + virtualMachineInterface.setPortSecurityEnabled(false); + Status status = apiConnector.create(virtualMachineInterface); + status.ifFailure(errorHandler); + return apiConnector.findById(VirtualMachineInterface.class, virtualMachineInterface.getUuid()); + } catch (IOException ex) { + return null; + } + } + + public boolean updateTungstenObject(ApiObjectBase apiObjectBase) { + try { + Status status = apiConnector.update(apiObjectBase); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException ex) { + return false; + } + } + + public ApiObjectBase createTungstenFloatingIpPool(String networkUuid, String fipName) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + FloatingIpPool floatingIpPool = (FloatingIpPool) apiConnector.find(FloatingIpPool.class, virtualNetwork, + fipName); + if (floatingIpPool == null) { + floatingIpPool = new FloatingIpPool(); + floatingIpPool.setName(fipName); + floatingIpPool.setParent(virtualNetwork); + Status status = apiConnector.create(floatingIpPool); + status.ifFailure(errorHandler); + return apiConnector.findById(FloatingIpPool.class, floatingIpPool.getUuid()); + } else { + return floatingIpPool; + } + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenFloatingIp(String projectUuid, String networkUuid, String fipName, String name, + String publicIp) { + try { + Project project = (Project) apiConnector.findById(Project.class, projectUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + FloatingIpPool fip = (FloatingIpPool) apiConnector.find(FloatingIpPool.class, virtualNetwork, fipName); + FloatingIp floatingIp = (FloatingIp) apiConnector.find(FloatingIp.class, fip, name); + if (floatingIp == null) { + floatingIp = new FloatingIp(); + floatingIp.setName(name); + floatingIp.setParent(fip); + floatingIp.setProject(project); + floatingIp.setAddress(publicIp); + Status status = apiConnector.create(floatingIp); + status.ifFailure(errorHandler); + return apiConnector.findById(FloatingIp.class, floatingIp.getUuid()); + } else { + return floatingIp; + } + } catch (IOException e) { + return null; + } + } + + public boolean assignTungstenFloatingIp(String networkUuid, String vmiUuid, String fipName, String name, + String privateIp) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + FloatingIpPool fip = (FloatingIpPool) apiConnector.find(FloatingIpPool.class, virtualNetwork, fipName); + VirtualMachineInterface vmi = (VirtualMachineInterface) apiConnector.findById(VirtualMachineInterface.class, + vmiUuid); + FloatingIp floatingIp = (FloatingIp) apiConnector.find(FloatingIp.class, fip, name); + floatingIp.setVirtualMachineInterface(vmi); + floatingIp.setFixedIpAddress(privateIp); + Status status = apiConnector.update(floatingIp); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean releaseTungstenFloatingIp(String networkUuid, String fipName, String name) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + FloatingIpPool fip = (FloatingIpPool) apiConnector.find(FloatingIpPool.class, virtualNetwork, fipName); + FloatingIp floatingIp = (FloatingIp) apiConnector.find(FloatingIp.class, fip, name); + if (floatingIp == null) { + return true; + } + floatingIp.clearVirtualMachineInterface(); + floatingIp.setFixedIpAddress(null); + Status status = apiConnector.update(floatingIp); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public String getTungstenNatIp(String projectUuid, String logicalRouterUuid) { + // wait for service instance created + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + S_LOGGER.error("can not delay for service instance create"); + } + + try { + Project project = (Project) apiConnector.findById(Project.class, projectUuid); + List instanceIps = (List) apiConnector.list(InstanceIp.class, null); + if (instanceIps != null) { + for (InstanceIp instanceIp : instanceIps) { + if (instanceIp.getQualifiedName() + .get(0) + .startsWith( + TungstenUtils.getSnatNetworkStartName(project.getQualifiedName(), logicalRouterUuid)) + && instanceIp.getQualifiedName().get(0).endsWith(TungstenUtils.SNAT_NETWORK_END_NAME)) { + InstanceIp natInstanceIp = (InstanceIp) apiConnector.findById(InstanceIp.class, + instanceIp.getUuid()); + if (natInstanceIp != null) { + return natInstanceIp.getAddress(); + } + } + } + } + return null; + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createOrUpdateTungstenNetworkPolicy(String name, String projectUuid, + List tungstenRuleList) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.find(NetworkPolicy.class, project, name); + PolicyEntriesType policyEntriesType; + if (networkPolicy == null) { + policyEntriesType = new PolicyEntriesType(); + + getPolicyEntriesType(tungstenRuleList, policyEntriesType); + + networkPolicy = new NetworkPolicy(); + networkPolicy.setName(name); + networkPolicy.setParent(project); + networkPolicy.setEntries(policyEntriesType); + + Status status = apiConnector.create(networkPolicy); + status.ifFailure(errorHandler); + } else { + policyEntriesType = networkPolicy.getEntries(); + if (policyEntriesType == null) { + policyEntriesType = new PolicyEntriesType(); + networkPolicy.setEntries(policyEntriesType); + } + + getPolicyEntriesType(tungstenRuleList, policyEntriesType); + + Status status = apiConnector.update(networkPolicy); + status.ifFailure(errorHandler); + } + return apiConnector.findById(NetworkPolicy.class, networkPolicy.getUuid()); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase applyTungstenNetworkPolicy(String policyUuid, String networkUuid, int majorSequence, + int minorSequence) { + try { + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, policyUuid); + VirtualNetwork network = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + + if (networkPolicy == null || network == null) { + return null; + } + + List> objectReferenceList = network.getNetworkPolicy(); + if (objectReferenceList != null) { + for (ObjectReference objectReference : objectReferenceList) { + if (objectReference.getUuid().equals(networkPolicy.getUuid())) { + return networkPolicy; + } + } + } + + network.addNetworkPolicy(networkPolicy, + new VirtualNetworkPolicyType(new SequenceType(majorSequence, minorSequence))); + network.setPerms2(null); + Status status = apiConnector.update(network); + status.ifFailure(errorHandler); + return apiConnector.findById(NetworkPolicy.class, policyUuid); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase getTungstenFabricNetwork() { + try { + return apiConnector.findByFQN(VirtualNetwork.class, TungstenUtils.FABRIC_NETWORK_FQN); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenDomain(String domainName, String domainUuid) { + try { + Domain domain = (Domain) apiConnector.findById(Domain.class, domainUuid); + if (domain != null) + return domain; + //create tungsten domain + Domain tungstenDomain = new Domain(); + tungstenDomain.setDisplayName(domainName); + tungstenDomain.setName(domainName); + tungstenDomain.setUuid(domainUuid); + Status status = apiConnector.create(tungstenDomain); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + // create default project in tungsten for this newly created domain + Project tungstenDefaultProject = new Project(); + tungstenDefaultProject.setDisplayName(TUNGSTEN_DEFAULT_PROJECT); + tungstenDefaultProject.setName(TUNGSTEN_DEFAULT_PROJECT); + tungstenDefaultProject.setParent(tungstenDomain); + Status defaultProjectStatus = apiConnector.create(tungstenDefaultProject); + defaultProjectStatus.ifFailure(errorHandler); + } + return getTungstenObject(Domain.class, tungstenDomain.getUuid()); + } catch (IOException e) { + throw new CloudRuntimeException("Failed creating domain resource in Tungsten-Fabric."); + } + } + + public ApiObjectBase createTungstenProject(String projectName, String projectUuid, String domainUuid, + String domainName) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + if (project != null) + return project; + //Create tungsten project + Project tungstenProject = new Project(); + tungstenProject.setDisplayName(projectName); + tungstenProject.setName(projectName); + tungstenProject.setUuid(projectUuid); + Domain tungstenDomain; + + if (domainUuid == null && domainName == null) + tungstenDomain = getDefaultTungstenDomain(); + else { + tungstenDomain = (Domain) getTungstenObject(Domain.class, domainUuid); + if (tungstenDomain == null) + tungstenDomain = (Domain) createTungstenDomain(domainName, domainUuid); + } + tungstenProject.setParent(tungstenDomain); + apiConnector.create(tungstenProject); + return getTungstenObject(Project.class, tungstenProject.getUuid()); + } catch (IOException e) { + throw new CloudRuntimeException("Failed creating project resource in Tungsten-Fabric."); + } + } + + public boolean deleteTungstenDomain(String domainUuid) { + try { + Domain domain = (Domain) getTungstenObject(Domain.class, domainUuid); + //delete the projects of this domain + for (ObjectReference project : domain.getProjects()) { + apiConnector.delete(Project.class, project.getUuid()); + } + Status status = apiConnector.delete(Domain.class, domainUuid); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean deleteTungstenProject(String projectUuid) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + if (project != null) { + Status status = apiConnector.delete(Project.class, projectUuid); + status.ifFailure(errorHandler); + return status.isSuccess(); + } + return true; + } catch (IOException e) { + return false; + } + } + + public Domain getDefaultTungstenDomain() throws IOException { + return (Domain) apiConnector.findByFQN(Domain.class, TUNGSTEN_DEFAULT_DOMAIN); + } + + public ApiObjectBase createTungstenLoadbalancer(String projectUuid, String lbName, String vmiUuid, + String subnetUuid, String privateIp) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, vmiUuid); + LoadbalancerType loadbalancerType = new LoadbalancerType(); + loadbalancerType.setVipSubnetId(subnetUuid); + loadbalancerType.setVipAddress(privateIp); + loadbalancerType.setAdminState(true); + loadbalancerType.setOperatingStatus("ONLINE"); + loadbalancerType.setProvisioningStatus("ACTIVE"); + + Loadbalancer loadbalancer = new Loadbalancer(); + loadbalancer.setName(lbName); + loadbalancer.setParent(project); + loadbalancer.setProperties(loadbalancerType); + loadbalancer.setProvider("opencontrail"); + loadbalancer.setVirtualMachineInterface(virtualMachineInterface); + Status status = apiConnector.create(loadbalancer); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(Loadbalancer.class, loadbalancer.getUuid()); + } else { + return null; + } + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenLoadbalancerListener(String projectUuid, String loadBalancerUuid, String name, + String protocol, int port) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + Loadbalancer loadbalancer = (Loadbalancer) apiConnector.findById(Loadbalancer.class, loadBalancerUuid); + LoadbalancerListenerType loadbalancerListenerType = new LoadbalancerListenerType(); + loadbalancerListenerType.setConnectionLimit(-1); + loadbalancerListenerType.setAdminState(true); + loadbalancerListenerType.setProtocol(protocol); + loadbalancerListenerType.setProtocolPort(port); + + LoadbalancerListener loadbalancerListener = new LoadbalancerListener(); + loadbalancerListener.setName(name); + loadbalancerListener.setParent(project); + loadbalancerListener.setLoadbalancer(loadbalancer); + loadbalancerListener.setProperties(loadbalancerListenerType); + Status status = apiConnector.create(loadbalancerListener); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(LoadbalancerListener.class, loadbalancerListener.getUuid()); + } else { + return null; + } + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenLoadbalancerHealthMonitor(String projectUuid, String name, String monitorType, + int maxRetries, int delay, int timeout, String httpMethod, String urlPath, String expectedCode) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LoadbalancerHealthmonitorType loadbalancerHealthmonitorType = new LoadbalancerHealthmonitorType(); + loadbalancerHealthmonitorType.setMonitorType(monitorType); + loadbalancerHealthmonitorType.setMaxRetries(maxRetries); + loadbalancerHealthmonitorType.setDelay(delay); + loadbalancerHealthmonitorType.setAdminState(true); + loadbalancerHealthmonitorType.setTimeout(timeout); + if (monitorType.equals("HTTP")) { + loadbalancerHealthmonitorType.setHttpMethod(httpMethod); + loadbalancerHealthmonitorType.setUrlPath(urlPath); + loadbalancerHealthmonitorType.setExpectedCodes(expectedCode); + } + + LoadbalancerHealthmonitor loadbalancerHealthmonitor = new LoadbalancerHealthmonitor(); + loadbalancerHealthmonitor.setName(name); + loadbalancerHealthmonitor.setParent(project); + loadbalancerHealthmonitor.setProperties(loadbalancerHealthmonitorType); + Status status = apiConnector.create(loadbalancerHealthmonitor); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(LoadbalancerHealthmonitor.class, loadbalancerHealthmonitor.getUuid()); + } else { + return null; + } + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenLoadbalancerPool(String projectUuid, String loadbalancerlistenerUuid, + String loadbalancerHealthmonitorUuid, String name, String method, String protocol) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LoadbalancerListener loadbalancerListener = (LoadbalancerListener) apiConnector.findById( + LoadbalancerListener.class, loadbalancerlistenerUuid); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = (LoadbalancerHealthmonitor) apiConnector.findById( + LoadbalancerHealthmonitor.class, loadbalancerHealthmonitorUuid); + LoadbalancerPoolType loadbalancerPoolType = new LoadbalancerPoolType(); + loadbalancerPoolType.setLoadbalancerMethod(method); + loadbalancerPoolType.setProtocol(protocol); + loadbalancerPoolType.setAdminState(true); + + LoadbalancerPool loadbalancerPool = new LoadbalancerPool(); + loadbalancerPool.setName(name); + loadbalancerPool.setParent(project); + loadbalancerPool.setLoadbalancerListener(loadbalancerListener); + loadbalancerPool.setLoadbalancerHealthmonitor(loadbalancerHealthmonitor); + loadbalancerPool.setProperties(loadbalancerPoolType); + Status status = apiConnector.create(loadbalancerPool); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(LoadbalancerPool.class, loadbalancerPool.getUuid()); + } else { + return null; + } + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenLoadbalancerMember(String loadbalancerPoolUuid, String name, String address, + String subnetUuid, int port, int weight) { + try { + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) apiConnector.findById(LoadbalancerPool.class, + loadbalancerPoolUuid); + LoadbalancerMemberType loadbalancerMemberType = new LoadbalancerMemberType(); + loadbalancerMemberType.setAddress(address); + loadbalancerMemberType.setAdminState(true); + loadbalancerMemberType.setProtocolPort(port); + loadbalancerMemberType.setSubnetId(subnetUuid); + loadbalancerMemberType.setWeight(weight); + + LoadbalancerMember loadbalancerMember = new LoadbalancerMember(); + loadbalancerMember.setName(name); + loadbalancerMember.setParent(loadbalancerPool); + loadbalancerMember.setProperties(loadbalancerMemberType); + Status status = apiConnector.create(loadbalancerMember); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(LoadbalancerMember.class, loadbalancerMember.getUuid()); + } else { + return null; + } + } catch (IOException e) { + return null; + } + } + + public boolean updateLoadBalancerMember(String projectUuid, String lbPoolName, + List listTungstenLoadBalancerMember, String subnetUuid) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) apiConnector.find(LoadbalancerPool.class, project, + lbPoolName); + List> listMember = loadbalancerPool.getLoadbalancerMembers(); + + if (listMember != null) { + for (ObjectReference member : listMember) { + Status status = apiConnector.delete(LoadbalancerMember.class, member.getUuid()); + status.ifFailure(errorHandler); + if (!status.isSuccess()) { + return false; + } + } + } + + for (TungstenLoadBalancerMember tungstenLoadBalancerMember : listTungstenLoadBalancerMember) { + LoadbalancerMemberType loadbalancerMemberType = new LoadbalancerMemberType(); + loadbalancerMemberType.setAddress(tungstenLoadBalancerMember.getIpAddress()); + loadbalancerMemberType.setProtocolPort(tungstenLoadBalancerMember.getPort()); + loadbalancerMemberType.setSubnetId(subnetUuid); + loadbalancerMemberType.setAdminState(true); + loadbalancerMemberType.setWeight(tungstenLoadBalancerMember.getWeight()); + LoadbalancerMember loadbalancerMember = new LoadbalancerMember(); + loadbalancerMember.setName(tungstenLoadBalancerMember.getName()); + loadbalancerMember.setParent(loadbalancerPool); + loadbalancerMember.setProperties(loadbalancerMemberType); + Status status = apiConnector.create(loadbalancerMember); + status.ifFailure(errorHandler); + if (!status.isSuccess()) { + return false; + } + } + return true; + } catch (IOException e) { + return false; + } + } + + public boolean updateLoadBalancerPool(String projectUuid, String lbPoolName, String lbMethod, + String lbSessionPersistence, String lbPersistenceCookieName, String lbProtocol, boolean statEnable, + String statsPort, String statsUri, String statsAuth) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) apiConnector.find(LoadbalancerPool.class, project, + lbPoolName); + LoadbalancerPoolType loadbalancerPoolType = loadbalancerPool.getProperties(); + if (lbMethod != null) { + loadbalancerPoolType.setLoadbalancerMethod(lbMethod); + } + if (lbSessionPersistence != null) { + loadbalancerPoolType.setSessionPersistence(lbSessionPersistence); + } + if (lbPersistenceCookieName != null) { + loadbalancerPoolType.setPersistenceCookieName(lbPersistenceCookieName); + } + if (lbProtocol != null) { + loadbalancerPoolType.setProtocol(lbProtocol); + } + + if (statEnable) { + KeyValuePairs keyValuePairs = new KeyValuePairs(); + keyValuePairs.addKeyValuePair("stats_enable", "enable"); + keyValuePairs.addKeyValuePair("stats_port", statsPort); + keyValuePairs.addKeyValuePair("stats_realm", "Haproxy Statistics"); + keyValuePairs.addKeyValuePair("stats_uri", statsUri); + keyValuePairs.addKeyValuePair("stats_auth", statsAuth); + loadbalancerPool.setCustomAttributes(keyValuePairs); + } + + Status status = apiConnector.update(loadbalancerPool); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean updateLoadBalancerListener(String projectUuid, String listenerName, String protocol, int port, + String url) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LoadbalancerListener loadbalancerListener = (LoadbalancerListener) apiConnector.find( + LoadbalancerListener.class, project, listenerName); + LoadbalancerListenerType loadbalancerListenerType = loadbalancerListener.getProperties(); + loadbalancerListenerType.setProtocolPort(port); + loadbalancerListenerType.setProtocol(protocol); + loadbalancerListenerType.setDefaultTlsContainer(url); + Status status = apiConnector.update(loadbalancerListener); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean updateLoadBalancerHealthMonitor(String projectUuid, String healthMonitorName, String type, + int retry, int timeout, int interval, String httpMethod, String expectedCode, String urlPath) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = (LoadbalancerHealthmonitor) apiConnector.find( + LoadbalancerHealthmonitor.class, project, healthMonitorName); + LoadbalancerHealthmonitorType loadbalancerHealthmonitorType = new LoadbalancerHealthmonitorType(); + loadbalancerHealthmonitorType.setMonitorType(type); + loadbalancerHealthmonitorType.setMaxRetries(retry); + loadbalancerHealthmonitorType.setTimeout(timeout); + loadbalancerHealthmonitorType.setDelay(interval); + loadbalancerHealthmonitorType.setHttpMethod(httpMethod); + loadbalancerHealthmonitorType.setExpectedCodes(expectedCode); + loadbalancerHealthmonitorType.setUrlPath(urlPath); + loadbalancerHealthmonitorType.setAdminState(true); + loadbalancerHealthmonitor.setProperties(loadbalancerHealthmonitorType); + Status status = apiConnector.update(loadbalancerHealthmonitor); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean updateLBServiceInstanceFatFlow(String publicNetworkUuid, String floatingIpPoolName, + String floatingIpName) { + boolean result = true; + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, + publicNetworkUuid); + FloatingIpPool floatingIpPool = (FloatingIpPool) apiConnector.find(FloatingIpPool.class, virtualNetwork, + floatingIpPoolName); + FloatingIp floatingIp = (FloatingIp) apiConnector.find(FloatingIp.class, floatingIpPool, floatingIpName); + List> listRefVmi = floatingIp.getVirtualMachineInterface(); + for (ObjectReference refVmi : listRefVmi) { + if (refVmi.getReferredName().get(refVmi.getReferredName().size() - 1).contains("right__1")) { + String siUuid = refVmi.getUuid(); + VirtualMachineInterface vmi = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, siUuid); + FatFlowProtocols fatFlowProtocols = vmi.getFatFlowProtocols(); + if (fatFlowProtocols != null) { + fatFlowProtocols.clearFatFlowProtocol(); + Status status = apiConnector.update(vmi); + status.ifFailure(errorHandler); + result = result && status.isSuccess(); + } + } + } + + return result; + } catch (IOException e) { + return false; + } + } + + public boolean applyTungstenPortForwarding(boolean isAdd, String publicNetworkUuid, String floatingIpPoolName, + String floatingIpName, String vmiUuid, String protocol, int publicPort, int privatePort) { + try { + FloatingIp floatingIp; + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, + publicNetworkUuid); + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, vmiUuid); + FloatingIpPool floatingIpPool = (FloatingIpPool) apiConnector.find(FloatingIpPool.class, virtualNetwork, + floatingIpPoolName); + if (isAdd) { + floatingIp = addFloatingIp(virtualMachineInterface, floatingIpPool, floatingIpName + , protocol, publicPort, privatePort); + } else { + floatingIp = removeFloatingIp(virtualMachineInterface, floatingIpPool, floatingIpName + , protocol, publicPort, privatePort); + } + + Status status = apiConnector.update(floatingIp); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + private FloatingIp addFloatingIp(VirtualMachineInterface virtualMachineInterface, FloatingIpPool floatingIpPool, + String floatingIpName, String protocol, int publicPort, int privatePort) throws IOException { + FloatingIp floatingIp = (FloatingIp) apiConnector.find(FloatingIp.class, floatingIpPool, floatingIpName); + PortMappings portMappings = floatingIp.getPortMappings(); + if (portMappings == null) { + portMappings = new PortMappings(); + } + + portMappings.addPortMappings(protocol, publicPort, privatePort); + floatingIp.setPortMappings(portMappings); + floatingIp.addVirtualMachineInterface(virtualMachineInterface); + floatingIp.setPortMappingsEnable(true); + return floatingIp; + } + + private FloatingIp removeFloatingIp(VirtualMachineInterface virtualMachineInterface, + FloatingIpPool floatingIpPool, String floatingIpName, String protocol, int publicPort, int privatePort) throws IOException { + FloatingIp floatingIp = (FloatingIp) apiConnector.find(FloatingIp.class, floatingIpPool, floatingIpName); + PortMappings portMappings = floatingIp.getPortMappings(); + if (portMappings != null) { + List portMapList = portMappings.getPortMappings(); + List removePortMapList = new ArrayList<>(); + for (PortMap portMap : portMapList) { + if (portMap.getProtocol().equals(protocol) && portMap.getSrcPort() == publicPort + && portMap.getDstPort() == privatePort) { + removePortMapList.add(portMap); + } + } + portMapList.removeAll(removePortMapList); + } + + floatingIp.removeVirtualMachineInterface(virtualMachineInterface); + + if (floatingIp.getVirtualMachineInterface() == null + || floatingIp.getVirtualMachineInterface().isEmpty()) { + floatingIp.setPortMappingsEnable(false); + } + return floatingIp; + } + + public boolean addTungstenNetworkSubnetCommand(String networkUuid, String ipPrefix, int ipPrefixLen, String gateway, + boolean dhcpEnable, String dnsServer, String allocationStart, String allocationEnd, boolean ipFromStart, + String subnetName) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + if (virtualNetwork == null) { + return false; + } + Project project = (Project) apiConnector.findById(Project.class, virtualNetwork.getParentUuid()); + NetworkIpam networkIpam = getDefaultProjectNetworkIpam(project); + + if (networkIpam == null) { + return false; + } + + IpamSubnetType ipamSubnetType = getIpamSubnetType(ipPrefix, ipPrefixLen, gateway, dhcpEnable, ipFromStart, + allocationStart, allocationEnd, subnetName, dnsServer); + List> objectReferenceList = virtualNetwork.getNetworkIpam(); + + if (objectReferenceList != null && objectReferenceList.size() == 1) { + VnSubnetsType vnSubnetsType = objectReferenceList.get(0).getAttr(); + vnSubnetsType.addIpamSubnets(ipamSubnetType); + } else { + VnSubnetsType vnSubnetsType = new VnSubnetsType(); + vnSubnetsType.addIpamSubnets(ipamSubnetType); + virtualNetwork.addNetworkIpam(networkIpam, vnSubnetsType); + } + + virtualNetwork.setPerms2(null); + Status status = apiConnector.update(virtualNetwork); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean removeTungstenNetworkSubnetCommand(String networkUuid, String subnetName) { + try { + boolean clear = false; + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + if (virtualNetwork == null) { + return true; + } + + List> objectReferenceList = virtualNetwork.getNetworkIpam(); + if (objectReferenceList == null) { + return true; + } + + for (ObjectReference vnSubnetsTypeObjectReference : objectReferenceList) { + VnSubnetsType vnSubnetsType = vnSubnetsTypeObjectReference.getAttr(); + List ipamSubnetTypeList = vnSubnetsType.getIpamSubnets(); + + List removeIpamSubnetTypelist = new ArrayList<>(); + for (IpamSubnetType ipamSubnetType : ipamSubnetTypeList) { + if (ipamSubnetType.getSubnetName().equals(subnetName)) { + removeIpamSubnetTypelist.add(ipamSubnetType); + } + } + + if (ipamSubnetTypeList.size() != removeIpamSubnetTypelist.size()) { + ipamSubnetTypeList.removeAll(removeIpamSubnetTypelist); + } else { + clear = true; + } + } + + if (clear) { + virtualNetwork.clearNetworkIpam(); + } + + virtualNetwork.setPerms2(null); + + Status status = apiConnector.update(virtualNetwork); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public ApiObjectBase createTungstenTagType(String uuid, String name) { + try { + TagType tagType = new TagType(); + tagType.setUuid(uuid); + tagType.setName(name); + Status status = apiConnector.create(tagType); + status.ifFailure(errorHandler); + return apiConnector.findById(TagType.class, tagType.getUuid()); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenTag(final String uuid, final String tagType, final String tagValue, final String tagId) { + try { + Tag tag = new Tag(); + tag.setUuid(uuid); + tag.setName(tagType + "=" + tagValue); + tag.setTypeName(tagType); + tag.setValue(tagValue); + tag.setParent(new ConfigRoot()); + if (tagId != null) { + tag.setId(tagId); + } + Status status = apiConnector.create(tag); + status.ifFailure(errorHandler); + return apiConnector.findById(Tag.class, tag.getUuid()); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenApplicationPolicySet(String uuid, String name) { + try { + String policyManagementUuid = apiConnector.findByName(PolicyManagement.class, new ConfigRoot(), TUNGSTEN_DEFAULT_POLICY_MANAGEMENT); + PolicyManagement policyManagement = (PolicyManagement) apiConnector.findById(PolicyManagement.class, policyManagementUuid); + if (policyManagement == null) { + return null; + } + + ApplicationPolicySet applicationPolicySet = new ApplicationPolicySet(); + applicationPolicySet.setUuid(uuid); + applicationPolicySet.setName(name); + applicationPolicySet.setParent(policyManagement); + Status status = apiConnector.create(applicationPolicySet); + status.ifFailure(errorHandler); + return apiConnector.findById(ApplicationPolicySet.class, applicationPolicySet.getUuid()); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenFirewallPolicy(String uuid, String applicationPolicySetUuid, String name, int sequence) { + try { + String policyManagementUuid = apiConnector.findByName(PolicyManagement.class, new ConfigRoot(), TUNGSTEN_DEFAULT_POLICY_MANAGEMENT); + PolicyManagement policyManagement = (PolicyManagement) apiConnector.findById(PolicyManagement.class, policyManagementUuid); + if (policyManagement == null) { + return null; + } + + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) apiConnector.findById(ApplicationPolicySet.class, applicationPolicySetUuid); + List> objectReferenceList = applicationPolicySet.getTag(); + FirewallPolicy firewallPolicy = new FirewallPolicy(); + firewallPolicy.setUuid(uuid); + firewallPolicy.setName(name); + firewallPolicy.setParent(policyManagement); + if (objectReferenceList != null && !objectReferenceList.isEmpty()) { + for (ObjectReference objectReference : objectReferenceList) { + Tag tag = (Tag) apiConnector.findById(Tag.class, objectReference.getUuid()); + firewallPolicy.setTag(tag); + } + } + Status status = apiConnector.create(firewallPolicy); + status.ifFailure(errorHandler); + + if (status.isSuccess()) { + applicationPolicySet.addFirewallPolicy(firewallPolicy, new FirewallSequence(String.valueOf(sequence))); + Status update = apiConnector.update(applicationPolicySet); + update.ifFailure(errorHandler); + if (update.isSuccess()) { + return apiConnector.findById(FirewallPolicy.class, firewallPolicy.getUuid()); + } else { + apiConnector.delete(firewallPolicy); + } + } + return null; + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenFirewallRule(String uuid, String firewallPolicyUuid, String name, String action, String serviceGroupUuid, + String srcTagUuid, String srcAddressGroupUuid, String srcNetworkUuid, String direction, String destTagUuid, + String destAddressGroupUuid, String destNetworkUuid, String tagTypeUuid, int sequence) { + try { + String policyManagementUuid = apiConnector.findByName(PolicyManagement.class, new ConfigRoot(), TUNGSTEN_DEFAULT_POLICY_MANAGEMENT); + PolicyManagement policyManagement = (PolicyManagement) apiConnector.findById(PolicyManagement.class, policyManagementUuid); + if (policyManagement == null) { + return null; + } + FirewallPolicy firewallPolicy = (FirewallPolicy) apiConnector.findById(FirewallPolicy.class, firewallPolicyUuid); + if (firewallPolicy == null) { + return null; + } + ServiceGroup serviceGroup = (ServiceGroup) apiConnector.findById(ServiceGroup.class, serviceGroupUuid); + AddressGroup srcAddressGroup = (AddressGroup) apiConnector.findById(AddressGroup.class, + srcAddressGroupUuid); + AddressGroup destAddressGroup = (AddressGroup) apiConnector.findById(AddressGroup.class, + destAddressGroupUuid); + VirtualNetwork srcNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, srcNetworkUuid); + VirtualNetwork destNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, destNetworkUuid); + Tag srcTag = (Tag) apiConnector.findById(Tag.class, srcTagUuid); + Tag destTag = (Tag) apiConnector.findById(Tag.class, destTagUuid); + TagType tagType = (TagType) apiConnector.findById(TagType.class, tagTypeUuid); + if (serviceGroup == null) { + return null; + } + + if (srcAddressGroup == null && srcTag == null && srcNetwork == null) { + return null; + } + + if (destAddressGroup == null && destTag == null && destNetwork == null) { + return null; + } + + FirewallRule firewallRule = new FirewallRule(); + firewallRule.setUuid(uuid); + firewallRule.setName(name); + firewallRule.setParent(policyManagement); + firewallRule.setActionList(new ActionListType(action)); + firewallRule.setServiceGroup(serviceGroup); + FirewallRuleEndpointType srcFirewallRuleEndpointType = new FirewallRuleEndpointType(); + if (srcTag != null) { + srcFirewallRuleEndpointType.addTags("global:" + srcTag.getName()); + srcFirewallRuleEndpointType.addTagIds(Integer.decode(srcTag.getId())); + } + + if (srcAddressGroup != null) { + String srcAddressGroupName = StringUtils.join(srcAddressGroup.getQualifiedName(), ":"); + srcFirewallRuleEndpointType.setAddressGroup(srcAddressGroupName); + } + + if (srcNetwork != null) { + srcFirewallRuleEndpointType.setVirtualNetwork(StringUtils.join(srcNetwork.getQualifiedName(), ":")); + } + + FirewallRuleEndpointType destFirewallRuleEndpointType = new FirewallRuleEndpointType(); + if (destTag != null) { + destFirewallRuleEndpointType.addTags("global:" + destTag.getName()); + destFirewallRuleEndpointType.addTagIds(Integer.decode(destTag.getId())); + } + + if (destAddressGroup != null) { + String destAddressGroupName = StringUtils.join(destAddressGroup.getQualifiedName(), ":"); + destFirewallRuleEndpointType.setAddressGroup(destAddressGroupName); + } + + if (destNetwork != null) { + destFirewallRuleEndpointType.setVirtualNetwork(StringUtils.join(destNetwork.getQualifiedName(), ":")); + } + + firewallRule.setEndpoint1(srcFirewallRuleEndpointType); + firewallRule.setDirection(direction); + firewallRule.setEndpoint2(destFirewallRuleEndpointType); + FirewallRuleMatchTagsType firewallRuleMatchTagsType = new FirewallRuleMatchTagsType(); + if (tagType != null) { + firewallRuleMatchTagsType.addTag(tagType.getName()); + firewallRule.setMatchTags(firewallRuleMatchTagsType); + } + + return createFirewallRule(firewallPolicy, firewallRule, sequence); + } catch (IOException e) { + return null; + } + } + + private ApiObjectBase createFirewallRule(FirewallPolicy firewallPolicy, FirewallRule firewallRule, int sequence) throws IOException { + Status status = apiConnector.create(firewallRule); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + firewallPolicy.addFirewallRule(firewallRule, new FirewallSequence(String.valueOf(sequence))); + Status updated = apiConnector.update(firewallPolicy); + updated.ifFailure(errorHandler); + if (updated.isSuccess()) { + return apiConnector.findById(FirewallRule.class, firewallRule.getUuid()); + } else { + apiConnector.delete(firewallRule); + } + } + return null; + } + + public ApiObjectBase createTungstenServiceGroup(String uuid, String name, String protocol, int startPort, + int endPort) { + try { + String policyManagementUuid = apiConnector.findByName(PolicyManagement.class, new ConfigRoot(), TUNGSTEN_DEFAULT_POLICY_MANAGEMENT); + PolicyManagement policyManagement = (PolicyManagement) apiConnector.findById(PolicyManagement.class, policyManagementUuid); + if (policyManagement == null) { + return null; + } + + ServiceGroup serviceGroup = new ServiceGroup(); + serviceGroup.setUuid(uuid); + serviceGroup.setName(name); + serviceGroup.setParent(policyManagement); + FirewallServiceType firewallServiceType = new FirewallServiceType(); + firewallServiceType.setProtocol(protocol); + firewallServiceType.setSrcPorts(new PortType(0)); + firewallServiceType.setDstPorts(new PortType(startPort, endPort)); + FirewallServiceGroupType firewallServiceGroupType = new FirewallServiceGroupType(); + firewallServiceGroupType.addFirewallService(firewallServiceType); + serviceGroup.setFirewallServiceList(firewallServiceGroupType); + Status status = apiConnector.create(serviceGroup); + status.ifFailure(errorHandler); + return apiConnector.findById(ServiceGroup.class, serviceGroup.getUuid()); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenAddressGroup(String uuid, String name, String ipPrefix, int ipPrefixLen) { + try { + String policyManagementUuid = apiConnector.findByName(PolicyManagement.class, new ConfigRoot(), TUNGSTEN_DEFAULT_POLICY_MANAGEMENT); + PolicyManagement policyManagement = (PolicyManagement) apiConnector.findById(PolicyManagement.class, policyManagementUuid); + if (policyManagement == null) { + return null; + } + + AddressGroup addressGroup = new AddressGroup(); + addressGroup.setUuid(uuid); + addressGroup.setName(name); + SubnetListType subnetListType = new SubnetListType(); + subnetListType.addSubnet(ipPrefix, ipPrefixLen); + addressGroup.setPrefix(subnetListType); + addressGroup.setParent(policyManagement); + Status status = apiConnector.create(addressGroup); + status.ifFailure(errorHandler); + return apiConnector.findById(AddressGroup.class, addressGroup.getUuid()); + } catch (IOException e) { + return null; + } + } + + public boolean applyTungstenNetworkTag(List networkUuids, String tagUuid) { + try { + boolean result = true; + for (String networkUuid : networkUuids) { + Tag tag = (Tag) apiConnector.findById(Tag.class, tagUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, + networkUuid); + virtualNetwork.addTag(tag); + Status status = apiConnector.update(virtualNetwork); + status.ifFailure(errorHandler); + result = result && status.isSuccess(); + } + return result; + } catch (IOException e) { + return false; + } + } + + public boolean applyTungstenVmTag(List vmUuids, String tagUuid) { + try { + boolean result = true; + Tag tag = (Tag) apiConnector.findById(Tag.class, tagUuid); + for (String vmUuid : vmUuids) { + VirtualMachine virtualMachine = (VirtualMachine) apiConnector.findById(VirtualMachine.class, vmUuid); + virtualMachine.addTag(tag); + Status status = apiConnector.update(virtualMachine); + status.ifFailure(errorHandler); + result = result && status.isSuccess(); + } + return result; + } catch (IOException e) { + return false; + } + } + + public boolean applyTungstenNicTag(List nicUuids, String tagUuid) { + try { + boolean result = true; + Tag tag = (Tag) apiConnector.findById(Tag.class, tagUuid); + for (String nicUuid : nicUuids) { + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, nicUuid); + virtualMachineInterface.addTag(tag); + Status status = apiConnector.update(virtualMachineInterface); + status.ifFailure(errorHandler); + result = result && status.isSuccess(); + } + return result; + } catch (IOException e) { + return false; + } + } + + public boolean applyTungstenPolicyTag(String policyUuid, String tagUuid) { + try { + Tag tag = (Tag) apiConnector.findById(Tag.class, tagUuid); + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, policyUuid); + networkPolicy.addTag(tag); + Status status = apiConnector.update(networkPolicy); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean applyTungstenApplicationPolicySetTag(String applicationPolicySetUuid, String tagUuid) { + try { + Tag tag = (Tag) apiConnector.findById(Tag.class, tagUuid); + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) apiConnector.findById(ApplicationPolicySet.class, applicationPolicySetUuid); + applicationPolicySet.addTag(tag); + Status status = apiConnector.update(applicationPolicySet); + status.ifFailure(errorHandler); + + List> firewallPolicyList = applicationPolicySet.getFirewallPolicy(); + if (firewallPolicyList != null && !firewallPolicyList.isEmpty()) { + for(ObjectReference objectReference : firewallPolicyList) { + FirewallPolicy firewallPolicy = (FirewallPolicy) apiConnector.findById(FirewallPolicy.class, objectReference.getUuid()); + firewallPolicy.setTag(tag); + Status updateFirewallPolicyStatus = apiConnector.update(firewallPolicy); + updateFirewallPolicyStatus.ifFailure(errorHandler); + } + } + + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public ApiObjectBase removeTungstenTag(List networkUuids, List vmUuids, List nicUuids, + String policyUuid, String applicationPolicySetUuid, String tagUuid) { + try { + Tag tag = (Tag) getTungstenObject(Tag.class, tagUuid); + if (tag == null) { + return null; + } + + removeTungstenNetworkTag(tag, networkUuids); + removeTungstenVmTag(tag, vmUuids); + removeTungstenNicTag(tag, nicUuids); + removeTungstenNetworkPolicyTag(tag, policyUuid); + removeTungstenApplicationPolicySetTag(tag, applicationPolicySetUuid); + + return apiConnector.findById(Tag.class, tagUuid); + } catch (IOException e) { + return null; + } + } + + private void removeTungstenNetworkTag(Tag tag, List networkUuids) throws IOException { + if (networkUuids != null) { + for (String networkUuid : networkUuids) { + VirtualNetwork virtualNetwork = (VirtualNetwork) getTungstenObject(VirtualNetwork.class, + networkUuid); + if (virtualNetwork != null) { + virtualNetwork.removeTag(tag); + Status status = apiConnector.update(virtualNetwork); + status.ifFailure(errorHandler); + } + } + } + } + + private void removeTungstenVmTag(Tag tag, List vmUuids) throws IOException { + if (vmUuids != null) { + for (String vmUuid : vmUuids) { + VirtualMachine virtualMachine = (VirtualMachine) getTungstenObject(VirtualMachine.class, vmUuid); + if (virtualMachine != null) { + virtualMachine.removeTag(tag); + Status status = apiConnector.update(virtualMachine); + status.ifFailure(errorHandler); + } + } + } + } + + private void removeTungstenNicTag(Tag tag, List nicUuids) throws IOException { + if (nicUuids != null) { + for (String nicUuid : nicUuids) { + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) getTungstenObject( + VirtualMachineInterface.class, nicUuid); + if (virtualMachineInterface != null) { + virtualMachineInterface.removeTag(tag); + Status status = apiConnector.update(virtualMachineInterface); + status.ifFailure(errorHandler); + } + } + } + } + + private void removeTungstenNetworkPolicyTag(Tag tag, String policyUuid) throws IOException { + if (policyUuid != null) { + NetworkPolicy networkPolicy = (NetworkPolicy) getTungstenObject(NetworkPolicy.class, policyUuid); + if (networkPolicy != null) { + networkPolicy.removeTag(tag); + Status status = apiConnector.update(networkPolicy); + status.ifFailure(errorHandler); + } + } + } + + private void removeTungstenApplicationPolicySetTag(Tag tag, String applicationPolicySetUuid) throws IOException { + if (applicationPolicySetUuid != null) { + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) getTungstenObject(ApplicationPolicySet.class, applicationPolicySetUuid); + if (applicationPolicySet != null) { + applicationPolicySet.removeTag(tag); + Status status = apiConnector.update(applicationPolicySet); + status.ifFailure(errorHandler); + } + } + } + + public ApiObjectBase removeTungstenPolicy(String networkUuid, String policyUuid) { + try { + NetworkPolicy networkPolicy = (NetworkPolicy) getTungstenObject(NetworkPolicy.class, policyUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) getTungstenObject(VirtualNetwork.class, networkUuid); + if (networkPolicy != null && virtualNetwork != null) { + virtualNetwork.removeNetworkPolicy(networkPolicy, new VirtualNetworkPolicyType()); + Status status = apiConnector.update(virtualNetwork); + status.ifFailure(errorHandler); + return apiConnector.findById(NetworkPolicy.class, policyUuid); + } + return null; + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenPolicy(final String uuid, final String name, final String projectUuid) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + NetworkPolicy networkPolicy = new NetworkPolicy(); + networkPolicy.setUuid(uuid); + networkPolicy.setName(name); + networkPolicy.setParent(project); + Status status = apiConnector.create(networkPolicy); + status.ifFailure(errorHandler); + return apiConnector.findById(NetworkPolicy.class, networkPolicy.getUuid()); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase addTungstenPolicyRule(final String uuid, final String policyUuid, final String action, + final String protocol, final String direction, final String srcNetwork, final String srcIpPrefix, + final int srcIpPrefixLen, final int srcStartPort, final int srcEndPort, final String destNetwork, + final String destIpPrefix, final int destIpPrefixLen, final int destStartPort, final int destEndPort) { + try { + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, policyUuid); + PolicyEntriesType policyEntriesType = networkPolicy.getEntries(); + if (policyEntriesType == null) { + policyEntriesType = new PolicyEntriesType(); + networkPolicy.setEntries(policyEntriesType); + } + + PolicyRuleType policyRuleType = new PolicyRuleType(); + policyRuleType.setActionList(new ActionListType(action)); + policyRuleType.setProtocol(protocol); + policyRuleType.setRuleUuid(uuid); + policyRuleType.setDirection(direction); + + AddressType srcAddressType = new AddressType(); + if (srcNetwork != null) { + srcAddressType.setVirtualNetwork(srcNetwork); + } + + if (srcIpPrefix != null) { + srcAddressType.addSubnet(new SubnetType(srcIpPrefix, srcIpPrefixLen)); + } + + AddressType dstAddressType = new AddressType(); + if (destNetwork != null) { + dstAddressType.setVirtualNetwork(destNetwork); + } + + if (destIpPrefix != null) { + dstAddressType.addSubnet(new SubnetType(destIpPrefix, destIpPrefixLen)); + } + policyRuleType.addSrcAddresses(srcAddressType); + policyRuleType.addDstAddresses(dstAddressType); + policyRuleType.addSrcPorts(srcStartPort, srcEndPort); + policyRuleType.addDstPorts(destStartPort, destEndPort); + + policyEntriesType.addPolicyRule(policyRuleType); + Status status = apiConnector.update(networkPolicy); + status.ifFailure(errorHandler); + return apiConnector.findById(NetworkPolicy.class, policyUuid); + } catch (IOException e) { + return null; + } + } + + public List listTungstenAddressPolicy(String projectUuid, String policyName) { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + List networkPolicyList = new ArrayList<>(); + NetworkPolicy networkPolicy = (NetworkPolicy) getTungstenObjectByName(NetworkPolicy.class, + project.getQualifiedName(), policyName); + + if (networkPolicy != null) { + networkPolicyList.add(networkPolicy); + } + + return networkPolicyList; + } + + public List listTungstenPolicy(String projectUuid, String policyUuid) { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + return getTungstenListObject(NetworkPolicy.class, project, policyUuid); + } + + public List listTungstenNetwork(String projectUuid, String networkUuid) { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + return getTungstenListObject(VirtualNetwork.class, project, networkUuid); + } + + public List listTungstenVm(String projectUuid, String vmUuid) { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + return getTungstenListObject(VirtualMachine.class, project, vmUuid); + } + + public List listTungstenNic(String projectUuid, String nicUuid) { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + return getTungstenListObject(VirtualMachineInterface.class, project, nicUuid); + } + + public List listTungstenTag(String networkUuid, String vmUuid, String nicUuid, + String policyUuid, String applicationPolicySetUuid, String tagUuid) { + try { + List tagList; + + if (networkUuid != null) { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, + networkUuid); + tagList = getTungstenListTag(virtualNetwork.getTag()); + } else if (vmUuid != null) { + VirtualMachine virtualMachine = (VirtualMachine) apiConnector.findById(VirtualMachine.class, vmUuid); + tagList = getTungstenListTag(virtualMachine.getTag()); + } else if (nicUuid != null) { + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, nicUuid); + tagList = getTungstenListTag(virtualMachineInterface.getTag()); + } else if (policyUuid != null) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, policyUuid); + tagList = getTungstenListTag(networkPolicy.getTag()); + } else if (applicationPolicySetUuid != null) { + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) apiConnector.findById(ApplicationPolicySet.class, applicationPolicySetUuid); + tagList = getTungstenListTag(applicationPolicySet.getTag()); + } else { + tagList = getTungstenListTag(); + } + + return getObjectList(filterSystemTag(tagList), tagUuid); + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public List listTungstenTagType(String tagTypeUuid) { + try { + List tagTypeList = new ArrayList<>(); + if (tagTypeUuid != null) { + TagType tagType = (TagType) apiConnector.findById(TagType.class, tagTypeUuid); + if (tagType != null) { + tagTypeList.add(tagType); + } + } else { + List list = (List) apiConnector.list(TagType.class, null); + if (list != null) { + for (TagType tagType : list) { + tagTypeList.add((TagType) apiConnector.findById(TagType.class, tagType.getUuid())); + } + } + } + return filterSystemTagType(tagTypeList); + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public List listTungstenNetworkPolicy(String networkUuid, String policyUuid) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + List networkPolicyList = new ArrayList<>(); + if (virtualNetwork == null) + return networkPolicyList; + + List> objectReferenceList = virtualNetwork.getNetworkPolicy(); + if (objectReferenceList != null) { + for (ObjectReference objectReference : objectReferenceList) { + if (policyUuid == null) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, + objectReference.getUuid()); + networkPolicyList.add(networkPolicy); + } else { + if (objectReference.getUuid().equals(policyUuid)) { + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, + objectReference.getUuid()); + networkPolicyList.add(networkPolicy); + } + } + } + } + + return networkPolicyList; + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public List listTungstenApplicationPolicySet(String applicationPolicySetUuid) { + try { + List applicationPolicySetList = new ArrayList<>(); + if (applicationPolicySetUuid != null) { + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) apiConnector.findById( + ApplicationPolicySet.class, applicationPolicySetUuid); + if (applicationPolicySet != null) { + applicationPolicySetList.add(applicationPolicySet); + } + } else { + List list = (List) apiConnector.list( + ApplicationPolicySet.class, null); + if (list != null) { + for (ApplicationPolicySet applicationPolicySet : list) { + List qualifiedName = applicationPolicySet.getQualifiedName(); + if (qualifiedName.get(0).equals(TUNGSTEN_DEFAULT_POLICY_MANAGEMENT)) { + applicationPolicySetList.add( + (ApplicationPolicySet) apiConnector.findById(ApplicationPolicySet.class, + applicationPolicySet.getUuid())); + } + } + } + } + return filterSystemApplicationPolicySet(applicationPolicySetList); + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public List listTungstenFirewallPolicy(String applicationPolicySetUuid, + String firewallPolicyUuid) { + try { + if (applicationPolicySetUuid != null) { + return listTungstenFirewallPolicyWithUuid(applicationPolicySetUuid, firewallPolicyUuid); + } else { + return listTungstenFirewallPolicyWithoutUuid(firewallPolicyUuid); + } + } catch (IOException e) { + return new ArrayList<>(); + } + } + + private List listTungstenFirewallPolicyWithUuid(String applicationPolicySetUuid, String firewallPolicyUuid) throws IOException { + List firewallPolicyList = new ArrayList<>(); + ApplicationPolicySet applicationPolicySet = (ApplicationPolicySet) apiConnector.findById( + ApplicationPolicySet.class, applicationPolicySetUuid); + List> objectReferenceList = applicationPolicySet.getFirewallPolicy(); + if (objectReferenceList != null) { + for (ObjectReference objectReference : objectReferenceList) { + FirewallPolicy firewallPolicy = (FirewallPolicy) apiConnector.findById(FirewallPolicy.class, + objectReference.getUuid()); + if (firewallPolicyUuid != null) { + if (objectReference.getUuid().equals(firewallPolicyUuid)) { + firewallPolicyList.add(firewallPolicy); + } + } else { + firewallPolicyList.add(firewallPolicy); + } + } + } + return firewallPolicyList; + } + + private List listTungstenFirewallPolicyWithoutUuid(String firewallPolicyUuid) throws IOException { + List firewallPolicyList = new ArrayList<>(); + List firewallPolicies = (List) apiConnector.list(FirewallPolicy.class, + null); + if (firewallPolicies != null) { + for (FirewallPolicy firewallPolicy : firewallPolicies) { + if (firewallPolicyUuid != null) { + if (firewallPolicy.getUuid().equals(firewallPolicyUuid)) { + firewallPolicyList.add(apiConnector.findById(FirewallPolicy.class, firewallPolicyUuid)); + } + } else { + String parentName = firewallPolicy.getQualifiedName().get(0); + if (parentName.equals(TUNGSTEN_DEFAULT_POLICY_MANAGEMENT)) { + firewallPolicyList.add(apiConnector.findById(FirewallPolicy.class, firewallPolicy.getUuid())); + } + } + } + } + return firewallPolicyList; + } + + public List listTungstenFirewallRule(String firewallPolicyUuid, String firewallRuleUuid) { + try { + if (firewallPolicyUuid != null) { + return listTungstenFirewallRuleWithUuid(firewallPolicyUuid, firewallRuleUuid); + } else { + return listTungstenFirewallRuleWithoutUuid(firewallRuleUuid); + } + } catch (IOException e) { + return new ArrayList<>(); + } + } + + private List listTungstenFirewallRuleWithUuid(String firewallPolicyUuid, String firewallRuleUuid) throws IOException { + List firewallRuleList = new ArrayList<>(); + FirewallPolicy firewallPolicy = (FirewallPolicy) apiConnector.findById(FirewallPolicy.class, + firewallPolicyUuid); + List> objectReferenceList = firewallPolicy.getFirewallRule(); + if (objectReferenceList != null) { + for (ObjectReference objectReference : objectReferenceList) { + FirewallRule firewallRule = (FirewallRule) apiConnector.findById(FirewallRule.class, + objectReference.getUuid()); + if (firewallRuleUuid != null) { + if (objectReference.getUuid().equals(firewallRuleUuid)) { + firewallRuleList.add(firewallRule); + } + } else { + firewallRuleList.add(firewallRule); + } + } + } + return firewallRuleList; + } + + private List listTungstenFirewallRuleWithoutUuid(String firewallRuleUuid) throws IOException { + List firewallRuleList = new ArrayList<>(); + List firewallRules = (List) apiConnector.list(FirewallRule.class, null); + if (firewallRules != null) { + for (FirewallRule firewallRule : firewallRules) { + if (firewallRuleUuid != null) { + if (firewallRule.getUuid().equals(firewallRuleUuid)) { + firewallRuleList.add(apiConnector.findById(FirewallRule.class, firewallRuleUuid)); + } + } else { + String parentName = firewallRule.getQualifiedName().get(0); + if (parentName.equals(TUNGSTEN_DEFAULT_POLICY_MANAGEMENT)) { + firewallRuleList.add(apiConnector.findById(FirewallRule.class, firewallRule.getUuid())); + } + } + } + } + return firewallRuleList; + } + + public List listTungstenServiceGroup(String serviceGroupUuid) { + try { + List serviceGroupList = new ArrayList<>(); + List serviceGroups = (List) apiConnector.list(ServiceGroup.class, null); + + if (serviceGroups == null) { + return new ArrayList<>(); + } + + for (ServiceGroup serviceGroup : serviceGroups) { + if (serviceGroupUuid != null) { + if (serviceGroup.getUuid().equals(serviceGroupUuid)) { + serviceGroupList.add(apiConnector.findById(ServiceGroup.class, serviceGroupUuid)); + } + } else { + String parentName = serviceGroup.getQualifiedName().get(0); + if (parentName.equals(TUNGSTEN_DEFAULT_POLICY_MANAGEMENT)) { + serviceGroupList.add(apiConnector.findById(ServiceGroup.class, serviceGroup.getUuid())); + } + } + } + return serviceGroupList; + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public List listTungstenAddressGroup(String addressGroupUuid) { + try { + List addressGroupList = new ArrayList<>(); + List addressGroups = (List) apiConnector.list(AddressGroup.class, null); + if (addressGroups == null) { + return new ArrayList<>(); + } + + for (AddressGroup addressGroup : addressGroups) { + if (addressGroupUuid != null) { + if (addressGroup.getUuid().equals(addressGroupUuid)) { + addressGroupList.add(apiConnector.findById(AddressGroup.class, addressGroupUuid)); + } + } else { + String parentName = addressGroup.getQualifiedName().get(0); + if (parentName.equals(TUNGSTEN_DEFAULT_POLICY_MANAGEMENT)) { + addressGroupList.add(apiConnector.findById(AddressGroup.class, addressGroup.getUuid())); + } + } + } + return addressGroupList; + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public ApiObjectBase removeTungstenNetworkPolicyRule(String policyUuid, String ruleUuid) { + try { + NetworkPolicy networkPolicy = (NetworkPolicy) apiConnector.findById(NetworkPolicy.class, policyUuid); + PolicyEntriesType policyEntriesType = networkPolicy.getEntries(); + List policyRuleTypeList = policyEntriesType.getPolicyRule(); + PolicyRuleType removePolicyRuleType = null; + for (PolicyRuleType policyRuleType : policyRuleTypeList) { + if (policyRuleType.getRuleUuid().equals(ruleUuid)) { + removePolicyRuleType = policyRuleType; + } + } + policyRuleTypeList.remove(removePolicyRuleType); + Status status = apiConnector.update(networkPolicy); + status.ifFailure(errorHandler); + return apiConnector.findById(NetworkPolicy.class, policyUuid); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase updateTungstenVrouterConfig(String forwardingMode) { + try { + String globalVrouterConfigUuid = apiConnector.findByName(GlobalSystemConfig.class, new ConfigRoot(), TUNGSTEN_GLOBAL_SYSTEM_CONFIG); + GlobalSystemConfig globalSystemConfig = (GlobalSystemConfig) apiConnector.findById(GlobalSystemConfig.class, globalVrouterConfigUuid); + GlobalVrouterConfig globalVrouterConfig = (GlobalVrouterConfig) apiConnector.find(GlobalVrouterConfig.class, + globalSystemConfig, TUNGSTEN_GLOBAL_VROUTER_CONFIG); + if (globalVrouterConfig == null) { + return null; + } + globalVrouterConfig.setForwardingMode(forwardingMode); + Status status = apiConnector.update(globalVrouterConfig); + status.ifFailure(errorHandler); + return apiConnector.findById(GlobalVrouterConfig.class, globalVrouterConfig.getUuid()); + } catch (IOException e) { + return null; + } + } + + public boolean deleteTungstenObject(ApiObjectBase apiObjectBase) { + try { + Status status = apiConnector.delete(apiObjectBase); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean deleteTungstenObject(Class cls, String uuid) { + try { + Status status = apiConnector.delete(cls, uuid); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public List getTungstenListObject(Class cls, ApiObjectBase parent, + String uuid) { + try { + List resultList = new ArrayList<>(); + if (uuid != null) { + resultList.add(apiConnector.findById(cls, uuid)); + } else { + List list = apiConnector.list(cls, parent.getQualifiedName()); + if (list != null) { + for (ApiObjectBase object : list) { + resultList.add(apiConnector.findById(object.getClass(), object.getUuid())); + } + } + } + return resultList; + } catch (IOException e) { + return new ArrayList<>(); + } + } + + private IpamSubnetType getIpamSubnetType(String ipPrefix, int ipPrefixLen, String gateway, boolean dhcpEnable, + boolean ipFromStart, String allocationStart, String allocationEnd, String subnetName, String dnsServer) { + IpamSubnetType ipamSubnetType = new IpamSubnetType(); + ipamSubnetType.setSubnetName(subnetName); + ipamSubnetType.setSubnet(new SubnetType(ipPrefix, ipPrefixLen)); + ipamSubnetType.setDefaultGateway(gateway != null ? gateway : TungstenUtils.ALL_IP4_PREFIX); + ipamSubnetType.setEnableDhcp(dhcpEnable); + ipamSubnetType.setAddrFromStart(ipFromStart); + ipamSubnetType.setDnsServerAddress(dnsServer); + + if (allocationStart != null && allocationEnd != null) { + ipamSubnetType.addAllocationPools(allocationStart, allocationEnd, false); + } + + return ipamSubnetType; + } + + private PolicyRuleType getPolicyRuleType(TungstenRule tungstenRule) { + PolicyRuleType policyRuleType = new PolicyRuleType(); + if (tungstenRule.getUuid() != null) { + policyRuleType.setRuleUuid(tungstenRule.getUuid()); + } + policyRuleType.setActionList(new ActionListType(tungstenRule.getAction())); + policyRuleType.setDirection(tungstenRule.getDirection()); + policyRuleType.setProtocol(tungstenRule.getProtocol()); + return policyRuleType; + } + + private void getPolicyEntriesType(List tungstenRuleList, PolicyEntriesType policyEntriesType) { + for (TungstenRule tungstenRule : tungstenRuleList) { + PolicyRuleType policyRuleType = getPolicyRuleType(tungstenRule); + AddressType srcAddressType = new AddressType(); + AddressType dstAddressType = new AddressType(); + String srcIpPrefix = tungstenRule.getSrcIpPrefix(); + int srcIpPrefixLen = tungstenRule.getSrcIpPrefixLen(); + String dstIpPrefix = tungstenRule.getDstIpPrefix(); + int dstIpPrefixLen = tungstenRule.getDstIpPrefixLen(); + String srcNetwork = getSrcNetwork(tungstenRule); + String dstNetwork = getDstNetwork(tungstenRule); + + if (srcIpPrefix == null || srcIpPrefix.isEmpty() || srcIpPrefix.isBlank()) { + srcIpPrefix = TungstenUtils.ALL_IP4_PREFIX; + srcIpPrefixLen = 0; + } + + if (dstIpPrefix == null || dstIpPrefix.isEmpty() || dstIpPrefix.isBlank()) { + dstIpPrefix = TungstenUtils.ALL_IP4_PREFIX; + dstIpPrefixLen = 0; + } + + if (!srcNetwork.equals(TungstenUtils.ANY)) { + srcAddressType.setVirtualNetwork(srcNetwork); + } else { + srcAddressType.setSubnet(new SubnetType(srcIpPrefix, srcIpPrefixLen)); + } + + if (!dstNetwork.equals(TungstenUtils.ANY)) { + dstAddressType.setVirtualNetwork(dstNetwork); + } else { + dstAddressType.setSubnet(new SubnetType(dstIpPrefix, dstIpPrefixLen)); + } + + policyRuleType.addSrcAddresses(srcAddressType); + policyRuleType.addDstAddresses(dstAddressType); + policyRuleType.addSrcPorts(tungstenRule.getSrcStartPort(), tungstenRule.getSrcEndPort()); + policyRuleType.addDstPorts(tungstenRule.getDstStartPort(), tungstenRule.getDstEndPort()); + policyEntriesType.addPolicyRule(policyRuleType); + } + } + + private String getSrcNetwork(TungstenRule tungstenRule) { + String srcNetwork = tungstenRule.getSrcNetwork(); + if (srcNetwork == null || srcNetwork.isEmpty() || srcNetwork.isBlank()) { + return TungstenUtils.ANY; + } else { + return srcNetwork; + } + } + + private String getDstNetwork(TungstenRule tungstenRule) { + String dstNetwork = tungstenRule.getDstNetwork(); + if (dstNetwork == null || dstNetwork.isEmpty() || dstNetwork.isBlank()) { + return TungstenUtils.ANY; + } else { + return dstNetwork; + } + } + + public String getSubnetUuid(String networkUuid) { + try { + String subnetUuid = null; + VirtualNetwork network = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + if (network != null) { + List> listIpam = network.getNetworkIpam(); + if (listIpam != null) { + for (ObjectReference objectReference : listIpam) { + VnSubnetsType vnSubnetsType = objectReference.getAttr(); + List ipamSubnetTypeList = vnSubnetsType.getIpamSubnets(); + for (IpamSubnetType ipamSubnetType : ipamSubnetTypeList) { + subnetUuid = ipamSubnetType.getSubnetUuid(); + } + } + } + return subnetUuid; + } + return null; + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase createTungstenSecurityGroup(String securityGroupUuid, String securityGroupName, + String securityGroupDescription, String projectFqn) { + try { + SecurityGroup tungstenSecurityGroup = (SecurityGroup) apiConnector.findById(SecurityGroup.class, + securityGroupUuid); + if (tungstenSecurityGroup != null) { + return tungstenSecurityGroup; + } + Project project = (Project) getTungstenProjectByFqn(projectFqn); + tungstenSecurityGroup = new SecurityGroup(); + tungstenSecurityGroup.setUuid(securityGroupUuid); + tungstenSecurityGroup.setName(securityGroupName); + tungstenSecurityGroup.setDisplayName(securityGroupDescription); + tungstenSecurityGroup.setParent(project); + Status status = apiConnector.create(tungstenSecurityGroup); + status.ifFailure(errorHandler); + if (status.isSuccess()) { + return apiConnector.findById(SecurityGroup.class, tungstenSecurityGroup.getUuid()); + } else { + return null; + } + } catch (IOException e) { + return null; + } + } + + public boolean addTungstenSecurityGroupRule(String tungstenSecurityGroupUuid, String securityGroupRuleUuid, + String securityGroupRuleType, int startPort, int endPort, String target, String etherType, String protocol) { + try { + SecurityGroup securityGroup = (SecurityGroup) getTungstenObject(SecurityGroup.class, + tungstenSecurityGroupUuid); + if (securityGroup == null) { + return false; + } + + PolicyEntriesType policyEntriesType = securityGroup.getEntries(); + if (policyEntriesType == null) { + policyEntriesType = new PolicyEntriesType(); + securityGroup.setEntries(policyEntriesType); + } + + PolicyRuleType policyRuleType = createPolicyRuleType(securityGroupRuleUuid, securityGroupRuleType, + startPort, endPort, target, etherType, protocol); + + policyEntriesType.addPolicyRule(policyRuleType); + Status status = apiConnector.update(securityGroup); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean removeTungstenSecurityGroupRule(String tungstenSecurityGroupUuid, String securityGroupRuleUuid) { + try { + SecurityGroup securityGroup = (SecurityGroup) getTungstenObject(SecurityGroup.class, + tungstenSecurityGroupUuid); + if (securityGroup == null) { + return false; + } + List existingPolicyRules = securityGroup.getEntries().getPolicyRule(); + securityGroup.getEntries().clearPolicyRule(); + for (PolicyRuleType policyRule : existingPolicyRules) { + if (!policyRule.getRuleUuid().equals(securityGroupRuleUuid)) { + securityGroup.getEntries().addPolicyRule(policyRule); + } + } + Status status = apiConnector.update(securityGroup); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + private PolicyRuleType createPolicyRuleType(String securityGroupRuleUuid, String securityGroupRuleType, + int startPort, int endPort, String target, String etherType, String protocol) { + AddressType addressType; + String tungstenProtocol; + String tungstenEthertType; + if (NetUtils.isValidIp4Cidr(target) || NetUtils.isValidIp6Cidr(target)) { + Pair pair = NetUtils.getCidr(target); + addressType = new AddressType(new SubnetType(pair.first(), pair.second())); + tungstenProtocol = TungstenUtils.getTungstenProtocol(protocol, target); + tungstenEthertType = TungstenUtils.getEthertTypeFromCidr(target); + } else { + addressType = new AddressType(null, null, target); + tungstenProtocol = etherType.equals(TungstenUtils.IPV4) ? + TungstenUtils.getTungstenProtocol(protocol, NetUtils.ALL_IP4_CIDRS) : + TungstenUtils.getTungstenProtocol(protocol, NetUtils.ALL_IP6_CIDRS); + tungstenEthertType = etherType; + } + + PolicyRuleType policyRuleType = new PolicyRuleType(); + policyRuleType.setDirection(TungstenUtils.ONE_WAY_DIRECTION); + policyRuleType.setProtocol(tungstenProtocol); + policyRuleType.setEthertype(tungstenEthertType); + policyRuleType.setRuleUuid(securityGroupRuleUuid); + + if (securityGroupRuleType.equals(TungstenUtils.INGRESS_RULE)) { + policyRuleType.addSrcAddresses(addressType); + policyRuleType.addSrcPorts(new PortType(0, 65535)); + policyRuleType.addDstAddresses(new AddressType(null, null, TUNGSTEN_LOCAL_SECURITY_GROUP, null)); + policyRuleType.addDstPorts(new PortType(startPort, endPort)); + } else if (securityGroupRuleType.equals(TungstenUtils.EGRESS_RULE)) { + policyRuleType.addSrcPorts(new PortType(0, 65535)); + policyRuleType.addSrcAddresses(new AddressType(null, null, TUNGSTEN_LOCAL_SECURITY_GROUP, null)); + policyRuleType.addDstAddresses(addressType); + policyRuleType.addDstPorts(new PortType(startPort, endPort)); + + } + + return policyRuleType; + } + + public boolean addInstanceToSecurityGroup(String nicUuid, List securityGroupUuidList) { + try { + VirtualMachineInterface vmi = (VirtualMachineInterface) apiConnector.findById(VirtualMachineInterface.class, + nicUuid); + if (vmi == null) { + return false; + } + + for (String securityGroupUuid : securityGroupUuidList) { + SecurityGroup tungstenSecurityGroup = (SecurityGroup) apiConnector.findById(SecurityGroup.class, + securityGroupUuid); + if (tungstenSecurityGroup != null) { + vmi.addSecurityGroup(tungstenSecurityGroup); + } + } + + vmi.setPortSecurityEnabled(true); + Status status = apiConnector.update(vmi); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean removeInstanceFromSecurityGroup(String nicUuid, List securityGroupUuidList) { + try { + VirtualMachineInterface vmi = (VirtualMachineInterface) apiConnector.findById(VirtualMachineInterface.class, + nicUuid); + if (vmi == null) { + return true; + } + + for (String securityGroupUuid : securityGroupUuidList) { + SecurityGroup tungstenSecurityGroup = (SecurityGroup) apiConnector.findById(SecurityGroup.class, + securityGroupUuid); + if (tungstenSecurityGroup != null) { + vmi.removeSecurityGroup(tungstenSecurityGroup); + } + } + + vmi.setPortSecurityEnabled(false); + Status status = apiConnector.update(vmi); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean addSecondaryIpAddress(String networkUuid, String nicUuid, String iiName, String address) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, nicUuid); + InstanceIp instanceIp = new InstanceIp(); + instanceIp.setName(iiName); + instanceIp.setVirtualNetwork(virtualNetwork); + instanceIp.setVirtualMachineInterface(virtualMachineInterface); + instanceIp.setAddress(address); + if (NetUtils.isValidIp6(address)) { + instanceIp.setFamily("v6"); + } + instanceIp.setSecondary(true); + Status status = apiConnector.create(instanceIp); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + public boolean removeSecondaryIpAddress(String iiName) { + try { + String instanceIpUuid = apiConnector.findByName(InstanceIp.class, null, iiName); + InstanceIp instanceIp = (InstanceIp) apiConnector.findById(InstanceIp.class, instanceIpUuid); + if (instanceIp != null) { + Status status = apiConnector.delete(instanceIp); + status.ifFailure(errorHandler); + return status.isSuccess(); + } else { + return true; + } + } catch (IOException e) { + return false; + } + } + + public String getTungstenNetworkDns(String uuid, String subnetName) { + try { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, uuid); + if (virtualNetwork == null) { + return null; + } + + List> objectReferenceList = virtualNetwork.getNetworkIpam(); + if (objectReferenceList == null) { + return null; + } + + for (ObjectReference objectReference : objectReferenceList) { + VnSubnetsType vnSubnetsType = objectReference.getAttr(); + if (vnSubnetsType == null) { + return null; + } + + List ipamSubnetTypeList = vnSubnetsType.getIpamSubnets(); + if (ipamSubnetTypeList == null) { + return null; + } + + for (IpamSubnetType ipamSubnetType : ipamSubnetTypeList) { + if (ipamSubnetType.getSubnetName().equals(subnetName)) { + return ipamSubnetType.getDnsServerAddress(); + } + } + } + + return null; + } catch (IOException e) { + return null; + } + } + + public boolean updateTungstenDefaultSecurityGroup(String projectFqn) { + try { + Project project = (Project) getTungstenProjectByFqn(projectFqn); + SecurityGroup securityGroup = (SecurityGroup) apiConnector.find(SecurityGroup.class, project, TUNGSTEN_DEFAULT); + if (securityGroup == null) { + return true; + } + + PolicyEntriesType policyEntriesType = securityGroup.getEntries(); + if (policyEntriesType == null) { + return false; + } + + List policyRuleTypeList = policyEntriesType.getPolicyRule(); + if (policyRuleTypeList == null || policyRuleTypeList.size() != 4) { + return true; + } + + updatePolicyRule(policyRuleTypeList); + + Status status = apiConnector.update(securityGroup); + status.ifFailure(errorHandler); + return status.isSuccess(); + } catch (IOException e) { + return false; + } + } + + private void updatePolicyRule(List policyRuleTypeList) { + for (PolicyRuleType policyRuleType : policyRuleTypeList) { + List addressTypeList = policyRuleType.getSrcAddresses(); + if (addressTypeList.size() != 1) { + return; + } + + AddressType addressType = addressTypeList.get(0); + if (addressType == null || addressType.getSecurityGroup() == null) { + return; + } + + if (!addressType.getSecurityGroup().equals(TUNGSTEN_LOCAL_SECURITY_GROUP)) { + if (policyRuleType.getEthertype().equals(TungstenUtils.IPV4)) { + addressType.setSecurityGroup(null); + addressType.setSubnet(new SubnetType(TungstenUtils.ALL_IP4_PREFIX, 0)); + } + + if (policyRuleType.getEthertype().equals(TungstenUtils.IPV6)) { + addressType.setSecurityGroup(null); + addressType.setSubnet(new SubnetType(TungstenUtils.ALL_IP6_PREFIX, 0)); + } + } + } + } + + public ApiObjectBase createRoutingLogicalRouter(String projectUuid, String uuid, String name) { + try { + Project project = (Project) getTungstenObject(Project.class, projectUuid); + LogicalRouter logicalRouter = new LogicalRouter(); + logicalRouter.setParent(project); + logicalRouter.setName(TungstenUtils.ROUTINGLR_NAME + name); + logicalRouter.setDisplayName(name); + logicalRouter.setUuid(uuid); + Status status = apiConnector.create(logicalRouter); + status.ifFailure(errorHandler); + return apiConnector.findById(LogicalRouter.class, logicalRouter.getUuid()); + } catch (IOException e) { + return null; + } + } + + public List listRoutingLogicalRouter(String logicalRouterUuid) { + try { + List logicalRouterList = new ArrayList<>(); + List logicalRouters = (List) apiConnector.list(LogicalRouter.class, null); + if (logicalRouters != null) { + for (LogicalRouter logicalRouter : logicalRouters) { + if (logicalRouterUuid != null) { + if (logicalRouter.getUuid().equals(logicalRouterUuid)) { + logicalRouterList.add( + (LogicalRouter) apiConnector.findById(LogicalRouter.class, logicalRouterUuid)); + } + } else { + logicalRouterList.add( + (LogicalRouter) apiConnector.findById(LogicalRouter.class, logicalRouter.getUuid())); + } + } + } + return filterSystemLogicalRouter(logicalRouterList); + } catch (IOException e) { + return new ArrayList<>(); + } + } + + public ApiObjectBase addNetworkGatewayToLogicalRouter(String networkUuid, String logicalRouterUuid, String ipAddress) { + try { + LogicalRouter logicalRouter = (LogicalRouter) apiConnector.findById(LogicalRouter.class, logicalRouterUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + Project project = (Project) apiConnector.findById(Project.class, virtualNetwork.getParentUuid()); + VirtualMachineInterface vmi = (VirtualMachineInterface) createTungstenGatewayVmi( + TungstenUtils.getRoutingGatewayVmiName(logicalRouter.getName(), virtualNetwork.getName()), + project.getUuid(), virtualNetwork.getUuid()); + createTungstenInstanceIp( + TungstenUtils.getRoutingGatewayIiName(logicalRouter.getName(), virtualNetwork.getName()), ipAddress, + virtualNetwork.getUuid(), vmi.getUuid()); + logicalRouter.addVirtualMachineInterface(vmi); + Status status = apiConnector.update(logicalRouter); + status.ifFailure(errorHandler); + return apiConnector.findById(LogicalRouter.class, logicalRouterUuid); + } catch (IOException e) { + return null; + } + } + + public ApiObjectBase removeNetworkGatewayFromLogicalRouter(String networkUuid, String logicalRouterUuid) { + try { + LogicalRouter logicalRouter = (LogicalRouter) apiConnector.findById(LogicalRouter.class, logicalRouterUuid); + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, networkUuid); + Project project = (Project) apiConnector.findById(Project.class, virtualNetwork.getParentUuid()); + VirtualMachineInterface vmi = (VirtualMachineInterface) apiConnector.find(VirtualMachineInterface.class, project, + TungstenUtils.getRoutingGatewayVmiName(logicalRouter.getName(), virtualNetwork.getName())); + logicalRouter.removeVirtualMachineInterface(vmi); + Status status = apiConnector.update(logicalRouter); + status.ifFailure(errorHandler); + deleteTungstenVmInterface(vmi); + return apiConnector.findById(LogicalRouter.class, logicalRouterUuid); + } catch (IOException e) { + return null; + } + } + + public List getBackRefFromVirtualNetwork(Class aClass, List> objectReferenceList) { + List apiObjectBaseList = new ArrayList<>(); + if (objectReferenceList == null) { + return apiObjectBaseList; + } + try { + for (ObjectReference objectReference : objectReferenceList) { + VirtualNetwork apiObjectBase = (VirtualNetwork) apiConnector.findById(aClass, objectReference.getUuid()); + apiObjectBaseList.add(apiObjectBase); + } + + return apiObjectBaseList; + } catch (IOException e) { + return apiObjectBaseList; + } + } + + public List getBackRefFromVirtualMachine(Class aClass, List> objectReferenceList) { + List apiObjectBaseList = new ArrayList<>(); + if (objectReferenceList == null) { + return apiObjectBaseList; + } + try { + for (ObjectReference objectReference : objectReferenceList) { + VirtualMachine apiObjectBase = (VirtualMachine) apiConnector.findById(aClass, objectReference.getUuid()); + apiObjectBaseList.add(apiObjectBase); + } + + return apiObjectBaseList; + } catch (IOException e) { + return apiObjectBaseList; + } + } + + public List getBackRefFromVirtualMachineInterface(Class aClass, List> objectReferenceList) { + List apiObjectBaseList = new ArrayList<>(); + if (objectReferenceList == null) { + return apiObjectBaseList; + } + try { + for (ObjectReference objectReference : objectReferenceList) { + VirtualMachineInterface apiObjectBase = (VirtualMachineInterface) apiConnector.findById(aClass, objectReference.getUuid()); + apiObjectBaseList.add(apiObjectBase); + } + + return apiObjectBaseList; + } catch (IOException e) { + return apiObjectBaseList; + } + } + + public List getBackRefFromNetworkPolicy(Class aClass, List> objectReferenceList) { + List apiObjectBaseList = new ArrayList<>(); + if (objectReferenceList == null) { + return apiObjectBaseList; + } + try { + for (ObjectReference objectReference : objectReferenceList) { + NetworkPolicy apiObjectBase = (NetworkPolicy) apiConnector.findById(aClass, objectReference.getUuid()); + apiObjectBaseList.add(apiObjectBase); + } + + return apiObjectBaseList; + } catch (IOException e) { + return apiObjectBaseList; + } + } + + public List getBackRefFromApplicationPolicySet(Class aClass, List> objectReferenceList) { + List apiObjectBaseList = new ArrayList<>(); + if (objectReferenceList == null) { + return apiObjectBaseList; + } + try { + for (ObjectReference objectReference : objectReferenceList) { + ApplicationPolicySet apiObjectBase = (ApplicationPolicySet) apiConnector.findById(aClass, objectReference.getUuid()); + apiObjectBaseList.add(apiObjectBase); + } + + return apiObjectBaseList; + } catch (IOException e) { + return apiObjectBaseList; + } + } + + public List getNetworksFromNetworkPolicy(NetworkPolicy networkPolicy) { + List virtualNetworkList = new ArrayList<>(); + try { + List> vnList = networkPolicy.getVirtualNetworkBackRefs(); + if (vnList == null) { + return virtualNetworkList; + } + + for(ObjectReference vn : vnList) { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, vn.getUuid()); + virtualNetworkList.add(virtualNetwork); + } + + return virtualNetworkList; + } catch (IOException e) { + return virtualNetworkList; + } + } + + public List listConnectedNetworkFromLogicalRouter(LogicalRouter logicalRouter) { + List virtualNetworkList = new ArrayList<>(); + try { + List> vmiList = logicalRouter.getVirtualMachineInterface(); + if (vmiList == null) { + return virtualNetworkList; + } + + for (ObjectReference vmi : vmiList) { + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) apiConnector.findById( + VirtualMachineInterface.class, vmi.getUuid()); + List> networkList = virtualMachineInterface.getVirtualNetwork(); + for(ObjectReference network : networkList) { + VirtualNetwork virtualNetwork = (VirtualNetwork) apiConnector.findById(VirtualNetwork.class, network.getUuid()); + virtualNetworkList.add(virtualNetwork); + } + } + return virtualNetworkList; + } catch (IOException e) { + return virtualNetworkList; + } + } + + public Project createDefaultTungstenProject() { + try { + Domain domain = (Domain) apiConnector.findByFQN(Domain.class, TUNGSTEN_DEFAULT_DOMAIN); + List fqdnName = Arrays.asList(TUNGSTEN_DEFAULT_DOMAIN, TUNGSTEN_DEFAULT_PROJECT); + String uuid = apiConnector.findByName(Project.class, fqdnName); + if (uuid == null) { + Project project = new Project(); + project.setParent(domain); + project.setName(TUNGSTEN_DEFAULT_PROJECT); + project.setDisplayName(TUNGSTEN_DEFAULT_PROJECT); + Status status = apiConnector.create(project); + status.ifFailure(errorHandler); + return (Project) apiConnector.findById(Project.class, project.getUuid()); + } else { + return (Project) apiConnector.findById(Project.class, uuid); + } + } catch (IOException e) { + return null; + } + } + + private List getTungstenListTag() { + try { + List resultList = new ArrayList<>(); + List list = apiConnector.list(Tag.class, null); + if (list != null) { + for (ApiObjectBase object : list) { + resultList.add(apiConnector.findById(object.getClass(), object.getUuid())); + } + } + return resultList; + } catch (IOException e) { + return new ArrayList<>(); + } + } + + private List getTungstenListTag(List> objectReferenceList) { + try { + if (objectReferenceList == null) { + return new ArrayList<>(); + } + + List resultList = new ArrayList<>(); + for (ObjectReference object : objectReferenceList) { + resultList.add(apiConnector.findById(Tag.class, object.getUuid())); + } + + return resultList; + } catch (IOException e) { + return new ArrayList<>(); + } + } + + private List getObjectList(List list, String uuid) { + if (uuid == null) + return (List) list; + + for (ApiObjectBase apiObjectBase : list) { + if (apiObjectBase.getUuid().equals(uuid)) { + return Arrays.asList(apiObjectBase); + } + } + + return new ArrayList<>(); + } + + private List filterSystemTag(List tagList) { + List result = new ArrayList<>(); + for(ApiObjectBase tag : tagList) { + String[] tagTypeList = StringUtils.split(tag.getName(), "="); + if (tagTypeList.length == 2 && !tagTypeList[1].startsWith("fabric")) { + result.add(tag); + } + } + return result; + } + + private List filterSystemTagType(List tagTypeList) { + List result = new ArrayList<>(); + for(TagType tagType : tagTypeList) { + if (!tagType.getName().startsWith("neutron")) { + result.add(tagType); + } + } + return result; + } + + private List filterSystemApplicationPolicySet(List applicationPolicySetList) { + List result = new ArrayList<>(); + for(ApplicationPolicySet applicationPolicySet : applicationPolicySetList) { + if (!applicationPolicySet.getName().startsWith(TUNGSTEN_DEFAULT)) { + result.add(applicationPolicySet); + } + } + return result; + } + + private List filterSystemLogicalRouter(List logicalRouterList) { + List result = new ArrayList<>(); + for(LogicalRouter logicalRouter : logicalRouterList) { + if (logicalRouter.getName().startsWith(TungstenUtils.ROUTINGLR_NAME)) { + result.add(logicalRouter); + } + } + return result; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenElement.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenElement.java new file mode 100644 index 00000000000..578accaa745 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenElement.java @@ -0,0 +1,1185 @@ +// 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.network.tungsten.service; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.Listener; +import com.cloud.agent.api.AgentControlAnswer; +import com.cloud.agent.api.AgentControlCommand; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.StartupCommand; +import com.cloud.agent.api.to.LoadBalancerTO; +import com.cloud.api.ApiDBUtils; +import com.cloud.configuration.Config; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkMigrationResponder; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.PublicIpAddress; +import com.cloud.network.TungstenGuestNetworkIpAddressVO; +import com.cloud.network.TungstenProvider; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.LoadBalancerCertMapDao; +import com.cloud.network.dao.LoadBalancerCertMapVO; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.LoadBalancerVMMapDao; +import com.cloud.network.dao.LoadBalancerVMMapVO; +import com.cloud.network.dao.LoadBalancerVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; +import com.cloud.network.dao.TungstenGuestNetworkIpAddressDao; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.DnsServiceProvider; +import com.cloud.network.element.FirewallServiceProvider; +import com.cloud.network.element.IpDeployer; +import com.cloud.network.element.LoadBalancingServiceProvider; +import com.cloud.network.element.PortForwardingServiceProvider; +import com.cloud.network.element.StaticNatServiceProvider; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.LbStickinessMethod; +import com.cloud.network.rules.LoadBalancerContainer; +import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.StaticNat; +import com.cloud.offering.NetworkOffering; +import com.cloud.resource.ResourceManager; +import com.cloud.resource.ResourceStateAdapter; +import com.cloud.resource.ServerResource; +import com.cloud.user.AccountManager; +import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.fsm.StateListener; +import com.cloud.utils.fsm.StateMachine2; +import com.cloud.utils.net.Ip; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.VMInstanceDao; +import com.google.gson.Gson; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenPortForwardingCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AssignTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkLoadbalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenVirtualMachineCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVRouterPortCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmInterfaceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ReleaseTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTfRouteCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.StartupTungstenCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerHealthMonitorCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerMemberCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerPoolCommand; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorDao; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +@Component +public class TungstenElement extends AdapterBase + implements StaticNatServiceProvider, IpDeployer, FirewallServiceProvider, + LoadBalancingServiceProvider, PortForwardingServiceProvider, ResourceStateAdapter, DnsServiceProvider, Listener, + StateListener, NetworkMigrationResponder { + private static final Logger s_logger = Logger.getLogger(TungstenElement.class); + + private static final String NETWORK = "network"; + + private final Map> capabilities = initCapabilities(); + @Inject + HostPodDao podDao; + @Inject + DataCenterDao dataCenterDao; + @Inject + NetworkModel networkModel; + @Inject + NetworkDao networkDao; + @Inject + AccountManager accountMgr; + @Inject + ResourceManager resourceMgr; + @Inject + IPAddressDao ipAddressDao; + @Inject + IpAddressManager ipAddressMgr; + @Inject + PhysicalNetworkDao physicalNetworkDao; + @Inject + VMInstanceDao vmInstanceDao; + @Inject + AgentManager agentMgr; + @Inject + ConfigurationDao configDao; + @Inject + VlanDao vlanDao; + @Inject + HostDao hostDao; + @Inject + NicDao nicDao; + @Inject + NetworkServiceMapDao networkServiceMapDao; + @Inject + NetworkDetailsDao networkDetailsDao; + @Inject + LoadBalancerVMMapDao lbVmMapDao; + @Inject + LoadBalancerDao lbDao; + @Inject + TungstenService tungstenService; + @Inject + MessageBus messageBus; + @Inject + TungstenProviderDao tungstenProviderDao; + @Inject + TungstenGuestNetworkIpAddressDao tungstenGuestNetworkIpAddressDao; + @Inject + TungstenFabricUtils tungstenFabricUtils; + @Inject + PhysicalNetworkTrafficTypeDao physicalNetworkTrafficTypeDao; + @Inject + TungstenFabricLBHealthMonitorDao tungstenFabricLBHealthMonitorDao; + @Inject + LoadBalancerCertMapDao loadBalancerCertMapDao; + + private static Map> initCapabilities() { + Map> capabilities = new HashMap<>(); + Map dhcpCapabilities = new HashMap<>(); + dhcpCapabilities.put(Network.Capability.DhcpAccrossMultipleSubnets, "true"); + capabilities.put(Network.Service.Dhcp, dhcpCapabilities); + Map sourceNatCapabilities = new HashMap<>(); + sourceNatCapabilities.put(Network.Capability.RedundantRouter, "true"); + sourceNatCapabilities.put(Network.Capability.SupportedSourceNatTypes, "peraccount"); + capabilities.put(Network.Service.SourceNat, sourceNatCapabilities); + capabilities.put(Network.Service.Connectivity, null); + capabilities.put(Network.Service.SecurityGroup, null); + capabilities.put(Network.Service.StaticNat, null); + Map dnsCapabilities = new HashMap<>(); + dnsCapabilities.put(Network.Capability.AllowDnsSuffixModification, "true"); + capabilities.put(Network.Service.Dns, dnsCapabilities); + Map firewallCapabilities = new HashMap<>(); + firewallCapabilities.put(Network.Capability.SupportedProtocols, "tcp,udp,icmp"); + firewallCapabilities.put(Network.Capability.SupportedEgressProtocols, "tcp,udp,icmp,all"); + firewallCapabilities.put(Network.Capability.MultipleIps, "true"); + firewallCapabilities.put(Network.Capability.TrafficStatistics, "per public ip"); + firewallCapabilities.put(Network.Capability.SupportedTrafficDirection, "ingress, egress"); + capabilities.put(Network.Service.Firewall, firewallCapabilities); + + Map lbCapabilities = new HashMap<>(); + lbCapabilities.put(Network.Capability.SupportedLBAlgorithms, "roundrobin,leastconn,source"); + lbCapabilities.put(Network.Capability.SupportedLBIsolation, "dedicated"); + lbCapabilities.put(Network.Capability.SupportedProtocols, "tcp,udp,http,ssl"); + lbCapabilities.put(Network.Capability.TrafficStatistics, "per public ip"); + lbCapabilities.put(Network.Capability.LoadBalancingSupportedIps, "additional"); + lbCapabilities.put(Network.Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString()); + lbCapabilities.put(Network.Capability.SslTermination, "true"); + + LbStickinessMethod method; + List methodList = new ArrayList<>(); + method = new LbStickinessMethod(LbStickinessMethod.StickinessMethodType.LBCookieBased, + "This is cookie based sticky method, can be used only for http"); + methodList.add(method); + + method = new LbStickinessMethod(LbStickinessMethod.StickinessMethodType.AppCookieBased, + "This is app session based sticky method, can be used only for http"); + methodList.add(method); + method.addParam("name", true, "cookie name passed in http header by apllication to the client", false); + + method = new LbStickinessMethod(LbStickinessMethod.StickinessMethodType.SourceBased, + "This is source based sticky method, can be used for any type of protocol."); + methodList.add(method); + + Gson gson = new Gson(); + String stickyMethodList = gson.toJson(methodList); + lbCapabilities.put(Network.Capability.SupportedStickinessMethods, stickyMethodList); + + lbCapabilities.put(Network.Capability.HealthCheckPolicy, "true"); + capabilities.put(Network.Service.Lb, lbCapabilities); + capabilities.put(Network.Service.PortForwarding, null); + + return capabilities; + } + + protected boolean canHandle(Network network, Network.Service service) { + s_logger.debug("Checking if TungstenElement can handle service " + service.getName() + " on network " + + network.getDisplayText()); + + if (!networkModel.isProviderForNetwork(getProvider(), network.getId())) { + s_logger.debug("TungstenElement is not a provider for network " + network.getDisplayText()); + return false; + } + + return true; + } + + @Override + public boolean applyStaticNats(Network config, List rules) { + for(StaticNat staticNat : rules) { + long sourceIpAddressId = staticNat.getSourceIpAddressId(); + IPAddressVO ipAddressVO = ipAddressDao.findByIdIncludingRemoved(sourceIpAddressId); + VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(ipAddressVO.getAssociatedWithVmId()); + // floating ip is released when nic was deleted + if (vm == null || networkModel.getNicInNetworkIncludingRemoved(vm.getId(), config.getId()) == null) { + continue; + } + Nic nic = networkModel.getNicInNetworkIncludingRemoved(vm.getId(), config.getId()); + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(config.getDataCenterId(), Networks.TrafficType.Public); + if (!staticNat.isForRevoke()) { + TungstenCommand assignTungstenFloatingIpCommand = new AssignTungstenFloatingIpCommand(publicNetwork.getUuid(), nic.getUuid(), + TungstenUtils.getFloatingIpPoolName(config.getDataCenterId()), TungstenUtils.getFloatingIpName(ipAddressVO.getId()), nic.getIPv4Address()); + TungstenAnswer assignFloatingIpAnswer = tungstenFabricUtils.sendTungstenCommand( + assignTungstenFloatingIpCommand, config.getDataCenterId()); + return assignFloatingIpAnswer.getResult(); + } else { + TungstenCommand releaseTungstenFloatingIpCommand = new ReleaseTungstenFloatingIpCommand(publicNetwork.getUuid(), TungstenUtils.getFloatingIpPoolName(config.getDataCenterId()), + TungstenUtils.getFloatingIpName(ipAddressVO.getId())); + TungstenAnswer releaseFloatingIpAnswer = tungstenFabricUtils.sendTungstenCommand( + releaseTungstenFloatingIpCommand, config.getDataCenterId()); + return releaseFloatingIpAnswer.getResult(); + } + } + + return true; + } + + @Override + public boolean applyLBRules(Network network, List rules) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(network.getDataCenterId(), + Networks.TrafficType.Public); + for (LoadBalancingRule loadBalancingRule : rules) { + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + LoadBalancerCertMapVO loadBalancerCertMapVO = loadBalancerCertMapDao.findByLbRuleId(loadBalancingRule.getId()); + if ((loadBalancerCertMapVO == null || !loadBalancerCertMapVO.isRevoke()) && loadBalancingRule.getState() == FirewallRule.State.Add) { + String protocol = StringUtils.upperCase(loadBalancingRule.getLbProtocol()); + if (loadBalancingRule.getSourcePortStart() == NetUtils.HTTP_PORT + || loadBalancingRule.getSourcePortStart() == NetUtils.HTTPS_PORT) { + protocol = "HTTP"; + } + + IPAddressVO ipAddressVO = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), + loadBalancingRule.getSourceIp().addr()); + + List memberIp = createTungstenLoadBalancerMember(loadBalancingRule); + + createLoadBalancer(network, publicNetwork, loadBalancingRule, ipAddressVO, memberIp, tungstenProjectFqn, protocol); + + updateLBHealthMonitor(network, loadBalancingRule, ipAddressVO, tungstenProjectFqn); + + updateLBPool(network, loadBalancingRule, protocol, tungstenProjectFqn); + + updateLoadBalancerMember(network, loadBalancingRule, memberIp, tungstenProjectFqn); + + return tungstenService.updateLoadBalancer(network, loadBalancingRule); + } + + if (loadBalancingRule.getState() == FirewallRule.State.Revoke) { + return applyRevokeRule(network, loadBalancingRule, publicNetwork, tungstenProjectFqn); + } + } + + return true; + } + + private void updateLoadBalancerMember(Network network, LoadBalancingRule loadBalancingRule, List memberIp, String tungstenProjectFqn) { + TungstenCommand updateTungstenLoadBalancerMemberCommand = new UpdateTungstenLoadBalancerMemberCommand( + tungstenProjectFqn, network.getUuid(), TungstenUtils.getLoadBalancerPoolName(loadBalancingRule.getId()), memberIp); + TungstenAnswer updateTungstenLoadBalancerMemberAnswer = tungstenFabricUtils.sendTungstenCommand( + updateTungstenLoadBalancerMemberCommand, network.getDataCenterId()); + if (!updateTungstenLoadBalancerMemberAnswer.getResult()) { + throw new CloudRuntimeException("Can not create Tungsten Fabric Load Balancer Member"); + } + } + + private void createLoadBalancer(Network network, Network publicNetwork, LoadBalancingRule loadBalancingRule, IPAddressVO ipAddressVO, List memberIp, String tungstenProjectFqn, String protocol) { + String lbIp = getLoadBalancerIpAddress(network, ipAddressVO); + TungstenCommand createTungstenNetworkLoadbalancerCommand = new CreateTungstenNetworkLoadbalancerCommand( + tungstenProjectFqn, network.getUuid(), publicNetwork.getUuid(), TungstenUtils.getLoadBalancerAlgorithm(loadBalancingRule.getAlgorithm()), + TungstenUtils.getLoadBalancerName(ipAddressVO.getId()), TungstenUtils.getLoadBalancerListenerName(loadBalancingRule.getId()), + TungstenUtils.getLoadBalancerPoolName(loadBalancingRule.getId()), TungstenUtils.getLoadBalancerHealthMonitorName(ipAddressVO.getId()), + TungstenUtils.getLoadBalancerVmiName(ipAddressVO.getId()), TungstenUtils.getLoadBalancerIiName(ipAddressVO.getId()), loadBalancingRule.getId(), memberIp, + protocol, loadBalancingRule.getSourcePortStart(), loadBalancingRule.getDefaultPortStart(), lbIp, + TungstenUtils.getFloatingIpPoolName(network.getDataCenterId()), TungstenUtils.getFloatingIpName(ipAddressVO.getId()), + TungstenService.MonitorType.PING.toString(), 3, 5, 5, null, null, null); + TungstenAnswer createTungstenNetworkLoadbalancerAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenNetworkLoadbalancerCommand, network.getDataCenterId()); + if (!createTungstenNetworkLoadbalancerAnswer.getResult()) { + throw new CloudRuntimeException("Can not create Tungsten Fabric Load Balancer"); + } + } + + private List createTungstenLoadBalancerMember(LoadBalancingRule loadBalancingRule) { + List memberIp = new ArrayList<>(); + + List loadBalancerVMMapVOList = lbVmMapDao.listByLoadBalancerId( + loadBalancingRule.getId(), false); + + for (LoadBalancerVMMapVO lbVMMapVO : loadBalancerVMMapVOList) { + int port = loadBalancingRule.getDefaultPortStart(); + if (loadBalancingRule.getDefaultPortStart() == NetUtils.HTTPS_PORT) { + port = NetUtils.HTTP_PORT; + } + + TungstenLoadBalancerMember tungstenLoadBalancerMember = new TungstenLoadBalancerMember( + TungstenUtils.getLoadBalancerMemberName(loadBalancingRule.getId(), lbVMMapVO.getInstanceIp()), + lbVMMapVO.getInstanceIp(), port, 1); + memberIp.add(tungstenLoadBalancerMember); + } + + return memberIp; + } + + private String getLoadBalancerIpAddress(Network network, IPAddressVO ipAddressVO) { + String lbIp; + TungstenGuestNetworkIpAddressVO guestNetworkIpAddressVO = tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp( + network.getId(), ipAddressVO.getAddress().addr()); + + if (guestNetworkIpAddressVO == null) { + lbIp = ipAddressMgr.acquireGuestIpAddress(network, null); + + if (lbIp == null) { + throw new CloudRuntimeException("Can not acquire ip address for loadbalancer"); + } + + // register tungsten guest network ip + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = new TungstenGuestNetworkIpAddressVO(); + tungstenGuestNetworkIpAddressVO.setNetworkId(network.getId()); + tungstenGuestNetworkIpAddressVO.setPublicIpAddress(ipAddressVO.getAddress()); + tungstenGuestNetworkIpAddressVO.setGuestIpAddress(new Ip(lbIp)); + tungstenGuestNetworkIpAddressDao.persist(tungstenGuestNetworkIpAddressVO); + } else { + lbIp = guestNetworkIpAddressVO.getGuestIpAddress().addr(); + } + + return lbIp; + } + + private void updateLBPool(Network network, LoadBalancingRule loadBalancingRule, String protocol, String tungstenProjectFqn) { + // update stickiness, algorithm, protocol + List lbStickinessPolicyList = loadBalancingRule.getStickinessPolicies(); + String lbSessionPersistence = null; + String lbPersistenceCookieName = null; + if (!lbStickinessPolicyList.isEmpty()) { + lbSessionPersistence = TungstenUtils.getLoadBalancerSession(lbStickinessPolicyList.get(0).getMethodName()); + if (lbStickinessPolicyList.get(0).getMethodName().equals("AppCookie")) { + lbPersistenceCookieName = lbStickinessPolicyList.get(0).getParams().get(0).second(); + } + } + + // update haproxy + TungstenCommand updateTungstenLoadBalancerPoolCommand; + String lbStatsVisibility = configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key()); + if (!lbStatsVisibility.equals("disabled")) { + String lbStatsUri = configDao.getValue(Config.NetworkLBHaproxyStatsUri.key()); + String lbStatsAuth = configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key()); + String lbStatsPort = configDao.getValue(Config.NetworkLBHaproxyStatsPort.key()); + updateTungstenLoadBalancerPoolCommand = new UpdateTungstenLoadBalancerPoolCommand( + tungstenProjectFqn, TungstenUtils.getLoadBalancerPoolName(loadBalancingRule.getId()), + TungstenUtils.getLoadBalancerAlgorithm(loadBalancingRule.getAlgorithm()), + lbSessionPersistence, lbPersistenceCookieName, protocol, true, lbStatsPort, lbStatsUri, + lbStatsAuth); + } else { + updateTungstenLoadBalancerPoolCommand = new UpdateTungstenLoadBalancerPoolCommand( + tungstenProjectFqn, TungstenUtils.getLoadBalancerPoolName(loadBalancingRule.getId()), + TungstenUtils.getLoadBalancerAlgorithm(loadBalancingRule.getAlgorithm()), + lbSessionPersistence, lbPersistenceCookieName, protocol, false, null, null, null); + } + TungstenAnswer updateTungstenLoadBalancerPoolAnswer = tungstenFabricUtils.sendTungstenCommand( + updateTungstenLoadBalancerPoolCommand, network.getDataCenterId()); + if (!updateTungstenLoadBalancerPoolAnswer.getResult()) { + throw new CloudRuntimeException("Can not update Tungsten Fabric Load Balancer Pool"); + } + } + + private void updateLBHealthMonitor(Network network, LoadBalancingRule loadBalancingRule, IPAddressVO ipAddressVO, String tungstenProjectFqn) { + // update load balancer health monitor + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = tungstenFabricLBHealthMonitorDao.findByLbId( + loadBalancingRule.getId()); + if (tungstenFabricLBHealthMonitorVO != null) { + TungstenCommand updateTungstenHealthMonitorCommand = new UpdateTungstenLoadBalancerHealthMonitorCommand( + tungstenProjectFqn, TungstenUtils.getLoadBalancerHealthMonitorName(ipAddressVO.getId()), + tungstenFabricLBHealthMonitorVO.getType(), tungstenFabricLBHealthMonitorVO.getRetry(), + tungstenFabricLBHealthMonitorVO.getTimeout(), tungstenFabricLBHealthMonitorVO.getInterval(), + tungstenFabricLBHealthMonitorVO.getHttpMethod(), tungstenFabricLBHealthMonitorVO.getExpectedCode(), + tungstenFabricLBHealthMonitorVO.getUrlPath()); + TungstenAnswer updateTungstenHealthMonitorAnswer = tungstenFabricUtils.sendTungstenCommand( + updateTungstenHealthMonitorCommand, network.getDataCenterId()); + if (!updateTungstenHealthMonitorAnswer.getResult()) { + throw new CloudRuntimeException("Can not update Tungsten Fabric Health Monitor"); + } + } + } + + private boolean applyRevokeRule(Network network, LoadBalancingRule loadBalancingRule, Network publicNetwork, String tungstenProjectFqn) { + IPAddressVO ipAddressVO = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), + loadBalancingRule.getSourceIp().addr()); + List listLoadBalancerVO = lbDao.listByIpAddress(ipAddressVO.getId()); + if (listLoadBalancerVO.size() > 1) { + TungstenCommand deleteTungstenLoadBalancerListenerCommand = + new DeleteTungstenLoadBalancerListenerCommand( + tungstenProjectFqn, TungstenUtils.getLoadBalancerListenerName(loadBalancingRule.getId())); + TungstenAnswer deleteTungstenLoadBalancerListenerAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenLoadBalancerListenerCommand, network.getDataCenterId()); + if (!deleteTungstenLoadBalancerListenerAnswer.getResult()) { + return false; + } + + return tungstenService.updateLoadBalancer(network, loadBalancingRule); + } else { + TungstenCommand deleteTungstenLoadBalancerCommand = new DeleteTungstenLoadBalancerCommand( + tungstenProjectFqn, publicNetwork.getUuid(), + TungstenUtils.getLoadBalancerName(ipAddressVO.getId()), + TungstenUtils.getLoadBalancerHealthMonitorName(ipAddressVO.getId()), + TungstenUtils.getLoadBalancerVmiName(ipAddressVO.getId()), + TungstenUtils.getFloatingIpPoolName(network.getDataCenterId()), + TungstenUtils.getFloatingIpName(ipAddressVO.getId())); + TungstenAnswer deleteTungstenLoadBalancerAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenLoadBalancerCommand, network.getDataCenterId()); + if (!deleteTungstenLoadBalancerAnswer.getResult()) { + return false; + } + + TungstenGuestNetworkIpAddressVO guestNetworkIpAddressVO = + tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp( + network.getId(), ipAddressVO.getAddress().addr()); + if (guestNetworkIpAddressVO != null) { + return tungstenGuestNetworkIpAddressDao.remove(guestNetworkIpAddressVO.getId()); + } + } + + return true; + } + + @Override + public boolean validateLBRule(Network network, LoadBalancingRule rule) { + return true; + } + + @Override + public List updateHealthChecks(Network network, List lbrules) { + return new ArrayList<>(); + } + + @Override + public boolean handlesOnlyRulesInTransitionState() { + return false; + } + + @Override + public boolean applyPFRules(final Network network, final List rules) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(network.getDataCenterId(), + Networks.TrafficType.Public); + // tungsten port forwarding don't support multiple vm per public ip address + // if multiple vm, only 1 vm get effect + // frontend : don't allow to add multiple vm per public ip address + for (PortForwardingRule rule : rules) { + IPAddressVO publicIp = ApiDBUtils.findIpAddressById(rule.getSourceIpAddressId()); + UserVm vm = ApiDBUtils.findUserVmById(rule.getVirtualMachineId()); + if (vm == null || networkModel.getNicInNetwork(vm.getId(), network.getId()) == null) { + continue; + } + Nic guestNic = networkModel.getNicInNetwork(vm.getId(), network.getId()); + if (rule.getState() == FirewallRule.State.Add || rule.getState() == FirewallRule.State.Revoke) { + TungstenCommand applyTungstenPortForwardingCommand = new ApplyTungstenPortForwardingCommand( + rule.getState() == FirewallRule.State.Add, publicNetwork.getUuid(), + TungstenUtils.getFloatingIpPoolName(network.getDataCenterId()), + TungstenUtils.getFloatingIpName(publicIp.getId()), guestNic.getUuid(), + StringUtils.upperCase(rule.getProtocol()), rule.getSourcePortStart(), + rule.getDestinationPortStart()); + TungstenAnswer applyTungstenPortForwardingAnswer = tungstenFabricUtils.sendTungstenCommand( + applyTungstenPortForwardingCommand, network.getDataCenterId()); + if (!applyTungstenPortForwardingAnswer.getResult()) { + return false; + } + } + } + + return true; + } + + @Override + public IpDeployer getIpDeployer(Network network) { + return this; + } + + @Override + public Map> getCapabilities() { + return capabilities; + } + + @Override + public boolean applyIps(Network network, List ipAddress, Set services) { + return true; + } + + @Override + public Network.Provider getProvider() { + return Network.Provider.Tungsten; + } + + @Override + public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, + ReservationContext context) + throws ConcurrentOperationException { + return true; + } + + @Override + public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, + ReservationContext context) + throws ConcurrentOperationException { + if (network.getTrafficType() == Networks.TrafficType.Public) { + TungstenAnswer createVirtualMachineAnswer = createTungstenVM(network, nic, vm, dest); + if (!createVirtualMachineAnswer.getResult()) { + throw new CloudRuntimeException("can not create Tungsten-Fabric vm"); + } + + // get tungsten public firewall rule + IPAddressVO ipAddressVO = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), nic.getIPv4Address()); + List tungstenRuleList = createDefaultTungstenFirewallRuleList(vm.getType(), + nic.getIPv4Address()); + + // create tungsten public network policy for system vm + TungstenCommand createTungstenNetworkPolicyCommand = new CreateTungstenNetworkPolicyCommand( + TungstenUtils.getPublicNetworkPolicyName(ipAddressVO.getId()), null, tungstenRuleList); + TungstenAnswer createTungstenNetworkPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenNetworkPolicyCommand, network.getDataCenterId()); + if (!createTungstenNetworkPolicyAnswer.getResult()) { + throw new CloudRuntimeException("can not create Tungsten-Fabric public network policy"); + } + + messageBus.publish(_name, TungstenService.MESSAGE_APPLY_NETWORK_POLICY_EVENT, PublishScope.LOCAL, network); + + updateTungstenFabricService(nic); + } + + if (network.getTrafficType() == Networks.TrafficType.Management) { + TungstenAnswer createVirtualMachineAnswer = createTungstenVM(network, nic, vm, dest); + if (!createVirtualMachineAnswer.getResult()) { + throw new CloudRuntimeException("can not create Tungsten-Fabric vm"); + } + + updateTungstenFabricService(nic); + } + + return true; + } + + @Override + public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) + throws ConcurrentOperationException { + VMInstanceVO vmInstanceVO = vmInstanceDao.findById(vm.getId()); + HostVO host = hostDao.findById(vmInstanceVO.getLastHostId()); + + if (host != null) { + if (network.getTrafficType() == Networks.TrafficType.Public) { + try { + TungstenCommand deleteTungstenVRouterPortCommand = new DeleteTungstenVRouterPortCommand( + host.getPublicIpAddress(), nic.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenVRouterPortCommand, network.getDataCenterId()); + String nicName = TungstenUtils.getVmiName(network.getTrafficType().toString(), vm.getType().toString(), + vm.getInstanceName(), nic.getId()); + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + DeleteTungstenVmInterfaceCommand deleteVmiCmd = new DeleteTungstenVmInterfaceCommand(tungstenProjectFqn, + nicName); + tungstenFabricUtils.sendTungstenCommand(deleteVmiCmd, network.getDataCenterId()); + + TungstenCommand deleteVmCmd = new DeleteTungstenVmCommand(vm.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteVmCmd, network.getDataCenterId()); + + IPAddressVO ipAddressVO = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), nic.getIPv4Address()); + TungstenCommand deleteTungstenNetworkPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getPublicNetworkPolicyName(ipAddressVO.getId()), null, network.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenNetworkPolicyCommand, network.getDataCenterId()); + } catch (IllegalArgumentException e) { + throw new CloudRuntimeException( + "Failing to expunge the vm from Tungsten-Fabric with the uuid " + vm.getUuid()); + } + } + + if (network.getTrafficType() == Networks.TrafficType.Management) { + try { + TungstenCommand deleteTungstenVRouterPortCommand = new DeleteTungstenVRouterPortCommand( + host.getPublicIpAddress(), nic.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenVRouterPortCommand, network.getDataCenterId()); + String nicName = TungstenUtils.getVmiName(network.getTrafficType().toString(), vm.getType().toString(), + vm.getInstanceName(), nic.getId()); + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + TungstenCommand deleteVmiCmd = new DeleteTungstenVmInterfaceCommand(tungstenProjectFqn, nicName); + tungstenFabricUtils.sendTungstenCommand(deleteVmiCmd, network.getDataCenterId()); + + TungstenCommand deleteVmCmd = new DeleteTungstenVmCommand(vm.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteVmCmd, network.getDataCenterId()); + } catch (IllegalArgumentException e) { + throw new CloudRuntimeException( + "Failing to expunge the vm from Tungsten-Fabric with the uuid " + vm.getUuid()); + } + } + } + + return true; + } + + @Override + public boolean shutdown(Network network, ReservationContext context, boolean cleanup) + throws ConcurrentOperationException { + return canHandle(network, Network.Service.Connectivity); + } + + @Override + public boolean destroy(Network network, ReservationContext context) + throws ConcurrentOperationException, ResourceUnavailableException { + boolean result = true; + // delete floating ips + List staticNatIpList = ipAddressDao.listByAssociatedNetwork(network.getId(), false); + for (IPAddressVO ipAddressVO : staticNatIpList) { + TungstenCommand deleteTungstenFloatingIpCommand = new DeleteTungstenFloatingIpCommand(network.getUuid(), + TungstenUtils.getFloatingIpPoolName(network.getDataCenterId()), + TungstenUtils.getFloatingIpName(ipAddressVO.getId())); + TungstenAnswer tungstenDeleteFIPAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenFloatingIpCommand, network.getDataCenterId()); + result = result && tungstenDeleteFIPAnswer.getResult(); + + TungstenCommand deleteTungstenNetworkPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getPublicNetworkPolicyName(ipAddressVO.getId()), null, network.getUuid()); + TungstenAnswer tungstenDeleteNPAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenNetworkPolicyCommand, network.getDataCenterId()); + result = result && tungstenDeleteNPAnswer.getResult(); + } + + return result; + } + + @Override + public boolean isReady(PhysicalNetworkServiceProvider provider) { + PhysicalNetworkTrafficTypeVO managementNetwork = physicalNetworkTrafficTypeDao.findBy( + provider.getPhysicalNetworkId(), Networks.TrafficType.Management); + return managementNetwork != null; + } + + @Override + public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) + throws ConcurrentOperationException { + long zoneId = physicalNetworkDao.findById(provider.getPhysicalNetworkId()).getDataCenterId(); + + TungstenProvider tungstenProvider = tungstenProviderDao.findByZoneId(zoneId); + if (tungstenProvider != null) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + + if (!dataCenter.isSecurityGroupEnabled()) { + // delete network service map + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, + Networks.TrafficType.Public); + if (publicNetwork != null) { + networkServiceMapDao.deleteByNetworkId(publicNetwork.getId()); + List listVlanVO = vlanDao.listVlansByNetworkIdIncludingRemoved(publicNetwork.getId()); + for (VlanVO vlanVO : listVlanVO) { + tungstenService.removePublicNetworkSubnet(vlanVO); + } + + tungstenService.deletePublicNetwork(zoneId); + } + } + + List listPod = podDao.listByDataCenterId(zoneId); + for (HostPodVO pod : listPod) { + tungstenService.removeManagementNetworkSubnet(pod); + } + + tungstenService.deleteManagementNetwork(zoneId); + tungstenProviderDao.expunge(tungstenProvider.getId()); + } + return true; + } + + @Override + public boolean canEnableIndividualServices() { + return true; + } + + @Override + public boolean verifyServicesCombination(final Set services) { + // tf can use configdrive for userdata + services.remove(Network.Service.UserData); + final Set sharedZoneServices = new HashSet<>( + Arrays.asList(Network.Service.Connectivity, + Network.Service.Dhcp, + Network.Service.Dns, Network.Service.SecurityGroup)); + final Set isolatedZoneServices = new HashSet<>( + Arrays.asList(Network.Service.Connectivity, + Network.Service.Dhcp, + Network.Service.Dns, Network.Service.SourceNat, Network.Service.StaticNat, + Network.Service.Lb, Network.Service.PortForwarding, Network.Service.Firewall)); + return (services.containsAll(sharedZoneServices) && sharedZoneServices.containsAll(services)) || ( + services.containsAll(isolatedZoneServices) && isolatedZoneServices.containsAll(services)); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + super.configure(name, params); + agentMgr.registerForHostEvents(this, true, true, true); + resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); + VirtualMachine.State.getStateMachine().registerListener(this); + + return true; + } + + @Override + public HostVO createHostVOForConnectedAgent(HostVO host, StartupCommand[] cmd) { + return null; + } + + @Override + public HostVO createHostVOForDirectConnectAgent(HostVO host, StartupCommand[] startup, ServerResource resource, + Map details, List hostTags) { + if (!(startup[0] instanceof StartupTungstenCommand)) { + return null; + } + host.setType(Host.Type.L2Networking); + return host; + } + + @Override + public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) { + if (host.getType() != Host.Type.L2Networking) { + return null; + } + return new DeleteHostAnswer(true); + } + + @Override + public boolean processAnswers(final long agentId, final long seq, final Answer[] answers) { + return false; + } + + @Override + public boolean processCommands(final long agentId, final long seq, final Command[] commands) { + return false; + } + + @Override + public AgentControlAnswer processControlCommand(final long agentId, final AgentControlCommand cmd) { + return null; + } + + @Override + public void processHostAdded(final long hostId) { + // Do nothing + } + + @Override + public void processConnect(final Host host, final StartupCommand cmd, final boolean forRebalance) { + long zoneId = host.getDataCenterId(); + TungstenProviderVO tungstenProvider = tungstenProviderDao.findByZoneId(zoneId); + if (host.getHypervisorType() == Hypervisor.HypervisorType.KVM && tungstenProvider != null + && host.getPublicIpAddress().equals(tungstenProvider.getGateway())) { + setupVrouter(host); + } + + if ((host.getType() == Host.Type.ConsoleProxy || host.getType() == Host.Type.SecondaryStorageVM) && tungstenProvider != null) { + VirtualMachine.Type type = host.getType() == Host.Type.SecondaryStorageVM ? VirtualMachine.Type.SecondaryStorageVm : VirtualMachine.Type.ConsoleProxy; + List vmList = vmInstanceDao.listByZoneIdAndType(zoneId, type); + if (vmList.size() == 1 && vmList.get(0).getState() == VirtualMachine.State.Running) { + NicVO nicVO = nicDao.getControlNicForVM(vmList.get(0).getId()); + HostVO kvmHost = hostDao.findById(vmList.get(0).getHostId()); + String srcNetwork = NetUtils.getCidrFromGatewayAndNetmask(kvmHost.getPrivateIpAddress(), kvmHost.getPrivateNetmask()); + Command setupTfRoute = new SetupTfRouteCommand(nicVO.getIPv4Address(), host.getPublicIpAddress(), srcNetwork); + agentMgr.easySend(vmList.get(0).getHostId(), setupTfRoute); + } + } + } + + private void setupVrouter(Host host) { + long zoneId = host.getDataCenterId(); + DataCenterVO dataCenterVO = dataCenterDao.findById(zoneId); + if (dataCenterVO.isSecurityGroupEnabled()) { + List networks = networkDao.listByZoneSecurityGroup(zoneId); + for (NetworkVO network : networks) { + NetworkDetailVO networkDetail = networkDetailsDao.findDetail(network.getId(), "vrf"); + if (networkDetail != null) { + Command setupTungstenVRouterCommand = new SetupTungstenVRouterCommand( + "create", TungstenUtils.getSgVgwName(network.getId()), network.getCidr(), + NetUtils.ALL_IP4_CIDRS, networkDetail.getValue()); + agentMgr.easySend(host.getId(), setupTungstenVRouterCommand); + } + } + } else { + List vlanList = vlanDao.listByZone(zoneId); + List publicSubnetList = new ArrayList<>(); + + for (VlanVO vlanVO : vlanList) { + String subnet = NetUtils.getCidrFromGatewayAndNetmask(vlanVO.getVlanGateway(), + vlanVO.getVlanNetmask()); + publicSubnetList.add(subnet); + } + + String publicSubnet = StringUtils.join(publicSubnetList.toArray(), " "); + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, + Networks.TrafficType.Public); + NetworkDetailVO networkDetail = networkDetailsDao.findDetail(publicNetwork.getId(), "vrf"); + if (networkDetail != null) { + Command setupTungstenVRouterCommand = new SetupTungstenVRouterCommand("create", + TungstenUtils.getVgwName(zoneId), publicSubnet, NetUtils.ALL_IP4_CIDRS, + networkDetail.getValue()); + agentMgr.easySend(host.getId(), setupTungstenVRouterCommand); + } + } + } + + @Override + public boolean processDisconnect(final long agentId, final Status state) { + return true; + } + + @Override + public void processHostAboutToBeRemoved(final long hostId) { + Host host = hostDao.findById(hostId); + long zoneId = host.getDataCenterId(); + + TungstenProviderVO tungstenProvider = tungstenProviderDao.findByZoneId(zoneId); + if (host.getHypervisorType() == Hypervisor.HypervisorType.KVM && tungstenProvider != null + && host.getPublicIpAddress().equals(tungstenProvider.getGateway())) { + DataCenterVO dataCenterVO = dataCenterDao.findById(zoneId); + if (dataCenterVO.isSecurityGroupEnabled()) { + List networks = networkDao.listByZoneSecurityGroup(zoneId); + for (NetworkVO network : networks) { + Command setupTungstenVRouterCommand = new SetupTungstenVRouterCommand("delete", + TungstenUtils.getSgVgwName(network.getId()), NetUtils.ALL_IP4_CIDRS, NetUtils.ALL_IP4_CIDRS, + NetUtils.ALL_IP4_CIDRS); + agentMgr.easySend(host.getId(), setupTungstenVRouterCommand); + } + } else { + Command setupTungstenVRouterCommand = new SetupTungstenVRouterCommand("delete", + TungstenUtils.getVgwName(zoneId), NetUtils.ALL_IP4_CIDRS, NetUtils.ALL_IP4_CIDRS, + NetUtils.ALL_IP4_CIDRS); + agentMgr.easySend(host.getId(), setupTungstenVRouterCommand); + } + } + } + + @Override + public void processHostRemoved(final long hostId, final long clusterId) { + // Do no thing + } + + @Override + public boolean isRecurring() { + return false; + } + + @Override + public int getTimeout() { + return 0; + } + + @Override + public boolean processTimeout(final long agentId, final long seq) { + return false; + } + + @Override + public boolean applyFWRules(final Network network, final List rules) + throws ResourceUnavailableException { + String tungstenProjectFqn; + String networkUuid; + String policyName; + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(network.getDataCenterId(), + Networks.TrafficType.Public); + for (FirewallRule firewallRule : rules) { + if (firewallRule.getPurpose() == FirewallRule.Purpose.Firewall) { + if (firewallRule.getDestinationCidrList() == null) { + return false; + } + + if (firewallRule.getTrafficType() == FirewallRule.TrafficType.Egress) { + tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + networkUuid = network.getUuid(); + policyName = TungstenUtils.getRuleNetworkPolicyName(firewallRule.getId()); + } else { + tungstenProjectFqn = null; + networkUuid = publicNetwork.getUuid(); + policyName = TungstenUtils.getPublicNetworkPolicyName(firewallRule.getSourceIpAddressId()); + } + + applyAddRule(network, firewallRule, tungstenProjectFqn, networkUuid,policyName); + + if (firewallRule.getState() == FirewallRule.State.Revoke) { + TungstenCommand deleteTungstenNetworkPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + policyName, tungstenProjectFqn, networkUuid); + tungstenFabricUtils.sendTungstenCommand( + deleteTungstenNetworkPolicyCommand, network.getDataCenterId()); + } + } + } + + return true; + } + + private void applyAddRule(Network network, FirewallRule firewallRule, String tungstenProjectFqn, String networkUuid,String policyName) throws ResourceUnavailableException { + if (firewallRule.getState() == FirewallRule.State.Add) { + TungstenRule tungstenRule = convertFirewallRule(firewallRule); + List tungstenRuleList = new ArrayList<>(); + tungstenRuleList.add(tungstenRule); + + TungstenCommand createTungstenNetworkPolicyCommand = new CreateTungstenNetworkPolicyCommand( + policyName, tungstenProjectFqn, tungstenRuleList); + TungstenAnswer createNetworkPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenNetworkPolicyCommand, network.getDataCenterId()); + if (!createNetworkPolicyAnswer.getResult()) { + throw new CloudRuntimeException("Can not create tungsten fabric network policy"); + } + + TungstenCommand applyTungstenNetworkPolicyCommand = new ApplyTungstenNetworkPolicyCommand( + tungstenProjectFqn, policyName, networkUuid, 0, 0); + TungstenAnswer applyNetworkPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + applyTungstenNetworkPolicyCommand, network.getDataCenterId()); + if (!applyNetworkPolicyAnswer.getResult()) { + throw new CloudRuntimeException("Can not apply tungsten fabric network policy"); + } + } + } + + private TungstenRule convertFirewallRule(FirewallRule firewallRule) throws ResourceUnavailableException { + List srcCidrs = firewallRule.getSourceCidrList(); + List dstCidrs = firewallRule.getDestinationCidrList(); + + if (firewallRule.getTrafficType() == FirewallRule.TrafficType.Egress && dstCidrs == null) { + throw new ResourceUnavailableException("invalid destination cidr", FirewallRule.class, + firewallRule.getId()); + } + + String dstPrefix = dstCidrs.size() == 1 ? NetUtils.getCidr(dstCidrs.get(0)).first() : "0.0.0.0"; + int dstPrefixLen = dstCidrs.size() == 1 ? NetUtils.getCidr(dstCidrs.get(0)).second() : 0; + int dstPortStart = firewallRule.getSourcePortStart() != null ? firewallRule.getSourcePortStart() : -1; + int dstPortEnd = firewallRule.getSourcePortEnd() != null ? firewallRule.getSourcePortEnd() : -1; + String tungstenProtocol = + firewallRule.getProtocol().equals(NetUtils.ALL_PROTO) ? TungstenUtils.ANY : firewallRule.getProtocol(); + + if (srcCidrs == null || srcCidrs.size() != 1) { + throw new ResourceUnavailableException("invalid source cidr", FirewallRule.class, firewallRule.getId()); + } + + Pair srcSubnet = NetUtils.getCidr(srcCidrs.get(0)); + + if (firewallRule.getTrafficType() == FirewallRule.TrafficType.Ingress) { + long id = firewallRule.getSourceIpAddressId(); + IPAddressVO ipAddressVO = ipAddressDao.findById(id); + dstPrefix = ipAddressVO.getAddress().addr(); + dstPrefixLen = 32; + } + + return new TungstenRule(firewallRule.getUuid(), TungstenUtils.PASS_ACTION, TungstenUtils.ONE_WAY_DIRECTION, + tungstenProtocol, TungstenUtils.ANY, srcSubnet.first(), srcSubnet.second(), -1, -1, TungstenUtils.ANY, + dstPrefix, dstPrefixLen, dstPortStart, dstPortEnd); + } + + private TungstenRule getDefaultIngressRule(String ip, String protocol, int startPort, int endPort) { + return new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.TWO_WAY_DIRECTION, protocol, TungstenUtils.ANY, + TungstenUtils.ALL_IP4_PREFIX, 0, -1, -1, TungstenUtils.ANY, ip, TungstenUtils.MAX_CIDR, startPort, endPort); + } + + private TungstenRule getDefaultEgressRule(String ip, String protocol, int startPort, int endPort) { + return new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.ONE_WAY_DIRECTION, protocol, TungstenUtils.ANY, + TungstenUtils.ALL_IP4_PREFIX, 0, startPort, endPort, TungstenUtils.ANY, ip, TungstenUtils.MAX_CIDR, -1, -1); + } + + private List createDefaultTungstenFirewallRuleList(VirtualMachine.Type vmType, String ip) { + List tungstenRuleList = new ArrayList<>(); + tungstenRuleList.add(getDefaultIngressRule(ip, NetUtils.ICMP_PROTO, -1, -1)); + tungstenRuleList.add(getDefaultEgressRule(ip, NetUtils.UDP_PROTO, TungstenUtils.DNS_SERVICE_PORT, + TungstenUtils.DNS_SERVICE_PORT)); + tungstenRuleList.add(getDefaultEgressRule(ip, NetUtils.UDP_PROTO, TungstenUtils.NTP_SERVICE_PORT, + TungstenUtils.NTP_SERVICE_PORT)); + if (vmType == VirtualMachine.Type.ConsoleProxy) { + tungstenRuleList.add(getDefaultIngressRule(ip, NetUtils.TCP_PROTO, NetUtils.HTTP_PORT, NetUtils.HTTP_PORT)); + tungstenRuleList.add(getDefaultIngressRule(ip, NetUtils.TCP_PROTO, TungstenUtils.WEB_SERVICE_PORT, + TungstenUtils.WEB_SERVICE_PORT)); + tungstenRuleList.add( + getDefaultIngressRule(ip, NetUtils.TCP_PROTO, NetUtils.HTTPS_PORT, NetUtils.HTTPS_PORT)); + } else { + tungstenRuleList.add(getDefaultEgressRule(ip, NetUtils.TCP_PROTO, NetUtils.HTTP_PORT, NetUtils.HTTP_PORT)); + } + + return tungstenRuleList; + } + + @Override + public boolean addDnsEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, + ReservationContext context) + throws ConcurrentOperationException { + return networkModel.isProviderSupportServiceInNetwork(network.getId(), Network.Service.Dhcp, getProvider()); + } + + @Override + public boolean configDnsSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, + DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException { + return networkModel.isProviderSupportServiceInNetwork(network.getId(), Network.Service.Dhcp, getProvider()); + } + + @Override + public boolean removeDnsSupportForSubnet(Network network) { + return networkModel.isProviderSupportServiceInNetwork(network.getId(), Network.Service.Dhcp, getProvider()); + } + + @Override + public boolean preStateTransitionEvent(final VirtualMachine.State oldState, final VirtualMachine.Event event, + final VirtualMachine.State newState, final VirtualMachine vo, final boolean status, final Object opaque) { + return true; + } + + @Override + public boolean postStateTransitionEvent( + final StateMachine2.Transition transition, final VirtualMachine vo, + final boolean status, final Object opaque) { + if (!status) { + return false; + } + + VirtualMachine.State oldState = transition.getCurrentState(); + VirtualMachine.State newState = transition.getToState(); + VirtualMachine.Event event = transition.getEvent(); + if (VirtualMachine.State.isVmStarted(oldState, event, newState)) { + return tungstenService.addTungstenVmSecurityGroup((VMInstanceVO) vo); + } else if (VirtualMachine.State.isVmStopped(oldState, event, newState)) { + return tungstenService.removeTungstenVmSecurityGroup((VMInstanceVO) vo); + } + + return true; + } + + @Override + public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final DeployDestination dest, final ReservationContext context) { + if (vm.getType().isUsedBySystem()) { + TungstenAnswer answer = createTungstenVM(network, nic, vm, dest); + return answer.getResult(); + } else { + return true; + } + } + + @Override + public void rollbackMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final ReservationContext src, final ReservationContext dst) { + if (vm.getType().isUsedBySystem()) { + Long hostId = vm.getVirtualMachine().getHostId(); + HostVO host = hostDao.findById(hostId); + TungstenCommand deleteTungstenVRouterPortCommand = new DeleteTungstenVRouterPortCommand( + host.getPublicIpAddress(), nic.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenVRouterPortCommand, network.getDataCenterId()); + } + } + + @Override + public void commitMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final ReservationContext src, final ReservationContext dst) { + if (vm.getType().isUsedBySystem()) { + Long hostId = vm.getVirtualMachine().getLastHostId(); + HostVO host = hostDao.findById(hostId); + TungstenCommand deleteTungstenVRouterPortCommand = new DeleteTungstenVRouterPortCommand( + host.getPublicIpAddress(), nic.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenVRouterPortCommand, network.getDataCenterId()); + } + } + + private TungstenAnswer createTungstenVM(Network network, NicProfile nic, VirtualMachineProfile vm, + DeployDestination dest) { + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + VMInstanceVO vmInstanceVO = vmInstanceDao.findById(vm.getId()); + Host host = dest.getHost(); + if (host == null) { + host = hostDao.findById(vmInstanceVO.getHostId()); + } + + TungstenCommand createTungstenVirtualMachineCommand = new CreateTungstenVirtualMachineCommand( + tungstenProjectFqn, network.getUuid(), vm.getUuid(), vm.getInstanceName(), nic.getUuid(), nic.getId(), + nic.getIPv4Address(), null, nic.getMacAddress(), vm.getType().toString(), + network.getTrafficType().toString(), host.getPublicIpAddress(), network.getGateway(), nic.isDefaultNic()); + return tungstenFabricUtils.sendTungstenCommand(createTungstenVirtualMachineCommand, network.getDataCenterId()); + } + + private void updateTungstenFabricService(NicProfile nic) { + if (nic.getIPv4Address() != null) { + nic.setReservationStrategy(Nic.ReservationStrategy.Create); + } + + nic.setBroadcastType(Networks.BroadcastDomainType.TUNGSTEN); + nic.setBroadcastUri(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf")); + + if (nic.getName() == null) { + nic.setName(TungstenUtils.DEFAULT_VHOST_INTERFACE); + } + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtils.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtils.java new file mode 100644 index 00000000000..f3e321298bc --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtils.java @@ -0,0 +1,58 @@ +// 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.network.tungsten.service; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; + +@Component +public class TungstenFabricUtils { + + private static final Logger s_logger = Logger.getLogger(TungstenFabricUtils.class); + + @Inject + AgentManager agentMgr; + @Inject + TungstenProviderDao tungstenProviderDao; + + public TungstenAnswer sendTungstenCommand(TungstenCommand cmd, long zoneId) throws IllegalArgumentException { + + TungstenProviderVO tungstenProviderVO = tungstenProviderDao.findByZoneId(zoneId); + if (tungstenProviderVO == null) { + s_logger.error("No Tungsten-Fabric provider have been found!"); + throw new InvalidParameterValueException("Failed to find a Tungsten-Fabric provider"); + } + + Answer answer = agentMgr.easySend(tungstenProviderVO.getHostId(), cmd); + + if (answer == null || !answer.getResult()) { + s_logger.error("Tungsten-Fabric API Command failed"); + throw new InvalidParameterValueException("Failed API call to Tungsten-Fabric Network plugin"); + } + + return (TungstenAnswer) answer; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuru.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuru.java new file mode 100644 index 00000000000..12fe160f979 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuru.java @@ -0,0 +1,524 @@ +// 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.network.tungsten.service; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Command; +import com.cloud.dc.DataCenter; +import com.cloud.dc.Vlan; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapacityException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkMigrationResponder; +import com.cloud.network.NetworkProfile; +import com.cloud.network.Networks; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.TungstenProvider; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.guru.GuestNetworkGuru; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; +import com.cloud.user.Account; +import com.cloud.user.dao.AccountDao; +import com.cloud.utils.Pair; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.db.DB; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.VMInstanceDao; +import org.apache.cloudstack.network.tungsten.agent.api.ClearTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenVirtualMachineCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVRouterPortCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmInterfaceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNatIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.log4j.Logger; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +public class TungstenGuestNetworkGuru extends GuestNetworkGuru implements NetworkMigrationResponder { + + private static final Logger s_logger = Logger.getLogger(TungstenGuestNetworkGuru.class); + + @Inject + NetworkDao networkDao; + @Inject + IpAddressManager ipAddressManager; + @Inject + IPAddressDao ipAddressDao; + @Inject + TungstenService tungstenService; + @Inject + FirewallRulesDao firewallRulesDao; + @Inject + TungstenFabricUtils tungstenFabricUtils; + @Inject + HostDao hostDao; + @Inject + VMInstanceDao vmInstanceDao; + @Inject + VlanDao vlanDao; + @Inject + AccountDao accountDao; + @Inject + NetworkDetailsDao networkDetailsDao; + @Inject + AgentManager agentMgr; + @Inject + TungstenProviderDao tungstenProviderDao; + @Inject + NetworkOfferingServiceMapDao networkOfferingServiceMapDao; + + private static final Networks.TrafficType[] TrafficTypes = {Networks.TrafficType.Guest}; + + public TungstenGuestNetworkGuru() { + super(); + _isolationMethods = new PhysicalNetwork.IsolationMethod[] {new PhysicalNetwork.IsolationMethod("TF")}; + } + + @Override + public boolean isMyTrafficType(Networks.TrafficType type) { + for (Networks.TrafficType t : TrafficTypes) { + if (t == type) { + return true; + } + } + return false; + } + + @Override + public boolean canHandle(NetworkOffering offering, DataCenter.NetworkType networkType, + PhysicalNetwork physicalNetwork) { + return networkType == DataCenter.NetworkType.Advanced && isMyTrafficType(offering.getTrafficType()) + && isMyIsolationMethod(physicalNetwork) && networkOfferingServiceMapDao.isProviderForNetworkOffering( + offering.getId(), Network.Provider.Tungsten); + } + + @Override + public Network design(NetworkOffering offering, DeploymentPlan plan, Network userSpecified, Account owner) { + + PhysicalNetworkVO physnet = _physicalNetworkDao.findById(plan.getPhysicalNetworkId()); + DataCenter dc = _dcDao.findById(plan.getDataCenterId()); + + if (!canHandle(offering, dc.getNetworkType(), physnet)) { + s_logger.debug("Refusing to design this network"); + return null; + } + + NetworkVO network = (NetworkVO) super.design(offering, plan, userSpecified, owner); + + if (network == null) { + return null; + } + + if (userSpecified != null) { + if ((userSpecified.getIp6Cidr() == null && userSpecified.getIp6Gateway() != null) || ( + userSpecified.getIp6Cidr() != null && userSpecified.getIp6Gateway() == null)) { + throw new InvalidParameterValueException("cidrv6 and gatewayv6 must be specified together."); + } + + if (userSpecified.getIp6Cidr() != null) { + network.setIp6Cidr(userSpecified.getIp6Cidr()); + network.setIp6Gateway(userSpecified.getIp6Gateway()); + } + } + + network.setBroadcastDomainType(Networks.BroadcastDomainType.TUNGSTEN); + network.setState(Network.State.Allocated); + return network; + } + + @Override + @DB + public void deallocate(Network config, NicProfile nic, VirtualMachineProfile vm) { + super.deallocate(config, nic, vm); + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(config); + + // delete instance ip and vmi + String nicName = TungstenUtils.getVmiName(config.getTrafficType().toString(), vm.getType().toString(), + vm.getInstanceName(), nic.getId()); + TungstenCommand deleteVmiCmd = new DeleteTungstenVmInterfaceCommand(tungstenProjectFqn, nicName); + tungstenFabricUtils.sendTungstenCommand(deleteVmiCmd, config.getDataCenterId()); + + List nics = _nicDao.listByVmId(vm.getId()); + if (nics.size() == 1) { + try { + // delete tungsten vm + DeleteTungstenVmCommand cmd = new DeleteTungstenVmCommand(vm.getUuid()); + tungstenFabricUtils.sendTungstenCommand(cmd, config.getDataCenterId()); + } catch (IllegalArgumentException e) { + throw new CloudRuntimeException("Failing to expunge the vm from Tungsten-Fabric with the uuid " + vm.getUuid()); + } + } + } + + @Override + public Network implement(Network network, NetworkOffering offering, DeployDestination dest, + ReservationContext context) { + + if (network.getState() != Network.State.Implementing) { + throw new IllegalArgumentException("Why are we implementing " + network); + } + + // get zone id + long zoneId = network.getDataCenterId(); + + NetworkVO implemented = new NetworkVO(network.getTrafficType(), network.getMode(), + network.getBroadcastDomainType(), network.getNetworkOfferingId(), Network.State.Implemented, + network.getDataCenterId(), network.getPhysicalNetworkId(), offering.isRedundantRouter()); + + if (network.getGateway() != null) { + implemented.setGateway(network.getGateway()); + } + + if (network.getCidr() != null) { + implemented.setCidr(network.getCidr()); + } + + implemented.setBroadcastUri(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf")); + + // setup tungsten network + try { + if (offering.getGuestType() == Network.GuestType.Shared) { + List vlanVOList = vlanDao.listVlansByNetworkId(network.getId()); + if (!vlanVOList.isEmpty()) { + tungstenService.createSharedNetwork(network, vlanVOList.get(0)); + } else { + throw new CloudRuntimeException("can not create Tungsten-Fabric shared network"); + } + } else { + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + Network publicNetwork = _networkModel.getSystemNetworkByZoneAndTrafficType(network.getDataCenterId(), + Networks.TrafficType.Public); + + // create tungsten network + createTungstenNetwork(network, tungstenProjectFqn); + + if (!tungstenService.allocateDnsIpAddress(network, null, TungstenUtils.getSubnetName(network.getId()))) { + throw new CloudRuntimeException("can not allocate Tungsten-Fabric Dns Ip Address"); + } + + // create logical router with public network + TungstenAnswer createLogicalRouterAnswer = createTungstenLogicalRouter(network, tungstenProjectFqn); + + // after logical router created, tungsten system will create service instance + // need to wait for service instance created before get its public ip address + // need to find a way to set public ip address to instance service + TungstenCommand getTungstenNatIpCommand = new GetTungstenNatIpCommand(tungstenProjectFqn, + createLogicalRouterAnswer.getApiObjectBase().getUuid()); + TungstenAnswer getTungstenNatIpAnswer = tungstenFabricUtils.sendTungstenCommand(getTungstenNatIpCommand, + network.getDataCenterId()); + if (getTungstenNatIpAnswer.getResult()) { + String natIp = getTungstenNatIpAnswer.getDetails(); + Account networkAccount = accountDao.findById(network.getAccountId()); + ipAddressManager.assignSourceNatPublicIpAddress(zoneId, null, networkAccount, + Vlan.VlanType.VirtualNetwork, network.getId(), natIp, false, false); + + // add default tungsten guest network policy + tungstenService.addTungstenDefaultNetworkPolicy(zoneId, tungstenProjectFqn, + TungstenUtils.getVirtualNetworkPolicyName(network.getId()), network.getUuid(), + getDefautlGuestNetworkPolicyRule(network), 100, 0); + + IPAddressVO ipAddressVO = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), natIp); + Pair pair = NetUtils.getCidr(network.getCidr()); + + List tungstenSourceNatRuleList = new ArrayList<>(); + tungstenSourceNatRuleList.add( + new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.ONE_WAY_DIRECTION, TungstenUtils.ANY, + null, TungstenUtils.ALL_IP4_PREFIX, 0, -1, -1, null, natIp, TungstenUtils.MAX_CIDR, -1, + -1)); + tungstenSourceNatRuleList.add( + new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.TWO_WAY_DIRECTION, TungstenUtils.ANY, + TungstenUtils.ANY, pair.first(), pair.second(), -1, -1, TungstenUtils.ANY, + TungstenUtils.ALL_IP4_PREFIX, 0, -1, -1)); + + tungstenService.addTungstenDefaultNetworkPolicy(zoneId, null, + TungstenUtils.getPublicNetworkPolicyName(ipAddressVO.getId()), publicNetwork.getUuid(), + tungstenSourceNatRuleList, 0, 0); + + // create gateway vmi, update logical router + createTungstenVmiGateway(network, tungstenProjectFqn); + } + } + } catch (Exception ex) { + throw new CloudRuntimeException("unable to create Tungsten-Fabric network " + network.getUuid()); + } + return implemented; + } + + @Override + public void reserve(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final DeployDestination dest, final ReservationContext context) + throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + super.reserve(nic, network, vm, dest, context); + createTungstenVM(nic, network, vm, dest); + if (nic.getName() == null) { + nic.setName(TungstenUtils.DEFAULT_VHOST_INTERFACE); + } + } + + @Override + public boolean release(final NicProfile nic, final VirtualMachineProfile vm, final String reservationId) { + // delete vrouter port + VMInstanceVO vmInstanceVO = vmInstanceDao.findById(vm.getId()); + Long hostId = vmInstanceVO.getHostId() != null ? vmInstanceVO.getHostId() : vmInstanceVO.getLastHostId(); + if (hostId != null) { + TungstenAnswer tungstenAnswer = deleteVrouterPort(hostId, nic.getUuid()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + + return super.release(nic, vm, reservationId); + } + + @Override + public void shutdown(final NetworkProfile profile, final NetworkOffering offering) { + if (offering.getGuestType() == Network.GuestType.Isolated) { + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(profile); + + Network publicNetwork = _networkModel.getSystemNetworkByZoneAndTrafficType(profile.getDataCenterId(), + Networks.TrafficType.Public); + + // clear floating ip + List staticNatIpList = ipAddressDao.listByAssociatedNetwork(profile.getId(), false); + for (IPAddressVO ipAddressVO : staticNatIpList) { + DeleteTungstenFloatingIpCommand deleteTungstenFloatingIpCommand = new DeleteTungstenFloatingIpCommand( + publicNetwork.getUuid(), TungstenUtils.getFloatingIpPoolName(profile.getDataCenterId()), + TungstenUtils.getFloatingIpName(ipAddressVO.getId())); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenFloatingIpCommand, profile.getDataCenterId()); + } + + // delete rule network policy + List firewallRuleVOList = firewallRulesDao.listByNetworkAndPurpose(profile.getId(), + FirewallRule.Purpose.Firewall); + for (FirewallRuleVO firewallRuleVO : firewallRuleVOList) { + String networkUuid = + firewallRuleVO.getTrafficType() == FirewallRule.TrafficType.Egress ? profile.getUuid() : + publicNetwork.getUuid(); + DeleteTungstenNetworkPolicyCommand deleteRuleNetworkPolicyCommand = + new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getRuleNetworkPolicyName(firewallRuleVO.getId()), tungstenProjectFqn, networkUuid); + tungstenFabricUtils.sendTungstenCommand(deleteRuleNetworkPolicyCommand, profile.getDataCenterId()); + } + + // clear source nat network policy + List sourceNatIpList = ipAddressDao.listByAssociatedNetwork(profile.getId(), true); + for (IPAddressVO ipAddressVO : sourceNatIpList) { + DeleteTungstenNetworkPolicyCommand deletePublicNetworkPolicyCommand = + new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getPublicNetworkPolicyName(ipAddressVO.getId()), null, publicNetwork.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deletePublicNetworkPolicyCommand, profile.getDataCenterId()); + } + } + super.shutdown(profile, offering); + } + + @Override + public boolean trash(Network network, NetworkOffering offering) { + try { + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + + // delete default network policy + DeleteTungstenNetworkPolicyCommand deleteTungstenNetworkPolicyCommand = + new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getVirtualNetworkPolicyName(network.getId()), tungstenProjectFqn, network.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenNetworkPolicyCommand, network.getDataCenterId()); + + // clear network gateway + ClearTungstenNetworkGatewayCommand clearTungstenNetworkGatewayCommand = + new ClearTungstenNetworkGatewayCommand( + tungstenProjectFqn, TungstenUtils.getLogicalRouterName(network.getId()), network.getId()); + tungstenFabricUtils.sendTungstenCommand(clearTungstenNetworkGatewayCommand, network.getDataCenterId()); + + if (network.getGuestType() == Network.GuestType.Shared) { + tungstenService.deallocateDnsIpAddress(network, null, TungstenUtils.getIPV4SubnetName(network.getId())); + } else { + tungstenService.deallocateDnsIpAddress(network, null, TungstenUtils.getSubnetName(network.getId())); + } + + if (network.getGuestType() == Network.GuestType.Shared) { + NetworkDetailVO networkDetailVO = networkDetailsDao.findDetail(network.getId(), "vrf"); + TungstenProvider tungstenProvider = tungstenProviderDao.findByZoneId(network.getDataCenterId()); + if (tungstenProvider != null && networkDetailVO != null) { + Host host = hostDao.findByPublicIp(tungstenProvider.getGateway()); + if (host != null) { + Command setupTungstenVRouterCommand = new SetupTungstenVRouterCommand("delete", + TungstenUtils.getSgVgwName(network.getId()), network.getCidr(), NetUtils.ALL_IP4_CIDRS, + networkDetailVO.getValue()); + agentMgr.easySend(host.getId(), setupTungstenVRouterCommand); + } + + networkDetailsDao.expunge(networkDetailVO.getId()); + } + } + + // delete network + DeleteTungstenNetworkCommand deleteTungstenNetworkCommand = new DeleteTungstenNetworkCommand( + network.getUuid()); + tungstenFabricUtils.sendTungstenCommand(deleteTungstenNetworkCommand, network.getDataCenterId()); + } catch (Exception e) { + return false; + } + return super.trash(network, offering); + } + + @Override + public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final DeployDestination dest, final ReservationContext context) { + if (vm.getType() == VirtualMachine.Type.User) { + TungstenAnswer answer = createTungstenVM(nic, network, vm, dest); + return answer.getResult(); + } else { + return true; + } + } + + @Override + public void rollbackMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final ReservationContext src, final ReservationContext dst) { + if (vm.getType() == VirtualMachine.Type.User) { + Long hostId = vm.getVirtualMachine().getHostId(); + if (hostId != null) { + deleteVrouterPort(hostId, nic.getUuid()); + } + } + } + + @Override + public void commitMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, + final ReservationContext src, final ReservationContext dst) { + if (vm.getType() == VirtualMachine.Type.User) { + Long hostId = vm.getVirtualMachine().getLastHostId(); + if (hostId != null) { + deleteVrouterPort(hostId, nic.getUuid()); + } + } + } + + private void createTungstenNetwork(Network network, String tungstenProjectFqn) { + Pair pair = NetUtils.getCidr(network.getCidr()); + TungstenCommand createTungstenGuestNetworkCommand = new CreateTungstenNetworkCommand(network.getUuid(), + TungstenUtils.getGuestNetworkName(network.getName(), network.getUuid()), network.getName(), tungstenProjectFqn, false, false, + pair.first(), pair.second(), null, network.getMode().equals(Networks.Mode.Dhcp), null, null, + null, false, false, TungstenUtils.getSubnetName(network.getId())); + + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(createTungstenGuestNetworkCommand, network.getDataCenterId()); + + if (!tungstenAnswer.getResult()) { + throw new CloudRuntimeException("can not create Tungsten-Fabric network"); + } + } + + private void createTungstenVmiGateway(Network network, String tungstenProjectFqn) { + SetTungstenNetworkGatewayCommand setTungstenNetworkGatewayCommand = new SetTungstenNetworkGatewayCommand( + tungstenProjectFqn, TungstenUtils.getLogicalRouterName(network.getId()), network.getId(), network.getUuid(), + network.getGateway()); + tungstenFabricUtils.sendTungstenCommand(setTungstenNetworkGatewayCommand, network.getDataCenterId()); + } + + private List getDefautlGuestNetworkPolicyRule(Network network) { + Pair pair = NetUtils.getCidr(network.getCidr()); + List tungstenRuleList = new ArrayList<>(); + tungstenRuleList.add( + new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.TWO_WAY_DIRECTION, TungstenUtils.ANY, + TungstenUtils.ANY, pair.first(), pair.second(), -1, -1, TungstenUtils.ANY, pair.first(), pair.second(), + -1, -1)); + tungstenRuleList.add( + new TungstenRule(TungstenUtils.DENY_ACTION, TungstenUtils.ONE_WAY_DIRECTION, TungstenUtils.ANY, + TungstenUtils.ANY, pair.first(), pair.second(), -1, -1, TungstenUtils.ANY, TungstenUtils.ALL_IP4_PREFIX, + 0, -1, -1)); + return tungstenRuleList; + } + + private TungstenAnswer createTungstenLogicalRouter(Network network, String tungstenProjectFqn) { + Network managementNetwork = _networkModel.getSystemNetworkByZoneAndTrafficType(network.getDataCenterId(), + Networks.TrafficType.Public); + TungstenCommand createTungstenLogicalRouterCommand = new CreateTungstenLogicalRouterCommand( + TungstenUtils.getLogicalRouterName(network.getId()), tungstenProjectFqn, managementNetwork.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(createTungstenLogicalRouterCommand, network.getDataCenterId()); + if (!tungstenAnswer.getResult()) { + throw new CloudRuntimeException("can not create Tungsten-Fabric logical router"); + } + return tungstenAnswer; + } + + private TungstenAnswer createTungstenVM(NicProfile nic, Network network, VirtualMachineProfile vm, + DeployDestination dest) { + String tungstenProjectFqn = tungstenService.getTungstenProjectFqn(network); + + // create tungsten vm ( vmi - ii - port ) + Host host = dest.getHost(); + if (host == null) { + VMInstanceVO vmInstanceVO = vmInstanceDao.findById(vm.getId()); + host = hostDao.findById(vmInstanceVO.getHostId()); + } + + String ipV4Address = nic.getIPv4Address() != null ? nic.getIPv4Address() : nic.getIPv6Address(); + String ipV6Address = nic.getIPv6Address() != null ? nic.getIPv6Address() : null; + CreateTungstenVirtualMachineCommand cmd = new CreateTungstenVirtualMachineCommand(tungstenProjectFqn, + network.getUuid(), vm.getUuid(), vm.getInstanceName(), nic.getUuid(), nic.getId(), ipV4Address, ipV6Address, + nic.getMacAddress(), vm.getType().toString(), network.getTrafficType().toString(), + host.getPublicIpAddress(), network.getGateway(), nic.isDefaultNic()); + return tungstenFabricUtils.sendTungstenCommand(cmd, network.getDataCenterId()); + } + + private TungstenAnswer deleteVrouterPort(long hostId, String nicUuid) { + HostVO host = hostDao.findById(hostId); + TungstenCommand deleteTungstenVRouterPortCommand = new DeleteTungstenVRouterPortCommand( + host.getPublicIpAddress(), nicUuid); + return tungstenFabricUtils.sendTungstenCommand(deleteTungstenVRouterPortCommand, host.getDataCenterId()); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApi.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApi.java new file mode 100644 index 00000000000..cfaff663c00 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApi.java @@ -0,0 +1,40 @@ +// 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.network.tungsten.service; + +import org.apache.cloudstack.network.tungsten.vrouter.IntrospectApiConnector; +import org.apache.cloudstack.network.tungsten.vrouter.IntrospectApiConnectorFactory; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; + +public class TungstenIntrospectApi { + private TungstenIntrospectApi() { + } + + private static IntrospectApiConnector getIntrospectConnector(String host, String port) { + return IntrospectApiConnectorFactory.getInstance(host, port); + } + + public static String getLinkLocalIp(String host, String port, String uuid) { + Document document = getIntrospectConnector(host, port).getSnhItfReq(uuid); + NodeList nodeList = document.getElementsByTagName("mdata_ip_addr"); + if (nodeList.getLength() == 1) { + return nodeList.item(0).getTextContent(); + } + return null; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderService.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderService.java new file mode 100644 index 00000000000..b68581d6d22 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderService.java @@ -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.network.tungsten.service; + +import com.cloud.network.TungstenProvider; +import com.cloud.utils.component.PluggableService; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricProviderCmd; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricProviderResponse; + +import java.util.List; + +public interface TungstenProviderService extends PluggableService { + TungstenProvider addProvider(CreateTungstenFabricProviderCmd cmd); + + TungstenFabricProviderResponse createTungstenProviderResponse(TungstenProvider tungstenProvider); + + List listTungstenProvider(Long zoneId); +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceImpl.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceImpl.java new file mode 100644 index 00000000000..c26cf3eccf6 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceImpl.java @@ -0,0 +1,234 @@ +// 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.network.tungsten.service; + +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.domain.dao.DomainDao; +import com.cloud.host.DetailVO; +import com.cloud.host.Host; +import com.cloud.host.dao.HostDetailsDao; +import com.cloud.network.TungstenProvider; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.projects.dao.ProjectDao; +import com.cloud.resource.ResourceManager; +import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.exception.CloudRuntimeException; +import com.google.common.collect.Lists; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; +import org.apache.cloudstack.network.tungsten.api.command.AddTungstenFabricNetworkGatewayToLogicalRouterCmd; +import org.apache.cloudstack.network.tungsten.api.command.AddTungstenFabricPolicyRuleCmd; +import org.apache.cloudstack.network.tungsten.api.command.ApplyTungstenFabricPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.ApplyTungstenFabricTagCmd; +import org.apache.cloudstack.network.tungsten.api.command.ConfigTungstenFabricServiceCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricAddressGroupCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricApplicationPolicySetCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricFirewallPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricFirewallRuleCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricLogicalRouterCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricLBHealthMonitorCmd; +import org.apache.cloudstack.network.tungsten.api.command.UpdateTungstenFabricLBHealthMonitorCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricManagementNetworkCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricProviderCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricPublicNetworkCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricServiceGroupCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricTagCmd; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricTagTypeCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricAddressGroupCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricApplicationPolicySetCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricFirewallPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricFirewallRuleCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricLogicalRouterCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricServiceGroupCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricTagCmd; +import org.apache.cloudstack.network.tungsten.api.command.DeleteTungstenFabricTagTypeCmd; +import org.apache.cloudstack.network.tungsten.api.command.GetLoadBalancerSslCertificateCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricAddressGroupCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricApplictionPolicySetCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricFirewallPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricFirewallRuleCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricLogicalRouterCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricNetworkCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricNicCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricPolicyRuleCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricProvidersCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricServiceGroupCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricTagCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricTagTypeCmd; +import org.apache.cloudstack.network.tungsten.api.command.ListTungstenFabricVmCmd; +import org.apache.cloudstack.network.tungsten.api.command.RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd; +import org.apache.cloudstack.network.tungsten.api.command.RemoveTungstenFabricPolicyCmd; +import org.apache.cloudstack.network.tungsten.api.command.RemoveTungstenFabricPolicyRuleCmd; +import org.apache.cloudstack.network.tungsten.api.command.RemoveTungstenFabricTagCmd; +import org.apache.cloudstack.network.tungsten.api.command.SynchronizeTungstenFabricDataCmd; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricProviderResponse; +import org.apache.cloudstack.network.tungsten.resource.TungstenResource; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +@Component +public class TungstenProviderServiceImpl extends ManagerBase implements TungstenProviderService { + @Inject + TungstenProviderDao tungstenProviderDao; + @Inject + DataCenterDao zoneDao; + @Inject + ResourceManager resourceMgr; + @Inject + HostDetailsDao hostDetailsDao; + @Inject + DomainDao domainDao; + @Inject + ProjectDao projectDao; + @Inject + MessageBus messageBus; + + @Override + public List> getCommands() { + return Lists.newArrayList(CreateTungstenFabricProviderCmd.class, ConfigTungstenFabricServiceCmd.class, + CreateTungstenFabricPublicNetworkCmd.class, ListTungstenFabricProvidersCmd.class, + CreateTungstenFabricManagementNetworkCmd.class, GetLoadBalancerSslCertificateCmd.class, + SynchronizeTungstenFabricDataCmd.class, CreateTungstenFabricPolicyCmd.class, + AddTungstenFabricPolicyRuleCmd.class, ListTungstenFabricPolicyCmd.class, + ListTungstenFabricPolicyRuleCmd.class, RemoveTungstenFabricPolicyRuleCmd.class, + DeleteTungstenFabricPolicyCmd.class, CreateTungstenFabricTagCmd.class, CreateTungstenFabricTagTypeCmd.class, + DeleteTungstenFabricTagCmd.class, DeleteTungstenFabricTagTypeCmd.class, ListTungstenFabricTagCmd.class, + ListTungstenFabricTagTypeCmd.class, ApplyTungstenFabricPolicyCmd.class, ApplyTungstenFabricTagCmd.class, + RemoveTungstenFabricPolicyCmd.class, RemoveTungstenFabricTagCmd.class, ListTungstenFabricNetworkCmd.class, + ListTungstenFabricVmCmd.class, ListTungstenFabricNicCmd.class, UpdateTungstenFabricLBHealthMonitorCmd.class, + CreateTungstenFabricApplicationPolicySetCmd.class, CreateTungstenFabricFirewallPolicyCmd.class, + CreateTungstenFabricFirewallRuleCmd.class, CreateTungstenFabricServiceGroupCmd.class, + CreateTungstenFabricAddressGroupCmd.class, ListTungstenFabricApplictionPolicySetCmd.class, + ListTungstenFabricFirewallPolicyCmd.class, ListTungstenFabricFirewallRuleCmd.class, + ListTungstenFabricServiceGroupCmd.class, ListTungstenFabricAddressGroupCmd.class, + DeleteTungstenFabricApplicationPolicySetCmd.class, DeleteTungstenFabricFirewallPolicyCmd.class, + DeleteTungstenFabricFirewallRuleCmd.class, DeleteTungstenFabricAddressGroupCmd.class, + DeleteTungstenFabricServiceGroupCmd.class, CreateTungstenFabricLogicalRouterCmd.class, + AddTungstenFabricNetworkGatewayToLogicalRouterCmd.class, RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd.class, + ListTungstenFabricLogicalRouterCmd.class, DeleteTungstenFabricLogicalRouterCmd.class, + ListTungstenFabricLBHealthMonitorCmd.class); + } + + @Override + public TungstenProvider addProvider(CreateTungstenFabricProviderCmd cmd) { + TungstenProviderVO tungstenProvider; + final Long zoneId = cmd.getZoneId(); + final String name = cmd.getName(); + final String hostname = cmd.getHostname(); + final String gateway = cmd.getGateway(); + final String port = cmd.getPort() == null || cmd.getPort().equals(StringUtils.EMPTY) ? "8082" : cmd.getPort(); + final String vrouterPort = + cmd.getVrouterPort() == null || cmd.getVrouterPort().equals(StringUtils.EMPTY) ? "9091" : + cmd.getVrouterPort(); + final String introspectPort = + cmd.getIntrospectPort() == null || cmd.getIntrospectPort().equals(StringUtils.EMPTY) ? "8085" : + cmd.getIntrospectPort(); + + TungstenResource tungstenResource = new TungstenResource(); + + Map params = new HashMap<>(); + params.put("guid", UUID.randomUUID().toString()); + params.put("zoneId", zoneId.toString()); + params.put("name", "TungstenDevice - " + cmd.getName()); + params.put("hostname", cmd.getHostname()); + params.put("port", port); + params.put("gateway", cmd.getGateway()); + params.put("vrouterPort", vrouterPort); + params.put("introspectPort", introspectPort); + Map hostdetails = new HashMap<>(params); + + try { + tungstenResource.configure(cmd.getHostname(), hostdetails); + final Host host = resourceMgr.addHost(zoneId, tungstenResource, Host.Type.L2Networking, params); + if (host != null) { + tungstenProvider = Transaction.execute((TransactionCallback) status -> { + TungstenProviderVO tungstenProviderVO = new TungstenProviderVO(zoneId, name, host.getId(), port, + hostname, gateway, vrouterPort, introspectPort); + tungstenProviderDao.persist(tungstenProviderVO); + + DetailVO detail = new DetailVO(host.getId(), "tungstendeviceid", + String.valueOf(tungstenProviderVO.getId())); + hostDetailsDao.persist(detail); + + return tungstenProviderVO; + }); + messageBus.publish(_name, TungstenService.MESSAGE_SYNC_TUNGSTEN_DB_WITH_DOMAINS_AND_PROJECTS_EVENT, + PublishScope.LOCAL, tungstenProvider); + } else { + throw new CloudRuntimeException("Failed to add Tungsten-Fabric provider due to internal error."); + } + } catch (ConfigurationException e) { + throw new CloudRuntimeException(e.getMessage()); + } + + return tungstenProvider; + } + + @Override + public List listTungstenProvider(Long zoneId) { + List tungstenProviderResponseList = new ArrayList<>(); + if (zoneId != null) { + TungstenProviderVO tungstenProviderVO = tungstenProviderDao.findByZoneId(zoneId); + tungstenProviderResponseList.add(createTungstenProviderResponse(tungstenProviderVO)); + } else { + List tungstenProviderVOList = tungstenProviderDao.listAll(); + for (TungstenProviderVO tungstenProviderVO : tungstenProviderVOList) { + tungstenProviderResponseList.add(createTungstenProviderResponse(tungstenProviderVO)); + } + } + + return tungstenProviderResponseList; + } + + @Override + public TungstenFabricProviderResponse createTungstenProviderResponse(TungstenProvider tungstenProvider) { + DataCenterVO zone = zoneDao.findById(tungstenProvider.getZoneId()); + String zoneName = zone.getName(); + TungstenFabricProviderResponse tungstenProviderResponse = new TungstenFabricProviderResponse(); + tungstenProviderResponse.setHostname(tungstenProvider.getHostname()); + tungstenProviderResponse.setName(tungstenProvider.getProviderName()); + tungstenProviderResponse.setPort(tungstenProvider.getPort()); + tungstenProviderResponse.setUuid(tungstenProvider.getUuid()); + tungstenProviderResponse.setGateway(tungstenProvider.getGateway()); + tungstenProviderResponse.setIntrospectPort(tungstenProvider.getIntrospectPort()); + tungstenProviderResponse.setVrouterPort(tungstenProvider.getVrouterPort()); + tungstenProviderResponse.setZoneId(tungstenProvider.getZoneId()); + tungstenProviderResponse.setZoneName(zoneName); + tungstenProviderResponse.setSecurityGroupsEnabled(zone.isSecurityGroupEnabled()); + tungstenProviderResponse.setObjectName("tungstenProvider"); + return tungstenProviderResponse; + } + + +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenService.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenService.java new file mode 100644 index 00000000000..5f6b02b7214 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenService.java @@ -0,0 +1,207 @@ +// 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.network.tungsten.service; + +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Pod; +import com.cloud.dc.Vlan; +import com.cloud.dc.VlanVO; +import com.cloud.network.Network; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.vm.VMInstanceVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricAddressGroupResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricApplicationPolicySetResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallPolicyResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallRuleResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricRuleResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricServiceGroupResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagTypeResponse; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; + +import java.util.List; + +public interface TungstenService { + + static final ConfigKey TUNGSTEN_ENABLED = new ConfigKey(Boolean.class, "tungsten.plugin.enable", "Advanced", "false", + "Indicates whether to enable the Tungsten plugin", false, ConfigKey.Scope.Zone, null); + + static Boolean isTungstenEnabled(long zoneId) { + return TUNGSTEN_ENABLED.valueIn(zoneId); + } + + String getTungstenProjectFqn(Network network); + + List getTungstenProviders(); + + boolean createPublicNetwork(long zoneId); + + boolean addPublicNetworkSubnet(VlanVO vlanVO); + + boolean removePublicNetworkSubnet(VlanVO vlanVO); + + boolean deletePublicNetwork(long zoneId); + + boolean createManagementNetwork(long zoneId); + + boolean deleteManagementNetwork(long zoneId); + + boolean addManagementNetworkSubnet(HostPodVO pod); + + boolean removeManagementNetworkSubnet(HostPodVO pod); + + boolean updateLoadBalancer(Network network, LoadBalancingRule rule); + + boolean updateLoadBalancerSsl(Network network, LoadBalancingRule loadBalancingRule); + + boolean synchronizeTungstenData(Long tungstenProviderId); + + boolean addTungstenDefaultNetworkPolicy(long zoneId, String projectFqn, String policyName, String networkUuid, + List ruleList, int majorSequence, int minorSequence); + + TungstenFabricPolicyResponse createTungstenPolicy(long zoneId, String name); + + TungstenFabricTagResponse createTungstenTag(long zoneId, String tagType, String tagValue); + + TungstenFabricTagTypeResponse createTungstenTagType(long zoneId, String name); + + TungstenFabricAddressGroupResponse createTungstenAddressGroup(long zoneId, String name, String ipPrefix, + int ipPrefixLen); + + TungstenFabricServiceGroupResponse createTungstenServiceGroup(long zoneId, String name, String protocol, + int startPort, int endPort); + + TungstenFabricFirewallRuleResponse createTungstenFirewallRule(long zoneId, final String firewallPolicyUuid, String name, String serviceGroupUuid, + String action, String srcTagUuid, String srcAddressGroupUuid, String srcNetworkUuid, String direction, String destTagUuid, + String destAddressGroupUuid, String destNetworkUuid, String tagTypeUuid, int sequence); + + TungstenFabricFirewallPolicyResponse createTungstenFirewallPolicy(long zoneId, String applicationPolicySetUuid, String name, int sequence); + + TungstenFabricApplicationPolicySetResponse createTungstenApplicationPolicySet(long zoneId, String name); + + TungstenFabricRuleResponse addTungstenPolicyRule(final long zoneId, final String policyUuid, final String action, + final String direction, final String protocol, final String srcNetwork, final String srcIpPrefix, + final int srcIpPrefixLen, final int srcStartPort, final int srcEndPort, final String destNetwork, + final String destIpPrefix, final int destIpPrefixLen, final int destStartPort, final int destEndPort); + + List listTungstenPolicy(long zoneId, final Long networkId, final Long addressId, + final String policyUuid); + + List listTungstenNetwork(long zoneId, final String networkUuid, final boolean listAll); + + List listTungstenNic(long zoneId, final String nicUuid); + + List listTungstenVm(long zoneId, final String vmUuid); + + List listTungstenPolicyRule(final long zoneId, final String policyUuid, final String ruleUuid); + + List listTungstenTags(final long zoneId, final String networkUuid, final String vmUuid, + final String nicUuid, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid); + + List listTungstenTagTypes(final long zoneId, final String tagTypeUuid); + + List listTungstenApplicationPolicySet(final long zoneId, final String applicationPolicySetUuid); + + List listTungstenFirewallPolicy(final long zoneId, final String applicationPolicySetUuid, + final String firewallPolicyUuid); + + List listTungstenFirewallRule(final long zoneId, final String firewallPolicyUuid, + final String firewallRuleUuid); + + List listTungstenServiceGroup(final long zoneId, final String serviceGroupUuid); + + List listTungstenAddressGroup(final long zoneId, final String addressGroupUuid); + + boolean deleteTungstenPolicy(final long zoneId, final String policyUuid); + + TungstenFabricPolicyResponse removeTungstenPolicyRule(final long zoneId, final String policyUuid, + final String ruleUuid); + + boolean deleteTungstenTag(final long zoneId, final String tagUuid); + + boolean deleteTungstenTagType(final long zoneId, final String tagTypeUuid); + + boolean deleteTungstenApplicationPolicySet(final long zoneId, final String applicationPolicySetUuid); + + boolean deleteTungstenFirewallPolicy(final long zoneId, final String firewallPolicyUuid); + + boolean deleteTungstenFirewallRule(final long zoneId, final String firewallRuleUuid); + + boolean deleteTungstenServiceGroup(final long zoneId, final String serviceGroupUuid); + + boolean deleteTungstenAddressGroup(final long zoneId, final String addressGroupUuid); + + TungstenFabricPolicyResponse applyTungstenPolicy(final long zoneId, final String networkUuid, + final String policyUuid, final int majorSequence, final int minorSequence); + + TungstenFabricTagResponse applyTungstenTag(final long zoneId, final List networkUuids, + final List vmUuids, final List nicUuids, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid); + + TungstenFabricPolicyResponse removeTungstenPolicy(final long zoneId, final String networkUuid, + final String policyUuid); + + TungstenFabricTagResponse removeTungstenTag(final long zoneId, final List networkUuids, + final List vmUuids, final List nicUuids, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid); + + void subscribeTungstenEvent(); + + boolean createSharedNetwork(Network network, Vlan vlan); + + boolean addTungstenVmSecurityGroup(VMInstanceVO vm); + + boolean removeTungstenVmSecurityGroup(VMInstanceVO vm); + + boolean allocateDnsIpAddress(Network network, Pod pod, String subnetName); + + void deallocateDnsIpAddress(Network network, Pod pod, String subnetName); + + BaseResponse createRoutingLogicalRouter(final long zoneId, final String projectFqn, final String name); + + BaseResponse addNetworkGatewayToLogicalRouter(final long zoneId, final String networkUuid, + final String logicalRouterUuid); + + List listRoutingLogicalRouter(final long zoneId, final String networkUuid, final String logicalRouterUuid); + + BaseResponse removeNetworkGatewayFromLogicalRouter(final long zoneId, final String networkUuid, + final String logicalRouterUuid); + + boolean deleteLogicalRouter(final long zoneId, final String logicalRouterUuid); + + List listConnectedNetworkFromLogicalRouter(final long zoneId, final String logicalRouterUuid); + + TungstenFabricLBHealthMonitorVO updateTungstenFabricLBHealthMonitor(final long lbId, final String type, final int retry, final int timeout, final int interval, final String httpMethod, final String expectedCode, final String urlPath); + + boolean applyLBHealthMonitor(final long lbId); + + List listTungstenFabricLBHealthMonitor(final long lbId); + + String MESSAGE_APPLY_NETWORK_POLICY_EVENT = "Message.ApplyNetworkPolicy.Event"; + String MESSAGE_SYNC_TUNGSTEN_DB_WITH_DOMAINS_AND_PROJECTS_EVENT = "Message.SyncTungstenDnWithDomainsAndProjects.Event"; + + enum MonitorType { + PING, TCP, HTTP + } + + enum HttpType { + GET, HEAD + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java new file mode 100644 index 00000000000..f54aaba1d77 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImpl.java @@ -0,0 +1,2555 @@ +// 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.network.tungsten.service; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterIpAddressVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.Pod; +import com.cloud.dc.Vlan; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.DataCenterIpAddressDao; +import com.cloud.domain.Domain; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.network.IpAddress; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.NetworkService; +import com.cloud.network.Networks; +import com.cloud.network.TungstenGuestNetworkIpAddressVO; +import com.cloud.network.TungstenProvider; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.LoadBalancerCertMapDao; +import com.cloud.network.dao.LoadBalancerCertMapVO; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.LoadBalancerVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.SslCertVO; +import com.cloud.network.dao.TungstenGuestNetworkIpAddressDao; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRulesService; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.network.security.SecurityGroup; +import com.cloud.network.security.SecurityGroupManager; +import com.cloud.network.security.SecurityGroupRuleVO; +import com.cloud.network.security.SecurityGroupService; +import com.cloud.network.security.SecurityGroupVO; +import com.cloud.network.security.SecurityRule; +import com.cloud.network.security.TungstenSecurityGroupRule; +import com.cloud.network.security.TungstenSecurityGroupRuleVO; +import com.cloud.network.security.dao.SecurityGroupDao; +import com.cloud.network.security.dao.SecurityGroupRuleDao; +import com.cloud.network.security.dao.SecurityGroupVMMapDao; +import com.cloud.network.security.dao.TungstenSecurityGroupRuleDao; +import com.cloud.projects.Project; +import com.cloud.projects.ProjectManager; +import com.cloud.projects.ProjectVO; +import com.cloud.projects.dao.ProjectDao; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.DomainManager; +import com.cloud.user.User; +import com.cloud.user.dao.AccountDao; +import com.cloud.utils.EncryptionUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.component.ManagerBase; +import com.cloud.utils.db.EntityManager; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.Ip; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic; +import com.cloud.vm.NicSecondaryIp; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.NicSecondaryIpDao; +import com.cloud.vm.dao.NicSecondaryIpVO; +import net.juniper.tungsten.api.ApiObjectBase; +import net.juniper.tungsten.api.types.AddressGroup; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.PolicyEntriesType; +import net.juniper.tungsten.api.types.PolicyRuleType; +import net.juniper.tungsten.api.types.ServiceGroup; +import net.juniper.tungsten.api.types.TagType; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkGatewayToLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenVmToSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDefaultProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenFabricNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNetworkDnsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenConnectedNetworkFromLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNicCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkGatewayFromLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenVmFromSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateLoadBalancerServiceInstanceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenDefaultSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadbalancerSslCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadbalancerStatsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenVrouterConfigCommand; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricAddressGroupResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricApplicationPolicySetResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallPolicyResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallRuleResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLBHealthMonitorResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLogicalRouterResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricNetworkResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricNicResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricRuleResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricServiceGroupResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagTypeResponse; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricVmResponse; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorDao; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; +import org.apache.cloudstack.network.tungsten.model.TungstenLogicalRouter; +import org.apache.cloudstack.network.tungsten.model.TungstenModel; +import org.apache.cloudstack.network.tungsten.model.TungstenNetworkPolicy; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.cloudstack.network.tungsten.model.TungstenTag; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.InvalidParameterException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; + +public class TungstenServiceImpl extends ManagerBase implements TungstenService, Configurable { + private static final Logger s_logger = Logger.getLogger(TungstenServiceImpl.class); + + private static final String NETWORK = "network"; + + @Inject + protected MessageBus messageBus; + @Inject + protected ProjectDao projectDao; + @Inject + protected AccountDao accountDao; + @Inject + protected NetworkDao networkDao; + @Inject + protected ConfigurationDao configDao; + @Inject + protected AccountManager accountMgr; + @Inject + protected IPAddressDao ipAddressDao; + @Inject + protected EntityManager entityMgr; + @Inject + protected NetworkModel networkModel; + @Inject + protected DomainDao domainDao; + @Inject + protected LoadBalancerCertMapDao lbCertMapDao; + @Inject + protected FirewallRulesDao fwRulesDao; + @Inject + protected TungstenGuestNetworkIpAddressDao tungstenGuestNetworkIpAddressDao; + @Inject + protected TungstenProviderDao tungstenProviderDao; + @Inject + protected TungstenFabricUtils tungstenFabricUtils; + @Inject + protected AgentManager agentMgr; + @Inject + protected HostDao hostDao; + @Inject + protected NetworkDetailsDao networkDetailsDao; + @Inject + protected SecurityGroupDao securityGroupDao; + @Inject + protected NicDao nicDao; + @Inject + protected TungstenSecurityGroupRuleDao tungstenSecurityGroupRuleDao; + @Inject + protected SecurityGroupVMMapDao securityGroupVMMapDao; + @Inject + protected SecurityGroupRuleDao securityGroupRuleDao; + @Inject + protected SecurityGroupManager securityGroupManager; + @Inject + protected NicSecondaryIpDao nicSecIpDao; + @Inject + protected DataCenterIpAddressDao dataCenterIpAddressDao; + @Inject + protected DataCenterDao dataCenterDao; + @Inject + protected IpAddressManager ipAddressManager; + @Inject + protected TungstenFabricLBHealthMonitorDao tungstenFabricLBHealthMonitorDao; + @Inject + protected LoadBalancingRulesService loadBalancingRulesService; + @Inject + LoadBalancerDao loadBalancerDao; + + @Override + public boolean start() { + subscribeTungstenEvent(); + return true; + } + + @Override + public boolean synchronizeTungstenData(Long tungstenProviderId) { + TungstenProviderVO tungstenProviderVO = tungstenProviderDao.findById(tungstenProviderId); + return tungstenProviderVO != null && syncTungstenDbWithCloudstackProjectsAndDomains(); + } + + @Override + public void subscribeTungstenEvent() { + subscribeIpAddressEvent(); + subscribeNetworkPolicyEvent(); + subscribeVlanEvent(); + subscribePopEvent(); + subscribeDomainEvent(); + subscribeProjectEvent(); + subscribeSecurityGroupEvent(); + subscribeSecondaryNicEvent(); + subscribeSynchonizeEvent(); + } + + private void subscribeSynchonizeEvent() { + messageBus.subscribe(TungstenService.MESSAGE_SYNC_TUNGSTEN_DB_WITH_DOMAINS_AND_PROJECTS_EVENT, + (senderAddress, subject, args) -> { + try { + syncTungstenDbWithCloudstackProjectsAndDomains(); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeIpAddressEvent() { + messageBus.subscribe(IpAddressManager.MESSAGE_ASSIGN_IPADDR_EVENT, (senderAddress, subject, args) -> { + try { + final IpAddress ipAddress = (IpAddress) args; + long zoneId = ipAddress.getDataCenterId(); + TungstenProvider tungstenProvider = tungstenProviderDao.findByZoneId(zoneId); + if (!ipAddress.isSourceNat() && tungstenProvider != null) { + createTungstenFloatingIp(zoneId, ipAddress); + } + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(IpAddressManager.MESSAGE_RELEASE_IPADDR_EVENT, (senderAddress, subject, args) -> { + try { + final IpAddress ipAddress = (IpAddress) args; + if (!ipAddress.isSourceNat() && ipAddress.getState() == IpAddress.State.Releasing) { + long zoneId = ipAddress.getDataCenterId(); + TungstenProvider tungstenProvider = tungstenProviderDao.findByZoneId(zoneId); + if (tungstenProvider != null) { + deleteTungstenFloatingIp(zoneId, ipAddress); + } + } + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeNetworkPolicyEvent() { + messageBus.subscribe(TungstenService.MESSAGE_APPLY_NETWORK_POLICY_EVENT, (senderAddress, subject, args) -> { + try { + final Network network = (Network) args; + List ipAddressVOList = ipAddressDao.listByAccount(Account.ACCOUNT_ID_SYSTEM); + for (IPAddressVO ipAddressVO : ipAddressVOList) { + ApplyTungstenNetworkPolicyCommand applyTungstenNetworkPolicyCommand = + new ApplyTungstenNetworkPolicyCommand( + null, TungstenUtils.getPublicNetworkPolicyName(ipAddressVO.getId()), + network.getUuid(), 1, + 0); + tungstenFabricUtils.sendTungstenCommand(applyTungstenNetworkPolicyCommand, + network.getDataCenterId()); + } + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeVlanEvent() { + messageBus.subscribe(ConfigurationManager.MESSAGE_CREATE_VLAN_IP_RANGE_EVENT, + (senderAddress, subject, args) -> { + try { + final VlanVO vlanVO = (VlanVO) args; + addPublicNetworkSubnet(vlanVO); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(ConfigurationManager.MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, + (senderAddress, subject, args) -> { + try { + final VlanVO vlanVO = (VlanVO) args; + removePublicNetworkSubnet(vlanVO); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribePopEvent() { + messageBus.subscribe(ConfigurationManager.MESSAGE_CREATE_POD_IP_RANGE_EVENT, (senderAddress, subject, args) -> { + try { + final HostPodVO pod = (HostPodVO) args; + addManagementNetworkSubnet(pod); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(ConfigurationManager.MESSAGE_DELETE_POD_IP_RANGE_EVENT, (senderAddress, subject, args) -> { + try { + final HostPodVO pod = (HostPodVO) args; + removeManagementNetworkSubnet(pod); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeDomainEvent() { + messageBus.subscribe(DomainManager.MESSAGE_CREATE_TUNGSTEN_DOMAIN_EVENT, (senderAddress, subject, args) -> { + try { + final DomainVO domain = (DomainVO) args; + createTungstenDomain(domain); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(DomainManager.MESSAGE_DELETE_TUNGSTEN_DOMAIN_EVENT, (senderAddress, subject, args) -> { + try { + final DomainVO domain = (DomainVO) args; + deleteTungstenDomain(domain); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeProjectEvent() { + messageBus.subscribe(ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT, (senderAddress, subject, args) -> { + try { + final Project project = (Project) args; + createTungstenProject(project); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(ProjectManager.MESSAGE_DELETE_TUNGSTEN_PROJECT_EVENT, (senderAddress, subject, args) -> { + try { + final Project project = (Project) args; + deleteTungstenProject(project); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeSecurityGroupEvent() { + messageBus.subscribe(SecurityGroupService.MESSAGE_CREATE_TUNGSTEN_SECURITY_GROUP_EVENT, + (senderAddress, subject, args) -> { + try { + final SecurityGroup securityGroup = (SecurityGroup) args; + createTungstenSecurityGroup(securityGroup); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(SecurityGroupService.MESSAGE_DELETE_TUNGSTEN_SECURITY_GROUP_EVENT, + (senderAddress, subject, args) -> { + try { + final SecurityGroup securityGroup = (SecurityGroup) args; + deleteTungstenSecurityGroup(securityGroup); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(SecurityGroupService.MESSAGE_ADD_SECURITY_GROUP_RULE_EVENT, (senderAddress, subject, + args) -> { + try { + final List securityRules = (List) args; + addTungstenSecurityGroupRule(securityRules); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(SecurityGroupService.MESSAGE_REMOVE_SECURITY_GROUP_RULE_EVENT, (senderAddress, subject, + args) -> { + try { + final SecurityRule securityRule = (SecurityRule) args; + removeTungstenSecurityGroupRule(securityRule); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + private void subscribeSecondaryNicEvent() { + messageBus.subscribe(NetworkService.MESSAGE_ASSIGN_NIC_SECONDARY_IP_EVENT, (senderAddress, subject, args) -> { + try { + final long id = (long) args; + addTungstenNicSecondaryIpAddress(id); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + + messageBus.subscribe(NetworkService.MESSAGE_RELEASE_NIC_SECONDARY_IP_EVENT, (senderAddress, subject, args) -> { + try { + final NicSecondaryIpVO nicSecondaryIpVO = (NicSecondaryIpVO) args; + removeTungstenNicSecondaryIpAddress(nicSecondaryIpVO); + } catch (final Exception e) { + s_logger.error(e.getMessage()); + } + }); + } + + @Override + public List getTungstenProviders() { + List tungstenProviders = tungstenProviderDao.findAll(); + return Objects.requireNonNullElseGet(tungstenProviders, ArrayList::new); + } + + private boolean createTungstenFloatingIp(long zoneId, IpAddress ipAddress) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + Network network = networkDao.findById(ipAddress.getNetworkId()); + String projectFqn = getTungstenProjectFqn(network); + TungstenCommand createTungstenFloatingIpCommand = new CreateTungstenFloatingIpCommand(projectFqn, + publicNetwork.getUuid(), TungstenUtils.getFloatingIpPoolName(zoneId), + TungstenUtils.getFloatingIpName(ipAddress.getId()), ipAddress.getAddress().addr()); + TungstenAnswer createTungstenFloatingIpAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenFloatingIpCommand, zoneId); + return createTungstenFloatingIpAnswer.getResult(); + } + + private boolean deleteTungstenFloatingIp(long zoneId, IpAddress ipAddress) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + TungstenCommand deleteTungstenFloatingIpCommand = new DeleteTungstenFloatingIpCommand(publicNetwork.getUuid(), + TungstenUtils.getFloatingIpPoolName(zoneId), TungstenUtils.getFloatingIpName(ipAddress.getId())); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(deleteTungstenFloatingIpCommand, + zoneId); + return tungstenAnswer.getResult(); + } + + private String getProject(long accountId) { + Account account = accountDao.findById(accountId); + if (account.getType() == Account.Type.PROJECT) { + ProjectVO projectVO = projectDao.findByProjectAccountId(account.getId()); + if (projectVO != null) { + return projectVO.getUuid(); + } + } + return null; + } + + @Override + public String getTungstenProjectFqn(Network network) { + + if (network == null) { + return TungstenApi.TUNGSTEN_DEFAULT_DOMAIN + ":" + TungstenApi.TUNGSTEN_DEFAULT_PROJECT; + } + + String networkProjectUuid = getProject(network.getAccountId()); + return buildProjectFqnName(network.getDomainId(), networkProjectUuid); + } + + public String buildProjectFqnName(long domainUuid, String projectUuid) { + Project project = projectDao.findByUuid(projectUuid); + Domain domain = domainDao.findById(domainUuid); + + StringBuilder sb = new StringBuilder(); + if (domain != null && domain.getName() != null && domain.getId() != Domain.ROOT_DOMAIN) { + sb.append(domain.getName()); + } else { + sb.append(TungstenApi.TUNGSTEN_DEFAULT_DOMAIN); + } + + sb.append(":"); + + if (project != null && project.getName() != null) { + sb.append(project.getName()); + } else { + sb.append(TungstenApi.TUNGSTEN_DEFAULT_PROJECT); + } + return sb.toString(); + } + + @Override + public boolean addTungstenDefaultNetworkPolicy(long zoneId, String projectFqn, String policyName, + String networkUuid, List ruleList, int majorSequence, int minorSequence) { + + // create network policy + TungstenCommand createTungstenPolicyCommand = new CreateTungstenNetworkPolicyCommand(policyName, projectFqn, + ruleList); + TungstenAnswer createTungstenPolicyAnswer = tungstenFabricUtils.sendTungstenCommand(createTungstenPolicyCommand, + zoneId); + if (!createTungstenPolicyAnswer.getResult()) { + return false; + } + + // apply network policy + TungstenCommand applyTungstenNetworkPolicyCommand = new ApplyTungstenNetworkPolicyCommand(networkUuid, + createTungstenPolicyAnswer.getApiObjectBase().getUuid(), majorSequence, minorSequence); + TungstenAnswer applyTungstenPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + applyTungstenNetworkPolicyCommand, zoneId); + return applyTungstenPolicyAnswer.getResult(); + } + + @Override + public boolean createManagementNetwork(long zoneId) { + Network managementNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, + Networks.TrafficType.Management); + + TungstenCommand createTungstenNetworkCommand = new CreateTungstenNetworkCommand(managementNetwork.getUuid(), + TungstenUtils.getManagementNetworkName(zoneId), TungstenUtils.getManagementNetworkName(zoneId), null, false, + false, null, 0, null, true, null, null, null, true, true, null); + TungstenAnswer createTungstenNetworkAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenNetworkCommand, zoneId); + + if (!createTungstenNetworkAnswer.getResult()) { + return false; + } + + // change default tungsten security group + TungstenCommand updateTungstenDefaultSecurityGroupCommand = new UpdateTungstenDefaultSecurityGroupCommand(null); + TungstenAnswer updateTungstenDefaultSecurityGroupAnswer = tungstenFabricUtils.sendTungstenCommand(updateTungstenDefaultSecurityGroupCommand, zoneId); + + if (!updateTungstenDefaultSecurityGroupAnswer.getResult()) { + return false; + } + + // change default forwarding mode + TungstenCommand updateTungstenGlobalVrouterConfigCommand = new UpdateTungstenVrouterConfigCommand( + TungstenUtils.DEFAULT_FORWARDING_MODE); + TungstenAnswer updateTungstenGlobalVrouterConfigAnswer = tungstenFabricUtils.sendTungstenCommand(updateTungstenGlobalVrouterConfigCommand, zoneId); + + if (!updateTungstenGlobalVrouterConfigAnswer.getResult()) { + return false; + } + + VirtualNetwork managementVirtualNetwork = (VirtualNetwork) createTungstenNetworkAnswer.getApiObjectBase(); + List tungstenManagementRuleList = new ArrayList<>(); + tungstenManagementRuleList.add( + new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.TWO_WAY_DIRECTION, TungstenUtils.ANY, + StringUtils.join(managementVirtualNetwork.getQualifiedName(), ":"), null, 0, -1, -1, + TungstenUtils.FABRIC_NETWORK_FQN, null, 0, -1, -1)); + + boolean addDefaultManagementPolicy = addTungstenDefaultNetworkPolicy(zoneId, null, + TungstenUtils.getManagementPolicyName(zoneId), managementVirtualNetwork.getUuid(), + tungstenManagementRuleList, 1, 0); + if (!addDefaultManagementPolicy) { + return false; + } + + TungstenCommand getTungstenFabricNetworkCommand = new GetTungstenFabricNetworkCommand(); + TungstenAnswer getTungstenFabricNetworkAnswer = tungstenFabricUtils.sendTungstenCommand( + getTungstenFabricNetworkCommand, zoneId); + if (!getTungstenFabricNetworkAnswer.getResult()) { + return false; + } + + List tungstenFabricRuleList = new ArrayList<>(); + tungstenFabricRuleList.add( + new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.TWO_WAY_DIRECTION, TungstenUtils.ANY, + TungstenUtils.FABRIC_NETWORK_FQN, null, 0, -1, -1, + StringUtils.join(managementVirtualNetwork.getQualifiedName(), ":"), null, 0, -1, -1)); + + String fabricNetworkUuid = getTungstenFabricNetworkAnswer.getApiObjectBase().getUuid(); + return addTungstenDefaultNetworkPolicy(zoneId, null, TungstenUtils.getFabricPolicyName(zoneId), + fabricNetworkUuid, tungstenFabricRuleList, 1, 0); + } + + @Override + public boolean addManagementNetworkSubnet(HostPodVO pod) { + final String[] podIpRanges = pod.getDescription().split(","); + Network managementNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(pod.getDataCenterId(), + Networks.TrafficType.Management); + + // tungsten system don't support delete a part of allocation pool in subnet + // we only create first pod ip range in a pod (the same with public network) + // in UI : don't permit to add more than 1 pod ip range if tungsten zone + // consider to permit add more pod ip range if it is not overlap subnet + if (podIpRanges.length == 1) { + final String[] ipRange = podIpRanges[0].split("-"); + String startIp = ipRange[0]; + String endIp = ipRange[1]; + + TungstenCommand addTungstenNetworkSubnetCommand = new AddTungstenNetworkSubnetCommand( + managementNetwork.getUuid(), pod.getCidrAddress(), pod.getCidrSize(), null, true, "0.0.0.0", startIp, + endIp, true, pod.getUuid()); + TungstenAnswer addTungstenNetworkSubnetAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenNetworkSubnetCommand, pod.getDataCenterId()); + + if (!addTungstenNetworkSubnetAnswer.getResult()) { + return false; + } + + return allocateDnsIpAddress(managementNetwork, pod, pod.getUuid()); + } + + return true; + } + + @Override + public boolean deleteManagementNetwork(long zoneId) { + Network managementNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, + Networks.TrafficType.Management); + + TungstenCommand deleteTungstenManagementPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getManagementPolicyName(zoneId), null, managementNetwork.getUuid()); + TungstenAnswer deleteTungstenManagementPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenManagementPolicyCommand, zoneId); + if (!deleteTungstenManagementPolicyAnswer.getResult()) { + return false; + } + + TungstenCommand getTungstenFabricNetworkCommand = new GetTungstenFabricNetworkCommand(); + TungstenAnswer getTungstenFabricNetworkAnswer = tungstenFabricUtils.sendTungstenCommand( + getTungstenFabricNetworkCommand, zoneId); + if (!getTungstenFabricNetworkAnswer.getResult()) { + return false; + } + + TungstenCommand deleteTungstenFabricPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getFabricPolicyName(zoneId), null, + getTungstenFabricNetworkAnswer.getApiObjectBase().getUuid()); + TungstenAnswer deleteTungstenFabricPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenFabricPolicyCommand, zoneId); + if (!deleteTungstenFabricPolicyAnswer.getResult()) { + return false; + } + + TungstenCommand deleteTungstenNetworkCommand = new DeleteTungstenNetworkCommand(managementNetwork.getUuid()); + TungstenAnswer deleteTungstenNetworkAnswer = tungstenFabricUtils.sendTungstenCommand(deleteTungstenNetworkCommand, zoneId); + return deleteTungstenNetworkAnswer.getResult(); + } + + @Override + public boolean removeManagementNetworkSubnet(HostPodVO pod) { + Network managementNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(pod.getDataCenterId(), + Networks.TrafficType.Management); + + deallocateDnsIpAddress(managementNetwork, pod, pod.getUuid()); + + TungstenCommand removeTungstenNetworkSubnetCommand = new RemoveTungstenNetworkSubnetCommand( + managementNetwork.getUuid(), pod.getUuid()); + + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(removeTungstenNetworkSubnetCommand, + pod.getDataCenterId()); + return tungstenAnswer.getResult(); + } + + @Override + public boolean createPublicNetwork(long zoneId) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + + // create public network + TungstenCommand createTungstenPublicNetworkCommand = new CreateTungstenNetworkCommand(publicNetwork.getUuid(), + TungstenUtils.getPublicNetworkName(zoneId), TungstenUtils.getPublicNetworkName(zoneId), null, true, false, + null, 0, null, true, null, null, null, false, false, null); + TungstenAnswer createPublicNetworkAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenPublicNetworkCommand, zoneId); + if (!createPublicNetworkAnswer.getResult()) { + return false; + } + + // add default public network policy + List tungstenRuleList = new ArrayList<>(); + tungstenRuleList.add( + new TungstenRule(TungstenUtils.DENY_ACTION, TungstenUtils.ONE_WAY_DIRECTION, TungstenUtils.ANY, + TungstenUtils.ANY, TungstenUtils.ALL_IP4_PREFIX, 0, -1, -1, TungstenUtils.ANY, + TungstenUtils.ALL_IP4_PREFIX, 0, -1, -1)); + + addTungstenDefaultNetworkPolicy(zoneId, null, TungstenUtils.getDefaultPublicNetworkPolicyName(zoneId), + publicNetwork.getUuid(), tungstenRuleList, 100, 0); + + // create floating ip pool + TungstenCommand createTungstenFloatingIpPoolCommand = new CreateTungstenFloatingIpPoolCommand( + publicNetwork.getUuid(), TungstenUtils.getFloatingIpPoolName(zoneId)); + TungstenAnswer createFloatingIpPoolAnswer = tungstenFabricUtils.sendTungstenCommand( + createTungstenFloatingIpPoolCommand, zoneId); + if (!createFloatingIpPoolAnswer.getResult()) { + return false; + } + + NetworkDetailVO networkDetailVO = new NetworkDetailVO(publicNetwork.getId(), "vrf", + TungstenUtils.getVrfNetworkName(createPublicNetworkAnswer.getApiObjectBase().getQualifiedName()), false); + NetworkDetailVO persisted = networkDetailsDao.persist(networkDetailVO); + + return persisted != null; + } + + @Override + public boolean addPublicNetworkSubnet(VlanVO pubVlanVO) { + long zoneId = pubVlanVO.getDataCenterId(); + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + + // create public ip address + String[] ipAddress = pubVlanVO.getIpRange().split("-"); + String publicNetworkCidr = NetUtils.getCidrFromGatewayAndNetmask(pubVlanVO.getVlanGateway(), + pubVlanVO.getVlanNetmask()); + Pair publicPair = NetUtils.getCidr(publicNetworkCidr); + + TungstenCommand addTungstenNetworkSubnetCommand = new AddTungstenNetworkSubnetCommand(publicNetwork.getUuid(), + publicPair.first(), publicPair.second(), pubVlanVO.getVlanGateway(), true, "0.0.0.0", ipAddress[0], + ipAddress[1], false, pubVlanVO.getUuid()); + TungstenAnswer addTungstenNetworkSubnetAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenNetworkSubnetCommand, zoneId); + if (!addTungstenNetworkSubnetAnswer.getResult()) { + return false; + } + + List tungstenRuleList = new ArrayList<>(); + tungstenRuleList.add( + new TungstenRule(TungstenUtils.PASS_ACTION, TungstenUtils.ONE_WAY_DIRECTION, TungstenUtils.ANY, + TungstenUtils.ANY, publicPair.first(), publicPair.second(), -1, -1, TungstenUtils.ANY, + TungstenUtils.ALL_IP4_PREFIX, 0, -1, -1)); + + addTungstenDefaultNetworkPolicy(zoneId, null, TungstenUtils.getDefaultPublicSubnetPolicyName(pubVlanVO.getId()), + publicNetwork.getUuid(), tungstenRuleList, 99, 0); + + return allocateDnsIpAddress(publicNetwork, null, pubVlanVO.getUuid()); + } + + @Override + public boolean deletePublicNetwork(long zoneId) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + + TungstenCommand deleteTungstenNetworkPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getDefaultPublicNetworkPolicyName(zoneId), null, publicNetwork.getUuid()); + TungstenAnswer deleteTungstenNetworkPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenNetworkPolicyCommand, zoneId); + if (!deleteTungstenNetworkPolicyAnswer.getResult()) { + return false; + } + + // delete floating ip pool + TungstenCommand deleteTungstenFloatingIpPoolCommand = new DeleteTungstenFloatingIpPoolCommand( + publicNetwork.getUuid(), TungstenUtils.getFloatingIpPoolName(zoneId)); + TungstenAnswer deleteTungstenFloatingIpPoolAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenFloatingIpPoolCommand, zoneId); + if (!deleteTungstenFloatingIpPoolAnswer.getResult()) { + return false; + } + + // delete public network + TungstenCommand deleteTungstenNetworkCommand = new DeleteTungstenNetworkCommand(publicNetwork.getUuid()); + TungstenAnswer deleteTungstenNetworkAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenNetworkCommand, zoneId); + return deleteTungstenNetworkAnswer.getResult(); + } + + @Override + public boolean removePublicNetworkSubnet(VlanVO vlanVO) { + long zoneId = vlanVO.getDataCenterId(); + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(zoneId, Networks.TrafficType.Public); + + deallocateDnsIpAddress(publicNetwork, null, vlanVO.getUuid()); + + TungstenCommand deleteTungstenNetworkPolicyCommand = new DeleteTungstenNetworkPolicyCommand( + TungstenUtils.getDefaultPublicSubnetPolicyName(vlanVO.getId()), null, publicNetwork.getUuid()); + TungstenAnswer deleteTungstenNetworkPolicyAnswer = tungstenFabricUtils.sendTungstenCommand( + deleteTungstenNetworkPolicyCommand, vlanVO.getDataCenterId()); + if (!deleteTungstenNetworkPolicyAnswer.getResult()) { + return false; + } + + TungstenCommand removeTungstenNetworkSubnetCommand = new RemoveTungstenNetworkSubnetCommand( + publicNetwork.getUuid(), vlanVO.getUuid()); + TungstenAnswer removeTungstenNetworkSubnetAnswer = tungstenFabricUtils.sendTungstenCommand( + removeTungstenNetworkSubnetCommand, zoneId); + return removeTungstenNetworkSubnetAnswer.getResult(); + } + + @Override + public boolean allocateDnsIpAddress(Network network, Pod pod, String subnetName) { + long zoneId = network.getDataCenterId(); + TungstenCommand getTungstenNetworkDnsCommand = new GetTungstenNetworkDnsCommand(network.getUuid(), subnetName); + TungstenAnswer getTungstenNetworkDnsAnswer = tungstenFabricUtils.sendTungstenCommand( + getTungstenNetworkDnsCommand, zoneId); + if (getTungstenNetworkDnsAnswer.getResult()) { + return markIpAddress(pod, network, zoneId, getTungstenNetworkDnsAnswer.getDetails()); + } + return true; + } + + private boolean markIpAddress(Pod pod, Network network, long zoneId, String ip) { + String cidr = network.getCidr(); + if (NetUtils.isIpWithInCidrRange(ip, cidr)) { + if ((network.getTrafficType() == Networks.TrafficType.Public || ( + network.getTrafficType() == Networks.TrafficType.Guest + && network.getGuestType() == Network.GuestType.Shared) && + ipAddressDao.findByIpAndDcId(zoneId, ip) != null)) { + return ipAddressDao.mark(zoneId, new Ip(ip)); + } + + if (network.getTrafficType() == Networks.TrafficType.Management && pod != null) { + long podId = pod.getId(); + if (!dataCenterIpAddressDao.listByPodIdDcIdIpAddress(podId, zoneId, ip).isEmpty()) { + return dataCenterIpAddressDao.mark(zoneId, podId, ip); + } + } + + if (network.getTrafficType() == Networks.TrafficType.Guest + && network.getGuestType() == Network.GuestType.Isolated) { + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = + new TungstenGuestNetworkIpAddressVO(network.getId(), new Ip(ip)); + return tungstenGuestNetworkIpAddressDao.persist(tungstenGuestNetworkIpAddressVO) != null; + } + } + + return true; + } + + @Override + public void deallocateDnsIpAddress(Network network, Pod pod, String subnetName) { + long zoneId = network.getDataCenterId(); + TungstenCommand getTungstenNetworkDnsCommand = new GetTungstenNetworkDnsCommand(network.getUuid(), subnetName); + TungstenAnswer getTungstenNetworkDnsAnswer = tungstenFabricUtils.sendTungstenCommand( + getTungstenNetworkDnsCommand, zoneId); + if (getTungstenNetworkDnsAnswer.getResult()) { + releaseIpAddress(pod, network, zoneId, getTungstenNetworkDnsAnswer.getDetails()); + } + } + + private void releaseIpAddress(Pod pod, Network network, long zoneId, String ip) { + if (network.getTrafficType() == Networks.TrafficType.Public || ( + network.getTrafficType() == Networks.TrafficType.Guest + && network.getGuestType() == Network.GuestType.Shared)) { + IpAddress ipAddress = ipAddressDao.findByIpAndDcId(zoneId, ip); + if (ipAddress != null) { + ipAddressDao.unassignIpAddress(ipAddress.getId()); + } + } + + if (network.getTrafficType() == Networks.TrafficType.Management && pod != null) { + long podId = pod.getId(); + List dataCenterIpAddressVOList = dataCenterIpAddressDao.listByPodIdDcIdIpAddress( + podId, zoneId, ip); + for (DataCenterIpAddressVO dataCenterIpAddressVO : dataCenterIpAddressVOList) { + dataCenterIpAddressDao.releasePodIpAddress(dataCenterIpAddressVO.getId()); + } + } + + if (network.getTrafficType() == Networks.TrafficType.Guest + && network.getGuestType() == Network.GuestType.Isolated) { + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = + tungstenGuestNetworkIpAddressDao.findByNetworkAndGuestIpAddress(network.getId(), ip); + if (tungstenGuestNetworkIpAddressVO != null) { + tungstenGuestNetworkIpAddressDao.expunge(tungstenGuestNetworkIpAddressVO.getId()); + } + } + } + + private boolean createTungstenDomain(DomainVO domain) { + if (domain != null && domain.getId() != Domain.ROOT_DOMAIN) { + List tungstenProviders = tungstenProviderDao.findAll(); + for (TungstenProviderVO tungstenProvider : tungstenProviders) { + TungstenCommand createTungstenDomainCommand = new CreateTungstenDomainCommand(domain.getName(), + domain.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(createTungstenDomainCommand, + tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + } + return true; + } + + private boolean deleteTungstenDomain(DomainVO domain) { + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + TungstenCommand deleteTungstenDomainCommand = new DeleteTungstenDomainCommand(domain.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(deleteTungstenDomainCommand, + tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + return true; + } + + private boolean createTungstenProject(Project project) { + String domainName; + String domainUuid; + Domain domain = domainDao.findById(project.getDomainId()); + //Check if the domain is the root domain + //if the domain is root domain we will use the default domain from tungsten by setting + //both domainName and domainUuid to null + if (domain != null && domain.getId() != Domain.ROOT_DOMAIN) { + domainName = domain.getName(); + domainUuid = domain.getUuid(); + } else { + domainName = null; + domainUuid = null; + } + if (domain != null) { + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + TungstenCommand createTungstenProjectCommand = new CreateTungstenProjectCommand(project.getName(), + project.getUuid(), domainUuid, domainName); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(createTungstenProjectCommand, + tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + + TungstenCommand updateTungstenDefaultSecurityGroupCommand = + new UpdateTungstenDefaultSecurityGroupCommand( + buildProjectFqnName(domain.getId(), project.getUuid())); + TungstenAnswer updateTungstenDefaultSecurityGroupAnswer = tungstenFabricUtils.sendTungstenCommand( + updateTungstenDefaultSecurityGroupCommand, tungstenProvider.getZoneId()); + if (!updateTungstenDefaultSecurityGroupAnswer.getResult()) { + return false; + } + } + } + return true; + } + + private boolean deleteTungstenProject(Project project) { + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + TungstenCommand deleteTungstenProjectCommand = new DeleteTungstenProjectCommand(project.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(deleteTungstenProjectCommand, + tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + return true; + } + + public boolean syncTungstenDbWithCloudstackProjectsAndDomains() { + List cloudstackDomains = domainDao.listAll(); + List cloudstackProjects = projectDao.listAll(); + + if (cloudstackDomains != null) { + for (DomainVO domain : cloudstackDomains) { + if (!createTungstenDomain(domain)) { + return false; + } + } + } + + if (cloudstackProjects != null) { + for (ProjectVO project : cloudstackProjects) { + if (!createTungstenProject(project)) { + return false; + } + } + } + + return createTungstenDefaultProject(); + } + + private boolean createTungstenDefaultProject() { + + List tungstenProviders = tungstenProviderDao.findAll(); + for (TungstenProviderVO tungstenProvider : tungstenProviders) { + TungstenCommand tungstenCommand = new CreateTungstenDefaultProjectCommand(); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + + return true; + } + + @Override + // remove this when tungsten support cloudstack ssl and stats + public boolean updateLoadBalancer(Network network, LoadBalancingRule loadBalancingRule) { + Network publicNetwork = networkModel.getSystemNetworkByZoneAndTrafficType(network.getDataCenterId(), + Networks.TrafficType.Public); + IPAddressVO ipAddressVO = ipAddressDao.findByIpAndDcId(network.getDataCenterId(), + loadBalancingRule.getSourceIp().addr()); + List hostList = hostDao.listAllHostsByZoneAndHypervisorType(network.getDataCenterId(), + Hypervisor.HypervisorType.KVM); + + TungstenCommand getTungstenLoadBalancerCommand = new GetTungstenLoadBalancerCommand( + getTungstenProjectFqn(network), TungstenUtils.getLoadBalancerName(ipAddressVO.getId())); + TungstenAnswer getTungstenLoadBalancerAnswer = tungstenFabricUtils.sendTungstenCommand( + getTungstenLoadBalancerCommand, network.getDataCenterId()); + if (!getTungstenLoadBalancerAnswer.getResult()) { + return false; + } + + // wait for service instance update + try { + TimeUnit.SECONDS.sleep(5); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + // remove fat flow protocol + TungstenCommand updateLoadBalancerServiceInstanceCommand = new UpdateLoadBalancerServiceInstanceCommand( + publicNetwork.getUuid(), TungstenUtils.getFloatingIpPoolName(network.getDataCenterId()), + TungstenUtils.getFloatingIpName(ipAddressVO.getId())); + TungstenAnswer updateLoadBalancerServiceInstanceAnswer = tungstenFabricUtils.sendTungstenCommand( + updateLoadBalancerServiceInstanceCommand, network.getDataCenterId()); + if (!updateLoadBalancerServiceInstanceAnswer.getResult()) { + return false; + } + + // wait for service instance update + try { + TimeUnit.SECONDS.sleep(5); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + String lbUuid = getTungstenLoadBalancerAnswer.getApiObjectBase().getUuid(); + + return updateHaproxyStats(hostList, lbUuid) && updateHaproxySsl(hostList, network, ipAddressVO, lbUuid); + } + + private boolean updateHaproxyStats(List hostList, String lbUuid) { + // update haproxy stats + String lbStatsVisibility = configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key()); + if (!lbStatsVisibility.equals("disabled")) { + String lbStatsUri = configDao.getValue(Config.NetworkLBHaproxyStatsUri.key()); + String lbStatsAuth = configDao.getValue(Config.NetworkLBHaproxyStatsAuth.key()); + String lbStatsPort = configDao.getValue(Config.NetworkLBHaproxyStatsPort.key()); + UpdateTungstenLoadbalancerStatsCommand updateTungstenLoadbalancerStatsCommand = + new UpdateTungstenLoadbalancerStatsCommand(lbUuid, lbStatsPort, lbStatsUri, lbStatsAuth); + for (HostVO host : hostList) { + Answer answer = agentMgr.easySend(host.getId(), updateTungstenLoadbalancerStatsCommand); + if (answer == null || !answer.getResult()) { + return false; + } + } + } + return true; + } + + private boolean updateHaproxySsl(List hostList, Network network, IPAddressVO ipAddressVO, String lbUuid) { + // update haproxy ssl + List firewallRulesDaoVOList = fwRulesDao.listByIpAndPurposeAndNotRevoked(ipAddressVO.getId(), + FirewallRule.Purpose.LoadBalancing); + for (FirewallRuleVO firewallRuleVO : firewallRulesDaoVOList) { + LoadBalancerCertMapVO loadBalancerCertMapVO = lbCertMapDao.findByLbRuleId(firewallRuleVO.getId()); + if (loadBalancerCertMapVO != null) { + SslCertVO certVO = entityMgr.findById(SslCertVO.class, loadBalancerCertMapVO.getCertId()); + if (certVO == null) { + return false; + } + + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = + tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp( + network.getId(), ipAddressVO.getAddress().addr()); + + UpdateTungstenLoadbalancerSslCommand updateTungstenLoadbalancerSslCommand = + new UpdateTungstenLoadbalancerSslCommand(lbUuid, certVO.getName(), + certVO.getCertificate(), certVO.getKey(), + tungstenGuestNetworkIpAddressVO.getGuestIpAddress().addr(), String.valueOf(NetUtils.HTTPS_PORT)); + for (HostVO host : hostList) { + Answer answer = agentMgr.easySend(host.getId(), updateTungstenLoadbalancerSslCommand); + if (answer == null || !answer.getResult()) { + return false; + } + } + } + } + + return true; + } + + @Override + // add this when tungsten support cloudstack ssl + public boolean updateLoadBalancerSsl(Network network, LoadBalancingRule loadBalancingRule) { + LoadBalancingRule.LbSslCert lbSslCert = loadBalancingRule.getLbSslCert(); + if (lbSslCert != null) { + String httpsProtocol = "TERMINATED_HTTPS"; + int listenerPort = NetUtils.HTTPS_PORT; + + User callerUser = accountMgr.getActiveUser(CallContext.current().getCallingUserId()); + String apiKey = callerUser.getApiKey(); + String secretKey = callerUser.getSecretKey(); + if (apiKey != null && secretKey != null) { + String url; + try { + String data = "apiKey=" + URLEncoder.encode(apiKey, StandardCharsets.UTF_8.name()).replace("\\+", "%20") + "&command" + + "=getLoadBalancerSslCertificate" + "&id=" + URLEncoder.encode( + loadBalancingRule.getUuid(), StandardCharsets.UTF_8.name()).replace("\\+", "%20") + "&response=json"; + String signature = EncryptionUtil.generateSignature(data.toLowerCase(), secretKey); + url = data + "&signature=" + URLEncoder.encode(signature, StandardCharsets.UTF_8.name()).replace("\\+", "%2B"); + } catch (UnsupportedEncodingException e) { + return false; + } + + TungstenCommand updateTungstenLoadBalancerListenerCommand = new UpdateTungstenLoadBalancerListenerCommand( + getTungstenProjectFqn(network), TungstenUtils.getLoadBalancerListenerName(loadBalancingRule.getId()), + httpsProtocol, listenerPort, url); + TungstenAnswer updateTungstenLoadBalancerListenerAnswer = tungstenFabricUtils.sendTungstenCommand( + updateTungstenLoadBalancerListenerCommand, network.getDataCenterId()); + return updateTungstenLoadBalancerListenerAnswer.getResult(); + } else { + s_logger.error("Tungsten-Fabric ssl require user api key"); + } + } + return true; + } + + public boolean createTungstenSecurityGroup(SecurityGroup securityGroup) { + Project project = projectDao.findByProjectAccountId(securityGroup.getAccountId()); + String projectFqn; + if (project != null) { + projectFqn = buildProjectFqnName(securityGroup.getDomainId(), project.getUuid()); + } else { + projectFqn = buildProjectFqnName(securityGroup.getDomainId(), null); + } + + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + List tungstenSecurityGroupRuleVOList = createDefaultTungstenSecurityGroupRule( + tungstenProvider, securityGroup, projectFqn); + + TungstenCommand createTungstenSecurityGroupCommand = new CreateTungstenSecurityGroupCommand( + securityGroup.getUuid(), + TungstenUtils.getSecurityGroupName(securityGroup.getName(), securityGroup.getAccountId()), + securityGroup.getDescription(), projectFqn); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(createTungstenSecurityGroupCommand, + tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + + for (TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO : tungstenSecurityGroupRuleVOList) { + TungstenCommand addTungstenSecurityGroupRuleCommand = new AddTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), tungstenSecurityGroupRuleVO.getUuid(), + tungstenSecurityGroupRuleVO.getRuleType(), NetUtils.PORT_RANGE_MIN, NetUtils.PORT_RANGE_MAX, + tungstenSecurityGroupRuleVO.getRuleTarget(), tungstenSecurityGroupRuleVO.getEtherType(), + NetUtils.ANY_PROTO); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + if (!addTungstenSecurityGroupRuleAnswer.getResult()) { + return false; + } + } + } + return true; + } + + private List createDefaultTungstenSecurityGroupRule(TungstenProvider tungstenProvider + , SecurityGroup securityGroup, String projectFqn) { + // create default Tungsten-Fabric security group rule + return Transaction.execute( + (TransactionCallback>) status -> { + List ruleVOList = new ArrayList<>(); + TungstenSecurityGroupRuleVO defaultIpv4EgressRule = + tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityGroup.getId(), TungstenUtils.EGRESS_RULE, TungstenUtils.IPV4); + if (defaultIpv4EgressRule == null) { + defaultIpv4EgressRule = new TungstenSecurityGroupRuleVO(tungstenProvider.getZoneId(), + securityGroup.getId(), TungstenUtils.EGRESS_RULE, NetUtils.ALL_IP4_CIDRS, + TungstenUtils.IPV4, true); + tungstenSecurityGroupRuleDao.persist(defaultIpv4EgressRule); + ruleVOList.add(defaultIpv4EgressRule); + } + + TungstenSecurityGroupRuleVO defaultIpv6EgressRule = + tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityGroup.getId(), TungstenUtils.EGRESS_RULE, TungstenUtils.IPV6); + if (defaultIpv6EgressRule == null) { + defaultIpv6EgressRule = new TungstenSecurityGroupRuleVO(tungstenProvider.getZoneId(), + securityGroup.getId(), TungstenUtils.EGRESS_RULE, NetUtils.ALL_IP6_CIDRS, + TungstenUtils.IPV6, true); + tungstenSecurityGroupRuleDao.persist(defaultIpv6EgressRule); + ruleVOList.add(defaultIpv6EgressRule); + } + + TungstenSecurityGroupRuleVO defaultIpv4IngressRule = + tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityGroup.getId(), TungstenUtils.INGRESS_RULE, TungstenUtils.IPV4); + if (defaultIpv4IngressRule == null) { + defaultIpv4IngressRule = new TungstenSecurityGroupRuleVO(tungstenProvider.getZoneId(), + securityGroup.getId(), TungstenUtils.INGRESS_RULE, + projectFqn + ":" + TungstenUtils.LOCAL, TungstenUtils.IPV4, true); + tungstenSecurityGroupRuleDao.persist(defaultIpv4IngressRule); + ruleVOList.add(defaultIpv4IngressRule); + } + + TungstenSecurityGroupRuleVO defaultIpv6IngressRule = + tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityGroup.getId(), TungstenUtils.INGRESS_RULE, TungstenUtils.IPV6); + if (defaultIpv6IngressRule == null) { + defaultIpv6IngressRule = new TungstenSecurityGroupRuleVO(tungstenProvider.getZoneId(), + securityGroup.getId(), TungstenUtils.INGRESS_RULE, + projectFqn + ":" + TungstenUtils.LOCAL, TungstenUtils.IPV6, true); + tungstenSecurityGroupRuleDao.persist(defaultIpv6IngressRule); + ruleVOList.add(defaultIpv6IngressRule); + } + + return ruleVOList; + }); + } + + public boolean deleteTungstenSecurityGroup(SecurityGroup securityGroup) { + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + TungstenCommand deleteTungstenSecurityGroupCommand = new DeleteTungstenSecurityGroupCommand( + securityGroup.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(deleteTungstenSecurityGroupCommand, + tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + return true; + } + + public boolean addTungstenSecurityGroupRule(List securityRules) { + List securityGroupVOList = new ArrayList<>(); + for (SecurityRule securityRule : securityRules) { + SecurityGroupVO securityGroupVO = securityGroupDao.findById(securityRule.getSecurityGroupId()); + securityGroupVOList.add(securityGroupVO); + if (securityRule.getAllowedNetworkId() != null) { + SecurityGroupVO allowedSecurityGroupVO = securityGroupDao.findById(securityRule.getAllowedNetworkId()); + securityGroupVOList.add(allowedSecurityGroupVO); + } + } + + checkTungstenSecurityGroups(securityGroupVOList); + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + for (SecurityRule securityRule : securityRules) { + checkSecurityRule(securityRule); + + SecurityGroup securityGroup = securityGroupDao.findById(securityRule.getSecurityGroupId()); + removeEgressRule(securityRule, tungstenProvider, securityGroup); + + int tungstenEndPort = securityRule.getEndPort(); + if (securityRule.getProtocol().equals(NetUtils.ALL_PROTO) && securityRule.getEndPort() == NetUtils.PORT_RANGE_MIN) { + tungstenEndPort = NetUtils.PORT_RANGE_MAX; + } + + if (securityRule.getAllowedNetworkId() != null) { + return addTungstenRuleWithNetwork(securityRule, tungstenProvider, securityGroup, tungstenEndPort); + } + + addTungstenRuleWithVM(securityRule, tungstenProvider, securityGroup, tungstenEndPort); + } + } + + return true; + } + + private void checkSecurityRule(SecurityRule securityRule) { + if (StringUtils.isNumeric(securityRule.getProtocol())) { + throw new CloudRuntimeException("Tungsten-Fabric don't support number protocol"); + } + } + + private void removeEgressRule(SecurityRule securityRule, TungstenProvider tungstenProvider, SecurityGroup securityGroup) { + if (securityRule.getRuleType() == SecurityRule.SecurityRuleType.EgressRule) { + TungstenSecurityGroupRule egressIpv4Rule = tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityRule.getSecurityGroupId(), TungstenUtils.EGRESS_RULE, TungstenUtils.IPV4); + + if (egressIpv4Rule != null) { + TungstenCommand tungstenCommand = new RemoveTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), egressIpv4Rule.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, + tungstenProvider.getZoneId()); + if (tungstenAnswer.getResult()) { + tungstenSecurityGroupRuleDao.expunge(egressIpv4Rule.getId()); + } + } + + TungstenSecurityGroupRule egressIpv6Rule = tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityRule.getSecurityGroupId(), TungstenUtils.EGRESS_RULE, TungstenUtils.IPV6); + + if (egressIpv6Rule != null) { + TungstenCommand tungstenCommand = new RemoveTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), egressIpv6Rule.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, + tungstenProvider.getZoneId()); + if (tungstenAnswer.getResult()) { + tungstenSecurityGroupRuleDao.expunge(egressIpv6Rule.getId()); + } + } + } + } + + private boolean addTungstenRuleWithNetwork(SecurityRule securityRule, TungstenProvider tungstenProvider, SecurityGroup securityGroup, int tungstenEndPort) { + List vmIdList = securityGroupVMMapDao.listVmIdsBySecurityGroup(securityRule.getAllowedNetworkId()); + for (long vmid : vmIdList) { + Nic nic = nicDao.findDefaultNicForVM(vmid); + List ipAddressList = getListIpAddressFromNic(nic); + for (String ipAddress : ipAddressList) { + String cidr = TungstenUtils.getSingleIpAddressCidr(ipAddress); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = new TungstenSecurityGroupRuleVO( + tungstenProvider.getZoneId(), securityRule.getSecurityGroupId(), securityRule.getType(), + cidr, TungstenUtils.getEthertTypeFromCidr(cidr), false); + TungstenSecurityGroupRuleVO persisted = tungstenSecurityGroupRuleDao.persist( + tungstenSecurityGroupRuleVO); + if (persisted != null) { + TungstenCommand addTungstenSecurityGroupRuleCommand = + new AddTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), tungstenSecurityGroupRuleVO.getUuid(), + securityRule.getType(), securityRule.getStartPort(), tungstenEndPort, cidr, + TungstenUtils.getEthertTypeFromCidr(cidr), securityRule.getProtocol()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + throw new CloudRuntimeException("Can not add Tungsten Fabric Security Group Rule to network"); + } + } else { + throw new CloudRuntimeException("Can not add Security Group Rule to network"); + } + } + } + return true; + } + + private void addTungstenRuleWithVM(SecurityRule securityRule, TungstenProvider tungstenProvider, SecurityGroup securityGroup, int tungstenEndPort) { + TungstenCommand addTungstenSecurityGroupRuleCommand = new AddTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), securityRule.getUuid(), securityRule.getType(), + securityRule.getStartPort(), tungstenEndPort, securityRule.getAllowedSourceIpCidr(), + TungstenUtils.getEthertTypeFromCidr(securityRule.getAllowedSourceIpCidr()), + securityRule.getProtocol()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + throw new CloudRuntimeException("Can not add Tungsten Fabric Security Rule to VM"); + } + } + + public boolean removeTungstenSecurityGroupRule(SecurityRule securityRule) { + SecurityGroup securityGroup = securityGroupDao.findById(securityRule.getSecurityGroupId()); + if (securityGroup == null) + return false; + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + if (securityRule.getRuleType() == SecurityRule.SecurityRuleType.EgressRule) { + List securityGroupRuleVOList = securityGroupRuleDao.listBySecurityGroupId( + securityRule.getSecurityGroupId(), SecurityRule.SecurityRuleType.EgressRule); + if (securityGroupRuleVOList.isEmpty()) { + addTungstenEgressRule(securityGroup, tungstenProvider); + } + } + + if (securityRule.getAllowedNetworkId() != null) { + return removeTungstenRuleWithNetwork(securityRule, securityGroup, tungstenProvider); + } else { + TungstenCommand removeTungstenSecurityGroupRuleCommand = new RemoveTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), securityRule.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + removeTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } + } + return true; + } + + private boolean addTungstenEgressRule(SecurityGroup securityGroup, TungstenProvider tungstenProvider) { + TungstenSecurityGroupRuleVO tungstenIpv4SecurityGroupRuleVO = + tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityGroup.getId(), TungstenUtils.EGRESS_RULE, TungstenUtils.IPV4); + + if (tungstenIpv4SecurityGroupRuleVO == null) { + tungstenIpv4SecurityGroupRuleVO = new TungstenSecurityGroupRuleVO(tungstenProvider.getZoneId(), + securityGroup.getId(), TungstenUtils.EGRESS_RULE, NetUtils.ALL_IP4_CIDRS, + TungstenUtils.IPV4, true); + TungstenSecurityGroupRuleVO persisted = tungstenSecurityGroupRuleDao.persist( + tungstenIpv4SecurityGroupRuleVO); + if (persisted != null) { + TungstenCommand addTungstenSecurityGroupRuleCommand = + new AddTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), persisted.getUuid(), TungstenUtils.EGRESS_RULE, + NetUtils.PORT_RANGE_MIN, NetUtils.PORT_RANGE_MAX, NetUtils.ALL_IP4_CIDRS, + TungstenUtils.IPV4, NetUtils.ANY_PROTO); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + } else { + return false; + } + } + + TungstenSecurityGroupRuleVO tungstenIpv6SecurityGroupRuleVO = + tungstenSecurityGroupRuleDao.findDefaultSecurityRule( + securityGroup.getId(), TungstenUtils.EGRESS_RULE, TungstenUtils.IPV6); + + if (tungstenIpv6SecurityGroupRuleVO == null) { + tungstenIpv6SecurityGroupRuleVO = new TungstenSecurityGroupRuleVO(tungstenProvider.getZoneId(), + securityGroup.getId(), TungstenUtils.EGRESS_RULE, NetUtils.ALL_IP6_CIDRS, + TungstenUtils.IPV6, true); + TungstenSecurityGroupRuleVO persisted = tungstenSecurityGroupRuleDao.persist( + tungstenIpv6SecurityGroupRuleVO); + if (persisted != null) { + TungstenCommand addTungstenSecurityGroupRuleCommand = + new AddTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), persisted.getUuid(), TungstenUtils.EGRESS_RULE, + NetUtils.PORT_RANGE_MIN, NetUtils.PORT_RANGE_MAX, NetUtils.ALL_IP6_CIDRS, + TungstenUtils.IPV6, NetUtils.ANY_PROTO); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + return tungstenAnswer.getResult(); + } else { + return false; + } + } + + return true; + } + + private boolean removeTungstenRuleWithNetwork(SecurityRule securityRule, SecurityGroup securityGroup, TungstenProvider tungstenProvider) { + List vmIdList = securityGroupVMMapDao.listVmIdsBySecurityGroup( + securityRule.getAllowedNetworkId()); + for (long vmId : vmIdList) { + Nic nic = nicDao.findDefaultNicForVM(vmId); + List ipAddressList = getListIpAddressFromNic(nic); + for (String ipAddress : ipAddressList) { + String cidr = TungstenUtils.getSingleIpAddressCidr(ipAddress); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = + tungstenSecurityGroupRuleDao.findBySecurityGroupAndRuleTypeAndRuleTarget( + securityGroup.getId(), securityRule.getType(), cidr); + TungstenCommand removeTungstenSecurityGroupRule = new RemoveTungstenSecurityGroupRuleCommand( + securityGroup.getUuid(), tungstenSecurityGroupRuleVO.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + removeTungstenSecurityGroupRule, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + + if (!tungstenSecurityGroupRuleDao.expunge(tungstenSecurityGroupRuleVO.getId())) { + return false; + } + } + } + + return true; + } + + public boolean addTungstenNicSecondaryIpAddress(long id) { + NicSecondaryIp nicSecondaryIp = entityMgr.findById(NicSecondaryIp.class, id); + Network network = entityMgr.findById(Network.class, nicSecondaryIp.getNetworkId()); + DataCenter dataCenter = entityMgr.findById(DataCenter.class, network.getDataCenterId()); + Nic nic = entityMgr.findById(Nic.class, nicSecondaryIp.getNicId()); + + String ipAddress = + nicSecondaryIp.getIp4Address() != null ? nicSecondaryIp.getIp4Address() : nicSecondaryIp.getIp6Address(); + String cidr = TungstenUtils.getSingleIpAddressCidr(ipAddress); + String etherType = TungstenUtils.getEthertTypeFromCidr(cidr); + + TungstenCommand addTungstenSecondaryIpAddressCommand = new AddTungstenSecondaryIpAddressCommand( + network.getUuid(), nic.getUuid(), TungstenUtils.getSecondaryInstanceIpName(nicSecondaryIp.getId()), + ipAddress); + TungstenAnswer addTungstenSecondaryIpAddressAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecondaryIpAddressCommand, network.getDataCenterId()); + if (!addTungstenSecondaryIpAddressAnswer.getResult()) { + return false; + } + + if (dataCenter.isSecurityGroupEnabled() && network.getGuestType() == Network.GuestType.Shared) { + List securityGroupVOList = securityGroupManager.getSecurityGroupsForVm( + nicSecondaryIp.getVmId()); + + for (TungstenProvider tungstenProvider : getTungstenProviders()) { + for (SecurityGroupVO securityGroupVO : securityGroupVOList) { + List securityGroupRuleVOList = + securityGroupRuleDao.listByAllowedSecurityGroupId(securityGroupVO.getId()); + addSecondaryNicRule(securityGroupRuleVOList, securityGroupVO, tungstenProvider, dataCenter.getId(), cidr, etherType); + } + } + } + + return true; + } + + private void addSecondaryNicRule(List securityGroupRuleVOList, SecurityGroupVO securityGroupVO + , TungstenProvider tungstenProvider, long zoneId, String cidr, String etherType) { + for (SecurityGroupRuleVO securityGroupRuleVO : securityGroupRuleVOList) { + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = + tungstenSecurityGroupRuleDao.findBySecurityGroupAndRuleTypeAndRuleTarget( + securityGroupVO.getId(), securityGroupRuleVO.getType(), cidr); + if (tungstenSecurityGroupRuleVO == null) { + tungstenSecurityGroupRuleVO = new TungstenSecurityGroupRuleVO(zoneId, + securityGroupVO.getId(), securityGroupRuleVO.getType(), cidr, etherType, false); + TungstenSecurityGroupRuleVO persisted = tungstenSecurityGroupRuleDao.persist( + tungstenSecurityGroupRuleVO); + if (persisted != null) { + int tungstenEndPort = securityGroupRuleVO.getEndPort(); + if (securityGroupRuleVO.getProtocol().equals(NetUtils.ALL_PROTO)) { + tungstenEndPort = NetUtils.PORT_RANGE_MAX; + } + + TungstenCommand addTungstenSecurityGroupRuleCommand = + new AddTungstenSecurityGroupRuleCommand( + securityGroupVO.getUuid(), tungstenSecurityGroupRuleVO.getUuid(), + securityGroupRuleVO.getType(), securityGroupRuleVO.getStartPort(), tungstenEndPort, + cidr, etherType, securityGroupRuleVO.getProtocol()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenSecurityGroupRuleCommand, tungstenProvider.getZoneId()); + if (!tungstenAnswer.getResult()) { + throw new CloudRuntimeException("Can not add tungsten security group rule"); + } + } else { + throw new CloudRuntimeException("Can not persist tungsten security group rule"); + } + } + } + } + + public boolean removeTungstenNicSecondaryIpAddress(NicSecondaryIpVO nicSecondaryIpVO) { + Network network = entityMgr.findById(Network.class, nicSecondaryIpVO.getNetworkId()); + DataCenter dataCenter = entityMgr.findById(DataCenter.class, network.getDataCenterId()); + + TungstenCommand removeTungstenSecondaryIpAddressCommand = new RemoveTungstenSecondaryIpAddressCommand( + TungstenUtils.getSecondaryInstanceIpName(nicSecondaryIpVO.getId())); + TungstenAnswer removeTungstenSecondaryIpAddressAnswer = tungstenFabricUtils.sendTungstenCommand( + removeTungstenSecondaryIpAddressCommand, network.getDataCenterId()); + if (!removeTungstenSecondaryIpAddressAnswer.getResult()) { + return false; + } + + if (dataCenter.isSecurityGroupEnabled() && network.getGuestType() == Network.GuestType.Shared) { + String ipAddress = nicSecondaryIpVO.getIp4Address() != null ? nicSecondaryIpVO.getIp4Address() : + nicSecondaryIpVO.getIp6Address(); + String cidr = TungstenUtils.getSingleIpAddressCidr(ipAddress); + List tungstenSecurityGroupRuleVOList = + tungstenSecurityGroupRuleDao.listByRuleTarget( + cidr); + for (TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO : tungstenSecurityGroupRuleVOList) { + SecurityGroup securityGroup = securityGroupDao.findById( + tungstenSecurityGroupRuleVO.getSecurityGroupId()); + TungstenCommand tungstenCommand = new RemoveTungstenSecurityGroupRuleCommand(securityGroup.getUuid(), + tungstenSecurityGroupRuleVO.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, + tungstenSecurityGroupRuleVO.getZoneId()); + if (!tungstenAnswer.getResult()) { + return false; + } + + if (!tungstenSecurityGroupRuleDao.expunge(tungstenSecurityGroupRuleVO.getId())) { + return false; + } + } + } + + return true; + } + + private void checkTungstenSecurityGroups(List securityGroups) { + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + for (SecurityGroupVO securityGroup : securityGroups) { + TungstenCommand getTungstenSecurityGroupCommand = new GetTungstenSecurityGroupCommand( + securityGroup.getUuid()); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(getTungstenSecurityGroupCommand, + tungstenProvider.getZoneId()); + if (tungstenAnswer.getApiObjectBase() == null) { + createTungstenSecurityGroup(securityGroup); + } + } + } + } + + @Override + public TungstenFabricPolicyResponse createTungstenPolicy(final long zoneId, final String name) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenPolicyCommand(name, getTungstenProjectFqn(null)); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + TungstenModel tungstenModel = tungstenAnswer.getTungstenModel(); + return new TungstenFabricPolicyResponse((TungstenNetworkPolicy) tungstenModel, dataCenter); + } + return null; + } + + @Override + public TungstenFabricRuleResponse addTungstenPolicyRule(final long zoneId, final String policyUuid, + final String action, final String direction, final String protocol, final String srcNetwork, + final String srcIpPrefix, final int srcIpPrefixLen, final int srcStartPort, final int srcEndPort, + final String destNetwork, final String destIpPrefix, final int destIpPrefixLen, final int destStartPort, + final int destEndPort) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + AddTungstenPolicyRuleCommand addTungstenPolicyRuleCommand = new AddTungstenPolicyRuleCommand(policyUuid, action, direction, + protocol, srcNetwork, srcIpPrefix, srcIpPrefixLen, srcStartPort, srcEndPort, destNetwork, destIpPrefix, + destIpPrefixLen, destStartPort, destEndPort); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(addTungstenPolicyRuleCommand, zoneId); + if (tungstenAnswer.getResult()) { + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenAnswer.getApiObjectBase(); + PolicyEntriesType policyEntriesType = networkPolicy.getEntries(); + + if (policyEntriesType == null) { + return null; + } + + List policyRuleTypeList = policyEntriesType.getPolicyRule(); + + if (policyRuleTypeList == null) { + return null; + } + + TungstenFabricRuleResponse tungstenRuleResponse = null; + for (PolicyRuleType policyRuleType : policyRuleTypeList) { + if (policyRuleType.getRuleUuid() + .equals(addTungstenPolicyRuleCommand.getUuid())) { + tungstenRuleResponse = new TungstenFabricRuleResponse(networkPolicy.getUuid(), policyRuleType, dataCenter); + } + } + + return tungstenRuleResponse; + } + + return null; + } + + @Override + public List listTungstenPolicy(final long zoneId, final Long networkId, + final Long addressId, final String policyUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + String projectFqn = getTungstenProjectFqn(null); + String networkUuid = getNetworkUuid(networkId); + String policyName = addressId != null ? TungstenUtils.getPublicNetworkPolicyName(addressId) : null; + TungstenCommand tungstenCommand = new ListTungstenPolicyCommand(projectFqn, networkUuid, policyName, + policyUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenPolicyResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List tungstenModelList = tungstenAnswer.getTungstenModelList(); + for (TungstenModel tungstenModel : tungstenModelList) { + tungstenPolicyResponseList.add(new TungstenFabricPolicyResponse((TungstenNetworkPolicy) tungstenModel, dataCenter)); + } + } + return tungstenPolicyResponseList; + } + + @Override + public List listTungstenNetwork(final long zoneId, final String networkUuid, final boolean listAll) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + String projectFqn = getTungstenProjectFqn(null); + TungstenCommand tungstenCommand = new ListTungstenNetworkCommand(projectFqn, networkUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenNetworkResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List nameList = new ArrayList<>(); + nameList.add(TungstenUtils.GUEST_NETWORK_NAME); + if (listAll) { + nameList.add(TungstenUtils.PUBLIC_NETWORK_NAME + zoneId); + } + List networkList = filterByName(tungstenAnswer.getApiObjectBaseList(), nameList); + for (ApiObjectBase network : networkList) { + tungstenNetworkResponseList.add(new TungstenFabricNetworkResponse((VirtualNetwork) network, dataCenter)); + } + } + return tungstenNetworkResponseList; + } + + @Override + public List listTungstenNic(final long zoneId, final String nicUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + String projectFqn = getTungstenProjectFqn(null); + TungstenCommand tungstenCommand = new ListTungstenNicCommand(projectFqn, nicUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenNicResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List nicList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase nic : nicList) { + tungstenNicResponseList.add(new TungstenFabricNicResponse((VirtualMachineInterface) nic, dataCenter)); + } + } + return tungstenNicResponseList; + } + + @Override + public List listTungstenVm(final long zoneId, final String vmUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + String projectFqn = getTungstenProjectFqn(null); + TungstenCommand tungstenCommand = new ListTungstenVmCommand(projectFqn, vmUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenVmResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List vmList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase vm : vmList) { + tungstenVmResponseList.add(new TungstenFabricVmResponse((VirtualMachine) vm, dataCenter)); + } + } + return tungstenVmResponseList; + } + + @Override + public boolean deleteTungstenPolicy(final long zoneId, final String policyUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenPolicyCommand(policyUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public List listTungstenPolicyRule(final long zoneId, final String policyUuid, + final String ruleUuid) { + TungstenCommand tungstenCommand = new ListTungstenPolicyRuleCommand(policyUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenRuleResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenAnswer.getApiObjectBase(); + tungstenRuleResponseList = getListTungstenPolicyRuleReponse(networkPolicy, zoneId, ruleUuid); + } + return tungstenRuleResponseList; + } + + private List getListTungstenPolicyRuleReponse(NetworkPolicy networkPolicy, long zoneId, String ruleUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + List tungstenRuleResponseList = new ArrayList<>(); + PolicyEntriesType policyEntriesType = networkPolicy.getEntries(); + if (policyEntriesType != null) { + List policyRuleTypeList = policyEntriesType.getPolicyRule(); + if (policyRuleTypeList != null) { + for (PolicyRuleType policyRuleType : policyRuleTypeList) { + if (ruleUuid == null || policyRuleType.getRuleUuid().equals(ruleUuid)) { + tungstenRuleResponseList.add( + new TungstenFabricRuleResponse(networkPolicy.getUuid(), policyRuleType, dataCenter)); + } + } + } + } + return tungstenRuleResponseList; + } + + @Override + public TungstenFabricPolicyResponse removeTungstenPolicyRule(final long zoneId, final String policyUuid, + final String ruleUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new RemoveTungstenPolicyRuleCommand(policyUuid, ruleUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricPolicyResponse((TungstenNetworkPolicy) tungstenAnswer.getTungstenModel(), dataCenter); + } + return null; + } + + @Override + public TungstenFabricTagResponse createTungstenTag(final long zoneId, final String tagType, final String tagValue) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenTagCommand(tagType, tagValue); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + TungstenTag tungstenTag = (TungstenTag) tungstenAnswer.getTungstenModel(); + return new TungstenFabricTagResponse(tungstenTag, dataCenter); + } + return null; + } + + @Override + public TungstenFabricTagTypeResponse createTungstenTagType(final long zoneId, final String name) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenTagTypeCommand(name); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + TagType tagtype = (TagType) tungstenAnswer.getApiObjectBase(); + return new TungstenFabricTagTypeResponse(tagtype, dataCenter); + } + return null; + } + + @Override + public List listTungstenTags(final long zoneId, final String networkUuid, + final String vmUuid, final String nicUuid, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenTagCommand(networkUuid, vmUuid, nicUuid, policyUuid, applicationPolicySetUuid, tagUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenTagResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List tungstenModelList = tungstenAnswer.getTungstenModelList(); + for (TungstenModel tungstenModel : tungstenModelList) { + tungstenTagResponseList.add(new TungstenFabricTagResponse((TungstenTag) tungstenModel, dataCenter)); + } + } + return tungstenTagResponseList; + } + + @Override + public List listTungstenTagTypes(final long zoneId, final String tagTypeUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenTagTypeCommand(tagTypeUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenTagTypeResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List tagTypeList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase tagType : tagTypeList) { + tungstenTagTypeResponseList.add(new TungstenFabricTagTypeResponse((TagType) tagType, dataCenter)); + } + } + return tungstenTagTypeResponseList; + } + + @Override + public boolean deleteTungstenTag(final long zoneId, final String tagUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenTagCommand(tagUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public boolean deleteTungstenTagType(final long zoneId, final String tagTypeUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenTagTypeCommand(tagTypeUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public TungstenFabricPolicyResponse applyTungstenPolicy(final long zoneId, final String networkUuid, + final String policyUuid, final int majorSequence, final int minorSequence) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ApplyTungstenNetworkPolicyCommand(networkUuid, policyUuid, majorSequence, + minorSequence); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricPolicyResponse((TungstenNetworkPolicy) tungstenAnswer.getTungstenModel(), dataCenter); + } + + return null; + } + + @Override + public TungstenFabricTagResponse applyTungstenTag(final long zoneId, final List networkUuids, + final List vmUuids, final List nicUuids, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ApplyTungstenTagCommand(networkUuids, vmUuids, nicUuids, policyUuid, applicationPolicySetUuid, + tagUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricTagResponse((TungstenTag) tungstenAnswer.getTungstenModel(), dataCenter); + } + + return null; + } + + @Override + public TungstenFabricPolicyResponse removeTungstenPolicy(final long zoneId, final String networkUuid, + final String policyUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new RemoveTungstenPolicyCommand(networkUuid, policyUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricPolicyResponse((TungstenNetworkPolicy) tungstenAnswer.getTungstenModel(), dataCenter); + } + return null; + } + + @Override + public TungstenFabricTagResponse removeTungstenTag(final long zoneId, final List networkUuids, + final List vmUuids, final List nicUuids, final String policyUuid, final String applicationPolicySetUuid, final String tagUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new RemoveTungstenTagCommand(networkUuids, vmUuids, nicUuids, policyUuid, + applicationPolicySetUuid, tagUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricTagResponse((TungstenTag) tungstenAnswer.getTungstenModel(), dataCenter); + } + return null; + } + + @Override + public TungstenFabricAddressGroupResponse createTungstenAddressGroup(final long zoneId, final String name, + final String ipPrefix, final int ipPrefixLen) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenAddressGroupCommand(name, ipPrefix, ipPrefixLen); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricAddressGroupResponse((AddressGroup) tungstenAnswer.getApiObjectBase(), dataCenter); + } + + return null; + } + + @Override + public TungstenFabricServiceGroupResponse createTungstenServiceGroup(final long zoneId, final String name, + final String protocol, final int startPort, final int endPort) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenServiceGroupCommand(name, protocol, startPort, endPort); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricServiceGroupResponse((ServiceGroup) tungstenAnswer.getApiObjectBase(), dataCenter); + } + + return null; + } + + @Override + public TungstenFabricFirewallRuleResponse createTungstenFirewallRule(final long zoneId, final String firewallPolicyUuid, final String name, + final String action, final String serviceGroupUuid, final String srcTagUuid, final String srcAddressGroupUuid, final String srcNetworkUuid, + final String direction, final String destTagUuid, final String destAddressGroupUuid, final String destNetworkUuid, final String tagTypeUuid, final int sequence) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenFirewallRuleCommand(firewallPolicyUuid, name, action, serviceGroupUuid, + srcTagUuid, srcAddressGroupUuid, srcNetworkUuid, direction, destTagUuid, destAddressGroupUuid, destNetworkUuid, tagTypeUuid, sequence); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricFirewallRuleResponse( + (net.juniper.tungsten.api.types.FirewallRule) tungstenAnswer.getApiObjectBase(), dataCenter); + } + + return null; + } + + @Override + public TungstenFabricFirewallPolicyResponse createTungstenFirewallPolicy(final long zoneId, final String applicationPolicySetUuid, final String name, final int sequence) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenFirewallPolicyCommand(name, applicationPolicySetUuid, sequence); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricFirewallPolicyResponse((FirewallPolicy) tungstenAnswer.getApiObjectBase(), dataCenter); + } + + return null; + } + + @Override + public TungstenFabricApplicationPolicySetResponse createTungstenApplicationPolicySet(final long zoneId, + final String name) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenApplicationPolicySetCommand(name); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricApplicationPolicySetResponse( + (ApplicationPolicySet) tungstenAnswer.getApiObjectBase(), dataCenter); + } + + return null; + } + + @Override + public List listTungstenApplicationPolicySet(final long zoneId, + final String applicationPolicySetUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenApplicationPolicySetCommand(applicationPolicySetUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenApplicationPolicySetResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List applicationPolicySetList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase applicationPolicySet : applicationPolicySetList) { + tungstenApplicationPolicySetResponseList.add( + new TungstenFabricApplicationPolicySetResponse((ApplicationPolicySet) applicationPolicySet, dataCenter)); + } + } + return tungstenApplicationPolicySetResponseList; + } + + @Override + public List listTungstenFirewallPolicy(final long zoneId, + final String applicationPolicySetUuid, final String firewallPolicyUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenFirewallPolicyCommand(applicationPolicySetUuid, + firewallPolicyUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenFirewallPolicyResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List firewallPolicyList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase firewallPolicy : firewallPolicyList) { + tungstenFirewallPolicyResponseList.add(new TungstenFabricFirewallPolicyResponse((FirewallPolicy) firewallPolicy, dataCenter)); + } + } + return tungstenFirewallPolicyResponseList; + } + + @Override + public List listTungstenFirewallRule(final long zoneId, + final String firewallPolicyUuid, final String firewallRuleUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenFirewallRuleCommand(firewallPolicyUuid, firewallRuleUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenFirewallRuleResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List firewallRuleList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase firewallRule : firewallRuleList) { + tungstenFirewallRuleResponseList.add(new TungstenFabricFirewallRuleResponse((net.juniper.tungsten.api.types.FirewallRule) firewallRule, dataCenter)); + } + } + return tungstenFirewallRuleResponseList; + } + + @Override + public List listTungstenServiceGroup(final long zoneId, + final String serviceGroupUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenServiceGroupCommand(serviceGroupUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenServiceGroupResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List serviceGroupList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase serviceGroup : serviceGroupList) { + tungstenServiceGroupResponseList.add(new TungstenFabricServiceGroupResponse((ServiceGroup) serviceGroup, dataCenter)); + } + } + return tungstenServiceGroupResponseList; + } + + @Override + public List listTungstenAddressGroup(final long zoneId, + final String addressGroupUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenAddressGroupCommand(addressGroupUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenAddressGroupResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List addressGroupList = tungstenAnswer.getApiObjectBaseList(); + for (ApiObjectBase addressGroup : addressGroupList) { + tungstenAddressGroupResponseList.add(new TungstenFabricAddressGroupResponse((AddressGroup) addressGroup, dataCenter)); + } + } + return tungstenAddressGroupResponseList; + } + + @Override + public boolean deleteTungstenApplicationPolicySet(final long zoneId, final String applicationPolicySetUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenApplicationPolicySetCommand(applicationPolicySetUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public boolean deleteTungstenFirewallPolicy(final long zoneId, final String firewallPolicyUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenFirewallPolicyCommand(firewallPolicyUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public boolean deleteTungstenFirewallRule(final long zoneId, final String firewallRuleUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenFirewallRuleCommand(firewallRuleUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public boolean deleteTungstenServiceGroup(final long zoneId, final String serviceGroupUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenServiceGroupCommand(serviceGroupUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public boolean deleteTungstenAddressGroup(final long zoneId, final String addressGroupUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenAddressGroupCommand(addressGroupUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public boolean createSharedNetwork(final Network network, final Vlan vlan) { + String tungstenProjectFqn = getTungstenProjectFqn(network); + TungstenCommand createTungstenSharedNetworkCommand = new CreateTungstenNetworkCommand(network.getUuid(), + TungstenUtils.getSharedNetworkName(network.getId()), network.getName(), tungstenProjectFqn, true, true, + null, 0, null, network.getMode().equals(Networks.Mode.Dhcp), null, null, null, false, false, null); + TungstenAnswer createSharedNetwork = tungstenFabricUtils.sendTungstenCommand(createTungstenSharedNetworkCommand, + network.getDataCenterId()); + + if (!createSharedNetwork.getResult()) { + return false; + } + + if (vlan.getVlanGateway() != null) { + Pair pair = NetUtils.getCidr(network.getCidr()); + String[] ipAddress = vlan.getIpRange().split("-"); + + TungstenCommand addTungstenNetworkSubnetCommand = new AddTungstenNetworkSubnetCommand(network.getUuid(), + pair.first(), pair.second(), network.getGateway(), true, null, ipAddress[0], ipAddress[1], false, + TungstenUtils.getIPV4SubnetName(network.getId())); + + TungstenAnswer addIpV4NetworkSubnetAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenNetworkSubnetCommand, network.getDataCenterId()); + if (!addIpV4NetworkSubnetAnswer.getResult()) { + return false; + } + + if (!setupVrouter(network, createSharedNetwork.getApiObjectBase().getQualifiedName())) { + return false; + } + + if (!allocateDnsIpAddress(network, null, TungstenUtils.getIPV4SubnetName(network.getId()))) { + return false; + } + } + + if (vlan.getIp6Gateway() != null) { + Pair pair = NetUtils.getCidr(vlan.getIp6Cidr()); + String[] ipAddress = vlan.getIp6Range().split("-"); + TungstenCommand addTungstenNetworkSubnetCommand = new AddTungstenNetworkSubnetCommand(network.getUuid(), + pair.first(), pair.second(), vlan.getIp6Gateway(), false, null, ipAddress[0], ipAddress[1], false, + TungstenUtils.getIPV6SubnetName(network.getId())); + + TungstenAnswer addIpV6NetworkSubnetAnswer = tungstenFabricUtils.sendTungstenCommand( + addTungstenNetworkSubnetCommand, network.getDataCenterId()); + return addIpV6NetworkSubnetAnswer.getResult(); + } + + return true; + } + + private boolean setupVrouter(Network network, List qualifiedName) { + NetworkDetailVO networkDetailVO = networkDetailsDao.findDetail(network.getId(), "vrf"); + if (networkDetailVO == null) { + networkDetailVO = new NetworkDetailVO(network.getId(), "vrf", + TungstenUtils.getVrfNetworkName(qualifiedName), false); + NetworkDetailVO persistNetworkDetail = networkDetailsDao.persist(networkDetailVO); + if (persistNetworkDetail != null) { + TungstenProviderVO tungstenProvider = tungstenProviderDao.findByZoneId(network.getDataCenterId()); + if (tungstenProvider != null) { + Host host = hostDao.findByPublicIp(tungstenProvider.getGateway()); + if (host != null) { + Command setupTungstenVRouterCommand = new SetupTungstenVRouterCommand("create", + TungstenUtils.getSgVgwName(network.getId()), network.getCidr(), NetUtils.ALL_IP4_CIDRS, + persistNetworkDetail.getValue()); + Answer answer = agentMgr.easySend(host.getId(), setupTungstenVRouterCommand); + return answer != null && answer.getResult(); + } + } + } + } + + return true; + } + + @Override + public boolean addTungstenVmSecurityGroup(VMInstanceVO vm) { + DataCenter dataCenter = dataCenterDao.findById(vm.getDataCenterId()); + if (!dataCenter.isSecurityGroupEnabled()) { + return true; + } + + // if security group is not exist, create it + List securityGroupVOList = securityGroupManager.getSecurityGroupsForVm(vm.getId()); + checkTungstenSecurityGroups(securityGroupVOList); + + // if vm is in tungsten zone, add security group to vmi + Nic nic = nicDao.findDefaultNicForVM(vm.getId()); + if (nic != null && nic.getBroadcastUri().equals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"))) { + List securityGroupUuidList = new ArrayList<>(); + for (SecurityGroupVO securityGroupVO : securityGroupVOList) { + securityGroupUuidList.add(securityGroupVO.getUuid()); + } + + TungstenCommand addTungstenVmToSecurityGroupCommand = new AddTungstenVmToSecurityGroupCommand(nic.getUuid(), + securityGroupUuidList); + TungstenAnswer addTungstenVmToSecurityGroupAnswer = tungstenFabricUtils.sendTungstenCommand(addTungstenVmToSecurityGroupCommand, + vm.getDataCenterId()); + if (!addTungstenVmToSecurityGroupAnswer.getResult()) { + return false; + } + + return addVmIp(securityGroupVOList, nic); + + } + + return true; + } + + private boolean addVmIp(List securityGroupVOList, Nic nic) { + // add vm to tungsten security group rule + for (TungstenProviderVO tungstenProvider : getTungstenProviders()) { + for (SecurityGroupVO securityGroupVO : securityGroupVOList) { + List securityGroupRuleVOList = securityGroupRuleDao.listByAllowedSecurityGroupId( + securityGroupVO.getId()); + for (SecurityGroupRuleVO securityGroupRuleVO : securityGroupRuleVOList) { + addSecurityGroupRule(securityGroupRuleVO, nic, tungstenProvider, securityGroupVO); + } + } + } + + return true; + } + + private void addSecurityGroupRule(SecurityGroupRuleVO securityGroupRuleVO, Nic nic, + TungstenProviderVO tungstenProvider, SecurityGroupVO securityGroupVO) { + List ipAddressList = getListIpAddressFromNic(nic); + int tungstenEndPort = securityGroupRuleVO.getEndPort(); + if (securityGroupRuleVO.getProtocol().equals(NetUtils.ALL_PROTO)) { + tungstenEndPort = NetUtils.PORT_RANGE_MAX; + } + + for (String ipAddress : ipAddressList) { + String cidr = TungstenUtils.getSingleIpAddressCidr(ipAddress); + String etherType = TungstenUtils.getEthertTypeFromCidr(cidr); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = new TungstenSecurityGroupRuleVO( + tungstenProvider.getZoneId(), securityGroupRuleVO.getSecurityGroupId(), + securityGroupRuleVO.getType(), cidr, etherType, false); + TungstenSecurityGroupRuleVO persisted = tungstenSecurityGroupRuleDao.persist( + tungstenSecurityGroupRuleVO); + if (persisted != null) { + TungstenCommand addTungstenSecurityGroupRuleCommand = new AddTungstenSecurityGroupRuleCommand( + securityGroupVO.getUuid(), persisted.getUuid(), securityGroupRuleVO.getType(), + securityGroupRuleVO.getStartPort(), tungstenEndPort, cidr, etherType, + securityGroupRuleVO.getProtocol()); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = + tungstenFabricUtils.sendTungstenCommand(addTungstenSecurityGroupRuleCommand, + tungstenProvider.getZoneId()); + if (!addTungstenSecurityGroupRuleAnswer.getResult()) { + throw new CloudRuntimeException("Can not add Tungsten Fabric Security Group Rule"); + } + } + } + } + + @Override + public boolean removeTungstenVmSecurityGroup(VMInstanceVO vm) { + DataCenter dataCenter = dataCenterDao.findById(vm.getDataCenterId()); + TungstenProvider tungstenProvider = tungstenProviderDao.findByZoneId(dataCenter.getId()); + if (!dataCenter.isSecurityGroupEnabled() || tungstenProvider == null) { + return true; + } + + List securityGroupVOList = securityGroupManager.getSecurityGroupsForVm(vm.getId()); + + // remove vmi security group + Nic nic = nicDao.findDefaultNicForVM(vm.getId()); + if (nic != null) { + List securityGroupUuidList = new ArrayList<>(); + for (SecurityGroupVO securityGroupVO : securityGroupVOList) { + securityGroupUuidList.add(securityGroupVO.getUuid()); + } + + TungstenCommand removeTungstenVmFromSecurityGroupCommand = new RemoveTungstenVmFromSecurityGroupCommand(nic.getUuid(), + securityGroupUuidList); + TungstenAnswer removeTungstenVmFromSecurityGroupAnswer = tungstenFabricUtils.sendTungstenCommand(removeTungstenVmFromSecurityGroupCommand, + vm.getDataCenterId()); + if (!removeTungstenVmFromSecurityGroupAnswer.getResult()) { + return false; + } + + return removeVmIp(nic); + } + + return true; + } + + private boolean removeVmIp(Nic nic) { + // remove vm security group rule + List ipAddressList = getListIpAddressFromNic(nic); + for (String ipAddress : ipAddressList) { + String cidr = TungstenUtils.getSingleIpAddressCidr(ipAddress); + List tungstenSecurityGroupRuleVOList = + tungstenSecurityGroupRuleDao.listByRuleTarget( + cidr); + for (TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO : tungstenSecurityGroupRuleVOList) { + SecurityGroup securityGroup = securityGroupDao.findById( + tungstenSecurityGroupRuleVO.getSecurityGroupId()); + TungstenCommand removeTungstenSecurityGroupRuleCommand = new RemoveTungstenSecurityGroupRuleCommand(securityGroup.getUuid(), + tungstenSecurityGroupRuleVO.getUuid()); + TungstenAnswer removeTungstenSecurityGroupRuleAnswer = tungstenFabricUtils.sendTungstenCommand(removeTungstenSecurityGroupRuleCommand, + tungstenSecurityGroupRuleVO.getZoneId()); + if (!removeTungstenSecurityGroupRuleAnswer.getResult()) { + return false; + } + + if (!tungstenSecurityGroupRuleDao.expunge(tungstenSecurityGroupRuleVO.getId())) { + return false; + } + } + } + + return true; + } + + @Override + public BaseResponse createRoutingLogicalRouter(final long zoneId, final String projectFqn, final String name) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new CreateTungstenRoutingLogicalRouterCommand(projectFqn, name); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + return new TungstenFabricLogicalRouterResponse((TungstenLogicalRouter) tungstenAnswer.getTungstenModel(), dataCenter); + } + return null; + } + + @Override + public BaseResponse addNetworkGatewayToLogicalRouter(final long zoneId, final String networkUuid, + final String logicalRouterUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + Network network = networkDao.findByUuid(networkUuid); + String ipAddress = ipAddressManager.acquireLastGuestIpAddress(network); + TungstenCommand tungstenCommand = new AddTungstenNetworkGatewayToLogicalRouterCommand(networkUuid, logicalRouterUuid, + ipAddress); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + tungstenGuestNetworkIpAddressDao.persist( + new TungstenGuestNetworkIpAddressVO(network.getId(), new Ip(ipAddress), logicalRouterUuid)); + return new TungstenFabricLogicalRouterResponse((TungstenLogicalRouter) tungstenAnswer.getTungstenModel(), dataCenter); + } + return null; + } + + @Override + public List listRoutingLogicalRouter(final long zoneId, final String networkUuid, final String logicalRouterUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new ListTungstenRoutingLogicalRouterCommand(networkUuid, logicalRouterUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + List tungstenLogicalRouterResponseList = new ArrayList<>(); + if (tungstenAnswer.getResult()) { + List tungstenModelList = tungstenAnswer.getTungstenModelList(); + for (TungstenModel tungstenModel : tungstenModelList) { + tungstenLogicalRouterResponseList.add( + new TungstenFabricLogicalRouterResponse((TungstenLogicalRouter) tungstenModel, dataCenter)); + } + } + return tungstenLogicalRouterResponseList; + } + + @Override + public BaseResponse removeNetworkGatewayFromLogicalRouter(final long zoneId, final String networkUuid, + final String logicalRouterUuid) { + DataCenter dataCenter = dataCenterDao.findById(zoneId); + TungstenCommand tungstenCommand = new RemoveTungstenNetworkGatewayFromLogicalRouterCommand(networkUuid, + logicalRouterUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + Network network = networkDao.findByUuid(networkUuid); + TungstenGuestNetworkIpAddressVO gatewayIp = tungstenGuestNetworkIpAddressDao.findByNetworkAndLogicalRouter( + network.getId(), logicalRouterUuid); + if (gatewayIp != null) { + tungstenGuestNetworkIpAddressDao.expunge(gatewayIp.getId()); + } + return new TungstenFabricLogicalRouterResponse((TungstenLogicalRouter) tungstenAnswer.getTungstenModel(), dataCenter); + } + return null; + } + + @Override + public boolean deleteLogicalRouter(final long zoneId, final String logicalRouterUuid) { + TungstenCommand tungstenCommand = new DeleteTungstenRoutingLogicalRouterCommand(logicalRouterUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + return tungstenAnswer.getResult(); + } + + @Override + public List listConnectedNetworkFromLogicalRouter(final long zoneId, final String logicalRouterUuid) { + List networkList = new ArrayList<>(); + TungstenCommand tungstenCommand = new ListTungstenConnectedNetworkFromLogicalRouterCommand(logicalRouterUuid); + TungstenAnswer tungstenAnswer = tungstenFabricUtils.sendTungstenCommand(tungstenCommand, zoneId); + if (tungstenAnswer.getResult()) { + for(ApiObjectBase apiObjectBase : tungstenAnswer.getApiObjectBaseList()) { + networkList.add(apiObjectBase.getUuid()); + } + } + return networkList; + } + + @Override + public TungstenFabricLBHealthMonitorVO updateTungstenFabricLBHealthMonitor(final long lbId, final String type, + final int retry, final int timeout, final int interval, final String httpMethod, final String expectedCode, + final String urlPath) { + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = tungstenFabricLBHealthMonitorDao.findByLbId(lbId); + if (tungstenFabricLBHealthMonitorVO == null) { + tungstenFabricLBHealthMonitorVO = new TungstenFabricLBHealthMonitorVO(lbId, type, retry, timeout, interval, httpMethod, expectedCode, urlPath); + } else { + tungstenFabricLBHealthMonitorVO.setType(type); + tungstenFabricLBHealthMonitorVO.setRetry(retry); + tungstenFabricLBHealthMonitorVO.setTimeout(timeout); + tungstenFabricLBHealthMonitorVO.setInterval(interval); + tungstenFabricLBHealthMonitorVO.setHttpMethod(httpMethod); + tungstenFabricLBHealthMonitorVO.setExpectedCode(expectedCode); + tungstenFabricLBHealthMonitorVO.setUrlPath(urlPath); + } + return tungstenFabricLBHealthMonitorDao.persist(tungstenFabricLBHealthMonitorVO); + } + + @Override + public boolean applyLBHealthMonitor(final long lbId) { + boolean success = true; + LoadBalancerVO loadBalancer = loadBalancerDao.findById(lbId); + if (loadBalancer == null) { + throw new InvalidParameterException("Invalid Load balancer Id:" + lbId); + } + + if (loadBalancer.getState() == FirewallRule.State.Active) { + loadBalancer.setState(FirewallRule.State.Add); + loadBalancerDao.persist(loadBalancer); + } + + try { + loadBalancingRulesService.applyLoadBalancerConfig(lbId); + } catch (ResourceUnavailableException e) { + success = false; + } + return success; + } + + @Override + public List listTungstenFabricLBHealthMonitor(final long lbId) { + List responseList = new ArrayList<>(); + LoadBalancer loadBalancer = loadBalancerDao.findById(lbId); + Network network = networkDao.findById(loadBalancer.getNetworkId()); + DataCenter dataCenter = dataCenterDao.findById(network.getDataCenterId()); + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = tungstenFabricLBHealthMonitorDao.findByLbId(lbId); + if (tungstenFabricLBHealthMonitorVO != null) { + responseList.add(new TungstenFabricLBHealthMonitorResponse(tungstenFabricLBHealthMonitorVO, dataCenter)); + } + return responseList; + } + + private List getListIpAddressFromNic(Nic nic) { + List ipAddressList = new ArrayList<>(); + if (nic.getIPv4Address() != null) { + ipAddressList.add(nic.getIPv4Address()); + } + + if (nic.getIPv6Address() != null) { + ipAddressList.add(nic.getIPv6Address()); + } + + if (nic.getSecondaryIp()) { + ipAddressList.addAll(nicSecIpDao.getSecondaryIpAddressesForNic(nic.getId())); + } + + return ipAddressList; + } + + private String getNetworkUuid(Long networkId) { + if (networkId == null) + return null; + + Network network = networkDao.findById(networkId); + + if (network != null) { + return network.getUuid(); + } + + return null; + } + + private List filterByName(List apiObjectBaseList, List nameList) { + List resultList = new ArrayList<>(); + for(String name : nameList) { + for(ApiObjectBase apiObjectBase : apiObjectBaseList) { + if (apiObjectBase.getName().startsWith(name)) { + resultList.add(apiObjectBase); + } + } + } + return resultList; + } + + @Override + public String getConfigComponentName() { + return TungstenServiceImpl.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[] { + TUNGSTEN_ENABLED + }; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApi.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApi.java new file mode 100644 index 00000000000..1ede3f9a2cb --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApi.java @@ -0,0 +1,48 @@ +// 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.network.tungsten.service; + +import org.apache.cloudstack.network.tungsten.vrouter.Port; +import org.apache.cloudstack.network.tungsten.vrouter.VRouterApiConnector; +import org.apache.cloudstack.network.tungsten.vrouter.VRouterApiConnectorFactory; +import org.apache.log4j.Logger; + +import java.io.IOException; + +public class TungstenVRouterApi { + private static final Logger s_logger = Logger.getLogger(TungstenVRouterApi.class); + + private TungstenVRouterApi() { + } + + private static VRouterApiConnector getvRouterApiConnector(String host, String vrouterPort) { + return VRouterApiConnectorFactory.getInstance(host, vrouterPort); + } + + public static boolean addTungstenVrouterPort(String host, String vrouterPort, Port port) { + try { + return getvRouterApiConnector(host, vrouterPort).addPort(port); + } catch (IOException ex) { + s_logger.error("Fail to add vrouter port : " + ex.getMessage()); + return false; + } + } + + public static boolean deleteTungstenVrouterPort(String host, String vrouterPort, String portId) { + return getvRouterApiConnector(host, vrouterPort).deletePort(portId); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/CustomHttpDelete.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/CustomHttpDelete.java new file mode 100644 index 00000000000..7346a0cbb0b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/CustomHttpDelete.java @@ -0,0 +1,40 @@ +// 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.network.tungsten.vrouter; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class CustomHttpDelete extends HttpEntityEnclosingRequestBase { + public static final String METHOD_NAME = "DELETE"; + + public CustomHttpDelete() { + } + + public CustomHttpDelete(URI uri) { + this.setURI(uri); + } + + public CustomHttpDelete(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return METHOD_NAME; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Gateway.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Gateway.java new file mode 100644 index 00000000000..1be0cb41def --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Gateway.java @@ -0,0 +1,75 @@ +// 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.network.tungsten.vrouter; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class Gateway { + @SerializedName("interface") + private String inf; + + @SerializedName("routing-instance") + private String vrf; + + @SerializedName("subnets") + private List subnets; + + @SerializedName("routes") + private List routes; + + public Gateway(final String inf, final String vrf, final List subnets, final List routes) { + this.inf = inf; + this.vrf = vrf; + this.subnets = subnets; + this.routes = routes; + } + + public String getInf() { + return inf; + } + + public void setInf(final String inf) { + this.inf = inf; + } + + public String getVrf() { + return vrf; + } + + public void setVrf(final String vrf) { + this.vrf = vrf; + } + + public List getSubnets() { + return subnets; + } + + public void setSubnets(final List subnets) { + this.subnets = subnets; + } + + public List getRoutes() { + return routes; + } + + public void setRoutes(final List routes) { + this.routes = routes; + } +} + diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnector.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnector.java new file mode 100644 index 00000000000..47166d8720b --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnector.java @@ -0,0 +1,23 @@ +// 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.network.tungsten.vrouter; + +import org.w3c.dom.Document; + +public interface IntrospectApiConnector { + Document getSnhItfReq(String uuid); +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorFactory.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorFactory.java new file mode 100644 index 00000000000..4edb8e4bab3 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorFactory.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.vrouter; + +import java.util.HashMap; +import java.util.Map; + +public class IntrospectApiConnectorFactory { + private static final Map introspectApiConnectors = new HashMap<>(); + + private IntrospectApiConnectorFactory() { + } + + public static IntrospectApiConnector getInstance(String host, String introspectPort) { + VRouter vRouter = new VRouter(host, introspectPort); + return introspectApiConnectors.computeIfAbsent(vRouter, IntrospectApiConnectorImpl::new); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImpl.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImpl.java new file mode 100644 index 00000000000..5847b3f53b3 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImpl.java @@ -0,0 +1,72 @@ +// 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.network.tungsten.vrouter; + +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import java.io.IOException; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +public class IntrospectApiConnectorImpl implements IntrospectApiConnector { + private static final Logger s_logger = Logger.getLogger(IntrospectApiConnectorImpl.class); + private final String vrouterUrl; + + public IntrospectApiConnectorImpl(VRouter vRouter) { + vrouterUrl = "http://" + vRouter.getHost() + ":" + vRouter.getPort() + "/"; + } + + public Document getSnhItfReq(String uuid) { + HttpUriRequest request = new HttpGet(this.vrouterUrl + "Snh_ItfReq?uuid=" + uuid); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(request)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to connect host : " + ex.getMessage()); + return null; + } catch (ParserConfigurationException ex) { + s_logger.error("Failed to parse xml configuration : " + ex.getMessage()); + return null; + } catch (SAXException ex) { + s_logger.error("Failed to get xml data : " + ex.getMessage()); + return null; + } + } + + private Document getResponse(final CloseableHttpResponse httpResponse) + throws IOException, ParserConfigurationException, SAXException { + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false); + documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + documentBuilderFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + documentBuilderFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); + documentBuilderFactory.setExpandEntityReferences(false); + DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); + return documentBuilder.parse(httpResponse.getEntity().getContent()); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Port.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Port.java new file mode 100644 index 00000000000..725ecb61efa --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Port.java @@ -0,0 +1,166 @@ +// 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.network.tungsten.vrouter; + +import com.google.gson.annotations.SerializedName; + +public class Port { + private static final String NONE = "None"; + + @SerializedName("id") + private String id = NONE; + + @SerializedName("instance-id") + private String instanceId = NONE; + + @SerializedName("display-name") + private String displayName = NONE; + + @SerializedName("vn-id") + private String vnId = NONE; + + @SerializedName("ip-address") + private String ipAddress = NONE; + + @SerializedName("mac-address") + private String macAddress = NONE; + + @SerializedName("vm-project-id") + private String vmProjectId = NONE; + + @SerializedName("rx-vlan-id") + private short rxVlanId = -1; + + @SerializedName("tx-vlan-id") + private short txVlanId = -1; + + @SerializedName("system-name") + private String tapInterfaceName = NONE; + + @SerializedName("type") + private int type = 0; + + @SerializedName("ip6-address") + private String ipv6Address = NONE; + + @SerializedName("vhostuser-mode") + private int vifType = 0; + + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + + public String getInstanceId() { + return instanceId; + } + + public void setInstanceId(final String instanceId) { + this.instanceId = instanceId; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(final String displayName) { + this.displayName = displayName; + } + + public String getVnId() { + return vnId; + } + + public void setVnId(final String vnId) { + this.vnId = vnId; + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(final String ipAddress) { + this.ipAddress = ipAddress; + } + + public String getMacAddress() { + return macAddress; + } + + public void setMacAddress(final String macAddress) { + this.macAddress = macAddress; + } + + public String getVmProjectId() { + return vmProjectId; + } + + public void setVmProjectId(final String vmProjectId) { + this.vmProjectId = vmProjectId; + } + + public short getRxVlanId() { + return rxVlanId; + } + + public void setRxVlanId(final short rxVlanId) { + this.rxVlanId = rxVlanId; + } + + public short getTxVlanId() { + return txVlanId; + } + + public void setTxVlanId(final short txVlanId) { + this.txVlanId = txVlanId; + } + + public String getTapInterfaceName() { + return tapInterfaceName; + } + + public void setTapInterfaceName(final String tapInterfaceName) { + this.tapInterfaceName = tapInterfaceName; + } + + public int getType() { + return type; + } + + public void setType(final int type) { + this.type = type; + } + + public String getIpv6Address() { + return ipv6Address; + } + + public void setIpv6Address(final String ipv6Address) { + this.ipv6Address = ipv6Address; + } + + public int getVifType() { + return vifType; + } + + public void setVifType(final int vifType) { + this.vifType = vifType; + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Subnet.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Subnet.java new file mode 100644 index 00000000000..d21f9155333 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/Subnet.java @@ -0,0 +1,48 @@ +// 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.network.tungsten.vrouter; + +import com.google.gson.annotations.SerializedName; + +public class Subnet { + @SerializedName("ip-address") + private String prefix; + @SerializedName("prefix-len") + private int length; + + public Subnet(final String prefix, final int length) { + this.prefix = prefix; + this.length = length; + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(final String prefix) { + this.prefix = prefix; + } + + public int getLength() { + return length; + } + + public void setLength(final int length) { + this.length = length; + } +} + diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouter.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouter.java new file mode 100644 index 00000000000..a579bc5c9a7 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouter.java @@ -0,0 +1,63 @@ +// 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.network.tungsten.vrouter; + +import java.util.Objects; + +public class VRouter { + private String host; + private String port; + + public VRouter() { + } + + public VRouter(final String host, final String port) { + this.host = host; + this.port = port; + } + + public String getHost() { + return host; + } + + public void setHost(final String host) { + this.host = host; + } + + public String getPort() { + return port; + } + + public void setPort(final String port) { + this.port = port; + } + + @Override + public boolean equals(final Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + final VRouter vRouter = (VRouter) o; + return host.equals(vRouter.host) && port.equals(vRouter.port); + } + + @Override + public int hashCode() { + return Objects.hash(host, port); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnector.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnector.java new file mode 100644 index 00000000000..ddbbd7f8b65 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnector.java @@ -0,0 +1,34 @@ +// 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.network.tungsten.vrouter; + +import java.io.IOException; +import java.util.List; + +public interface VRouterApiConnector { + boolean addPort(Port port) throws IOException; + + boolean deletePort(String portId); + + boolean enablePort(String portId); + + boolean disablePort(String portId); + + boolean addGateway(List gatewayList) throws IOException; + + boolean deleteGateway(List gatewayList) throws IOException; +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorFactory.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorFactory.java new file mode 100644 index 00000000000..ad8f277e181 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorFactory.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.vrouter; + +import java.util.HashMap; +import java.util.Map; + +public class VRouterApiConnectorFactory { + private static final Map vrouterApiConnectors = new HashMap<>(); + + private VRouterApiConnectorFactory() { + } + + public static VRouterApiConnector getInstance(String host, String vrouterPort) { + VRouter vRouter = new VRouter(host, vrouterPort); + return vrouterApiConnectors.computeIfAbsent(vRouter, VRouterApiConnectorImpl::new); + } +} diff --git a/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImpl.java b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImpl.java new file mode 100644 index 00000000000..6e8d727a9a2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImpl.java @@ -0,0 +1,138 @@ +// 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.network.tungsten.vrouter; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.apache.log4j.Logger; + +import java.io.IOException; +import java.util.List; + +public class VRouterApiConnectorImpl implements VRouterApiConnector { + private static final Logger s_logger = Logger.getLogger(VRouterApiConnectorImpl.class); + private final String vrouterUrl; + + public VRouterApiConnectorImpl(VRouter vRouter) { + vrouterUrl = "http://" + vRouter.getHost() + ":" + vRouter.getPort() + "/"; + } + + @Override + public boolean addPort(final Port port) throws IOException { + String url = this.vrouterUrl + "port"; + Gson gson = new Gson(); + final String jsonData = gson.toJson(port); + HttpPost httpPost = new HttpPost(url); + httpPost.setEntity(new StringEntity(jsonData)); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to add vrouter port : " + ex.getMessage()); + return false; + } + } + + @Override + public boolean deletePort(final String portId) { + HttpDelete httpDelete = new HttpDelete(this.vrouterUrl + "port/" + portId); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(httpDelete)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to delete vrouter port : " + ex.getMessage()); + return false; + } + } + + @Override + public boolean enablePort(final String portId) { + HttpPut httpPut = new HttpPut(this.vrouterUrl + "enable-port/" + portId); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(httpPut)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to enable vrouter port : " + ex.getMessage()); + return false; + } + } + + @Override + public boolean disablePort(final String portId) { + HttpPut httpPut = new HttpPut(this.vrouterUrl + "disable-port/" + portId); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(httpPut)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to disable vrouter port : " + ex.getMessage()); + return false; + } + } + + + @Override + public boolean addGateway(List gatewayList) throws IOException { + HttpPost httpPost = new HttpPost(this.vrouterUrl + "gateway"); + Gson gson = new Gson(); + final String jsonData = gson.toJson(gatewayList); + httpPost.setEntity(new StringEntity(jsonData)); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to add route : " + ex.getMessage()); + return false; + } + } + + @Override + public boolean deleteGateway(List gatewayList) throws IOException { + CustomHttpDelete customHttpDelete = new CustomHttpDelete(this.vrouterUrl + "gateway"); + Gson gson = new Gson(); + final String jsonData = gson.toJson(gatewayList); + customHttpDelete.setEntity(new StringEntity(jsonData)); + try (CloseableHttpClient httpClient = HttpClients.createDefault(); + CloseableHttpResponse httpResponse = httpClient.execute(customHttpDelete)) { + return getResponse(httpResponse); + } catch (IOException ex) { + s_logger.error("Failed to remove route : " + ex.getMessage()); + return false; + } + } + + private boolean getResponse(final CloseableHttpResponse httpResponse) throws IOException { + JsonParser parser = new JsonParser(); + String result = EntityUtils.toString(httpResponse.getEntity()); + JsonObject jsonObject = parser.parse(result).getAsJsonObject(); + if (jsonObject.entrySet().isEmpty()) { + return true; + } else { + String error = jsonObject.get("error").getAsString(); + s_logger.error(error); + return false; + } + } +} diff --git a/plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/module.properties b/plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/module.properties new file mode 100644 index 00000000000..72422a42b8c --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/module.properties @@ -0,0 +1,21 @@ +# +# 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. +# + +name=tungsten +parent=network \ No newline at end of file diff --git a/plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/spring-tungsten-context.xml b/plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/spring-tungsten-context.xml new file mode 100644 index 00000000000..2f0e9699008 --- /dev/null +++ b/plugins/network-elements/tungsten/src/main/resources/META-INF/cloudstack/tungsten/spring-tungsten-context.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmdTest.java new file mode 100644 index 00000000000..3e00748c773 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricNetworkGatewayToLogicalRouterCmdTest.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +import java.util.List; + +public class AddTungstenFabricNetworkGatewayToLogicalRouterCmdTest { + + @Mock + TungstenService tungstenService; + + AddTungstenFabricNetworkGatewayToLogicalRouterCmd addTungstenFabricNetworkGatewayToLogicalRouterCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + addTungstenFabricNetworkGatewayToLogicalRouterCmd = new AddTungstenFabricNetworkGatewayToLogicalRouterCmd(); + addTungstenFabricNetworkGatewayToLogicalRouterCmd.tungstenService = tungstenService; + Whitebox.setInternalState(addTungstenFabricNetworkGatewayToLogicalRouterCmd, "zoneId", 1L); + Whitebox.setInternalState(addTungstenFabricNetworkGatewayToLogicalRouterCmd, "networkUuid", "005f0dea-0196" + + "-11ec-a1ed-b42e99f6e187"); + Whitebox.setInternalState(addTungstenFabricNetworkGatewayToLogicalRouterCmd, "logicalRouterUuid", "125f0dea" + + "-0196-11ec-a1ed-b42e99f6e187"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + String network = "123"; + List networkList = List.of(network); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + Mockito.when(tungstenService.listConnectedNetworkFromLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(networkList); + Mockito.when(tungstenService.addNetworkGatewayToLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponse); + addTungstenFabricNetworkGatewayToLogicalRouterCmd.execute(); + Assert.assertEquals(baseResponse, addTungstenFabricNetworkGatewayToLogicalRouterCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmdTest.java new file mode 100644 index 00000000000..5fb4b25ff7f --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/AddTungstenFabricPolicyRuleCmdTest.java @@ -0,0 +1,85 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricRuleResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class AddTungstenFabricPolicyRuleCmdTest { + + @Mock + TungstenService tungstenService; + + AddTungstenFabricPolicyRuleCmd addTungstenFabricPolicyRuleCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + addTungstenFabricPolicyRuleCmd = new AddTungstenFabricPolicyRuleCmd(); + addTungstenFabricPolicyRuleCmd.tungstenService = tungstenService; + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "zoneId", 1L); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "policyUuid", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "action", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "direction", "oneway"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "protocol", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "srcNetwork", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "srcIpPrefix", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "srcIpPrefixLen", 1); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "srcStartPort", 1); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "srcEndPort", 1); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "destNetwork", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "destIpPrefix", "test"); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "destIpPrefixLen", 1); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "destStartPort", 1); + Whitebox.setInternalState(addTungstenFabricPolicyRuleCmd, "destEndPort", 1); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricRuleResponse tungstenFabricRuleResponse = Mockito.mock(TungstenFabricRuleResponse.class); + Mockito.when(tungstenService.addTungstenPolicyRule(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString() + , ArgumentMatchers.anyString() + , ArgumentMatchers.anyString() + , ArgumentMatchers.anyInt() + , ArgumentMatchers.anyInt() + , ArgumentMatchers.anyInt() + , ArgumentMatchers.anyString() + , ArgumentMatchers.anyString() + , ArgumentMatchers.anyInt() + , ArgumentMatchers.anyInt() + , ArgumentMatchers.anyInt() + )).thenReturn(tungstenFabricRuleResponse); + addTungstenFabricPolicyRuleCmd.execute(); + Assert.assertEquals(tungstenFabricRuleResponse, addTungstenFabricPolicyRuleCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmdTest.java new file mode 100644 index 00000000000..432aad0c64d --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricPolicyCmdTest.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class ApplyTungstenFabricPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + ApplyTungstenFabricPolicyCmd applyTungstenFabricPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + applyTungstenFabricPolicyCmd = new ApplyTungstenFabricPolicyCmd(); + applyTungstenFabricPolicyCmd.tungstenService = tungstenService; + Whitebox.setInternalState(applyTungstenFabricPolicyCmd, "zoneId", 1L); + Whitebox.setInternalState(applyTungstenFabricPolicyCmd, "networkUuid", "test"); + Whitebox.setInternalState(applyTungstenFabricPolicyCmd, "policyUuid", "test"); + Whitebox.setInternalState(applyTungstenFabricPolicyCmd, "majorSequence", 1); + Whitebox.setInternalState(applyTungstenFabricPolicyCmd, "minorSequence", 1); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = Mockito.mock(TungstenFabricPolicyResponse.class); + Mockito.when(tungstenService.applyTungstenPolicy(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())).thenReturn(tungstenFabricPolicyResponse); + applyTungstenFabricPolicyCmd.execute(); + Assert.assertEquals(tungstenFabricPolicyResponse, applyTungstenFabricPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmdTest.java new file mode 100644 index 00000000000..44463562775 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ApplyTungstenFabricTagCmdTest.java @@ -0,0 +1,69 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; + +public class ApplyTungstenFabricTagCmdTest { + + @Mock + TungstenService tungstenService; + + ApplyTungstenFabricTagCmd applyTungstenFabricTagCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + applyTungstenFabricTagCmd = new ApplyTungstenFabricTagCmd(); + applyTungstenFabricTagCmd.tungstenService = tungstenService; + Whitebox.setInternalState(applyTungstenFabricTagCmd, "zoneId", 1L); + Whitebox.setInternalState(applyTungstenFabricTagCmd, "networkUuids", Arrays.asList("test")); + Whitebox.setInternalState(applyTungstenFabricTagCmd, "vmUuids", Arrays.asList("test")); + Whitebox.setInternalState(applyTungstenFabricTagCmd, "nicUuids", Arrays.asList("test")); + Whitebox.setInternalState(applyTungstenFabricTagCmd, "policyUuid", "test"); + Whitebox.setInternalState(applyTungstenFabricTagCmd, "applicationPolicySetUuid", "test"); + Whitebox.setInternalState(applyTungstenFabricTagCmd, "tagUuid", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagResponse tungstenFabricTagResponse = Mockito.mock(TungstenFabricTagResponse.class); + Mockito.when(tungstenService.applyTungstenTag(ArgumentMatchers.anyLong(), ArgumentMatchers.anyList(), + ArgumentMatchers.anyList(), ArgumentMatchers.anyList(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(tungstenFabricTagResponse); + applyTungstenFabricTagCmd.execute(); + Assert.assertEquals(tungstenFabricTagResponse, applyTungstenFabricTagCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmdTest.java new file mode 100644 index 00000000000..057a490774b --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ConfigTungstenFabricServiceCmdTest.java @@ -0,0 +1,101 @@ +// 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.network.tungsten.api.command; + +import com.cloud.dc.DataCenter; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; +import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; +import com.cloud.utils.db.EntityManager; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({Transaction.class, ConfigTungstenFabricServiceCmd.class}) +public class ConfigTungstenFabricServiceCmdTest { + @Mock + EntityManager entityManager; + @Mock + NetworkModel networkModel; + @Mock + NetworkOfferingDao networkOfferingDao; + @Mock + NetworkOfferingServiceMapDao networkOfferingServiceMapDao; + @Mock + NetworkServiceMapDao networkServiceMapDao; + @Mock + PhysicalNetworkServiceProviderDao physicalNetworkServiceProviderDao; + + ConfigTungstenFabricServiceCmd configTungstenFabricServiceCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + configTungstenFabricServiceCmd = new ConfigTungstenFabricServiceCmd(); + configTungstenFabricServiceCmd._entityMgr = entityManager; + configTungstenFabricServiceCmd.networkModel = networkModel; + configTungstenFabricServiceCmd.networkOfferingDao = networkOfferingDao; + configTungstenFabricServiceCmd.networkOfferingServiceMapDao = networkOfferingServiceMapDao; + configTungstenFabricServiceCmd.networkServiceMapDao = networkServiceMapDao; + configTungstenFabricServiceCmd.physicalNetworkServiceProviderDao = physicalNetworkServiceProviderDao; + Whitebox.setInternalState(configTungstenFabricServiceCmd, "zoneId", 1L); + Whitebox.setInternalState(configTungstenFabricServiceCmd, "physicalNetworkId", 1L); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + DataCenter dataCenter = Mockito.mock(DataCenter.class); + Network managementNetwork = Mockito.mock(Network.class); + TransactionCallbackNoReturn transactionCallbackNoReturn = Mockito.mock(TransactionCallbackNoReturn.class); + List systemNetworkOffering = Arrays.asList(Mockito.mock(NetworkOfferingVO.class)); + mockStatic(Transaction.class); + Mockito.when(entityManager.findById(ArgumentMatchers.any(), ArgumentMatchers.anyLong())).thenReturn(dataCenter); + Mockito.when(dataCenter.isSecurityGroupEnabled()).thenReturn(true); + Mockito.when(networkModel.getSystemNetworkByZoneAndTrafficType(ArgumentMatchers.anyLong(), + ArgumentMatchers.any())).thenReturn(managementNetwork); + Mockito.when(networkOfferingDao.listSystemNetworkOfferings()).thenReturn(systemNetworkOffering); + PowerMockito.when(Transaction.execute(any(TransactionCallbackNoReturn.class))).thenReturn(transactionCallbackNoReturn); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + configTungstenFabricServiceCmd.execute(); + Assert.assertEquals(successResponse, configTungstenFabricServiceCmd.getResponseObject()); + } + +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmdTest.java new file mode 100644 index 00000000000..2eb497e28ac --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricAddressGroupCmdTest.java @@ -0,0 +1,66 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricAddressGroupResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricAddressGroupCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricAddressGroupCmd createTungstenFabricAddressGroupCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricAddressGroupCmd = new CreateTungstenFabricAddressGroupCmd(); + createTungstenFabricAddressGroupCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricAddressGroupCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricAddressGroupCmd, "name", "test"); + Whitebox.setInternalState(createTungstenFabricAddressGroupCmd, "ipPrefix", "test"); + Whitebox.setInternalState(createTungstenFabricAddressGroupCmd, "ipPrefixLen", 1); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricAddressGroupResponse tungstenFabricAddressGroupResponse = + Mockito.mock(TungstenFabricAddressGroupResponse.class); + Mockito.when(tungstenService.createTungstenAddressGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyInt())).thenReturn(tungstenFabricAddressGroupResponse); + createTungstenFabricAddressGroupCmd.execute(); + Assert.assertEquals(tungstenFabricAddressGroupResponse, + createTungstenFabricAddressGroupCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmdTest.java new file mode 100644 index 00000000000..9f1439c41c2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricApplicationPolicySetCmdTest.java @@ -0,0 +1,63 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricApplicationPolicySetResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricApplicationPolicySetCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricApplicationPolicySetCmd createTungstenFabricApplicationPolicySetCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricApplicationPolicySetCmd = new CreateTungstenFabricApplicationPolicySetCmd(); + createTungstenFabricApplicationPolicySetCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricApplicationPolicySetCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricApplicationPolicySetCmd, "name", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricApplicationPolicySetResponse tungstenFabricApplicationPolicySetResponse = + Mockito.mock(TungstenFabricApplicationPolicySetResponse.class); + Mockito.when(tungstenService.createTungstenApplicationPolicySet(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(tungstenFabricApplicationPolicySetResponse); + createTungstenFabricApplicationPolicySetCmd.execute(); + Assert.assertEquals(tungstenFabricApplicationPolicySetResponse, + createTungstenFabricApplicationPolicySetCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmdTest.java new file mode 100644 index 00000000000..833cec00acc --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallPolicyCmdTest.java @@ -0,0 +1,66 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricFirewallPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricFirewallPolicyCmd createTungstenFabricFirewallPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricFirewallPolicyCmd = new CreateTungstenFabricFirewallPolicyCmd(); + createTungstenFabricFirewallPolicyCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricFirewallPolicyCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricFirewallPolicyCmd, "applicationPolicySetUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallPolicyCmd, "name", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallPolicyCmd, "sequence", 1); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricFirewallPolicyResponse tungstenFabricFirewallPolicyResponse = + Mockito.mock(TungstenFabricFirewallPolicyResponse.class); + Mockito.when(tungstenService.createTungstenFirewallPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyInt())).thenReturn(tungstenFabricFirewallPolicyResponse); + createTungstenFabricFirewallPolicyCmd.execute(); + Assert.assertEquals(tungstenFabricFirewallPolicyResponse, + createTungstenFabricFirewallPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmdTest.java new file mode 100644 index 00000000000..72db94fe788 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricFirewallRuleCmdTest.java @@ -0,0 +1,80 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricFirewallRuleResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricFirewallRuleCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricFirewallRuleCmd createTungstenFabricFirewallRuleCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricFirewallRuleCmd = new CreateTungstenFabricFirewallRuleCmd(); + createTungstenFabricFirewallRuleCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "firewallPolicyUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "name", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "action", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "serviceGroupUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "srcTagUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "srcAddressGroupUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "srcNetworkUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "direction", "oneway"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "destTagUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "destAddressGroupUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "destNetworkUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "tagTypeUuid", "test"); + Whitebox.setInternalState(createTungstenFabricFirewallRuleCmd, "sequence", 1); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricFirewallRuleResponse tungstenFabricFirewallRuleResponse = + Mockito.mock(TungstenFabricFirewallRuleResponse.class); + Mockito.when(tungstenService.createTungstenFirewallRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyInt())).thenReturn(tungstenFabricFirewallRuleResponse); + createTungstenFabricFirewallRuleCmd.execute(); + Assert.assertEquals(tungstenFabricFirewallRuleResponse, + createTungstenFabricFirewallRuleCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmdTest.java new file mode 100644 index 00000000000..a6f0b0394a0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricLogicalRouterCmdTest.java @@ -0,0 +1,62 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricLogicalRouterCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricLogicalRouterCmd createTungstenFabricLogicalRouterCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricLogicalRouterCmd = new CreateTungstenFabricLogicalRouterCmd(); + createTungstenFabricLogicalRouterCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricLogicalRouterCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricLogicalRouterCmd, "name", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + Mockito.when(tungstenService.createRoutingLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.any(), + ArgumentMatchers.anyString())).thenReturn(baseResponse); + createTungstenFabricLogicalRouterCmd.execute(); + Assert.assertEquals(baseResponse, createTungstenFabricLogicalRouterCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmdTest.java new file mode 100644 index 00000000000..44ffe5d217d --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricManagementNetworkCmdTest.java @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.dc.HostPodVO; +import com.cloud.dc.dao.HostPodDao; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(CreateTungstenFabricManagementNetworkCmd.class) +public class CreateTungstenFabricManagementNetworkCmdTest { + + @Mock + TungstenService tungstenService; + @Mock + HostPodDao podDao; + + CreateTungstenFabricManagementNetworkCmd createTungstenFabricManagementNetworkCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricManagementNetworkCmd = new CreateTungstenFabricManagementNetworkCmd(); + createTungstenFabricManagementNetworkCmd.tungstenService = tungstenService; + createTungstenFabricManagementNetworkCmd.podDao = podDao; + Whitebox.setInternalState(createTungstenFabricManagementNetworkCmd, "podId", 1L); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + HostPodVO pod = Mockito.mock(HostPodVO.class); + Mockito.when(podDao.findById(ArgumentMatchers.anyLong())).thenReturn(pod); + Mockito.when(tungstenService.createManagementNetwork(ArgumentMatchers.anyLong())).thenReturn(true); + Mockito.when(tungstenService.addManagementNetworkSubnet(ArgumentMatchers.any())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + createTungstenFabricManagementNetworkCmd.execute(); + Assert.assertEquals(successResponse, createTungstenFabricManagementNetworkCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmdTest.java new file mode 100644 index 00000000000..f3e83992d6d --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPolicyCmdTest.java @@ -0,0 +1,60 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricPolicyCmd createTungstenFabricPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricPolicyCmd = new CreateTungstenFabricPolicyCmd(); + createTungstenFabricPolicyCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricPolicyCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricPolicyCmd, "name", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = Mockito.mock(TungstenFabricPolicyResponse.class); + Mockito.when(tungstenService.createTungstenPolicy(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString())).thenReturn(tungstenFabricPolicyResponse); + createTungstenFabricPolicyCmd.execute(); + Assert.assertEquals(tungstenFabricPolicyResponse, createTungstenFabricPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmdTest.java new file mode 100644 index 00000000000..335c5f07b10 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricProviderCmdTest.java @@ -0,0 +1,69 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.TungstenProvider; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricProviderResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenProviderService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricProviderCmdTest { + + @Mock + TungstenProviderService tungstenProviderService; + + CreateTungstenFabricProviderCmd createTungstenFabricProviderCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricProviderCmd = new CreateTungstenFabricProviderCmd(); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "tungstenProviderService", tungstenProviderService); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "name", "test"); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "hostname", "test"); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "port", "test"); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "gateway", "test"); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "vrouterPort", "test"); + Whitebox.setInternalState(createTungstenFabricProviderCmd, "introspectPort", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricProviderResponse tungstenFabricProviderResponse = + Mockito.mock(TungstenFabricProviderResponse.class); + TungstenProvider tungstenProvider = Mockito.mock(TungstenProvider.class); + Mockito.when(tungstenProviderService.addProvider(ArgumentMatchers.any())).thenReturn(tungstenProvider); + Mockito.when(tungstenProviderService.createTungstenProviderResponse(tungstenProvider)).thenReturn(tungstenFabricProviderResponse); + createTungstenFabricProviderCmd.execute(); + Assert.assertEquals(tungstenFabricProviderResponse, createTungstenFabricProviderCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmdTest.java new file mode 100644 index 00000000000..3a98e617f29 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricPublicNetworkCmdTest.java @@ -0,0 +1,82 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.VlanDao; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.utils.db.SearchCriteria; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(CreateTungstenFabricPublicNetworkCmd.class) +public class CreateTungstenFabricPublicNetworkCmdTest { + + @Mock + VlanDao vlanDao; + @Mock + NetworkModel networkModel; + @Mock + TungstenService tungstenService; + + CreateTungstenFabricPublicNetworkCmd createTungstenFabricPublicNetworkCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricPublicNetworkCmd = new CreateTungstenFabricPublicNetworkCmd(); + createTungstenFabricPublicNetworkCmd.tungstenService = tungstenService; + createTungstenFabricPublicNetworkCmd.vlanDao = vlanDao; + createTungstenFabricPublicNetworkCmd.networkModel = networkModel; + Whitebox.setInternalState(createTungstenFabricPublicNetworkCmd, "zoneId", 1L); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Network publicNetwork = Mockito.mock(Network.class); + SearchCriteria sc = Mockito.mock(SearchCriteria.class); + List pubVlanVOList = Arrays.asList(Mockito.mock(VlanVO.class)); + Mockito.when(networkModel.getSystemNetworkByZoneAndTrafficType(ArgumentMatchers.anyLong(), + ArgumentMatchers.any())).thenReturn(publicNetwork); + Mockito.when(vlanDao.createSearchCriteria()).thenReturn(sc); + Mockito.when(vlanDao.listVlansByNetworkId(ArgumentMatchers.anyLong())).thenReturn(pubVlanVOList); + + Mockito.when(tungstenService.createPublicNetwork(ArgumentMatchers.anyLong())).thenReturn(true); + Mockito.when(tungstenService.addPublicNetworkSubnet(ArgumentMatchers.any())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + createTungstenFabricPublicNetworkCmd.execute(); + Assert.assertEquals(successResponse, createTungstenFabricPublicNetworkCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmdTest.java new file mode 100644 index 00000000000..d80a6fc83a0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricServiceGroupCmdTest.java @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricServiceGroupResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricServiceGroupCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricServiceGroupCmd createTungstenFabricServiceGroupCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricServiceGroupCmd = new CreateTungstenFabricServiceGroupCmd(); + createTungstenFabricServiceGroupCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricServiceGroupCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricServiceGroupCmd, "name", "test"); + Whitebox.setInternalState(createTungstenFabricServiceGroupCmd, "protocol", "test"); + Whitebox.setInternalState(createTungstenFabricServiceGroupCmd, "startPort", 1); + Whitebox.setInternalState(createTungstenFabricServiceGroupCmd, "endPort", 1); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricServiceGroupResponse tungstenFabricServiceGroupResponse = + Mockito.mock(TungstenFabricServiceGroupResponse.class); + Mockito.when(tungstenService.createTungstenServiceGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt())).thenReturn(tungstenFabricServiceGroupResponse); + createTungstenFabricServiceGroupCmd.execute(); + Assert.assertEquals(tungstenFabricServiceGroupResponse, + createTungstenFabricServiceGroupCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmdTest.java new file mode 100644 index 00000000000..1b953f9ec62 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagCmdTest.java @@ -0,0 +1,62 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricTagCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricTagCmd createTungstenFabricTagCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricTagCmd = new CreateTungstenFabricTagCmd(); + createTungstenFabricTagCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricTagCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricTagCmd, "tagType", "test"); + Whitebox.setInternalState(createTungstenFabricTagCmd, "tagValue", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagResponse tungstenFabricTagResponse = Mockito.mock(TungstenFabricTagResponse.class); + Mockito.when(tungstenService.createTungstenTag(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(tungstenFabricTagResponse); + createTungstenFabricTagCmd.execute(); + Assert.assertEquals(tungstenFabricTagResponse, createTungstenFabricTagCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmdTest.java new file mode 100644 index 00000000000..81b32f0c812 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/CreateTungstenFabricTagTypeCmdTest.java @@ -0,0 +1,60 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagTypeResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class CreateTungstenFabricTagTypeCmdTest { + + @Mock + TungstenService tungstenService; + + CreateTungstenFabricTagTypeCmd createTungstenFabricTagTypeCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + createTungstenFabricTagTypeCmd = new CreateTungstenFabricTagTypeCmd(); + createTungstenFabricTagTypeCmd.tungstenService = tungstenService; + Whitebox.setInternalState(createTungstenFabricTagTypeCmd, "zoneId", 1L); + Whitebox.setInternalState(createTungstenFabricTagTypeCmd, "name", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagTypeResponse tungstenFabricTagTypeResponse = Mockito.mock(TungstenFabricTagTypeResponse.class); + Mockito.when(tungstenService.createTungstenTagType(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString())).thenReturn(tungstenFabricTagTypeResponse); + createTungstenFabricTagTypeCmd.execute(); + Assert.assertEquals(tungstenFabricTagTypeResponse, createTungstenFabricTagTypeCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmdTest.java new file mode 100644 index 00000000000..0e617bac7b4 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricAddressGroupCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricAddressGroupCmd.class) +public class DeleteTungstenFabricAddressGroupCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricAddressGroupCmd deleteTungstenFabricAddressGroupCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricAddressGroupCmd = new DeleteTungstenFabricAddressGroupCmd(); + deleteTungstenFabricAddressGroupCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricAddressGroupCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricAddressGroupCmd, "addressGroupUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenAddressGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricAddressGroupCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricAddressGroupCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmdTest.java new file mode 100644 index 00000000000..0ff22ae3878 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricApplicationPolicySetCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricApplicationPolicySetCmd.class) +public class DeleteTungstenFabricApplicationPolicySetCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricApplicationPolicySetCmd deleteTungstenFabricApplicationPolicySetCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricApplicationPolicySetCmd = new DeleteTungstenFabricApplicationPolicySetCmd(); + deleteTungstenFabricApplicationPolicySetCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricApplicationPolicySetCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricApplicationPolicySetCmd, "applicationPolicySetUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenApplicationPolicySet(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricApplicationPolicySetCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricApplicationPolicySetCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmdTest.java new file mode 100644 index 00000000000..4b3ce89907f --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallPolicyCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricFirewallPolicyCmd.class) +public class DeleteTungstenFabricFirewallPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricFirewallPolicyCmd deleteTungstenFabricFirewallPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricFirewallPolicyCmd = new DeleteTungstenFabricFirewallPolicyCmd(); + deleteTungstenFabricFirewallPolicyCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricFirewallPolicyCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricFirewallPolicyCmd, "firewallPolicyUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenFirewallPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricFirewallPolicyCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricFirewallPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmdTest.java new file mode 100644 index 00000000000..612a0e91b5d --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricFirewallRuleCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricFirewallRuleCmd.class) +public class DeleteTungstenFabricFirewallRuleCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricFirewallRuleCmd deleteTungstenFabricFirewallRuleCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricFirewallRuleCmd = new DeleteTungstenFabricFirewallRuleCmd(); + deleteTungstenFabricFirewallRuleCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricFirewallRuleCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricFirewallRuleCmd, "firewallRuleUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenFirewallRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricFirewallRuleCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricFirewallRuleCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmdTest.java new file mode 100644 index 00000000000..710fea9418f --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricLogicalRouterCmdTest.java @@ -0,0 +1,67 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricLogicalRouterCmd.class) +public class DeleteTungstenFabricLogicalRouterCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricLogicalRouterCmd deleteTungstenFabricLogicalRouterCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricLogicalRouterCmd = new DeleteTungstenFabricLogicalRouterCmd(); + deleteTungstenFabricLogicalRouterCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricLogicalRouterCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricLogicalRouterCmd, "logicalRouterUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + List networkList = new ArrayList<>(); + Mockito.when(tungstenService.listConnectedNetworkFromLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(networkList); + Mockito.when(tungstenService.deleteLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricLogicalRouterCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricLogicalRouterCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmdTest.java new file mode 100644 index 00000000000..7f421dd8e24 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricPolicyCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricPolicyCmd.class) +public class DeleteTungstenFabricPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricPolicyCmd deleteTungstenFabricPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricPolicyCmd = new DeleteTungstenFabricPolicyCmd(); + deleteTungstenFabricPolicyCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricPolicyCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricPolicyCmd, "policyUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricPolicyCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmdTest.java new file mode 100644 index 00000000000..2e32cede200 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricServiceGroupCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricServiceGroupCmd.class) +public class DeleteTungstenFabricServiceGroupCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricServiceGroupCmd deleteTungstenFabricServiceGroupCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricServiceGroupCmd = new DeleteTungstenFabricServiceGroupCmd(); + deleteTungstenFabricServiceGroupCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricServiceGroupCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricServiceGroupCmd, "serviceGroupUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenServiceGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricServiceGroupCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricServiceGroupCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmdTest.java new file mode 100644 index 00000000000..0bf3b093cbe --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricTagCmd.class) +public class DeleteTungstenFabricTagCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricTagCmd deleteTungstenFabricTagCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricTagCmd = new DeleteTungstenFabricTagCmd(); + deleteTungstenFabricTagCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricTagCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricTagCmd, "tagUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenTag(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricTagCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricTagCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmdTest.java new file mode 100644 index 00000000000..3a78370f065 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/DeleteTungstenFabricTagTypeCmdTest.java @@ -0,0 +1,61 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(DeleteTungstenFabricTagTypeCmd.class) +public class DeleteTungstenFabricTagTypeCmdTest { + + @Mock + TungstenService tungstenService; + + DeleteTungstenFabricTagTypeCmd deleteTungstenFabricTagTypeCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + deleteTungstenFabricTagTypeCmd = new DeleteTungstenFabricTagTypeCmd(); + deleteTungstenFabricTagTypeCmd.tungstenService = tungstenService; + Whitebox.setInternalState(deleteTungstenFabricTagTypeCmd, "zoneId", 1L); + Whitebox.setInternalState(deleteTungstenFabricTagTypeCmd, "tagTypeUuid", "test"); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.deleteTungstenTagType(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + deleteTungstenFabricTagTypeCmd.execute(); + Assert.assertEquals(successResponse, deleteTungstenFabricTagTypeCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmdTest.java new file mode 100644 index 00000000000..dcf07376279 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/GetLoadBalancerSslCertificateCmdTest.java @@ -0,0 +1,64 @@ +// 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.network.tungsten.api.command; + +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.lb.LoadBalancingRulesManager; +import org.apache.cloudstack.network.tungsten.api.response.TlsDataResponse; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(GetLoadBalancerSslCertificateCmd.class) +public class GetLoadBalancerSslCertificateCmdTest { + + @Mock + LoadBalancingRulesManager loadBalancingRulesManager; + + GetLoadBalancerSslCertificateCmd getLoadBalancerSslCertificateCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + getLoadBalancerSslCertificateCmd = new GetLoadBalancerSslCertificateCmd(); + Whitebox.setInternalState(getLoadBalancerSslCertificateCmd, "lbMgr", loadBalancingRulesManager); + Whitebox.setInternalState(getLoadBalancerSslCertificateCmd, "id", 1L); + } + + @Test + public void executeTest() throws Exception { + LoadBalancingRule.LbSslCert lbSslCert = Mockito.mock(LoadBalancingRule.LbSslCert.class); + TlsDataResponse tlsDataResponse = Mockito.mock(TlsDataResponse.class); + Mockito.when(lbSslCert.getCert()).thenReturn("test"); + Mockito.when(lbSslCert.getKey()).thenReturn("test"); + Mockito.when(lbSslCert.getChain()).thenReturn("test"); + Mockito.when(loadBalancingRulesManager.getLbSslCert(ArgumentMatchers.anyLong())).thenReturn(lbSslCert); + PowerMockito.whenNew(TlsDataResponse.class).withAnyArguments().thenReturn(tlsDataResponse); + getLoadBalancerSslCertificateCmd.execute(); + Assert.assertEquals(tlsDataResponse, getLoadBalancerSslCertificateCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmdTest.java new file mode 100644 index 00000000000..f741580e4b0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricAddressGroupCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricAddressGroupCmd.class) +public class ListTungstenFabricAddressGroupCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricAddressGroupCmd listTungstenFabricAddressGroupCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricAddressGroupCmd = new ListTungstenFabricAddressGroupCmd(); + listTungstenFabricAddressGroupCmd.tungstenService = tungstenService; + listTungstenFabricAddressGroupCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricAddressGroupCmd.configure(); + Whitebox.setInternalState(listTungstenFabricAddressGroupCmd, "addressGroupUuid", "test"); + Whitebox.setInternalState(listTungstenFabricAddressGroupCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricAddressGroupCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricAddressGroupCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenAddressGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricAddressGroupCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricAddressGroupCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenAddressGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricAddressGroupCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricAddressGroupCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmdTest.java new file mode 100644 index 00000000000..eff717dd2a3 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricApplictionPolicySetCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricApplictionPolicySetCmd.class) +public class ListTungstenFabricApplictionPolicySetCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricApplictionPolicySetCmd listTungstenFabricApplictionPolicySetCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricApplictionPolicySetCmd = new ListTungstenFabricApplictionPolicySetCmd(); + listTungstenFabricApplictionPolicySetCmd.tungstenService = tungstenService; + listTungstenFabricApplictionPolicySetCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricApplictionPolicySetCmd.configure(); + Whitebox.setInternalState(listTungstenFabricApplictionPolicySetCmd, "zoneId", 1L); + Whitebox.setInternalState(listTungstenFabricApplictionPolicySetCmd, "applicationPolicySetUuid", "test"); + Whitebox.setInternalState(listTungstenFabricApplictionPolicySetCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricApplictionPolicySetCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricApplictionPolicySetCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenApplicationPolicySet(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricApplictionPolicySetCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricApplictionPolicySetCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenApplicationPolicySet(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricApplictionPolicySetCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricApplictionPolicySetCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmdTest.java new file mode 100644 index 00000000000..ed3b68e7632 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallPolicyCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricFirewallPolicyCmd.class) +public class ListTungstenFabricFirewallPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricFirewallPolicyCmd listTungstenFabricFirewallPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricFirewallPolicyCmd = new ListTungstenFabricFirewallPolicyCmd(); + listTungstenFabricFirewallPolicyCmd.tungstenService = tungstenService; + listTungstenFabricFirewallPolicyCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricFirewallPolicyCmd.configure(); + Whitebox.setInternalState(listTungstenFabricFirewallPolicyCmd, "applicationPolicySetUuid", "test"); + Whitebox.setInternalState(listTungstenFabricFirewallPolicyCmd, "firewallPolicyUuid", "test"); + Whitebox.setInternalState(listTungstenFabricFirewallPolicyCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricFirewallPolicyCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricFirewallPolicyCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenFirewallPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricFirewallPolicyCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricFirewallPolicyCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenFirewallPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricFirewallPolicyCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricFirewallPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmdTest.java new file mode 100644 index 00000000000..f267478b0bd --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricFirewallRuleCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricFirewallRuleCmd.class) +public class ListTungstenFabricFirewallRuleCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricFirewallRuleCmd listTungstenFabricFirewallRuleCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricFirewallRuleCmd = new ListTungstenFabricFirewallRuleCmd(); + listTungstenFabricFirewallRuleCmd.tungstenService = tungstenService; + listTungstenFabricFirewallRuleCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricFirewallRuleCmd.configure(); + Whitebox.setInternalState(listTungstenFabricFirewallRuleCmd, "firewallPolicyUuid", "test"); + Whitebox.setInternalState(listTungstenFabricFirewallRuleCmd, "firewallRuleUuid", "test"); + Whitebox.setInternalState(listTungstenFabricFirewallRuleCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricFirewallRuleCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricFirewallRuleCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenFirewallRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricFirewallRuleCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricFirewallRuleCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenFirewallRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricFirewallRuleCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricFirewallRuleCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmdTest.java new file mode 100644 index 00000000000..c9df9355219 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLBHealthMonitorCmdTest.java @@ -0,0 +1,74 @@ +// 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.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricLBHealthMonitorCmd.class) +public class ListTungstenFabricLBHealthMonitorCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricLBHealthMonitorCmd listTungstenFabricLBHealthMonitorCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricLBHealthMonitorCmd = new ListTungstenFabricLBHealthMonitorCmd(); + listTungstenFabricLBHealthMonitorCmd.tungstenService = tungstenService; + listTungstenFabricLBHealthMonitorCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricLBHealthMonitorCmd.configure(); + Whitebox.setInternalState(listTungstenFabricLBHealthMonitorCmd, "lbID", 1L); + Whitebox.setInternalState(listTungstenFabricLBHealthMonitorCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricLBHealthMonitorCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenFabricLBHealthMonitor(ArgumentMatchers.anyLong())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricLBHealthMonitorCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricLBHealthMonitorCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmdTest.java new file mode 100644 index 00000000000..34879d21567 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricLogicalRouterCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricLogicalRouterCmd.class) +public class ListTungstenFabricLogicalRouterCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricLogicalRouterCmd listTungstenFabricLogicalRouterCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricLogicalRouterCmd = new ListTungstenFabricLogicalRouterCmd(); + listTungstenFabricLogicalRouterCmd.tungstenService = tungstenService; + listTungstenFabricLogicalRouterCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricLogicalRouterCmd.configure(); + Whitebox.setInternalState(listTungstenFabricLogicalRouterCmd, "networkUuid", "test"); + Whitebox.setInternalState(listTungstenFabricLogicalRouterCmd, "logicalRouterUuid", "test"); + Whitebox.setInternalState(listTungstenFabricLogicalRouterCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricLogicalRouterCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricLogicalRouterCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listRoutingLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricLogicalRouterCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricLogicalRouterCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listRoutingLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricLogicalRouterCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricLogicalRouterCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmdTest.java new file mode 100644 index 00000000000..dbb3b601e8e --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNetworkCmdTest.java @@ -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.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricNetworkCmd.class) +public class ListTungstenFabricNetworkCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricNetworkCmd listTungstenFabricNetworkCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricNetworkCmd = new ListTungstenFabricNetworkCmd(); + listTungstenFabricNetworkCmd.tungstenService = tungstenService; + listTungstenFabricNetworkCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricNetworkCmd.configure(); + Whitebox.setInternalState(listTungstenFabricNetworkCmd, "networkUuid", "test"); + Whitebox.setInternalState(listTungstenFabricNetworkCmd, "listAll", true); + Whitebox.setInternalState(listTungstenFabricNetworkCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricNetworkCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricNetworkCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenNetwork(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean())).thenReturn(baseResponseList); + PowerMockito.whenNew(BaseResponse.class).withAnyArguments().thenReturn(baseResponse); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricNetworkCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricNetworkCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenNetwork(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricNetworkCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricNetworkCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmdTest.java new file mode 100644 index 00000000000..8f43c25141f --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricNicCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricNicCmd.class) +public class ListTungstenFabricNicCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricNicCmd listTungstenFabricNicCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricNicCmd = new ListTungstenFabricNicCmd(); + listTungstenFabricNicCmd.tungstenService = tungstenService; + listTungstenFabricNicCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricNicCmd.configure(); + Whitebox.setInternalState(listTungstenFabricNicCmd, "nicUuid", "test"); + Whitebox.setInternalState(listTungstenFabricNicCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricNicCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricNicCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenNic(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricNicCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricNicCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenNic(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricNicCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricNicCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmdTest.java new file mode 100644 index 00000000000..eddb6b9a9cf --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricPolicyCmd.class) +public class ListTungstenFabricPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricPolicyCmd listTungstenFabricPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricPolicyCmd = new ListTungstenFabricPolicyCmd(); + listTungstenFabricPolicyCmd.tungstenService = tungstenService; + listTungstenFabricPolicyCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricPolicyCmd.configure(); + Whitebox.setInternalState(listTungstenFabricPolicyCmd, "networkId", 1L); + Whitebox.setInternalState(listTungstenFabricPolicyCmd, "addressId", 1L); + Whitebox.setInternalState(listTungstenFabricPolicyCmd, "policyUuid", "test"); + Whitebox.setInternalState(listTungstenFabricPolicyCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricPolicyCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricPolicyCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyLong(), + ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricPolicyCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricPolicyCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyLong(), + ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricPolicyCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmdTest.java new file mode 100644 index 00000000000..e76b8a7d06a --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricPolicyRuleCmdTest.java @@ -0,0 +1,95 @@ +// 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.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricPolicyRuleCmd.class) +public class ListTungstenFabricPolicyRuleCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricPolicyRuleCmd listTungstenFabricPolicyRuleCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricPolicyRuleCmd = new ListTungstenFabricPolicyRuleCmd(); + listTungstenFabricPolicyRuleCmd.tungstenService = tungstenService; + listTungstenFabricPolicyRuleCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricPolicyRuleCmd.configure(); + Whitebox.setInternalState(listTungstenFabricPolicyRuleCmd, "policyUuid", "test"); + Whitebox.setInternalState(listTungstenFabricPolicyRuleCmd, "ruleUuid", "test"); + Whitebox.setInternalState(listTungstenFabricPolicyRuleCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricPolicyRuleCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricPolicyRuleCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenPolicyRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricPolicyRuleCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricPolicyRuleCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenPolicyRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricPolicyRuleCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricPolicyRuleCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmdTest.java new file mode 100644 index 00000000000..96e9b12d1ee --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricProvidersCmdTest.java @@ -0,0 +1,75 @@ +// 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.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenProviderService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricProvidersCmd.class) +public class ListTungstenFabricProvidersCmdTest { + + @Mock + TungstenProviderService tungstenProviderService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricProvidersCmd listTungstenFabricProvidersCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricProvidersCmd = new ListTungstenFabricProvidersCmd(); + listTungstenFabricProvidersCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricProvidersCmd.configure(); + Whitebox.setInternalState(listTungstenFabricProvidersCmd, "tungstenProviderService", tungstenProviderService); + Whitebox.setInternalState(listTungstenFabricProvidersCmd, "zoneId", 1L); + Whitebox.setInternalState(listTungstenFabricProvidersCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricProvidersCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenProviderService.listTungstenProvider(ArgumentMatchers.anyLong())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricProvidersCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricProvidersCmd.getResponseObject()); + } +} + diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmdTest.java new file mode 100644 index 00000000000..2aacd6dac79 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricServiceGroupCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricServiceGroupCmd.class) +public class ListTungstenFabricServiceGroupCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricServiceGroupCmd listTungstenFabricServiceGroupCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricServiceGroupCmd = new ListTungstenFabricServiceGroupCmd(); + listTungstenFabricServiceGroupCmd.tungstenService = tungstenService; + listTungstenFabricServiceGroupCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricServiceGroupCmd.configure(); + Whitebox.setInternalState(listTungstenFabricServiceGroupCmd, "serviceGroupUuid", "test"); + Whitebox.setInternalState(listTungstenFabricServiceGroupCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricServiceGroupCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricServiceGroupCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenServiceGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricServiceGroupCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricServiceGroupCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenServiceGroup(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricServiceGroupCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricServiceGroupCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmdTest.java new file mode 100644 index 00000000000..a80fc70027d --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagCmdTest.java @@ -0,0 +1,107 @@ +// 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.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricTagCmd.class) +public class ListTungstenFabricTagCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricTagCmd listTungstenFabricTagCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricTagCmd = new ListTungstenFabricTagCmd(); + listTungstenFabricTagCmd.tungstenService = tungstenService; + listTungstenFabricTagCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricTagCmd.configure(); + Whitebox.setInternalState(listTungstenFabricTagCmd, "networkUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagCmd, "vmUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagCmd, "nicUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagCmd, "policyUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagCmd, "applicationPolicySetUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagCmd, "tagUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricTagCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricTagCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenTags(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricTagCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricTagCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenTags(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricTagCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricTagCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmdTest.java new file mode 100644 index 00000000000..1eeb8675ee2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricTagTypeCmdTest.java @@ -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 org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricTagTypeCmd.class) +public class ListTungstenFabricTagTypeCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricTagTypeCmd listTungstenFabricTagTypeCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricTagTypeCmd = new ListTungstenFabricTagTypeCmd(); + listTungstenFabricTagTypeCmd.tungstenService = tungstenService; + listTungstenFabricTagTypeCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricTagTypeCmd.configure(); + Whitebox.setInternalState(listTungstenFabricTagTypeCmd, "tagTypeUuid", "test"); + Whitebox.setInternalState(listTungstenFabricTagTypeCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricTagTypeCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricTagTypeCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenTagTypes(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricTagTypeCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricTagTypeCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenTagTypes(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricTagTypeCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricTagTypeCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmdTest.java new file mode 100644 index 00000000000..a347ca8f6fb --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/ListTungstenFabricVmCmdTest.java @@ -0,0 +1,90 @@ +// 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.network.tungsten.api.command; + +import com.cloud.configuration.ConfigurationService; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(ListTungstenFabricVmCmd.class) +public class ListTungstenFabricVmCmdTest { + + @Mock + TungstenService tungstenService; + + @Mock + ConfigurationService configService; + + ListTungstenFabricVmCmd listTungstenFabricVmCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + listTungstenFabricVmCmd = new ListTungstenFabricVmCmd(); + listTungstenFabricVmCmd.tungstenService = tungstenService; + listTungstenFabricVmCmd._configService = configService; + Mockito.when(configService.getDefaultPageSize()).thenReturn(-1L); + listTungstenFabricVmCmd.configure(); + Whitebox.setInternalState(listTungstenFabricVmCmd, "vmUuid", "test"); + Whitebox.setInternalState(listTungstenFabricVmCmd, "page", 1); + Whitebox.setInternalState(listTungstenFabricVmCmd, "pageSize", 10); + } + + @Test + public void executeTest() throws Exception { + Whitebox.setInternalState(listTungstenFabricVmCmd, "zoneId", 1L); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + Mockito.when(tungstenService.listTungstenVm(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricVmCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricVmCmd.getResponseObject()); + } + + @Test + public void executeAllZoneTest() throws Exception { + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + List baseResponseList = Arrays.asList(baseResponse); + ListResponse responseList = Mockito.mock(ListResponse.class); + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + List tungstenProviderVOList = Arrays.asList(tungstenProviderVO); + Mockito.when(tungstenService.getTungstenProviders()).thenReturn(tungstenProviderVOList); + Mockito.when(tungstenService.listTungstenVm(ArgumentMatchers.anyLong(), ArgumentMatchers.anyString())).thenReturn(baseResponseList); + PowerMockito.whenNew(ListResponse.class).withAnyArguments().thenReturn(responseList); + listTungstenFabricVmCmd.execute(); + Assert.assertEquals(responseList, listTungstenFabricVmCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmdTest.java new file mode 100644 index 00000000000..cb7aa9b34d2 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmdTest.java @@ -0,0 +1,70 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +public class RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmdTest { + + @Mock + TungstenService tungstenService; + + RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd removeTungstenFabricNetworkGatewayFromLogicalRouterCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + removeTungstenFabricNetworkGatewayFromLogicalRouterCmd = + new RemoveTungstenFabricNetworkGatewayFromLogicalRouterCmd(); + removeTungstenFabricNetworkGatewayFromLogicalRouterCmd.tungstenService = tungstenService; + Whitebox.setInternalState(removeTungstenFabricNetworkGatewayFromLogicalRouterCmd, "zoneId", 1L); + Whitebox.setInternalState(removeTungstenFabricNetworkGatewayFromLogicalRouterCmd, "networkUuid", "test"); + Whitebox.setInternalState(removeTungstenFabricNetworkGatewayFromLogicalRouterCmd, "logicalRouterUuid", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + List networkList = Arrays.asList("test"); + BaseResponse baseResponse = Mockito.mock(BaseResponse.class); + Mockito.when(tungstenService.listConnectedNetworkFromLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString())).thenReturn(networkList); + Mockito.when(tungstenService.removeNetworkGatewayFromLogicalRouter(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(baseResponse); + removeTungstenFabricNetworkGatewayFromLogicalRouterCmd.execute(); + Assert.assertEquals(baseResponse, removeTungstenFabricNetworkGatewayFromLogicalRouterCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmdTest.java new file mode 100644 index 00000000000..f4491044a26 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyCmdTest.java @@ -0,0 +1,63 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class RemoveTungstenFabricPolicyCmdTest { + + @Mock + TungstenService tungstenService; + + RemoveTungstenFabricPolicyCmd removeTungstenFabricPolicyCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + removeTungstenFabricPolicyCmd = new RemoveTungstenFabricPolicyCmd(); + removeTungstenFabricPolicyCmd.tungstenService = tungstenService; + Whitebox.setInternalState(removeTungstenFabricPolicyCmd, "zoneId", 1L); + Whitebox.setInternalState(removeTungstenFabricPolicyCmd, "networkUuid", "test"); + Whitebox.setInternalState(removeTungstenFabricPolicyCmd, "policyUuid", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = Mockito.mock(TungstenFabricPolicyResponse.class); + Mockito.when(tungstenService.removeTungstenPolicy(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(tungstenFabricPolicyResponse); + removeTungstenFabricPolicyCmd.execute(); + Assert.assertEquals(tungstenFabricPolicyResponse, removeTungstenFabricPolicyCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmdTest.java new file mode 100644 index 00000000000..bb9aceef9b8 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricPolicyRuleCmdTest.java @@ -0,0 +1,63 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricPolicyResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +public class RemoveTungstenFabricPolicyRuleCmdTest { + + @Mock + TungstenService tungstenService; + + RemoveTungstenFabricPolicyRuleCmd removeTungstenFabricPolicyRuleCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + removeTungstenFabricPolicyRuleCmd = new RemoveTungstenFabricPolicyRuleCmd(); + removeTungstenFabricPolicyRuleCmd.tungstenService = tungstenService; + Whitebox.setInternalState(removeTungstenFabricPolicyRuleCmd, "zoneId", 1L); + Whitebox.setInternalState(removeTungstenFabricPolicyRuleCmd, "policyUuid", "test"); + Whitebox.setInternalState(removeTungstenFabricPolicyRuleCmd, "ruleUuid", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricPolicyResponse tungstenFabricPolicyResponse = Mockito.mock(TungstenFabricPolicyResponse.class); + Mockito.when(tungstenService.removeTungstenPolicyRule(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(tungstenFabricPolicyResponse); + removeTungstenFabricPolicyRuleCmd.execute(); + Assert.assertEquals(tungstenFabricPolicyResponse, removeTungstenFabricPolicyRuleCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmdTest.java new file mode 100644 index 00000000000..399f80c87c5 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/RemoveTungstenFabricTagCmdTest.java @@ -0,0 +1,73 @@ +// 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.network.tungsten.api.command; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricTagResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; + +public class RemoveTungstenFabricTagCmdTest { + + @Mock + TungstenService tungstenService; + + RemoveTungstenFabricTagCmd removeTungstenFabricTagCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + removeTungstenFabricTagCmd = new RemoveTungstenFabricTagCmd(); + removeTungstenFabricTagCmd.tungstenService = tungstenService; + Whitebox.setInternalState(removeTungstenFabricTagCmd, "zoneId", 1L); + Whitebox.setInternalState(removeTungstenFabricTagCmd, "networkUuids", Arrays.asList("test")); + Whitebox.setInternalState(removeTungstenFabricTagCmd, "vmUuids", Arrays.asList("test")); + Whitebox.setInternalState(removeTungstenFabricTagCmd, "nicUuids", Arrays.asList("test")); + Whitebox.setInternalState(removeTungstenFabricTagCmd, "policyUuid", "test"); + Whitebox.setInternalState(removeTungstenFabricTagCmd, "applicationPolicySetUuid", "test"); + Whitebox.setInternalState(removeTungstenFabricTagCmd, "tagUuid", "test"); + } + + @Test + public void executeTest() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, + ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + TungstenFabricTagResponse tungstenFabricTagResponse = Mockito.mock(TungstenFabricTagResponse.class); + Mockito.when(tungstenService.removeTungstenTag(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyList(), + ArgumentMatchers.anyList(), + ArgumentMatchers.anyList(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyString())).thenReturn(tungstenFabricTagResponse); + removeTungstenFabricTagCmd.execute(); + Assert.assertEquals(tungstenFabricTagResponse, removeTungstenFabricTagCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmdTest.java new file mode 100644 index 00000000000..dfd64770e90 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/SynchronizeTungstenFabricDataCmdTest.java @@ -0,0 +1,59 @@ +// 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.network.tungsten.api.command; + +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(SynchronizeTungstenFabricDataCmd.class) +public class SynchronizeTungstenFabricDataCmdTest { + + @Mock + TungstenService tungstenService; + + SynchronizeTungstenFabricDataCmd synchronizeTungstenFabricDataCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + synchronizeTungstenFabricDataCmd = new SynchronizeTungstenFabricDataCmd(); + synchronizeTungstenFabricDataCmd.tungstenService = tungstenService; + Whitebox.setInternalState(synchronizeTungstenFabricDataCmd, "tungstenProviderId", 1L); + } + + @Test + public void executeTest() throws Exception { + SuccessResponse successResponse = Mockito.mock(SuccessResponse.class); + Mockito.when(tungstenService.synchronizeTungstenData(ArgumentMatchers.anyLong())).thenReturn(true); + PowerMockito.whenNew(SuccessResponse.class).withAnyArguments().thenReturn(successResponse); + synchronizeTungstenFabricDataCmd.execute(); + Assert.assertEquals(successResponse, synchronizeTungstenFabricDataCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmdTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmdTest.java new file mode 100644 index 00000000000..7f0919fccbc --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/api/command/UpdateTungstenFabricLBHealthMonitorCmdTest.java @@ -0,0 +1,114 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.network.tungsten.api.command; + +import com.cloud.dc.DataCenter; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.network.Network; +import com.cloud.network.rules.LoadBalancer; +import com.cloud.utils.db.EntityManager; +import org.apache.cloudstack.network.tungsten.api.response.TungstenFabricLBHealthMonitorResponse; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; +import org.apache.cloudstack.network.tungsten.service.TungstenService; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Optional; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(UpdateTungstenFabricLBHealthMonitorCmd.class) +public class UpdateTungstenFabricLBHealthMonitorCmdTest { + @Mock + EntityManager entityManager; + @Mock + TungstenService tungstenService; + + UpdateTungstenFabricLBHealthMonitorCmd updateTungstenFabricLBHealthMonitorCmd; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + updateTungstenFabricLBHealthMonitorCmd = new UpdateTungstenFabricLBHealthMonitorCmd(); + updateTungstenFabricLBHealthMonitorCmd.tungstenService = tungstenService; + updateTungstenFabricLBHealthMonitorCmd._entityMgr = entityManager; + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "lbId", 1L); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "type", "HTTP"); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "retry", 1); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "timeout", 1); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "interval", 1); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "httpMethod", "GET"); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "expectedCode", "test"); + Whitebox.setInternalState(updateTungstenFabricLBHealthMonitorCmd, "urlPath", "test"); + } + + @Test + public void createTest() throws ResourceAllocationException { + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = + Mockito.mock(TungstenFabricLBHealthMonitorVO.class); + Mockito.when(tungstenService.updateTungstenFabricLBHealthMonitor(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyString(), + ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt(), ArgumentMatchers.anyInt(), + ArgumentMatchers.anyString(), ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).thenReturn(tungstenFabricLBHealthMonitorVO); + updateTungstenFabricLBHealthMonitorCmd.create(); + Assert.assertEquals(Optional.of(tungstenFabricLBHealthMonitorVO.getId()), + Optional.ofNullable(updateTungstenFabricLBHealthMonitorCmd.getEntityId())); + Assert.assertEquals(tungstenFabricLBHealthMonitorVO.getUuid(), + updateTungstenFabricLBHealthMonitorCmd.getEntityUuid()); + } + + @Test + public void executeTest() throws Exception { + updateTungstenFabricLBHealthMonitorCmd.setEntityId(1L); + TungstenFabricLBHealthMonitorResponse tungstenFabricLBHealthMonitorResponse = + Mockito.mock(TungstenFabricLBHealthMonitorResponse.class); + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = + Mockito.mock(TungstenFabricLBHealthMonitorVO.class); + tungstenFabricLBHealthMonitorVO.setType("test"); + Whitebox.setInternalState(tungstenFabricLBHealthMonitorVO, "id", 1L); + Whitebox.setInternalState(tungstenFabricLBHealthMonitorVO, "uuid", "test"); + tungstenFabricLBHealthMonitorVO.setRetry(1); + tungstenFabricLBHealthMonitorVO.setTimeout(1); + tungstenFabricLBHealthMonitorVO.setInterval(1); + tungstenFabricLBHealthMonitorVO.setHttpMethod("test"); + tungstenFabricLBHealthMonitorVO.setExpectedCode("test"); + tungstenFabricLBHealthMonitorVO.setUrlPath("test"); + LoadBalancer loadBalancer = Mockito.mock(LoadBalancer.class); + Network network = Mockito.mock(Network.class); + DataCenter dataCenter = Mockito.mock(DataCenter.class); + + Mockito.when(entityManager.findById(ArgumentMatchers.eq(TungstenFabricLBHealthMonitorVO.class), + ArgumentMatchers.anyLong())).thenReturn(tungstenFabricLBHealthMonitorVO); + Mockito.when(entityManager.findById(ArgumentMatchers.eq(LoadBalancer.class), ArgumentMatchers.anyLong())).thenReturn(loadBalancer); + Mockito.when(entityManager.findById(ArgumentMatchers.eq(Network.class), ArgumentMatchers.anyLong())).thenReturn(network); + Mockito.when(entityManager.findById(ArgumentMatchers.eq(DataCenter.class), ArgumentMatchers.anyLong())).thenReturn(dataCenter); + Mockito.when(tungstenService.applyLBHealthMonitor(ArgumentMatchers.anyLong())).thenReturn(true); + PowerMockito.whenNew(TungstenFabricLBHealthMonitorResponse.class).withAnyArguments().thenReturn(tungstenFabricLBHealthMonitorResponse); + updateTungstenFabricLBHealthMonitorCmd.execute(); + Assert.assertEquals(tungstenFabricLBHealthMonitorResponse, + updateTungstenFabricLBHealthMonitorCmd.getResponseObject()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/resource/TungstenResourceTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/resource/TungstenResourceTest.java new file mode 100644 index 00000000000..bd0b33529a3 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/resource/TungstenResourceTest.java @@ -0,0 +1,1465 @@ +// 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.network.tungsten.resource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +import net.juniper.tungsten.api.ApiObjectBase; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.AddressGroup; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.Domain; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.FirewallRule; +import net.juniper.tungsten.api.types.FloatingIp; +import net.juniper.tungsten.api.types.FloatingIpPool; +import net.juniper.tungsten.api.types.GlobalVrouterConfig; +import net.juniper.tungsten.api.types.InstanceIp; +import net.juniper.tungsten.api.types.Loadbalancer; +import net.juniper.tungsten.api.types.LoadbalancerHealthmonitor; +import net.juniper.tungsten.api.types.LoadbalancerListener; +import net.juniper.tungsten.api.types.LoadbalancerMember; +import net.juniper.tungsten.api.types.LoadbalancerPool; +import net.juniper.tungsten.api.types.LogicalRouter; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.Project; +import net.juniper.tungsten.api.types.SecurityGroup; +import net.juniper.tungsten.api.types.ServiceGroup; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.TagType; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkGatewayToLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenVmToSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenPortForwardingCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AssignTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ClearTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkLoadbalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenVirtualMachineCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenObjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVRouterPortCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmInterfaceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenFabricNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenFloatingIpsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNatIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNetworkDnsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNicCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ReleaseTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkGatewayFromLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenVmFromSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateLoadBalancerServiceInstanceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenDefaultSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerMemberCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenVrouterConfigCommand; +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; +import org.apache.cloudstack.network.tungsten.model.TungstenNetworkPolicy; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.cloudstack.network.tungsten.model.TungstenTag; +import org.apache.cloudstack.network.tungsten.service.TungstenApi; +import org.apache.cloudstack.network.tungsten.service.TungstenVRouterApi; +import org.apache.cloudstack.network.tungsten.vrouter.Port; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.naming.ConfigurationException; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({TungstenVRouterApi.class, TungstenResource.class, TungstenNetworkPolicy.class}) +public class TungstenResourceTest { + @Mock + TungstenApi tungstenApi; + + TungstenResource tungstenResource; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + tungstenResource = new TungstenResource(); + tungstenResource.tungstenApi = tungstenApi; + Whitebox.setInternalState(tungstenResource, "vrouterPort", "9091"); + mockStatic(TungstenVRouterApi.class); + + Project project = mock(Project.class); + when(project.getUuid()).thenReturn("065eab99-b819-4f3f-8e97-99c2ab22e6ed"); + when(tungstenApi.getTungstenProjectByFqn(any())).thenReturn(project); + } + + @Test + public void configureTest() throws ConfigurationException { + Map map = new HashMap<>(); + map.put("name", "testName"); + map.put("guid", "097fe069-5a08-4fc5-a995-5d0f5e3685c6"); + map.put("zoneId", "1"); + map.put("hostname", "host1"); + map.put("port", "8082"); + map.put("vrouterPort", "9091"); + map.put("introspectPort", "8085"); + + assertTrue(tungstenResource.configure("tungsten", map)); + } + + @Test + public void configureFailTest() { + Map map = new HashMap<>(); + assertThrows(ConfigurationException.class, () -> tungstenResource.configure("tungsten", map)); + } + + @Test + public void getCurrentStatusSuccessTest() { + assertNotNull(tungstenResource.getCurrentStatus(1L)); + } + + @Test + public void getCurrentStatusFailTest() { + doThrow(ServerApiException.class).when(tungstenApi).checkTungstenProviderConnection(); + assertNull(tungstenResource.getCurrentStatus(1L)); + } + + @Test + public void executeRequestCreateTungstenNetworkCommandTest() { + TungstenCommand command = new CreateTungstenNetworkCommand("e8281cd6-9078-4db1-9f47-e52f679e03d1", + "testNetworkName", "testNetworkDisplayName", "projectFqn", false, false, "192.168.1.0", 24, "192.168.1.1", + true, "192.168.1.253", "192.168.1.100", "192.168.1.200", false, false, "subnet"); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + when(tungstenApi.createTungstenNetwork(anyString(), anyString(), anyString(), anyString(), anyBoolean(), + anyBoolean(), anyString(), anyInt(), anyString(), anyBoolean(), anyString(), anyString(), anyString(), + anyBoolean(), anyBoolean(), anyString())).thenReturn(virtualNetwork); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(virtualNetwork, answer.getApiObjectBase()); + } + + @Test + public void executeRequestDeleteTungstenNetworkCommandTest() { + TungstenCommand command = new DeleteTungstenNetworkCommand("e8281cd6-9078-4db1-9f47-e52f679e03d1"); + + when(tungstenApi.deleteTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenVmInterfaceCommandTest() { + TungstenCommand command = new DeleteTungstenVmInterfaceCommand("projectFqn", "vmi"); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + + when(tungstenApi.getTungstenObjectByName(eq(VirtualMachineInterface.class), any(), anyString())).thenReturn( + virtualMachineInterface); + when(tungstenApi.deleteTungstenVmInterface(any(VirtualMachineInterface.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenVmCommandTest() { + TungstenCommand command = new DeleteTungstenVmCommand("e8281cd6-9078-4db1-9f47-e52f679e03d1"); + + when(tungstenApi.deleteTungstenObject(eq(VirtualMachine.class), anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenLogicalRouterCommandTest() { + TungstenCommand command = new CreateTungstenLogicalRouterCommand("logicalRouter", "projectFqn", + "e8281cd6-9078-4db1-9f47-e52f679e03d1"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + + when(tungstenApi.createTungstenLogicalRouter(anyString(), anyString(), anyString())).thenReturn(logicalRouter); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(logicalRouter, answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenVirtualMachineCommandTest() { + TungstenCommand command = new CreateTungstenVirtualMachineCommand("projectFqn", + "e8281cd6-9078-4db1-9f47-e52f679e03d1", "5a27fad7-a8ca-4919-bfc3-cad26374b26a", "vmName", + "fe832e34-1bbb-4f0b-9ced-0e7ae2218598", 1L, "192.168.100.1", "fd00::1", "1e:00:d2:00:00:06", "guest", + "guest", "10.1.1.100", "10.1.1.1", true); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + InstanceIp instanceIp = mock(InstanceIp.class); + + when(virtualMachineInterface.getUuid()).thenReturn("b604c7f7-1dbc-42d8-bceb-2c0898034a7a"); + when(tungstenApi.getTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(virtualNetwork); + when(tungstenApi.createTungstenVirtualMachine(anyString(), anyString())).thenReturn(virtualMachine); + when(tungstenApi.createTungstenVmInterface(anyString(), anyString(), anyString(), anyString(), anyString(), + anyString(), anyString(), anyBoolean())).thenReturn(virtualMachineInterface); + when(tungstenApi.createTungstenInstanceIp(anyString(), anyString(), anyString(), anyString())).thenReturn( + instanceIp); + when(TungstenVRouterApi.addTungstenVrouterPort(anyString(), anyString(), any(Port.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(virtualMachine, answer.getApiObjectBase()); + } + + @Test + public void executeRequestSetTungstenNetworkGatewayCommandTest() { + TungstenCommand command = new SetTungstenNetworkGatewayCommand("projectFqn", "router", 1L, + "b604c7f7-1dbc-42d8-bceb-2c0898034a7a", "192.168.1.1"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + InstanceIp instanceIp = mock(InstanceIp.class); + + when(virtualMachineInterface.getUuid()).thenReturn("ac617be6-bf80-4086-9d6a-c05ff78e2264"); + when(tungstenApi.getTungstenObjectByName(eq(LogicalRouter.class), any(), anyString())).thenReturn( + logicalRouter); + when(tungstenApi.createTungstenGatewayVmi(anyString(), anyString(), anyString())).thenReturn( + virtualMachineInterface); + when(tungstenApi.createTungstenInstanceIp(anyString(), anyString(), anyString(), anyString())).thenReturn( + instanceIp); + when(tungstenApi.updateTungstenObject(any(LogicalRouter.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(virtualMachineInterface, answer.getApiObjectBase()); + } + + @Test + public void executeRequestGetTungstenNetworkDnsCommandTest() { + TungstenCommand command = new GetTungstenNetworkDnsCommand("ac617be6-bf80-4086-9d6a-c05ff78e2264", "subnet"); + + when(tungstenApi.getTungstenNetworkDns(anyString(), anyString())).thenReturn("192.168.1.253"); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals("192.168.1.253", answer.getDetails()); + } + + @Test + public void executeRequestGetTungstenPolicyCommandTest() { + TungstenCommand command = new GetTungstenPolicyCommand("projectFqn", "policy"); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + + when(tungstenApi.getTungstenObjectByName(eq(NetworkPolicy.class), any(), anyString())).thenReturn( + networkPolicy); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(networkPolicy, answer.getApiObjectBase()); + } + + @Test + public void executeRequestClearTungstenNetworkGatewayCommandTest() { + TungstenCommand command = new ClearTungstenNetworkGatewayCommand("projectFqn", "router", 1L); + + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + when(tungstenApi.getTungstenObjectByName(eq(LogicalRouter.class), any(), anyString())).thenReturn( + logicalRouter); + when(tungstenApi.deleteTungstenObject(any(LogicalRouter.class))).thenReturn(true); + when(tungstenApi.getTungstenObjectByName(eq(VirtualMachineInterface.class), any(), anyString())).thenReturn( + virtualMachineInterface); + when(tungstenApi.deleteTungstenVmInterface(any(VirtualMachineInterface.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenFloatingIpPoolCommandTest() { + TungstenCommand command = new CreateTungstenFloatingIpPoolCommand("ac617be6-bf80-4086-9d6a-c05ff78e2264", + "fip"); + FloatingIpPool floatingIpPool = mock(FloatingIpPool.class); + + when(tungstenApi.createTungstenFloatingIpPool(anyString(), anyString())).thenReturn(floatingIpPool); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(floatingIpPool, answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenFloatingIpCommandTest() { + TungstenCommand command = new CreateTungstenFloatingIpCommand("projectFqn", + "ac617be6-bf80-4086-9d6a-c05ff78e2264", "fip", "fi", "192.168.1.100"); + FloatingIp floatingIp = mock(FloatingIp.class); + + when(tungstenApi.createTungstenFloatingIp(anyString(), anyString(), anyString(), anyString(), + anyString())).thenReturn(floatingIp); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(floatingIp, answer.getApiObjectBase()); + } + + @Test + public void executeRequestAssignTungstenFloatingIpCommandTest() { + TungstenCommand command = new AssignTungstenFloatingIpCommand("b604c7f7-1dbc-42d8-bceb-2c0898034a7a", + "ac617be6-bf80-4086-9d6a-c05ff78e2264", "fip", "fi", "192.168.1.100"); + + when(tungstenApi.assignTungstenFloatingIp(anyString(), anyString(), anyString(), anyString(), + anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + + } + + @Test + public void executeRequestReleaseTungstenFloatingIpCommandTest() { + TungstenCommand command = new ReleaseTungstenFloatingIpCommand("b604c7f7-1dbc-42d8-bceb-2c0898034a7a", "fip", + "fi"); + + when(tungstenApi.releaseTungstenFloatingIp(anyString(), anyString(), anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestGetTungstenNatIpCommandTest() { + TungstenCommand command = new GetTungstenNatIpCommand("projectFqn", "b604c7f7-1dbc-42d8-bceb-2c0898034a7a"); + + when(tungstenApi.getTungstenNatIp(anyString(), anyString())).thenReturn("192.168.100.100"); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals("192.168.100.100", answer.getDetails()); + } + + @Test + public void executeRequestDeleteTungstenVRouterPortCommandTest() { + TungstenCommand command = new DeleteTungstenVRouterPortCommand("10.0.0.10", + "b604c7f7-1dbc-42d8-bceb-2c0898034a7a"); + + when(TungstenVRouterApi.deleteTungstenVrouterPort(anyString(), anyString(), anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenFloatingIpCommandTest() { + TungstenCommand command = new DeleteTungstenFloatingIpCommand("b604c7f7-1dbc-42d8-bceb-2c0898034a7a", "fip", + "fi"); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + FloatingIpPool floatingIpPool = mock(FloatingIpPool.class); + FloatingIp floatingIp = mock(FloatingIp.class); + + when(tungstenApi.getTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(virtualNetwork); + when(tungstenApi.getTungstenObjectByName(eq(FloatingIpPool.class), any(), anyString())).thenReturn( + floatingIpPool); + when(tungstenApi.getTungstenObjectByName(eq(FloatingIp.class), any(), anyString())).thenReturn(floatingIp); + when(tungstenApi.deleteTungstenObject(any(FloatingIp.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenFloatingIpPoolCommandTest() { + TungstenCommand command = new DeleteTungstenFloatingIpPoolCommand("b604c7f7-1dbc-42d8-bceb-2c0898034a7a", + "fip"); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + FloatingIpPool floatingIpPool = mock(FloatingIpPool.class); + + when(tungstenApi.getTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(virtualNetwork); + when(tungstenApi.getTungstenObjectByName(eq(FloatingIpPool.class), any(), anyString())).thenReturn( + floatingIpPool); + when(tungstenApi.deleteTungstenObject(any(FloatingIpPool.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenNetworkPolicyCommandest() { + TungstenRule tungstenRule = mock(TungstenRule.class); + List tungstenRuleList = List.of(tungstenRule); + TungstenCommand command = new CreateTungstenNetworkPolicyCommand("policy", "projectFqn", tungstenRuleList); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + + when(tungstenApi.createOrUpdateTungstenNetworkPolicy(anyString(), anyString(), eq(tungstenRuleList))).thenReturn(networkPolicy); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(networkPolicy, answer.getApiObjectBase()); + } + + @Test + public void executeRequestDeleteTungstenNetworkPolicyCommandTest() { + TungstenCommand command = new DeleteTungstenNetworkPolicyCommand("policy", "projectFqn", + "b604c7f7-1dbc-42d8-bceb-2c0898034a7a"); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + + when(tungstenApi.getTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(virtualNetwork); + when(tungstenApi.getTungstenObjectByName(eq(NetworkPolicy.class), any(), anyString())).thenReturn( + networkPolicy); + when(tungstenApi.updateTungstenObject(any(VirtualNetwork.class))).thenReturn(true); + when(tungstenApi.deleteTungstenObject(any(NetworkPolicy.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestGetTungstenFloatingIpsCommandTest() { + TungstenCommand command = new GetTungstenFloatingIpsCommand("b604c7f7-1dbc-42d8-bceb-2c0898034a7a", "fip"); + FloatingIp floatingIp1 = mock(FloatingIp.class); + FloatingIp floatingIp2 = mock(FloatingIp.class); + List floatingIpList = Arrays.asList(floatingIp1, floatingIp2); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + FloatingIpPool floatingIpPool = mock(FloatingIpPool.class); + + when(tungstenApi.getTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(virtualNetwork); + when(tungstenApi.getTungstenObjectByName(eq(FloatingIpPool.class), any(), anyString())).thenReturn( + floatingIpPool); + doReturn(floatingIpList).when(tungstenApi) + .getTungstenListObject(eq(FloatingIp.class), any(FloatingIpPool.class), any()); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(floatingIpList, answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestApplyTungstenNetworkPolicyCommandTest() throws Exception { + TungstenCommand command = new ApplyTungstenNetworkPolicyCommand("projectFqn", "policy", + "b604c7f7-1dbc-42d8-bceb-2c0898034a7a", 1, 1); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworkList = Arrays.asList(virtualNetwork1, virtualNetwork2); + TungstenNetworkPolicy tungstenNetworkPolicy = mock(TungstenNetworkPolicy.class); + + whenNew(TungstenNetworkPolicy.class).withArguments(networkPolicy, virtualNetworkList) + .thenReturn(tungstenNetworkPolicy); + when(networkPolicy.getUuid()).thenReturn("ac617be6-bf80-4086-9d6a-c05ff78e2264"); + when(tungstenApi.getTungstenObjectByName(eq(NetworkPolicy.class), any(), anyString())).thenReturn( + networkPolicy); + when(tungstenApi.applyTungstenNetworkPolicy(anyString(), anyString(), anyInt(), anyInt())).thenReturn( + networkPolicy); + doReturn(virtualNetworkList).when(tungstenApi).getNetworksFromNetworkPolicy(any(NetworkPolicy.class)); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(tungstenNetworkPolicy, answer.getTungstenModel()); + } + + @Test + public void executeRequestGetTungstenFabricNetworkCommand() { + TungstenCommand command = new GetTungstenFabricNetworkCommand(); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + + when(tungstenApi.getTungstenFabricNetwork()).thenReturn(virtualNetwork); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(virtualNetwork, answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenDomainCommandTest() { + TungstenCommand command = new CreateTungstenDomainCommand("domainName", "ac617be6-bf80-4086-9d6a-c05ff78e2264"); + Domain domain = mock(Domain.class); + + when(tungstenApi.createTungstenDomain(anyString(), anyString())).thenReturn(domain); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(domain, answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenProjectCommandTest() { + TungstenCommand command = new CreateTungstenProjectCommand("projectName", + "ac617be6-bf80-4086-9d6a-c05ff78e2264", "d069ad89-b4d0-43fb-b75f-179ab3bfb03c", "domainName"); + Project project = mock(Project.class); + + when(tungstenApi.createTungstenProject(anyString(), anyString(), anyString(), anyString())).thenReturn(project); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(project, answer.getApiObjectBase()); + } + + @Test + public void executeRequestDeleteTungstenDomainCommandTest() { + TungstenCommand command = new DeleteTungstenDomainCommand("ac617be6-bf80-4086-9d6a-c05ff78e2264"); + + when(tungstenApi.deleteTungstenDomain(anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenProjectCommandTest() { + TungstenCommand command = new DeleteTungstenProjectCommand("ac617be6-bf80-4086-9d6a-c05ff78e2264"); + + when(tungstenApi.deleteTungstenProject(anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenNetworkLoadbalancerCommandTest() { + TungstenLoadBalancerMember tungstenMember1 = new TungstenLoadBalancerMember("member1", "192.168.100.100", 80, + 1); + TungstenLoadBalancerMember tungstenMember2 = new TungstenLoadBalancerMember("member2", "192.168.100.101", 80, + 2); + List tungstenLoadBalancerMemberList = Arrays.asList(tungstenMember1, + tungstenMember2); + TungstenCommand command = new CreateTungstenNetworkLoadbalancerCommand("projectFqn", + "d4e2fc35-085c-4c8a-b08b-4cd237c75704", "c33e7145-865c-490b-8099-5a0efbab7467", "ROUND_ROBIN", "lbName", + "lbListenerName", "lbPoolName", "lbHealthMonitorName", "lbVmiName", "lbIiName", 1L, + tungstenLoadBalancerMemberList, "tcp", 80, 80, "192.168.1.100", "fipName", "fiName", "PING", 3, 5, 5, "GET", + "/url", "200"); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + FloatingIpPool floatingIpPool = mock(FloatingIpPool.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + InstanceIp instanceIp = mock(InstanceIp.class); + Loadbalancer loadbalancer = mock(Loadbalancer.class); + LoadbalancerListener loadbalancerListener = mock(LoadbalancerListener.class); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = mock(LoadbalancerHealthmonitor.class); + LoadbalancerPool loadbalancerPool = mock(LoadbalancerPool.class); + LoadbalancerMember member1 = mock(LoadbalancerMember.class); + LoadbalancerMember member2 = mock(LoadbalancerMember.class); + + when(virtualNetwork.getUuid()).thenReturn("ac617be6-bf80-4086-9d6a-c05ff78e2264"); + when(virtualMachineInterface.getUuid()).thenReturn("d069ad89-b4d0-43fb-b75f-179ab3bfb03c"); + when(loadbalancer.getUuid()).thenReturn("387cf015-44f7-48fa-bd6b-d2e3e14361de"); + when(loadbalancerHealthmonitor.getUuid()).thenReturn("f6517b1a-773c-46a2-ae50-e8b32d5023a1"); + when(loadbalancerListener.getUuid()).thenReturn("c877d37a-9ad4-4188-a09a-fb13f57f9be0"); + when(loadbalancerPool.getUuid()).thenReturn("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4"); + when(tungstenApi.getTungstenObject(eq(VirtualNetwork.class), anyString())).thenReturn(virtualNetwork); + when(tungstenApi.getTungstenObjectByName(eq(FloatingIpPool.class), any(), anyString())).thenReturn( + floatingIpPool); + when(tungstenApi.getSubnetUuid(anyString())).thenReturn("b604c7f7-1dbc-42d8-bceb-2c0898034a7a"); + when(tungstenApi.createTungstenLbVmi(anyString(), anyString(), anyString())).thenReturn( + virtualMachineInterface); + when(tungstenApi.createTungstenInstanceIp(anyString(), anyString(), anyString(), anyString(), + anyString())).thenReturn(instanceIp); + when(tungstenApi.assignTungstenFloatingIp(anyString(), anyString(), anyString(), anyString(), + anyString())).thenReturn(true); + when(tungstenApi.createTungstenLoadbalancer(anyString(), anyString(), anyString(), anyString(), + anyString())).thenReturn(loadbalancer); + when(tungstenApi.createTungstenLoadbalancerListener(anyString(), anyString(), anyString(), anyString(), + anyInt())).thenReturn(loadbalancerListener); + when(tungstenApi.createTungstenLoadbalancerHealthMonitor(anyString(), anyString(), anyString(), anyInt(), + anyInt(), anyInt(), anyString(), anyString(), anyString())).thenReturn(loadbalancerHealthmonitor); + when(tungstenApi.createTungstenLoadbalancerPool(anyString(), anyString(), anyString(), anyString(), anyString(), + anyString())).thenReturn(loadbalancerPool); + when(tungstenApi.createTungstenLoadbalancerMember(anyString(), anyString(), anyString(), anyString(), anyInt(), + anyInt())).thenReturn(member1).thenReturn(member2); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(loadbalancer, answer.getApiObjectBase()); + } + + @Test + public void executeRequestUpdateLoadBalancerServiceInstanceCommandTest() { + TungstenCommand command = new UpdateLoadBalancerServiceInstanceCommand("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "fipName", "fiName"); + + when(tungstenApi.updateLBServiceInstanceFatFlow(anyString(), anyString(), anyString())).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenLoadBalancerCommandTest() { + TungstenCommand command = new DeleteTungstenLoadBalancerCommand("projectFqn", + "d4e2fc35-085c-4c8a-b08b-4cd237c75704", "lbName", "lbHealthName", "lbVmiName", "fipName", "fiName"); + Loadbalancer loadbalancer = mock(Loadbalancer.class); + LoadbalancerListener loadbalancerListener = mock(LoadbalancerListener.class); + LoadbalancerPool loadbalancerPool = mock(LoadbalancerPool.class); + LoadbalancerMember loadbalancerMember1 = mock(LoadbalancerMember.class); + LoadbalancerMember loadbalancerMember2 = mock(LoadbalancerMember.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + ObjectReference listerner = mock(ObjectReference.class); + ObjectReference pool = mock(ObjectReference.class); + ObjectReference member1 = mock(ObjectReference.class); + ObjectReference member2 = mock(ObjectReference.class); + + when(listerner.getUuid()).thenReturn("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4"); + when(pool.getUuid()).thenReturn("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe"); + when(member1.getUuid()).thenReturn("7d5575eb-d029-467e-8b78-6056a8c94a71"); + when(member2.getUuid()).thenReturn("88729834-3ebd-413a-adf9-40aff73cf638"); + when(loadbalancer.getLoadbalancerListenerBackRefs()).thenReturn(List.of(listerner)); + when(loadbalancerListener.getLoadbalancerPoolBackRefs()).thenReturn(List.of(pool)); + when(loadbalancerPool.getLoadbalancerMembers()).thenReturn(Arrays.asList(member1, member2)); + when(tungstenApi.getTungstenObjectByName(eq(Loadbalancer.class), any(), anyString())).thenReturn(loadbalancer); + when(tungstenApi.getTungstenObjectByName(eq(VirtualMachineInterface.class), any(), anyString())).thenReturn( + virtualMachineInterface); + when(tungstenApi.getTungstenObject(eq(LoadbalancerListener.class), anyString())).thenReturn( + loadbalancerListener); + when(tungstenApi.getTungstenObject(eq(LoadbalancerPool.class), anyString())).thenReturn(loadbalancerPool); + when(tungstenApi.getTungstenObject(eq(LoadbalancerMember.class), anyString())).thenReturn(loadbalancerMember1) + .thenReturn(loadbalancerMember2); + when(tungstenApi.deleteTungstenObject(any())).thenReturn(true); + when(tungstenApi.releaseTungstenFloatingIp(anyString(), anyString(), anyString())).thenReturn(true); + when(tungstenApi.deleteTungstenVmInterface(any(VirtualMachineInterface.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenLoadBalancerListenerCommandTest() { + TungstenCommand command = new DeleteTungstenLoadBalancerListenerCommand("projectFqn", "lbListenerName"); + LoadbalancerListener loadbalancerListener = mock(LoadbalancerListener.class); + + when(tungstenApi.getTungstenObjectByName(eq(LoadbalancerListener.class), any(), anyString())).thenReturn( + loadbalancerListener); + when(tungstenApi.deleteTungstenObject(any(LoadbalancerListener.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestUpdateTungstenLoadBalancerPoolCommandTest() { + TungstenCommand command = new UpdateTungstenLoadBalancerPoolCommand("projectFqn", "lbPoolName", "lbMethod", + "lbSessionPersistence", "lbPersistenceCookieName", "lbProtocol", true, + "lbStatsPort", "lbStatsUri", "lbStatsAuth"); + when(tungstenApi.updateLoadBalancerPool(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), + anyBoolean(), anyString(), anyString(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestUpdateTungstenLoadBalancerListenerCommandTest() { + TungstenCommand command = new UpdateTungstenLoadBalancerListenerCommand("projectFqn", "listenerName", "tcp", + 80, "url"); + when(tungstenApi.updateLoadBalancerListener(anyString(), anyString(), anyString(), anyInt(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestUpdateTungstenLoadBalancerMemberCommandTest() { + TungstenCommand command = new UpdateTungstenLoadBalancerMemberCommand("projectFqn", "e8281cd6-9078-4db1-9f47-e52f679e03d1", + "lbPoolName", new ArrayList<>()); + when(tungstenApi.getSubnetUuid(anyString())).thenReturn("4185e240-0fcd-11ec-82a8-0242ac130003"); + when(tungstenApi.updateLoadBalancerMember(anyString(), anyString(), anyList(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestGetTungstenLoadBalancerCommandTest() { + TungstenCommand command = new GetTungstenLoadBalancerCommand("projectFqn", "lbName"); + Loadbalancer loadbalancer = mock(Loadbalancer.class); + when(tungstenApi.getTungstenObjectByName(eq(Loadbalancer.class), anyList(), anyString())).thenReturn(loadbalancer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(loadbalancer, answer.getApiObjectBase()); + } + + @Test + public void executeRequestApplyTungstenPortForwardingCommandTest() { + TungstenCommand command = new ApplyTungstenPortForwardingCommand(true, "d4e2fc35-085c-4c8a-b08b-4cd237c75704", + "floatingIpPoolName", "floatingIpName", "ac617be6-bf80-4086-9d6a-c05ff78e2264", + "tcp", 80, 85); + when(tungstenApi.applyTungstenPortForwarding(anyBoolean(), anyString(), anyString(), anyString(), anyString(), anyString(), + anyInt(), anyInt())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenObjectCommandTest() { + ApiObjectBase apiObjectBase = mock(ApiObjectBase.class); + TungstenCommand command = new DeleteTungstenObjectCommand(apiObjectBase); + when(tungstenApi.deleteTungstenObject(any(ApiObjectBase.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestAddTungstenNetworkSubnetCommandTest() { + TungstenCommand command = new AddTungstenNetworkSubnetCommand("7ea93dd0-0fd1-11ec-82a8-0242ac130003", "10.0.0.0", + 24, "10.0.0.1",true, "10.0.0.253", "10.0.0.2", "10.0.0.100", + true, "subnetName"); + when(tungstenApi.addTungstenNetworkSubnetCommand(anyString(), anyString(), anyInt(), anyString(), anyBoolean(), anyString(), anyString(), + anyString(), anyBoolean(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestRemoveTungstenNetworkSubnetCommandTest() { + TungstenCommand command = new RemoveTungstenNetworkSubnetCommand("7ea93dd0-0fd1-11ec-82a8-0242ac130003", "subnetName"); + when(tungstenApi.removeTungstenNetworkSubnetCommand(anyString(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenSecurityGroupCommandTest() { + SecurityGroup securityGroup = mock(SecurityGroup.class); + TungstenCommand command = new CreateTungstenSecurityGroupCommand("004a8524-0fd2-11ec-82a8-0242ac130003", + "securityGroupName", "securityGroupDescription", "projectFqn"); + when(tungstenApi.createTungstenSecurityGroup(anyString(), anyString(), anyString(), anyString())).thenReturn(securityGroup); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(securityGroup, answer.getApiObjectBase()); + } + + @Test + public void executeRequestDeleteTungstenSecurityGroupCommandTest() { + TungstenCommand command = new DeleteTungstenSecurityGroupCommand("004a8524-0fd2-11ec-82a8-0242ac130003"); + when(tungstenApi.deleteTungstenObject(eq(SecurityGroup.class), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestGetTungstenSecurityGroupCommandTest() { + SecurityGroup securityGroup = mock(SecurityGroup.class); + TungstenCommand command = new GetTungstenSecurityGroupCommand("004a8524-0fd2-11ec-82a8-0242ac130003"); + when(tungstenApi.getTungstenObject(eq(SecurityGroup.class), anyString())).thenReturn(securityGroup); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertEquals(securityGroup, answer.getApiObjectBase()); + } + + @Test + public void executeRequestAddTungstenSecurityGroupRuleCommandTest() { + TungstenCommand command = new AddTungstenSecurityGroupRuleCommand("169486d0-0fd3-11ec-82a8-0242ac130003", + "1ca20eee-0fd3-11ec-82a8-0242ac130003", "securityGroupRuleType", 80, 90, + "target", "etherType", "tcp"); + when(tungstenApi.addTungstenSecurityGroupRule(anyString(), anyString(), anyString(), anyInt(), anyInt(), anyString(), + anyString(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestAddTungstenVmToSecurityGroupCommandTest() { + List securityGroupUuidList = Arrays.asList("1ca20eee-0fd3-11ec-82a8-0242ac130003", "a38200a2-0fd5-11ec-82a8-0242ac130003"); + TungstenCommand command = new AddTungstenVmToSecurityGroupCommand("1ca20eee-0fd3-11ec-82a8-0242ac130003", securityGroupUuidList); + when(tungstenApi.addInstanceToSecurityGroup(anyString(), eq(securityGroupUuidList))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestRemoveTungstenVmFromSecurityGroupCommandTest() { + List securityGroupUuidList = Arrays.asList("1ca20eee-0fd3-11ec-82a8-0242ac130003", "a38200a2-0fd5-11ec-82a8-0242ac130003"); + TungstenCommand command = new RemoveTungstenVmFromSecurityGroupCommand("a38200a2-0fd5-11ec-82a8-0242ac130003", securityGroupUuidList); + when(tungstenApi.removeInstanceFromSecurityGroup(anyString(), eq(securityGroupUuidList))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestRemoveTungstenSecurityGroupRuleCommandTest() { + TungstenCommand command = new RemoveTungstenSecurityGroupRuleCommand("63906a00-0fd6-11ec-82a8-0242ac130003", + "6dd5ff84-0fd6-11ec-82a8-0242ac130003"); + when(tungstenApi.removeTungstenSecurityGroupRule(anyString(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestAddTungstenSecondaryIpAddressCommandTest() { + TungstenCommand command = new AddTungstenSecondaryIpAddressCommand("15266358-0fd9-11ec-82a8-0242ac130003", + "1ba019e0-0fd9-11ec-82a8-0242ac130003", "iiName", "address"); + when(tungstenApi.addSecondaryIpAddress(anyString(), anyString(), anyString(), anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestRemoveTungstenSecondaryIpAddressCommandTest() { + TungstenCommand command = new RemoveTungstenSecondaryIpAddressCommand("iiName"); + when(tungstenApi.removeSecondaryIpAddress(anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenPolicyCommandTest() { + TungstenCommand command = new CreateTungstenPolicyCommand("name", "projectFqn"); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworks = Arrays.asList(virtualNetwork1, virtualNetwork2); + when(tungstenApi.createTungstenPolicy(anyString(), anyString(), anyString())).thenReturn(new NetworkPolicy()); + when(tungstenApi.getNetworksFromNetworkPolicy(any(NetworkPolicy.class))).thenReturn(virtualNetworks); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestAddTungstenPolicyRuleCommandTest() { + TungstenCommand command = new AddTungstenPolicyRuleCommand("bae19252-0fe0-11ec-82a8-0242ac130003", "pass", "<>", + "tcp", "srcNetwork", "10.0.0.0", 24, 80, 90, "destNetwork", + "10.1.0.0", 24, 80, 90); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + when(tungstenApi.addTungstenPolicyRule(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), + anyInt(), anyInt(), anyInt(), anyString(), anyString(), anyInt(), anyInt(), anyInt())).thenReturn(networkPolicy); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestRemoveTungstenPolicyRuleCommandTest() { + TungstenCommand command = new RemoveTungstenPolicyRuleCommand("accdbdc0-0fe1-11ec-82a8-0242ac130003", + "b1e71054-0fe1-11ec-82a8-0242ac130003"); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworks = Arrays.asList(virtualNetwork1, virtualNetwork2); + when(tungstenApi.removeTungstenNetworkPolicyRule(anyString(), anyString())).thenReturn(new NetworkPolicy()); + when(tungstenApi.getNetworksFromNetworkPolicy(any(NetworkPolicy.class))).thenReturn(virtualNetworks); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenPolicyCommandTest() { + TungstenCommand command = new DeleteTungstenPolicyCommand("accdbdc0-0fe1-11ec-82a8-0242ac130003"); + when(tungstenApi.getTungstenObject(eq(NetworkPolicy.class), anyString())).thenReturn(new NetworkPolicy()); + when(tungstenApi.deleteTungstenObject(any(ApiObjectBase.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestListTungstenPolicyCommandTest() { + TungstenCommand command = new ListTungstenPolicyCommand("projectFqn", "2e51abf8-1097-11ec-82a8-0242ac130003", + null, null); + NetworkPolicy networkPolicy1 = mock(NetworkPolicy.class); + NetworkPolicy networkPolicy2 = mock(NetworkPolicy.class); + Answer> networkPoliciesAnswer = setupApiObjectBaseListAnswer(networkPolicy1, networkPolicy2); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworks = Arrays.asList(virtualNetwork1, virtualNetwork2); + when(tungstenApi.listTungstenNetworkPolicy(anyString(), anyString())).thenAnswer(networkPoliciesAnswer); + when(tungstenApi.getNetworksFromNetworkPolicy(any(NetworkPolicy.class))).thenReturn(virtualNetworks); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModelList()); + } + + @Test + public void executeRequestListTungstenPolicyRuleCommandTest() { + TungstenCommand command = new ListTungstenPolicyRuleCommand("accdbdc0-0fe1-11ec-82a8-0242ac130003"); + when(tungstenApi.getTungstenObject(eq(NetworkPolicy.class), anyString())).thenReturn(new NetworkPolicy()); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestListTungstenNetworkCommandTest() { + TungstenCommand command = new ListTungstenNetworkCommand("projectFqn", "2e51abf8-1097-11ec-82a8-0242ac130003"); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + Answer> virtualNetworksAnswer = setupApiObjectBaseListAnswer(virtualNetwork1, virtualNetwork2); + when(tungstenApi.listTungstenNetwork(anyString(), anyString())).thenAnswer(virtualNetworksAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestListTungstenVmCommandTest() { + TungstenCommand command = new ListTungstenVmCommand("projectFqn", "ca86c658-1096-11ec-82a8-0242ac130003"); + VirtualMachine virtualMachine1 = mock(VirtualMachine.class); + VirtualMachine virtualMachine2 = mock(VirtualMachine.class); + Answer> virtualMachinesAnswer = setupApiObjectBaseListAnswer(virtualMachine1, virtualMachine2); + when(tungstenApi.listTungstenVm(anyString(), anyString())).thenAnswer(virtualMachinesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestListTungstenNicCommandTest() { + TungstenCommand command = new ListTungstenNicCommand("projectFqn", "5b3ffba2-1096-11ec-82a8-0242ac130003"); + VirtualMachineInterface virtualMachineInterface1 = mock(VirtualMachineInterface.class); + VirtualMachineInterface virtualMachineInterface2 = mock(VirtualMachineInterface.class); + Answer> virtualMachineInterfacesAnswer = setupApiObjectBaseListAnswer(virtualMachineInterface1, virtualMachineInterface2); + when(tungstenApi.listTungstenNic(anyString(), anyString())).thenAnswer(virtualMachineInterfacesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenTagCommandTest() { + TungstenCommand command = new CreateTungstenTagCommand("tagType", "tagValue"); + Tag tag = mock(Tag.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + Answer> virtualNetworksAnswer = setupApiObjectBaseListAnswer(virtualNetwork1, virtualNetwork2); + VirtualMachine virtualMachine1 = mock(VirtualMachine.class); + VirtualMachine virtualMachine2 = mock(VirtualMachine.class); + Answer> virtualMachinesAnswer = setupApiObjectBaseListAnswer(virtualMachine1, virtualMachine2); + VirtualMachineInterface virtualMachineInterface1 = mock(VirtualMachineInterface.class); + VirtualMachineInterface virtualMachineInterface2 = mock(VirtualMachineInterface.class); + Answer> virtualMachineInterfacesAnswer = setupApiObjectBaseListAnswer(virtualMachineInterface1, virtualMachineInterface2); + NetworkPolicy networkPolicy1 = mock(NetworkPolicy.class); + NetworkPolicy networkPolicy2 = mock(NetworkPolicy.class); + Answer> networkPoliciesAnswer = setupApiObjectBaseListAnswer(networkPolicy1, networkPolicy2); + when(tungstenApi.createTungstenTag(anyString(), anyString(), anyString(), any())).thenReturn(tag); + when(tungstenApi.getBackRefFromVirtualNetwork(eq(VirtualNetwork.class), anyList())).thenAnswer(virtualNetworksAnswer); + when(tungstenApi.getBackRefFromVirtualMachine(eq(VirtualMachine.class), anyList())).thenAnswer(virtualMachinesAnswer); + when(tungstenApi.getBackRefFromVirtualMachineInterface(eq(VirtualMachineInterface.class), anyList())).thenAnswer(virtualMachineInterfacesAnswer); + when(tungstenApi.getBackRefFromNetworkPolicy(eq(NetworkPolicy.class), anyList())).thenAnswer(networkPoliciesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestCreateTungstenTagTypeCommandTest() { + TungstenCommand command = new CreateTungstenTagTypeCommand("TungstenTagTypeName"); + TagType tagType = mock(TagType.class); + when(tungstenApi.createTungstenTagType(anyString(), anyString())).thenReturn(tagType); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestDeleteTungstenTagCommandTest() { + TungstenCommand command = new DeleteTungstenTagCommand("2e51abf8-1097-11ec-82a8-0242ac130003"); + Tag tag = mock(Tag.class); + when(tungstenApi.getTungstenObject(eq(Tag.class), anyString())).thenReturn(tag); + when(tungstenApi.deleteTungstenObject(any(Tag.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenTagTypeCommandTest() { + TungstenCommand command = new DeleteTungstenTagTypeCommand("22f28f5a-1099-11ec-82a8-0242ac130003"); + TagType tagType = mock(TagType.class); + when(tungstenApi.getTungstenObject(eq(TagType.class), anyString())).thenReturn(tagType); + when(tungstenApi.deleteTungstenObject(any(TagType.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestListTungstenTagCommandTest() { + TungstenCommand command = new ListTungstenTagCommand("948f421c-edde-4518-a391-09299cc25dc2", + "8b4637b6-5629-46de-8fb2-d0b0502bfa85", "8d097a79-a38d-4db4-8a41-16f15d9c5afa", + "a329662e-1805-4a89-9b05-2b818ea35978", "d5e3f5c5-97ed-41b6-9b6f-7f696b9eddeb" + , "92e989bb-325e-4c16-9d32-ad89166feeab"); + Tag tag = mock(Tag.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + doReturn(List.of(tag)).when(tungstenApi).listTungstenTag(anyString(), anyString(), anyString(), anyString(), anyString(), anyString()); + doReturn(List.of(virtualNetwork)).when(tungstenApi).getBackRefFromVirtualNetwork(eq(VirtualNetwork.class), anyList()); + doReturn(List.of(virtualMachine)).when(tungstenApi).getBackRefFromVirtualMachine(eq(VirtualMachine.class), anyList()); + doReturn(List.of(virtualMachineInterface)).when(tungstenApi).getBackRefFromVirtualMachineInterface(eq(VirtualMachineInterface.class), anyList()); + doReturn(List.of(networkPolicy)).when(tungstenApi).getBackRefFromNetworkPolicy(eq(NetworkPolicy.class), anyList()); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + TungstenTag tungstenTag = (TungstenTag) answer.getTungstenModelList().get(0); + assertEquals(virtualNetwork, tungstenTag.getVirtualNetworkList().get(0)); + assertEquals(virtualMachine, tungstenTag.getVirtualMachineList().get(0)); + assertEquals(virtualMachineInterface, tungstenTag.getVirtualMachineInterfaceList().get(0)); + assertEquals(networkPolicy, tungstenTag.getNetworkPolicyList().get(0)); + } + + @Test + public void executeRequestListTungstenTagTypeCommandTest() { + TungstenCommand command = new ListTungstenTagTypeCommand("22f28f5a-1099-11ec-82a8-0242ac130003"); + TagType tagType1 = mock(TagType.class); + TagType tagType2 = mock(TagType.class); + Answer> tagTypesAnswer = setupApiObjectBaseListAnswer(tagType1, tagType2); + when(tungstenApi.listTungstenTagType(anyString())).thenAnswer(tagTypesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestApplyTungstenTagCommandTest() { + TungstenCommand command = new ApplyTungstenTagCommand(null, null, null, "22f28f5a-1099-11ec-82a8-0242ac130003", + null, "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652"); + Tag tag = mock(Tag.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + Answer> virtualNetworksAnswer = setupApiObjectBaseListAnswer(virtualNetwork1, virtualNetwork2); + VirtualMachine virtualMachine1 = mock(VirtualMachine.class); + VirtualMachine virtualMachine2 = mock(VirtualMachine.class); + Answer> virtualMachinesAnswer = setupApiObjectBaseListAnswer(virtualMachine1, virtualMachine2); + VirtualMachineInterface virtualMachineInterface1 = mock(VirtualMachineInterface.class); + VirtualMachineInterface virtualMachineInterface2 = mock(VirtualMachineInterface.class); + Answer> virtualMachineInterfacesAnswer = setupApiObjectBaseListAnswer(virtualMachineInterface1, virtualMachineInterface2); + NetworkPolicy networkPolicy1 = mock(NetworkPolicy.class); + NetworkPolicy networkPolicy2 = mock(NetworkPolicy.class); + Answer> networkPoliciesAnswer = setupApiObjectBaseListAnswer(networkPolicy1, networkPolicy2); + ApplicationPolicySet applicationPolicySet1 = mock(ApplicationPolicySet.class); + ApplicationPolicySet applicationPolicySet2 = mock(ApplicationPolicySet.class); + Answer> applicationPoliciesAnswer = setupApiObjectBaseListAnswer(applicationPolicySet1, applicationPolicySet2); + when(tungstenApi.applyTungstenPolicyTag(anyString(), anyString())).thenReturn(true); + when(tungstenApi.getTungstenObject(eq(Tag.class), anyString())).thenReturn(tag); + when(tungstenApi.getBackRefFromVirtualNetwork(eq(VirtualNetwork.class), anyList())).thenAnswer(virtualNetworksAnswer); + when(tungstenApi.getBackRefFromVirtualMachine(eq(VirtualMachine.class), anyList())).thenAnswer(virtualMachinesAnswer); + when(tungstenApi.getBackRefFromVirtualMachineInterface(eq(VirtualMachineInterface.class), anyList())).thenAnswer(virtualMachineInterfacesAnswer); + when(tungstenApi.getBackRefFromNetworkPolicy(eq(NetworkPolicy.class), anyList())).thenAnswer(networkPoliciesAnswer); + when(tungstenApi.getBackRefFromApplicationPolicySet(eq(ApplicationPolicySet.class), anyList())).thenAnswer(applicationPoliciesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestRemoveTungstenPolicyCommandTest() { + TungstenCommand command = new RemoveTungstenPolicyCommand("c8ed82ea-10a1-11ec-82a8-0242ac130003", + "caa4d57a-10a6-11ec-82a8-0242ac130003"); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworks = Arrays.asList(virtualNetwork1, virtualNetwork2); + when(tungstenApi.removeTungstenPolicy(anyString(), anyString())).thenReturn(networkPolicy); + when(tungstenApi.getNetworksFromNetworkPolicy(any(NetworkPolicy.class))).thenReturn(virtualNetworks); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestRemoveTungstenTagCommandTest() { + List networkUuids = Arrays.asList("91d32b4a-10a9-11ec-82a8-0242ac130003", "97007956-10a9-11ec-82a8-0242ac130003"); + List vmUuids = List.of("a2f226ba-10a9-11ec-82a8-0242ac130003"); + List nicUuids = Arrays.asList("af6478e4-10a9-11ec-82a8-0242ac130003", "b30ff54a-10a9-11ec-82a8-0242ac130003"); + TungstenCommand command = new RemoveTungstenTagCommand(networkUuids, vmUuids, nicUuids, + "c8ed82ea-10a1-11ec-82a8-0242ac130003", "41c2e4a8-1553-4cbb-9d68-0c1173e18c7b", + "caa4d57a-10a6-11ec-82a8-0242ac130003"); + Tag tag = mock(Tag.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + Answer> virtualNetworksAnswer = setupApiObjectBaseListAnswer(virtualNetwork1, virtualNetwork2); + VirtualMachine virtualMachine1 = mock(VirtualMachine.class); + VirtualMachine virtualMachine2 = mock(VirtualMachine.class); + Answer> virtualMachinesAnswer = setupApiObjectBaseListAnswer(virtualMachine1, virtualMachine2); + VirtualMachineInterface virtualMachineInterface1 = mock(VirtualMachineInterface.class); + VirtualMachineInterface virtualMachineInterface2 = mock(VirtualMachineInterface.class); + Answer> virtualMachineInterfacesAnswer = setupApiObjectBaseListAnswer(virtualMachineInterface1, virtualMachineInterface2); + NetworkPolicy networkPolicy1 = mock(NetworkPolicy.class); + NetworkPolicy networkPolicy2 = mock(NetworkPolicy.class); + Answer> networkPoliciesAnswer = setupApiObjectBaseListAnswer(networkPolicy1, networkPolicy2); + ApplicationPolicySet applicationPolicySet1 = mock(ApplicationPolicySet.class); + ApplicationPolicySet applicationPolicySet2 = mock(ApplicationPolicySet.class); + Answer> applicationPoliciesAnswer = setupApiObjectBaseListAnswer(applicationPolicySet1, applicationPolicySet2); + when(tungstenApi.removeTungstenTag(anyList(), anyList(), anyList(), anyString(), anyString(), anyString())).thenReturn(tag); + when(tungstenApi.getBackRefFromVirtualNetwork(eq(VirtualNetwork.class), anyList())).thenAnswer(virtualNetworksAnswer); + when(tungstenApi.getBackRefFromVirtualMachine(eq(VirtualMachine.class), anyList())).thenAnswer(virtualMachinesAnswer); + when(tungstenApi.getBackRefFromVirtualMachineInterface(eq(VirtualMachineInterface.class), anyList())).thenAnswer(virtualMachineInterfacesAnswer); + when(tungstenApi.getBackRefFromNetworkPolicy(eq(NetworkPolicy.class), anyList())).thenAnswer(networkPoliciesAnswer); + when(tungstenApi.getBackRefFromApplicationPolicySet(eq(ApplicationPolicySet.class), anyList())).thenAnswer(applicationPoliciesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestCreateTungstenApplicationPolicySetCommandTest() { + TungstenCommand command = new CreateTungstenApplicationPolicySetCommand("appPolicySetName"); + ApplicationPolicySet applicationPolicySet = mock(ApplicationPolicySet.class); + when(tungstenApi.createTungstenApplicationPolicySet(anyString(), anyString())).thenReturn(applicationPolicySet); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenFirewallPolicyCommandTest() { + TungstenCommand command = new CreateTungstenFirewallPolicyCommand("firewallPolicyName", "b30ff54a-10a9-11ec-82a8-0242ac130003", 1); + FirewallPolicy firewallPolicy = mock(FirewallPolicy.class); + when(tungstenApi.createTungstenFirewallPolicy(anyString(), anyString(), anyString(), anyInt())).thenReturn(firewallPolicy); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenFirewallRuleCommandTest() { + TungstenCommand command = new CreateTungstenFirewallRuleCommand("f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", + "firewallRuleName", "allow", "b30ff54a-10a9-11ec-82a8-0242ac130003", "b220a9d0-10aa-11ec-82a8-0242ac130003", + "ba7cc71c-10aa-11ec-82a8-0242ac130003", "92e989bb-325e-4c16-9d32-ad89166feeab", "<>", + "d7723adc-10aa-11ec-82a8-0242ac130003", "dd8e0572-10aa-11ec-82a8-0242ac130003", + "e4ca41cf-bc0a-4a62-b520-b7785f84b7a3", "e2e59350-10aa-11ec-82a8-0242ac130003", 1); + FirewallRule firewallRule = mock(FirewallRule.class); + when(tungstenApi.createTungstenFirewallRule(anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), anyString(), + anyString(), anyString(), anyString(), anyInt())).thenReturn(firewallRule); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenServiceGroupCommandTest() { + TungstenCommand command = new CreateTungstenServiceGroupCommand("serviceGroupName", "tcp", 80, 90); + ServiceGroup serviceGroup = mock(ServiceGroup.class); + when(tungstenApi.createTungstenServiceGroup(anyString(), anyString(), anyString(), anyInt(), anyInt())).thenReturn(serviceGroup); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestCreateTungstenAddressGroupCommandTest() { + TungstenCommand command = new CreateTungstenAddressGroupCommand("addressName", "10.0.0.0", 24); + AddressGroup addressGroup = mock(AddressGroup.class); + when(tungstenApi.createTungstenAddressGroup(anyString(), anyString(), anyString(), anyInt())).thenReturn(addressGroup); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestListTungstenApplicationPolicySetCommandTest() { + TungstenCommand command = new ListTungstenApplicationPolicySetCommand("d64e6082-10b3-11ec-82a8-0242ac130003"); + ApplicationPolicySet applicationPolicySet1 = mock(ApplicationPolicySet.class); + ApplicationPolicySet applicationPolicySet2 = mock(ApplicationPolicySet.class); + Answer> applicationPolicySetsAnswer = setupApiObjectBaseListAnswer(applicationPolicySet1, applicationPolicySet2); + when(tungstenApi.listTungstenApplicationPolicySet(anyString())).thenAnswer(applicationPolicySetsAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestListTungstenFirewallPolicyCommandTest() { + TungstenCommand command = new ListTungstenFirewallPolicyCommand("d64e6082-10b3-11ec-82a8-0242ac130003", + "db1f89d8-10b3-11ec-82a8-0242ac130003"); + FirewallPolicy firewallPolicy1 = mock(FirewallPolicy.class); + FirewallPolicy firewallPolicy2 = mock(FirewallPolicy.class); + Answer> firewallPoliciesAnswer = setupApiObjectBaseListAnswer(firewallPolicy1, firewallPolicy2); + when(tungstenApi.listTungstenFirewallPolicy(anyString(), anyString())).thenAnswer(firewallPoliciesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestListTungstenFirewallRuleCommandTest() { + TungstenCommand command = new ListTungstenFirewallRuleCommand("d64e6082-10b3-11ec-82a8-0242ac130003", + "db1f89d8-10b3-11ec-82a8-0242ac130003"); + FirewallRule firewallRule1 = mock(FirewallRule.class); + FirewallRule firewallRule2 = mock(FirewallRule.class); + Answer> firewallRulesAnswer = setupApiObjectBaseListAnswer(firewallRule1, firewallRule2); + when(tungstenApi.listTungstenFirewallRule(anyString(), anyString())).thenAnswer(firewallRulesAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestListTungstenServiceGroupCommandTest() { + TungstenCommand command = new ListTungstenServiceGroupCommand("d64e6082-10b3-11ec-82a8-0242ac130003"); + ServiceGroup serviceGroup1 = mock(ServiceGroup.class); + ServiceGroup serviceGroup2 = mock(ServiceGroup.class); + Answer> serviceGroupsAnswer = setupApiObjectBaseListAnswer(serviceGroup1, serviceGroup2); + when(tungstenApi.listTungstenServiceGroup(anyString())).thenAnswer(serviceGroupsAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestListTungstenAddressGroupCommandTest() { + TungstenCommand command = new ListTungstenAddressGroupCommand("d64e6082-10b3-11ec-82a8-0242ac130003"); + AddressGroup addressGroup1 = mock(AddressGroup.class); + AddressGroup addressGroup2 = mock(AddressGroup.class); + Answer> addressGroupsAnswer = setupApiObjectBaseListAnswer(addressGroup1, addressGroup2); + when(tungstenApi.listTungstenAddressGroup(anyString())).thenAnswer(addressGroupsAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBaseList()); + } + + @Test + public void executeRequestDeleteTungstenApplicationPolicySetCommandTest() { + TungstenCommand command = new DeleteTungstenApplicationPolicySetCommand("0b27c38c-10b6-11ec-82a8-0242ac130003"); + ApplicationPolicySet applicationPolicySet = mock(ApplicationPolicySet.class); + when(tungstenApi.getTungstenObject(eq(ApplicationPolicySet.class), anyString())).thenReturn(applicationPolicySet); + when(tungstenApi.deleteTungstenObject(any(ApplicationPolicySet.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenFirewallPolicyCommandTest() { + TungstenCommand command = new DeleteTungstenFirewallPolicyCommand("0b27c38c-10b6-11ec-82a8-0242ac130003"); + FirewallPolicy firewallPolicy = mock(FirewallPolicy.class); + when(tungstenApi.getTungstenObject(eq(FirewallPolicy.class), anyString())).thenReturn(firewallPolicy); + when(tungstenApi.deleteTungstenObject(any(FirewallPolicy.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenFirewallRuleCommandTest() { + TungstenCommand command = new DeleteTungstenFirewallRuleCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003"); + FirewallRule firewallRule = mock(FirewallRule.class); + when(tungstenApi.getTungstenObject(eq(FirewallRule.class), anyString())).thenReturn(firewallRule); + when(tungstenApi.deleteTungstenObject(any(FirewallRule.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenServiceGroupCommandTest() { + TungstenCommand command = new DeleteTungstenServiceGroupCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003"); + ServiceGroup serviceGroup = mock(ServiceGroup.class); + when(tungstenApi.getTungstenObject(eq(ServiceGroup.class), anyString())).thenReturn(serviceGroup); + when(tungstenApi.deleteTungstenObject(any(ServiceGroup.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenAddressGroupCommandTest() { + TungstenCommand command = new DeleteTungstenAddressGroupCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003"); + AddressGroup addressGroup = mock(AddressGroup.class); + when(tungstenApi.getTungstenObject(eq(AddressGroup.class), anyString())).thenReturn(addressGroup); + when(tungstenApi.deleteTungstenObject(any(AddressGroup.class))).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestUpdateTungstenVrouterConfigCommandTest() { + TungstenCommand command = new UpdateTungstenVrouterConfigCommand("forwardingMode"); + GlobalVrouterConfig globalVrouterConfig = mock(GlobalVrouterConfig.class); + when(tungstenApi.updateTungstenVrouterConfig(anyString())).thenReturn(globalVrouterConfig); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getApiObjectBase()); + } + + @Test + public void executeRequestUpdateTungstenDefaultSecurityGroupCommandTest() { + TungstenCommand command = new UpdateTungstenDefaultSecurityGroupCommand("projectFqn"); + when(tungstenApi.updateTungstenDefaultSecurityGroup(anyString())).thenReturn(true); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestCreateTungstenRoutingLogicalRouterCommandTest() { + TungstenCommand command = new CreateTungstenRoutingLogicalRouterCommand("projectFqn", "logicalRouterName"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + Answer> virtualNetworksAnswer = setupApiObjectBaseListAnswer(virtualNetwork1, virtualNetwork2); + when(tungstenApi.createRoutingLogicalRouter(anyString(), anyString(), anyString())).thenReturn(logicalRouter); + when(tungstenApi.listConnectedNetworkFromLogicalRouter(any(LogicalRouter.class))).thenAnswer(virtualNetworksAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestAddTungstenNetworkGatewayToLogicalRouterCommandTest() { + TungstenCommand command = new AddTungstenNetworkGatewayToLogicalRouterCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003", + "439a7efc-113e-11ec-82a8-0242ac130003", "10.0.0.0"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + Answer> virtualNetworksAnswer = setupApiObjectBaseListAnswer(virtualNetwork1, virtualNetwork2); + when(virtualNetwork1.getUuid()).thenReturn("fe79e06a-1142-11ec-82a8-0242ac130003"); + when(virtualNetwork2.getUuid()).thenReturn("efffa88c-1145-11ec-82a8-0242ac130003"); + when(tungstenApi.getTungstenObject(eq(LogicalRouter.class), anyString())).thenReturn(logicalRouter); + when(tungstenApi.listConnectedNetworkFromLogicalRouter(any(LogicalRouter.class))).thenAnswer(virtualNetworksAnswer); + when(tungstenApi.addNetworkGatewayToLogicalRouter(anyString(), anyString(), anyString())).thenReturn(logicalRouter); + when(tungstenApi.listConnectedNetworkFromLogicalRouter(any(LogicalRouter.class))).thenAnswer(virtualNetworksAnswer); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestRemoveTungstenNetworkGatewayFromLogicalRouterCommandTest() { + TungstenCommand command = new RemoveTungstenNetworkGatewayFromLogicalRouterCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003", + "439a7efc-113e-11ec-82a8-0242ac130003"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworks = Arrays.asList(virtualNetwork1, virtualNetwork2); + when(tungstenApi.removeNetworkGatewayFromLogicalRouter(anyString(), anyString())).thenReturn(logicalRouter); + when(tungstenApi.listConnectedNetworkFromLogicalRouter(any(LogicalRouter.class))).thenReturn(virtualNetworks); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModel()); + } + + @Test + public void executeRequestListTungstenRoutingLogicalRouterCommandTest() { + TungstenCommand command = new ListTungstenRoutingLogicalRouterCommand(null, "c2f8e1f8-10b6-11ec-82a8-0242ac130003"); + LogicalRouter logicalRouter1 = mock(LogicalRouter.class); + LogicalRouter logicalRouter2 = mock(LogicalRouter.class); + Answer> logicalRoutersAnswer = setupApiObjectBaseListAnswer(logicalRouter1, logicalRouter2); + VirtualNetwork virtualNetwork1 = mock(VirtualNetwork.class); + VirtualNetwork virtualNetwork2 = mock(VirtualNetwork.class); + List virtualNetworks = Arrays.asList(virtualNetwork1, virtualNetwork2); + when(tungstenApi.listRoutingLogicalRouter(anyString())).thenAnswer(logicalRoutersAnswer); + when(tungstenApi.listConnectedNetworkFromLogicalRouter(any(LogicalRouter.class))).thenReturn(virtualNetworks); + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + assertNotNull(answer.getTungstenModelList()); + } + + @Test + public void executeRequestDeleteTungstenRoutingLogicalRouterCommandSuccessTest() { + TungstenCommand command = new DeleteTungstenRoutingLogicalRouterCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + + when(tungstenApi.getTungstenObject(eq(LogicalRouter.class), anyString())).thenReturn(logicalRouter); + when(tungstenApi.deleteTungstenObject(any(LogicalRouter.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + @Test + public void executeRequestDeleteTungstenRoutingLogicalRouterCommandFailTest() { + TungstenCommand command = new DeleteTungstenRoutingLogicalRouterCommand("c2f8e1f8-10b6-11ec-82a8-0242ac130003"); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + ObjectReference objectReference = mock(ObjectReference.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + + when(tungstenApi.getTungstenObject(eq(LogicalRouter.class), anyString())).thenReturn(logicalRouter); + when(logicalRouter.getVirtualMachineInterface()).thenReturn(List.of(objectReference)); + when(tungstenApi.updateTungstenObject(any(LogicalRouter.class))).thenReturn(true); + when(tungstenApi.getTungstenObject(eq(VirtualMachineInterface.class), anyString())).thenReturn(virtualMachineInterface); + when(tungstenApi.deleteTungstenVmInterface(any(VirtualMachineInterface.class))).thenReturn(true); + when(tungstenApi.deleteTungstenObject(any(LogicalRouter.class))).thenReturn(true); + + TungstenAnswer answer = (TungstenAnswer) tungstenResource.executeRequest(command); + assertTrue(answer.getResult()); + } + + + private Answer> setupApiObjectBaseListAnswer(N... values) { + + final List list = new ArrayList<>(Arrays.asList(values)); + + return invocation -> list; + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenApiTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenApiTest.java new file mode 100644 index 00000000000..5bd92212711 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenApiTest.java @@ -0,0 +1,2059 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import net.juniper.tungsten.api.ApiConnector; +import net.juniper.tungsten.api.ApiConnectorMock; +import net.juniper.tungsten.api.ApiObjectBase; +import net.juniper.tungsten.api.types.AddressGroup; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.ConfigRoot; +import net.juniper.tungsten.api.types.Domain; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.FirewallRule; +import net.juniper.tungsten.api.types.FloatingIp; +import net.juniper.tungsten.api.types.FloatingIpPool; +import net.juniper.tungsten.api.types.GlobalSystemConfig; +import net.juniper.tungsten.api.types.GlobalVrouterConfig; +import net.juniper.tungsten.api.types.InstanceIp; +import net.juniper.tungsten.api.types.Loadbalancer; +import net.juniper.tungsten.api.types.LoadbalancerHealthmonitor; +import net.juniper.tungsten.api.types.LoadbalancerListener; +import net.juniper.tungsten.api.types.LoadbalancerMember; +import net.juniper.tungsten.api.types.LoadbalancerPool; +import net.juniper.tungsten.api.types.LogicalRouter; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.PolicyManagement; +import net.juniper.tungsten.api.types.Project; +import net.juniper.tungsten.api.types.SecurityGroup; +import net.juniper.tungsten.api.types.ServiceGroup; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.TagType; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.network.tungsten.model.TungstenLoadBalancerMember; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; + +public class TungstenApiTest { + + private static final Logger s_logger = Logger.getLogger(TungstenApiTest.class); + + private final TungstenApi tungstenApi = new TungstenApi(); + private Project project; + private String projectUuid; + private final String tungstenNetworkName = "TungstenNetworkTest"; + private final String tungstenNetworkUuid = UUID.randomUUID().toString(); + private final String tungstenVmName = "TungstenVmTest"; + private final String tungstenVmUuid = UUID.randomUUID().toString(); + private final String vmiName = "TungstenVirtualMachineInterfaceTest"; + private final String vmiUuid = UUID.randomUUID().toString(); + private String tungstenPublicNetworkName = "TungstenPublicNetworkTest"; + private String tungstenPublicNetworkUuid = UUID.randomUUID().toString(); + private String tungstenSecurityGroupName = "TungstenSecurityGroup"; + private String tungstenSecurityGroupUuid = UUID.randomUUID().toString(); + private String tungstenSecurityGroupRuleUuid = UUID.randomUUID().toString(); + private String tungstenLoadbalancerName = "TungstenLoadbalancer"; + private String tungstenLoadbalancerListenerName = "TungstenLoadbalancerListener"; + private String tungstenLoadbalancerPoolName = "TungstenLoadbalancerPool"; + private final Comparator comparator = Comparator.comparing(ApiObjectBase::getUuid); + + @Before + public void setUp() throws Exception { + s_logger.debug("Create Tungsten-Fabric api connector mock."); + ApiConnector api = new ApiConnectorMock(null, 0); + + tungstenApi.setApiConnector(api); + String domainUuid = UUID.randomUUID().toString(); + projectUuid = UUID.randomUUID().toString(); + + //create Tungsten-Fabric default domain + s_logger.debug("Create default domain in Tungsten-Fabric."); + Domain domain = new Domain(); + domain.setUuid(domainUuid); + String defaultDomainName = "default-domain"; + domain.setName(defaultDomainName); + api.create(domain); + + //create Tungsten-Fabric default project + s_logger.debug("Create default project in Tungsten-Fabric."); + Project project = new Project(); + project.setUuid(projectUuid); + String defaultProjectName = "default-project"; + project.setName(defaultProjectName); + project.setParent(domain); + api.create(project); + + this.project = (Project) api.findById(Project.class, projectUuid); + + // create Tungsten-Fabric default policy management + PolicyManagement policyManagement = new PolicyManagement(); + policyManagement.setParent(new ConfigRoot()); + policyManagement.setName(TungstenApi.TUNGSTEN_DEFAULT_POLICY_MANAGEMENT); + api.create(policyManagement); + + // create Tungsten-Fabric global system config + GlobalSystemConfig globalSystemConfig = new GlobalSystemConfig(); + globalSystemConfig.setName(TungstenApi.TUNGSTEN_GLOBAL_SYSTEM_CONFIG); + globalSystemConfig.setParent(new ConfigRoot()); + api.create(globalSystemConfig); + + // create Tungsten-Fabric global vrouter config + GlobalVrouterConfig globalVrouterConfig = new GlobalVrouterConfig(); + globalVrouterConfig.setName(TungstenApi.TUNGSTEN_GLOBAL_VROUTER_CONFIG); + globalVrouterConfig.setParent(globalSystemConfig); + api.create(globalVrouterConfig); + } + + @Test + public void createTungstenNetworkTest() { + s_logger.debug("Creating a virtual network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, + projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, + "")); + + s_logger.debug("Get Tungsten-Fabric virtual network and check if it's not null."); + assertNotNull(tungstenApi.getTungstenObject(VirtualNetwork.class, tungstenNetworkUuid)); + } + + @Test + public void createTungstenVirtualMachineTest() { + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName)); + + s_logger.debug("Check if virtual machine was created in Tungsten-Fabric."); + assertNotNull(tungstenApi.getTungstenObject(VirtualMachine.class, tungstenVmUuid)); + } + + @Test + public void createTungstenVirtualMachineInterfaceTest() { + s_logger.debug("Create fabric virtual network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(null, "ip-fabric", "ip-fabric", + projectUuid, true, false, null, 0, null, true, null, null, null, false, false, + "")); + + s_logger.debug("Create virtual network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, + projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, true, + "")); + + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName)); + + String vmiMacAddress = "02:fc:f3:d6:83:c3"; + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, vmiMacAddress, tungstenNetworkUuid, + tungstenVmUuid, projectUuid, "10.0.0.1", true)); + } + + @Test + public void deleteTungstenVirtualMachineInterfaceTest() { + s_logger.debug("Create virtual network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, + projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, + "")); + + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName)); + + String vmiMacAddress = "02:fc:f3:d6:83:c3"; + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, vmiMacAddress, tungstenNetworkUuid, + tungstenVmUuid, projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if the virtual machine interface was created in Tungsten-Fabric."); + VirtualMachineInterface vmi = (VirtualMachineInterface) tungstenApi.getTungstenObject(VirtualMachineInterface.class, vmiUuid); + assertNotNull(vmi); + + s_logger.debug("Delete virtual machine interface from Tungsten-Fabric."); + assertTrue(tungstenApi.deleteTungstenVmInterface(vmi)); + } + + @Test + public void createTungstenLogicalRouterTest() { + s_logger.debug("Create public network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(tungstenPublicNetworkUuid, tungstenPublicNetworkName, + tungstenPublicNetworkName, projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", + "10.0.0.20", false, false, "")); + + s_logger.debug("Create logical router in Tungsten-Fabric."); + assertNotNull( + tungstenApi.createTungstenLogicalRouter("TungstenLogicalRouter", projectUuid, tungstenPublicNetworkUuid)); + } + + @Test + public void createTungstenSecurityGroupTest() { + String projectFqn = TungstenApi.TUNGSTEN_DEFAULT_DOMAIN + ":" + TungstenApi.TUNGSTEN_DEFAULT_PROJECT; + + s_logger.debug("Create a security group in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenSecurityGroup(tungstenSecurityGroupUuid, tungstenSecurityGroupName, + "TungstenSecurityGroupDescription", projectFqn)); + + s_logger.debug("Check if the security group was created in Tungsten-Fabric."); + SecurityGroup securityGroup = (SecurityGroup) tungstenApi.getTungstenObject(SecurityGroup.class, + tungstenSecurityGroupUuid); + assertNotNull(securityGroup); + } + + @Test + public void addTungstenSecurityGroupRuleTest() { + String projectFqn = TungstenApi.TUNGSTEN_DEFAULT_DOMAIN + ":" + TungstenApi.TUNGSTEN_DEFAULT_PROJECT; + + s_logger.debug("Create a security group in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenSecurityGroup(tungstenSecurityGroupUuid, tungstenSecurityGroupName, + "TungstenSecurityGroupDescription", projectFqn)); + + //get Tungsten-Fabric security group + SecurityGroup securityGroup = (SecurityGroup) tungstenApi.getTungstenObject(SecurityGroup.class, + tungstenSecurityGroupUuid); + assertNotNull(securityGroup); + + s_logger.debug("Add a Tungsten-Fabric security group rule to the security group added earlier"); + boolean result = tungstenApi.addTungstenSecurityGroupRule(tungstenSecurityGroupUuid, + tungstenSecurityGroupRuleUuid, "ingress", 80, 90, "10.0.0.0/24", "IPv4", "tcp"); + assertTrue(result); + } + + @Test + public void removeTungstenSecurityGroupRuleTest() { + String projectFqn = TungstenApi.TUNGSTEN_DEFAULT_DOMAIN + ":" + TungstenApi.TUNGSTEN_DEFAULT_PROJECT; + + s_logger.debug("Create a security group in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenSecurityGroup(tungstenSecurityGroupUuid, "TungstenSecurityGroup", + "TungstenSecurityGroupDescription", projectFqn)); + + //get Tungsten-Fabric security group + SecurityGroup securityGroup = (SecurityGroup) tungstenApi.getTungstenObject(SecurityGroup.class, + tungstenSecurityGroupUuid); + assertNotNull(securityGroup); + + s_logger.debug("Add a Tungsten-Fabric security group rule to the security group added earlier"); + boolean result1 = tungstenApi.addTungstenSecurityGroupRule(tungstenSecurityGroupUuid, + "0a01e4c7-d912-4bd5-9786-5478e3dae7b2", "ingress", 80, 90, "10.0.0.0/24", "IPv4", "tcp"); + assertTrue(result1); + + s_logger.debug("Add a Tungsten-Fabric security group rule to the security group added earlier"); + boolean result2 = tungstenApi.addTungstenSecurityGroupRule(tungstenSecurityGroupUuid, + "fe44b353-21e7-4e6c-af18-1325c5ef886a", "egress", 80, 90, "securitygroup", "IPv4", "tcp"); + assertTrue(result2); + + s_logger.debug("Delete the Tungsten-Fabric security group rule added earlier"); + assertTrue( + tungstenApi.removeTungstenSecurityGroupRule(tungstenSecurityGroupUuid, "0a01e4c7-d912-4bd5-9786-5478e3dae7b2")); + } + + @Test + public void createTungstenLoadbalancerTest() { + s_logger.debug("Creating a virtual network in Tungsten-Fabric."); + createTungstenNetworkTest(); + + s_logger.debug("Get tungsten virtual network and check if it's not null."); + assertNotNull(tungstenApi.getTungstenObject(VirtualNetwork.class, tungstenNetworkUuid)); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + createTungstenVirtualMachineInterfaceTest(); + + s_logger.debug("Create loadbalancer in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenLoadbalancer(projectUuid, tungstenLoadbalancerName, vmiUuid, + tungstenApi.getSubnetUuid(tungstenNetworkUuid), "192.168.2.100")); + + s_logger.debug("Check if the loadbalancer was created in Tungsten-Fabric"); + Project project = (Project) tungstenApi.getTungstenObject(Project.class, projectUuid); + assertNotNull(tungstenApi.getTungstenObjectByName(Loadbalancer.class, project.getQualifiedName(), + tungstenLoadbalancerName)); + } + + @Test + public void createTungstenLoadbalancerListenerTest() { + s_logger.debug("Create a loadbalancer in Tungsten-Fabric"); + createTungstenLoadbalancerTest(); + + s_logger.debug("Get loadbalancer from Tungsten-Fabric"); + Project project = (Project) tungstenApi.getTungstenObject(Project.class, projectUuid); + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.getTungstenObjectByName(Loadbalancer.class, + project.getQualifiedName(), tungstenLoadbalancerName); + assertNotNull(loadbalancer); + + s_logger.debug("Create a loadbalancer listener in Tungsten-Fabric"); + LoadbalancerListener loadbalancerListener = + (LoadbalancerListener) tungstenApi.createTungstenLoadbalancerListener( + projectUuid, loadbalancer.getUuid(), tungstenLoadbalancerListenerName, "tcp", 24); + + s_logger.debug("Check if the loadbalancer listener was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(LoadbalancerListener.class, loadbalancerListener.getUuid())); + } + + @Test + public void createTungstenLoadbalancerHealthMonitorTest() { + s_logger.debug("Create a loadbalancer health monitor in Tungsten-Fabric"); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.createTungstenLoadbalancerHealthMonitor( + projectUuid, "LoadbalancerHealthMonitor", "PING", 3, 5, 5, null, null, null); + assertNotNull(loadbalancerHealthmonitor); + + s_logger.debug("Check if the loadbalancer health monitor was created in Tungsten-Fabric"); + assertNotNull( + tungstenApi.getTungstenObject(LoadbalancerHealthmonitor.class, loadbalancerHealthmonitor.getUuid())); + } + + @Test + public void createTungstenLoadbalancerPoolTest() { + s_logger.debug("Create a loadbalancer in Tungsten-Fabric"); + createTungstenLoadbalancerTest(); + + s_logger.debug("Get loadbalancer from Tungsten-Fabric"); + Project project = (Project) tungstenApi.getTungstenObject(Project.class, projectUuid); + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.getTungstenObjectByName(Loadbalancer.class, + project.getQualifiedName(), tungstenLoadbalancerName); + assertNotNull(loadbalancer); + + s_logger.debug("Create a loadbalancer listener in Tungsten-Fabric"); + LoadbalancerListener loadbalancerListener = + (LoadbalancerListener) tungstenApi.createTungstenLoadbalancerListener( + projectUuid, loadbalancer.getUuid(), tungstenLoadbalancerListenerName, "tcp", 24); + assertNotNull(loadbalancerListener); + + s_logger.debug("Create a loadbalancer health monitor in Tungsten-Fabric"); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.createTungstenLoadbalancerHealthMonitor( + projectUuid, "LoadbalancerHealthMonitor", "PING", 3, 5, 5, null, null, null); + assertNotNull(loadbalancerHealthmonitor); + + s_logger.debug("Create a loadbalancer pool in Tungsten-Fabric"); + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) tungstenApi.createTungstenLoadbalancerPool(projectUuid, + loadbalancerListener.getUuid(), loadbalancerHealthmonitor.getUuid(), tungstenLoadbalancerPoolName, + "ROUND_ROBIN", "TCP"); + assertNotNull(loadbalancerPool); + + s_logger.debug("Check if the loadbalancer pool was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(LoadbalancerPool.class, loadbalancerPool.getUuid())); + } + + @Test + public void createTungstenLoadbalancerMemberTest() { + s_logger.debug("Create a loadbalancer pool in Tungsten-Fabric"); + createTungstenLoadbalancerPoolTest(); + + s_logger.debug("Get the loadbalancer pool from Tungsten-Fabric"); + Project project = (Project) tungstenApi.getTungstenObject(Project.class, projectUuid); + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) tungstenApi.getTungstenObjectByName( + LoadbalancerPool.class, project.getQualifiedName(), tungstenLoadbalancerPoolName); + assertNotNull(loadbalancerPool); + + s_logger.debug("Create a loadbalancer member in Tungsten-Fabric"); + LoadbalancerMember loadbalancerMember = (LoadbalancerMember) tungstenApi.createTungstenLoadbalancerMember( + loadbalancerPool.getUuid(), "TungstenLoadbalancerMember", "10.0.0.0", null, 24, 5); + assertNotNull(loadbalancerMember); + + s_logger.debug("Check if the loadbalancer member was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(LoadbalancerMember.class, loadbalancerMember.getUuid())); + } + + @Test + public void createTungstenInstanceIpTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create a virtual machine in Tungsten-Fabric."); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if the instance ip is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "TungstenInstanceIp")); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + assertNotNull( + tungstenApi.createTungstenInstanceIp("TungstenInstanceIp", "192.168.1.100", tungstenNetworkUuid, + vmiUuid)); + + s_logger.debug("Check if the instance ip was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "TungstenInstanceIp")); + } + + @Test + public void createTungstenInstanceIpWithSubnetTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create a virtual machine in Tungsten-Fabric."); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if the instance ip is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "TungstenInstanceIp")); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + assertNotNull( + tungstenApi.createTungstenInstanceIp("TungstenInstanceIp", "192.168.1.100", tungstenNetworkUuid, + vmiUuid, tungstenApi.getSubnetUuid(tungstenNetworkUuid))); + + s_logger.debug("Check if the instance ip was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "TungstenInstanceIp")); + } + + @Test + public void createTungstenFloatingIpPoolTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + VirtualNetwork virtualNetwork = tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, + tungstenNetworkName, projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", + "10.0.0.20", false, false, ""); + + s_logger.debug("Check if the floating ip pool is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObjectByName(FloatingIpPool.class, virtualNetwork.getQualifiedName(), + "TungstenFip")); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenFloatingIpPool(tungstenNetworkUuid, "TungstenFip")); + + s_logger.debug("Check if the instance ip was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObjectByName(FloatingIpPool.class, virtualNetwork.getQualifiedName(), + "TungstenFip")); + } + + @Test + public void createTungstenLbVmiTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Check if the lb vmi is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObjectByName(VirtualMachineInterface.class, project.getQualifiedName(), + "TungstenLbVmi")); + + s_logger.debug("Create lb vmi in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenLbVmi("TungstenLbVmi", projectUuid, tungstenNetworkUuid)); + + s_logger.debug("Check if the lb vmi was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObjectByName(VirtualMachineInterface.class, project.getQualifiedName(), + "TungstenLbVmi")); + } + + @Test + public void updateTungstenObjectTest() { + s_logger.debug("Create public network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenPublicNetworkName, tungstenPublicNetworkName, + projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, + ""); + + s_logger.debug("Creating a logical router in Tungsten-Fabric."); + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.createTungstenLogicalRouter("TungstenLogicalRouter", + projectUuid, tungstenNetworkUuid); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + VirtualMachineInterface virtualMachineInterface = + (VirtualMachineInterface) tungstenApi.createTungstenGatewayVmi( + vmiName, projectUuid, tungstenNetworkUuid); + + s_logger.debug("Check if the logical router vmi is not exist in Tungsten-Fabric"); + assertNull(logicalRouter.getVirtualMachineInterface()); + + s_logger.debug("Update logical router with vmi"); + logicalRouter.setVirtualMachineInterface(virtualMachineInterface); + tungstenApi.updateTungstenObject(logicalRouter); + + s_logger.debug("Check updated logical router have vmi uuid equals created vmi uuid"); + LogicalRouter updatedlogicalRouter = (LogicalRouter) tungstenApi.getTungstenObjectByName(LogicalRouter.class, + project.getQualifiedName(), "TungstenLogicalRouter"); + assertEquals(virtualMachineInterface.getUuid(), + updatedlogicalRouter.getVirtualMachineInterface().get(0).getUuid()); + } + + @Test + public void createTungstenFloatingIpTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + FloatingIpPool floatingIpPool = (FloatingIpPool) tungstenApi.createTungstenFloatingIpPool(tungstenNetworkUuid, + "TungstenFip"); + + s_logger.debug("Check if the floating ip pool is not exist in Tungsten-Fabric"); + assertNull( + tungstenApi.getTungstenObjectByName(FloatingIp.class, floatingIpPool.getQualifiedName(), "TungstenFi")); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + assertNotNull( + tungstenApi.createTungstenFloatingIp(projectUuid, tungstenNetworkUuid, "TungstenFip", "TungstenFi", + "192.168.1.100")); + + s_logger.debug("Check if the lb vmi was created in Tungsten-Fabric"); + assertNotNull( + tungstenApi.getTungstenObjectByName(FloatingIp.class, floatingIpPool.getQualifiedName(), "TungstenFi")); + } + + @Test + public void assignTungstenFloatingIpTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + tungstenApi.createTungstenFloatingIpPool(tungstenNetworkUuid, "TungstenFip"); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + tungstenApi.createTungstenFloatingIp(projectUuid, tungstenNetworkUuid, "TungstenFip", "TungstenFi", + "192.168.1.100"); + + s_logger.debug("Create vm in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if the floating ip was assigned in Tungsten-Fabric"); + Assert.assertTrue( + tungstenApi.assignTungstenFloatingIp(tungstenNetworkUuid, vmiUuid, "TungstenFip", "TungstenFi", + "192.168.1.100")); + } + + @Test + public void releaseTungstenFloatingIpTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + tungstenApi.createTungstenFloatingIpPool(tungstenNetworkUuid, "TungstenFip"); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + tungstenApi.createTungstenFloatingIp(projectUuid, tungstenNetworkUuid, "TungstenFip", "TungstenFi", + "192.168.1.100"); + + s_logger.debug("Create vm in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if the floating ip was assigned in Tungsten-Fabric"); + tungstenApi.assignTungstenFloatingIp(tungstenNetworkUuid, vmiUuid, "TungstenFip", "TungstenFi", + "192.168.1.100"); + + s_logger.debug("Check if the floating ip was assigned in Tungsten-Fabric"); + Assert.assertTrue(tungstenApi.releaseTungstenFloatingIp(tungstenNetworkUuid, "TungstenFip", "TungstenFi")); + } + + @Test + public void createTungstenNetworkPolicyTest() { + s_logger.debug("Prepare network policy rule 1"); + List tungstenRuleList1 = new ArrayList<>(); + TungstenRule tungstenRule1 = new TungstenRule("005f0dea-0196-11ec-a1ed-b42e99f6e187", "pass", ">", "tcp", null, + "192.168.100.0", 24, 80, 80, null, "192.168.200.0", 24, 80, 80); + tungstenRuleList1.add(tungstenRule1); + + s_logger.debug("Create a network policy in Tungsten-Fabric."); + assertNotNull(tungstenApi.createOrUpdateTungstenNetworkPolicy("policy1", projectUuid, tungstenRuleList1)); + + s_logger.debug("Get created network policy and check if network policy rule has created"); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.getTungstenObjectByName(NetworkPolicy.class, + project.getQualifiedName(), "policy1"); + assertEquals("005f0dea-0196-11ec-a1ed-b42e99f6e187", + networkPolicy.getEntries().getPolicyRule().get(0).getRuleUuid()); + + s_logger.debug("Prepare network policy rule 2"); + List tungstenRuleList2 = new ArrayList<>(); + TungstenRule tungstenRule2 = new TungstenRule("105f0dea-0196-11ec-a1ed-b42e99f6e187", "pass", ">", "tcp", null, + "192.168.100.0", 24, 80, 80, null, "192.168.200.0", 24, 80, 80); + tungstenRuleList2.add(tungstenRule2); + + s_logger.debug("update created network policy in Tungsten-Fabric."); + assertNotNull(tungstenApi.createOrUpdateTungstenNetworkPolicy("policy1", projectUuid, tungstenRuleList2)); + + s_logger.debug("Get updated network policy and check if network policy rule has updated"); + NetworkPolicy networkPolicy1 = (NetworkPolicy) tungstenApi.getTungstenObjectByName(NetworkPolicy.class, + project.getQualifiedName(), "policy1"); + assertEquals("105f0dea-0196-11ec-a1ed-b42e99f6e187", + networkPolicy1.getEntries().getPolicyRule().get(1).getRuleUuid()); + } + + @Test + public void applyTungstenNetworkPolicy() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Prepare network policy rule"); + List tungstenRuleList = new ArrayList<>(); + + s_logger.debug("Create a network policy in Tungsten-Fabric."); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.createOrUpdateTungstenNetworkPolicy("policy", + projectUuid, tungstenRuleList); + + s_logger.debug("Check if network policy was not applied in Tungsten-Fabric."); + VirtualNetwork virtualNetwork1 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertNull(virtualNetwork1.getNetworkPolicy()); + + s_logger.debug("Apply network policy to network in Tungsten-Fabric."); + assertNotNull(tungstenApi.applyTungstenNetworkPolicy(networkPolicy.getUuid(), tungstenNetworkUuid, 1, 1)); + + s_logger.debug("Check if network policy was applied in Tungsten-Fabric."); + VirtualNetwork virtualNetwork2 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertNotNull(virtualNetwork2.getNetworkPolicy()); + } + + @Test + public void getTungstenFabricNetworkTest() { + s_logger.debug("Create fabric virtual network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(null, "ip-fabric", "ip-fabric", + projectUuid, true, false, null, 0, null, true, null, null, null, false, false, + "")); + + s_logger.debug("Check if fabric network was got in Tungsten-Fabric."); + assertNotNull(tungstenApi.getTungstenFabricNetwork()); + } + + @Test + public void createTungstenDomainTest() { + s_logger.debug("Check if domain was created in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenDomain("domain", "0a01e4c7-d912-4bd5-9786-5478e3dae7b2")); + } + + @Test + public void createTungstenProjectTest() { + s_logger.debug("Check if project was created in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenProject("project","fe44b353-21e7-4e6c-af18-1325c5ef886a","0a01e4c7-d912-4bd5-9786-5478e3dae7b2", "domain")); + } + + @Test + public void deleteTungstenDomainTest() { + s_logger.debug("Create domain in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenDomain("domain", "0a01e4c7-d912-4bd5-9786-5478e3dae7b2")); + + s_logger.debug("Check if domain was deleted in Tungsten-Fabric."); + assertTrue(tungstenApi.deleteTungstenDomain("0a01e4c7-d912-4bd5-9786-5478e3dae7b2")); + } + + @Test + public void deleteTungstenProjectTest() { + s_logger.debug("Create project in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenProject("project","fe44b353-21e7-4e6c-af18-1325c5ef886a","0a01e4c7-d912-4bd5-9786-5478e3dae7b2", "domain")); + + s_logger.debug("Check if project was deleted in Tungsten-Fabric."); + assertTrue(tungstenApi.deleteTungstenProject("fe44b353-21e7-4e6c-af18-1325c5ef886a")); + } + + @Test + public void getDefaultTungstenDomainTest() throws IOException { + s_logger.debug("Check if default domain was got in Tungsten-Fabric."); + assertNotNull(tungstenApi.getDefaultTungstenDomain()); + } + + @Test + public void updateLoadBalancerMemberTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create a vm in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Create loadbalancer in Tungsten-Fabric"); + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.createTungstenLoadbalancer(projectUuid, + tungstenLoadbalancerName, vmiUuid, tungstenApi.getSubnetUuid(tungstenNetworkUuid), "192.168.2.100"); + + s_logger.debug("Create a loadbalancer listener in Tungsten-Fabric"); + LoadbalancerListener loadbalancerListener = + (LoadbalancerListener) tungstenApi.createTungstenLoadbalancerListener( + projectUuid, loadbalancer.getUuid(), tungstenLoadbalancerListenerName, "tcp", 24); + + s_logger.debug("Create a loadbalancer health monitor in Tungsten-Fabric"); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.createTungstenLoadbalancerHealthMonitor( + projectUuid, "LoadbalancerHealthMonitor", "PING", 3, 5, 5, null, null, null); + + s_logger.debug("Create a loadbalancer pool in Tungsten-Fabric"); + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) tungstenApi.createTungstenLoadbalancerPool(projectUuid, + loadbalancerListener.getUuid(), loadbalancerHealthmonitor.getUuid(), tungstenLoadbalancerPoolName, + "ROUND_ROBIN", "TCP"); + + s_logger.debug("Update loadbalancer member 1 in Tungsten-Fabric"); + List tungstenLoadBalancerMemberList1 = new ArrayList<>(); + tungstenLoadBalancerMemberList1.add(new TungstenLoadBalancerMember("member1", "192.168.100.100", 80, 1)); + assertTrue(tungstenApi.updateLoadBalancerMember(projectUuid, tungstenLoadbalancerPoolName, + tungstenLoadBalancerMemberList1, tungstenApi.getSubnetUuid(tungstenNetworkUuid))); + + s_logger.debug("Check if loadbalancer member 2 was updated in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObjectByName(LoadbalancerMember.class, loadbalancerPool.getQualifiedName(), + "member1")); + + s_logger.debug("Update loadbalancer member 2 in Tungsten-Fabric"); + List tungstenLoadBalancerMemberList2 = new ArrayList<>(); + tungstenLoadBalancerMemberList2.add(new TungstenLoadBalancerMember("member2", "192.168.100.100", 80, 1)); + assertTrue(tungstenApi.updateLoadBalancerMember(projectUuid, tungstenLoadbalancerPoolName, + tungstenLoadBalancerMemberList2, tungstenApi.getSubnetUuid(tungstenNetworkUuid))); + + s_logger.debug("Check if loadbalancer member 1 was deleted in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObjectByName(LoadbalancerMember.class, loadbalancerPool.getQualifiedName(), + "member1")); + + s_logger.debug("Check if loadbalancer member 2 was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObjectByName(LoadbalancerMember.class, loadbalancerPool.getQualifiedName(), + "member2")); + } + + @Test + public void updateLoadBalancerPoolTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Create loadbalancer in Tungsten-Fabric"); + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.createTungstenLoadbalancer(projectUuid, + tungstenLoadbalancerName, vmiUuid, tungstenApi.getSubnetUuid(tungstenNetworkUuid), "192.168.2.100"); + + s_logger.debug("Create a loadbalancer listener in Tungsten-Fabric"); + LoadbalancerListener loadbalancerListener = + (LoadbalancerListener) tungstenApi.createTungstenLoadbalancerListener( + projectUuid, loadbalancer.getUuid(), tungstenLoadbalancerListenerName, "tcp", 24); + + s_logger.debug("Create a loadbalancer health monitor in Tungsten-Fabric"); + LoadbalancerHealthmonitor loadbalancerHealthmonitor = + (LoadbalancerHealthmonitor) tungstenApi.createTungstenLoadbalancerHealthMonitor( + projectUuid, "LoadbalancerHealthMonitor", "PING", 3, 5, 5, null, null, null); + + s_logger.debug("Create a loadbalancer pool in Tungsten-Fabric"); + tungstenApi.createTungstenLoadbalancerPool(projectUuid, loadbalancerListener.getUuid(), + loadbalancerHealthmonitor.getUuid(), tungstenLoadbalancerPoolName, "ROUND_ROBIN", "TCP"); + + s_logger.debug("Update loadbalancer pool in Tungsten-Fabric"); + assertTrue( + tungstenApi.updateLoadBalancerPool(projectUuid, tungstenLoadbalancerPoolName, "SOURCE_IP", "APP_COOKIE", + "cookie", "UDP", true, "80", "/stats", "admin:abc")); + + s_logger.debug("Check if loadbalancer pool was updated in Tungsten-Fabric"); + LoadbalancerPool loadbalancerPool = (LoadbalancerPool) tungstenApi.getTungstenObjectByName( + LoadbalancerPool.class, project.getQualifiedName(), tungstenLoadbalancerPoolName); + assertEquals("SOURCE_IP", loadbalancerPool.getProperties().getLoadbalancerMethod()); + assertEquals("APP_COOKIE", loadbalancerPool.getProperties().getSessionPersistence()); + assertEquals("cookie", loadbalancerPool.getProperties().getPersistenceCookieName()); + assertEquals("UDP", loadbalancerPool.getProperties().getProtocol()); + } + + @Test + public void updateLoadBalancerListenerTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Create loadbalancer in Tungsten-Fabric"); + Loadbalancer loadbalancer = (Loadbalancer) tungstenApi.createTungstenLoadbalancer(projectUuid, + tungstenLoadbalancerName, vmiUuid, tungstenApi.getSubnetUuid(tungstenNetworkUuid), "192.168.2.100"); + + s_logger.debug("Create a loadbalancer listener in Tungsten-Fabric"); + tungstenApi.createTungstenLoadbalancerListener(projectUuid, loadbalancer.getUuid(), + tungstenLoadbalancerListenerName, "tcp", 24); + + s_logger.debug("update loadbalancer listener in Tungsten-Fabric"); + assertTrue(tungstenApi.updateLoadBalancerListener(projectUuid, tungstenLoadbalancerListenerName, "udp", 25, + "http://host:8080/client/getLoadBalancerSslCertificate")); + + s_logger.debug("Check if loadbalancer listener was updated in Tungsten-Fabric"); + LoadbalancerListener loadbalancerListener = (LoadbalancerListener) tungstenApi.getTungstenObjectByName( + LoadbalancerListener.class, project.getQualifiedName(), tungstenLoadbalancerListenerName); + assertEquals("udp", loadbalancerListener.getProperties().getProtocol()); + assertEquals(Integer.valueOf(25), loadbalancerListener.getProperties().getProtocolPort()); + assertEquals("http://host:8080/client/getLoadBalancerSslCertificate", + loadbalancerListener.getProperties().getDefaultTlsContainer()); + } + + @Test + public void applyTungstenPortForwardingTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create instance ip in Tungsten-Fabric"); + tungstenApi.createTungstenFloatingIpPool(tungstenNetworkUuid, "TungstenFip"); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + FloatingIp floatingIp = (FloatingIp) tungstenApi.createTungstenFloatingIp(projectUuid, tungstenNetworkUuid, + "TungstenFip", "TungstenFi", "192.168.1.100"); + + s_logger.debug("Create floating ip in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if the port mapping is not exist in Tungsten-Fabric"); + assertNull(floatingIp.getPortMappings()); + assertNull(floatingIp.getVirtualMachineInterface()); + assertNull(floatingIp.getPortMappingsEnable()); + + s_logger.debug("Check if the port mapping was add in Tungsten-Fabric"); + assertTrue( + tungstenApi.applyTungstenPortForwarding(true, tungstenNetworkUuid, "TungstenFip", "TungstenFi", vmiUuid, + "tcp", 8080, 80)); + assertEquals("tcp", floatingIp.getPortMappings().getPortMappings().get(0).getProtocol()); + assertEquals(Integer.valueOf(8080), floatingIp.getPortMappings().getPortMappings().get(0).getSrcPort()); + assertEquals(Integer.valueOf(80), floatingIp.getPortMappings().getPortMappings().get(0).getDstPort()); + assertNotNull(floatingIp.getVirtualMachineInterface()); + assertTrue(floatingIp.getPortMappingsEnable()); + + s_logger.debug("Check if the port mapping was remove in Tungsten-Fabric"); + assertTrue(tungstenApi.applyTungstenPortForwarding(false, tungstenNetworkUuid, "TungstenFip", "TungstenFi", + vmiUuid, "tcp", 8080, 80)); + assertEquals(0, floatingIp.getPortMappings().getPortMappings().size()); + assertEquals(0, floatingIp.getVirtualMachineInterface().size()); + assertFalse(floatingIp.getPortMappingsEnable()); + } + + @Test + public void addTungstenNetworkSubnetCommandTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + VirtualNetwork virtualNetwork = tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, + tungstenNetworkName, projectUuid, true, false, null, 0, null, false, null, null, null, false, false, null); + + s_logger.debug("Check if network ipam subnet is empty in Tungsten-Fabric"); + assertNull(virtualNetwork.getNetworkIpam()); + + s_logger.debug("Check if network ipam subnet was added to network in Tungsten-Fabric"); + assertTrue(tungstenApi.addTungstenNetworkSubnetCommand(tungstenNetworkUuid, "10.0.0.0", 24, "10.0.0.1", true, + "10.0.0.253", "10.0.0.10", "10.0.0.20", true, "subnetName")); + VirtualNetwork virtualNetwork1 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertNotNull(virtualNetwork1.getNetworkIpam()); + assertEquals("10.0.0.0", + virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getSubnet().getIpPrefix()); + assertEquals(Integer.valueOf(24), + virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getSubnet().getIpPrefixLen()); + assertEquals("10.0.0.1", + virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getDefaultGateway()); + assertTrue(virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getEnableDhcp()); + assertEquals("10.0.0.253", + virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getDnsServerAddress()); + assertTrue(virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getAddrFromStart()); + assertEquals("10.0.0.10", virtualNetwork1.getNetworkIpam() + .get(0) + .getAttr() + .getIpamSubnets() + .get(0) + .getAllocationPools() + .get(0) + .getStart()); + assertEquals("10.0.0.20", virtualNetwork1.getNetworkIpam() + .get(0) + .getAttr() + .getIpamSubnets() + .get(0) + .getAllocationPools() + .get(0) + .getEnd()); + assertEquals("subnetName", + virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().get(0).getSubnetName()); + } + + @Test + public void removeTungstenNetworkSubnetCommandTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "192.168.100.0", 23, "192.168.100.1", false, null, null, null, false, false, "subnetName1"); + + s_logger.debug("Check if network ipam subnet was added to network in Tungsten-Fabric"); + assertTrue(tungstenApi.addTungstenNetworkSubnetCommand(tungstenNetworkUuid, "10.0.0.0", 24, "10.0.0.1", true, + "10.0.0.253", "10.0.0.10", "10.0.0.20", true, "subnetName2")); + VirtualNetwork virtualNetwork1 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals(2, virtualNetwork1.getNetworkIpam().get(0).getAttr().getIpamSubnets().size()); + + s_logger.debug("Check if network ipam subnet was removed to network in Tungsten-Fabric"); + assertTrue(tungstenApi.removeTungstenNetworkSubnetCommand(tungstenNetworkUuid, "subnetName2")); + VirtualNetwork virtualNetwork2 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals(1, virtualNetwork2.getNetworkIpam().get(0).getAttr().getIpamSubnets().size()); + } + + @Test + public void createTungstenTagTypeTest() { + s_logger.debug("Check if tag type is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(TagType.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create tag type in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenTagType("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype")); + + s_logger.debug("Check if tag type was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(TagType.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void createTungstenTagTest() { + s_logger.debug("Check if tag is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(Tag.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create tag in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype", "tagvalue", "123")); + + s_logger.debug("Check if tag was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(Tag.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void createTungstenApplicationPolicySetTest() { + s_logger.debug("Check if application policy set is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(ApplicationPolicySet.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create application policy set in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenApplicationPolicySet("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "applicationpolicyset")); + + s_logger.debug("Check if application policy set was created in Tungsten-Fabric"); + assertNotNull( + tungstenApi.getTungstenObject(ApplicationPolicySet.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void createTungstenFirewallPolicyTest() { + s_logger.debug("Create application policy set in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenApplicationPolicySet("f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", + "applicationpolicyset")); + + s_logger.debug("Check if firewall policy is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(FirewallPolicy.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create firewall policy in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenFirewallPolicy("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "firewallpolicy", 1)); + + s_logger.debug("Check if firewall policy was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(FirewallPolicy.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void createTungstenFirewallRuleTest() { + s_logger.debug("Create application policy set in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenApplicationPolicySet("f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", + "applicationpolicyset")); + + s_logger.debug("Create firewall policy in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenFirewallPolicy("1ab1b179-8c6c-492a-868e-0493f4be175c", + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "firewallpolicy", 1)); + + s_logger.debug("Check if firewall rule is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(FirewallRule.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create service group in Tungsten-Fabric"); + tungstenApi.createTungstenServiceGroup("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "servicegroup", "tcp", 80, 90); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "tagtype1", "tagvalue1", "123"); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("7d5575eb-d029-467e-8b78-6056a8c94a71", "tagtype2", "tagvalue2", "123"); + + s_logger.debug("Create address group in Tungsten-Fabric"); + tungstenApi.createTungstenAddressGroup("88729834-3ebd-413a-adf9-40aff73cf638", "addressgroup1", "10.0.0.0", 24); + + s_logger.debug("Create address group in Tungsten-Fabric"); + tungstenApi.createTungstenAddressGroup("9291ae28-56cf-448c-b848-f2334b3c86da", "addressgroup2", "10.0.0.0", 24); + + s_logger.debug("Create tag type in Tungsten-Fabric"); + tungstenApi.createTungstenTagType("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", "tagtype"); + + s_logger.debug("Create firewall rule in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenFirewallRule("124d0792-e890-4b7e-8fe8-1b7a6d63c66a", + "1ab1b179-8c6c-492a-868e-0493f4be175c", "firewallrule", "pass", "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "88729834-3ebd-413a-adf9-40aff73cf638", null, ">", + "7d5575eb-d029-467e-8b78-6056a8c94a71", "9291ae28-56cf-448c-b848-f2334b3c86da", + null, "c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", 1)); + + s_logger.debug("Check if firewall rule was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(FirewallRule.class, "124d0792-e890-4b7e-8fe8-1b7a6d63c66a")); + } + + @Test + public void createTungstenServiceGroupTest() { + s_logger.debug("Check if service group is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(ServiceGroup.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create service group in Tungsten-Fabric"); + assertNotNull( + tungstenApi.createTungstenServiceGroup("005f0dea-0196-11ec-a1ed-b42e99f6e187", "servicegroup", "tcp", 80, + 90)); + + s_logger.debug("Check if service group was created in Tungsten-Fabric"); + ServiceGroup serviceGroup = (ServiceGroup) tungstenApi.getTungstenObject(ServiceGroup.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertNotNull(serviceGroup); + assertEquals("tcp", serviceGroup.getFirewallServiceList().getFirewallService().get(0).getProtocol()); + assertEquals(Integer.valueOf(80), + serviceGroup.getFirewallServiceList().getFirewallService().get(0).getDstPorts().getStartPort()); + assertEquals(Integer.valueOf(90), + serviceGroup.getFirewallServiceList().getFirewallService().get(0).getDstPorts().getEndPort()); + } + + @Test + public void createTungstenAddressGroupTest() { + s_logger.debug("Check if address group is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(AddressGroup.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create address group in Tungsten-Fabric"); + assertNotNull( + tungstenApi.createTungstenAddressGroup("005f0dea-0196-11ec-a1ed-b42e99f6e187", "addressgroup", "10.0.0.0", + 24)); + + s_logger.debug("Check if address group was created in Tungsten-Fabric"); + AddressGroup addressGroup = (AddressGroup) tungstenApi.getTungstenObject(AddressGroup.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertNotNull(addressGroup); + assertEquals("10.0.0.0", addressGroup.getPrefix().getSubnet().get(0).getIpPrefix()); + assertEquals(Integer.valueOf(24), addressGroup.getPrefix().getSubnet().get(0).getIpPrefixLen()); + } + + @Test + public void applyTungstenNetworkTagTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + VirtualNetwork virtualNetwork = tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, + tungstenNetworkName, projectUuid, true, false, null, 0, null, false, null, null, null, false, false, null); + + s_logger.debug("Check if tag is not apply to network in Tungsten-Fabric"); + assertNull(virtualNetwork.getTag()); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype", "tagvalue", "123"); + + s_logger.debug("Check if tag was applied to network in Tungsten-Fabric"); + assertTrue(tungstenApi.applyTungstenNetworkTag(List.of(tungstenNetworkUuid), + "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + VirtualNetwork virtualNetwork1 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals("005f0dea-0196-11ec-a1ed-b42e99f6e187", virtualNetwork1.getTag().get(0).getUuid()); + } + + @Test + public void applyTungstenVmTagTest() { + s_logger.debug("Create vm in Tungsten-Fabric"); + VirtualMachine virtualMachine = tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Check if tag is not apply to vm in Tungsten-Fabric"); + assertNull(virtualMachine.getTag()); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype", "tagvalue", "123"); + + s_logger.debug("Check if tag was applied to vm in Tungsten-Fabric"); + assertTrue( + tungstenApi.applyTungstenVmTag(List.of(tungstenVmUuid), "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + VirtualMachine virtualMachine1 = (VirtualMachine) tungstenApi.getTungstenObject(VirtualMachine.class, + tungstenVmUuid); + assertEquals("005f0dea-0196-11ec-a1ed-b42e99f6e187", virtualMachine1.getTag().get(0).getUuid()); + } + + @Test + public void applyTungstenNicTagTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create vm in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + VirtualMachineInterface virtualMachineInterface = tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, + "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if tag is not apply to vmi in Tungsten-Fabric"); + assertNull(virtualMachineInterface.getTag()); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype", "tagvalue", "123"); + + s_logger.debug("Check if tag was applied to vmi in Tungsten-Fabric"); + assertTrue(tungstenApi.applyTungstenNicTag(List.of(vmiUuid), "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + VirtualMachineInterface virtualMachineInterface1 = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertEquals("005f0dea-0196-11ec-a1ed-b42e99f6e187", virtualMachineInterface1.getTag().get(0).getUuid()); + } + + @Test + public void applyTungstenPolicyTagTest() { + s_logger.debug("Create a network policy in Tungsten-Fabric."); + List tungstenRuleList1 = new ArrayList<>(); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.createOrUpdateTungstenNetworkPolicy("policy", + projectUuid, tungstenRuleList1); + + s_logger.debug("Check if tag is not apply to network policy in Tungsten-Fabric"); + assertNull(networkPolicy.getTag()); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype", "tagvalue", "123"); + + s_logger.debug("Check if tag was applied to network policy in Tungsten-Fabric"); + assertTrue(tungstenApi.applyTungstenPolicyTag(networkPolicy.getUuid(), "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + NetworkPolicy networkPolicy1 = (NetworkPolicy) tungstenApi.getTungstenObjectByName(NetworkPolicy.class, + project.getQualifiedName(), "policy"); + assertEquals("005f0dea-0196-11ec-a1ed-b42e99f6e187", networkPolicy1.getTag().get(0).getUuid()); + } + + @Test + public void removeTungstenTagTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create vm in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Creating a vmi in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + s_logger.debug("Create a network policy in Tungsten-Fabric."); + + s_logger.debug("Create a network policy in Tungsten-Fabric."); + List tungstenRuleList1 = new ArrayList<>(); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.createOrUpdateTungstenNetworkPolicy("policy", + projectUuid, tungstenRuleList1); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype", "tagvalue", "123"); + + s_logger.debug("Apply tag to network in Tungsten-Fabric"); + tungstenApi.applyTungstenNetworkTag(List.of(tungstenNetworkUuid), "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + + s_logger.debug("Check if tag was applied to network in Tungsten-Fabric"); + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals(1, virtualNetwork.getTag().size()); + + s_logger.debug("Apply tag to vm in Tungsten-Fabric"); + tungstenApi.applyTungstenVmTag(List.of(tungstenVmUuid), "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + + s_logger.debug("Check if tag was applied to vm in Tungsten-Fabric"); + VirtualMachine virtualMachine = (VirtualMachine) tungstenApi.getTungstenObject(VirtualMachine.class, + tungstenVmUuid); + assertEquals(1, virtualMachine.getTag().size()); + + s_logger.debug("Apply tag to nic in Tungsten-Fabric"); + tungstenApi.applyTungstenNicTag(List.of(vmiUuid), "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + + s_logger.debug("Check if tag was applied to nic in Tungsten-Fabric"); + VirtualMachineInterface virtualMachineInterface = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertEquals(1, virtualMachineInterface.getTag().size()); + + s_logger.debug("Apply tag to policy in Tungsten-Fabric"); + tungstenApi.applyTungstenPolicyTag(networkPolicy.getUuid(), "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + + s_logger.debug("Check if tag was applied to policy in Tungsten-Fabric"); + NetworkPolicy networkPolicy1 = (NetworkPolicy) tungstenApi.getTungstenObject(NetworkPolicy.class, + networkPolicy.getUuid()); + assertEquals(1, networkPolicy1.getTag().size()); + + s_logger.debug("remove tag from network, vm, nic, policy in Tungsten-Fabric"); + assertNotNull(tungstenApi.removeTungstenTag(List.of(tungstenNetworkUuid), List.of(tungstenVmUuid), + List.of(vmiUuid), networkPolicy.getUuid(), null, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Check if tag was removed from network in Tungsten-Fabric"); + VirtualNetwork virtualNetwork1 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals(0, virtualNetwork1.getTag().size()); + + s_logger.debug("Check if tag was removed from vm in Tungsten-Fabric"); + VirtualMachine virtualMachine1 = (VirtualMachine) tungstenApi.getTungstenObject(VirtualMachine.class, + tungstenVmUuid); + assertEquals(0, virtualMachine1.getTag().size()); + + s_logger.debug("Check if tag was removed from nic in Tungsten-Fabric"); + VirtualMachineInterface virtualMachineInterface1 = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertEquals(0, virtualMachineInterface1.getTag().size()); + + s_logger.debug("Check if tag was removed from policy in Tungsten-Fabric"); + NetworkPolicy networkPolicy2 = (NetworkPolicy) tungstenApi.getTungstenObject(NetworkPolicy.class, + networkPolicy.getUuid()); + assertEquals(0, networkPolicy2.getTag().size()); + } + + @Test + public void removeTungstenPolicyTest() { + s_logger.debug("Create a virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Prepare network policy rule"); + List tungstenRuleList = new ArrayList<>(); + + s_logger.debug("Create a network policy in Tungsten-Fabric."); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.createOrUpdateTungstenNetworkPolicy("policy", + projectUuid, tungstenRuleList); + + s_logger.debug("Apply network policy to network in Tungsten-Fabric."); + tungstenApi.applyTungstenNetworkPolicy(networkPolicy.getUuid(), tungstenNetworkUuid, 1, 1); + + s_logger.debug("Check if network policy was applied in Tungsten-Fabric."); + VirtualNetwork virtualNetwork = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals(1, virtualNetwork.getNetworkPolicy().size()); + + s_logger.debug("Apply network policy to network in Tungsten-Fabric."); + tungstenApi.removeTungstenPolicy(tungstenNetworkUuid, networkPolicy.getUuid()); + + s_logger.debug("Check if network policy was applied in Tungsten-Fabric."); + VirtualNetwork virtualNetwork1 = (VirtualNetwork) tungstenApi.getTungstenObject(VirtualNetwork.class, + tungstenNetworkUuid); + assertEquals(0, virtualNetwork1.getNetworkPolicy().size()); + } + + @Test + public void createTungstenPolicyTest() { + s_logger.debug("Check if policy is not exist in Tungsten-Fabric"); + assertNull(tungstenApi.getTungstenObject(NetworkPolicy.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Create policy in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenPolicy("005f0dea-0196-11ec-a1ed-b42e99f6e187", "policy", projectUuid)); + + s_logger.debug("Check if policy was created in Tungsten-Fabric"); + assertNotNull(tungstenApi.getTungstenObject(NetworkPolicy.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void addTungstenPolicyRuleTest() { + s_logger.debug("Create policy in Tungsten-Fabric"); + NetworkPolicy networkPolicy = (NetworkPolicy) tungstenApi.createTungstenPolicy( + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "policy", projectUuid); + + s_logger.debug("Check if policy was created in Tungsten-Fabric"); + assertNull(networkPolicy.getEntries()); + + s_logger.debug("Check if policy rule was added in Tungsten-Fabric"); + assertNotNull(tungstenApi.addTungstenPolicyRule("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "pass", "tcp", ">", "network1", "192.168.100.0", 24, 8080, 8081, + "network2", "10.0.0.0", 16, 80, 81)); + NetworkPolicy networkPolicy1 = (NetworkPolicy) tungstenApi.getTungstenObject(NetworkPolicy.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals("pass", networkPolicy1.getEntries().getPolicyRule().get(0).getActionList().getSimpleAction()); + assertEquals("tcp", networkPolicy1.getEntries().getPolicyRule().get(0).getProtocol()); + assertEquals(">", networkPolicy1.getEntries().getPolicyRule().get(0).getDirection()); + assertEquals("network1", + networkPolicy1.getEntries().getPolicyRule().get(0).getSrcAddresses().get(0).getVirtualNetwork()); + assertEquals("192.168.100.0", networkPolicy1.getEntries() + .getPolicyRule() + .get(0) + .getSrcAddresses() + .get(0) + .getSubnetList() + .get(0) + .getIpPrefix()); + assertEquals(Integer.valueOf(24), networkPolicy1.getEntries() + .getPolicyRule() + .get(0) + .getSrcAddresses() + .get(0) + .getSubnetList() + .get(0) + .getIpPrefixLen()); + assertEquals(Integer.valueOf(8080), + networkPolicy1.getEntries().getPolicyRule().get(0).getSrcPorts().get(0).getStartPort()); + assertEquals(Integer.valueOf(8081), + networkPolicy1.getEntries().getPolicyRule().get(0).getSrcPorts().get(0).getEndPort()); + assertEquals("network2", + networkPolicy1.getEntries().getPolicyRule().get(0).getDstAddresses().get(0).getVirtualNetwork()); + assertEquals("10.0.0.0", networkPolicy1.getEntries() + .getPolicyRule() + .get(0) + .getDstAddresses() + .get(0) + .getSubnetList() + .get(0) + .getIpPrefix()); + assertEquals(Integer.valueOf(16), networkPolicy1.getEntries() + .getPolicyRule() + .get(0) + .getDstAddresses() + .get(0) + .getSubnetList() + .get(0) + .getIpPrefixLen()); + assertEquals(Integer.valueOf(80), + networkPolicy1.getEntries().getPolicyRule().get(0).getDstPorts().get(0).getStartPort()); + assertEquals(Integer.valueOf(81), + networkPolicy1.getEntries().getPolicyRule().get(0).getDstPorts().get(0).getEndPort()); + } + + @Test + public void listTungstenAddressPolicyTest() { + s_logger.debug("Create policy in Tungsten-Fabric"); + ApiObjectBase networkPolicy1 = tungstenApi.createTungstenPolicy("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "policy1", projectUuid); + + s_logger.debug("Check if network policy was listed in Tungsten-Fabric"); + List networkPolicyList = tungstenApi.listTungstenAddressPolicy(projectUuid, "policy1"); + assertEquals(List.of(networkPolicy1), networkPolicyList); + } + + @Test + public void listTungstenPolicyTest() { + s_logger.debug("Create policy in Tungsten-Fabric"); + ApiObjectBase apiObjectBase1 = tungstenApi.createTungstenPolicy("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "policy1", projectUuid); + ApiObjectBase apiObjectBase2 = tungstenApi.createTungstenPolicy("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "policy2", projectUuid); + List policyList1 = Arrays.asList(apiObjectBase1, apiObjectBase2); + policyList1.sort(comparator); + List policyList2 = List.of(apiObjectBase1); + + s_logger.debug("Check if policy was listed all in Tungsten-Fabric"); + List policyList3 = tungstenApi.listTungstenPolicy(projectUuid, null); + assertEquals(policyList1, policyList3); + + s_logger.debug("Check if policy was listed with uuid in Tungsten-Fabric"); + List policyList4 = tungstenApi.listTungstenPolicy(projectUuid, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(policyList2, policyList4); + } + + @Test + public void listTungstenNetworkTest() { + s_logger.debug("Create network in Tungsten-Fabric"); + VirtualNetwork virtualNetwork1 = tungstenApi.createTungstenNetwork("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "network1", "network1", projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", + "10.0.0.20", false, false, ""); + VirtualNetwork virtualNetwork2 = tungstenApi.createTungstenNetwork("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "network2", "network2", projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", + "10.0.0.20", false, false, ""); + List networkList1 = Arrays.asList(virtualNetwork1, virtualNetwork2); + networkList1.sort(comparator); + List networkList2 = List.of(virtualNetwork1); + + s_logger.debug("Check if network was listed all in Tungsten-Fabric"); + List networkList3 = tungstenApi.listTungstenNetwork(projectUuid, null); + assertEquals(networkList1, networkList3); + + s_logger.debug("Check if network policy was listed with uuid in Tungsten-Fabric"); + List networkList4 = tungstenApi.listTungstenNetwork(projectUuid, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(networkList2, networkList4); + } + + @Test + public void listTungstenVmTest() { + s_logger.debug("Create vm in Tungsten-Fabric"); + VirtualMachine vm1 = tungstenApi.createTungstenVirtualMachine("005f0dea-0196-11ec-a1ed-b42e99f6e187", "vm1"); + VirtualMachine vm2 = tungstenApi.createTungstenVirtualMachine("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "vm2"); + List vmList1 = Arrays.asList(vm1, vm2); + vmList1.sort(comparator); + List vmList2 = List.of(vm1); + + s_logger.debug("Check if vm was listed all in Tungsten-Fabric"); + List vmList3 = tungstenApi.listTungstenVm(projectUuid, null); + vmList3.sort(comparator); + assertEquals(vmList1, vmList3); + + s_logger.debug("Check if policy was listed with uuid in Tungsten-Fabric"); + List vmList4 = tungstenApi.listTungstenVm(projectUuid, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(vmList2, vmList4); + } + + @Test + public void listTungstenNicTest() { + s_logger.debug("Create network in Tungsten-Fabric"); + tungstenApi.createTungstenNetwork("005f0dea-0196-11ec-a1ed-b42e99f6e187", "network1", "network1", projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + tungstenApi.createTungstenNetwork("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "network2", "network2", projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create vm in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine("7d5575eb-d029-467e-8b78-6056a8c94a71", "vm1"); + tungstenApi.createTungstenVirtualMachine("88729834-3ebd-413a-adf9-40aff73cf638", "vm2"); + + s_logger.debug("Creating vmi in Tungsten-Fabric."); + VirtualMachineInterface vmi1 = tungstenApi.createTungstenVmInterface("9291ae28-56cf-448c-b848-f2334b3c86da", + "vmi1", "02:fc:f3:d6:83:c3", "005f0dea-0196-11ec-a1ed-b42e99f6e187", "7d5575eb-d029-467e-8b78-6056a8c94a71", + projectUuid, "10.0.0.1", true); + VirtualMachineInterface vmi2 = tungstenApi.createTungstenVmInterface("124d0792-e890-4b7e-8fe8-1b7a6d63c66a", + "vmi2", "02:fc:f3:d6:83:c4", "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "88729834-3ebd-413a-adf9-40aff73cf638", + projectUuid, "10.0.0.1", true); + List vmiList1 = Arrays.asList(vmi1, vmi2); + vmiList1.sort(comparator); + List vmiList2 = List.of(vmi1); + + s_logger.debug("Check if vmi was listed all in Tungsten-Fabric"); + List vmiList3 = tungstenApi.listTungstenNic(projectUuid, null); + vmiList3.sort(comparator); + assertEquals(vmiList1, vmiList3); + + s_logger.debug("Check if vmi was listed with uuid in Tungsten-Fabric"); + List vmList4 = tungstenApi.listTungstenNic(projectUuid, + "9291ae28-56cf-448c-b848-f2334b3c86da"); + assertEquals(vmiList2, vmList4); + } + + @Test + public void listTungstenTagTest() { + s_logger.debug("Create tag in Tungsten-Fabric"); + ApiObjectBase apiObjectBase1 = tungstenApi.createTungstenTag("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype1", + "tagvalue1", "123"); + ApiObjectBase apiObjectBase2 = tungstenApi.createTungstenTag("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "tagtype2", + "tagvalue2", "123"); + ApiObjectBase apiObjectBase3 = tungstenApi.createTungstenTag("7d5575eb-d029-467e-8b78-6056a8c94a71", "tagtype3", + "tagvalue3", "123"); + ApiObjectBase apiObjectBase4 = tungstenApi.createTungstenTag("88729834-3ebd-413a-adf9-40aff73cf638", "tagtype4", + "tagvalue4", "123"); + ApiObjectBase apiObjectBase5 = tungstenApi.createTungstenTag("105f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype5", + "tagvalue5", "123"); + ApiObjectBase apiObjectBase6 = tungstenApi.createTungstenTag("7b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "tagtype6", + "tagvalue6", "123"); + ApiObjectBase apiObjectBase7 = tungstenApi.createTungstenTag("8d5575eb-d029-467e-8b78-6056a8c94a71", "tagtype7", + "tagvalue7", "123"); + ApiObjectBase apiObjectBase8 = tungstenApi.createTungstenTag("98729834-3ebd-413a-adf9-40aff73cf638", "tagtype8", + "tagvalue8", "123"); + List listTag = Arrays.asList(apiObjectBase1); + List listTag1 = Arrays.asList(apiObjectBase1, apiObjectBase2); + List listTag2 = Arrays.asList(apiObjectBase3, apiObjectBase4); + List listTag3 = Arrays.asList(apiObjectBase5, apiObjectBase6); + List listTag4 = Arrays.asList(apiObjectBase7, apiObjectBase8); + List listTag5 = Arrays.asList(apiObjectBase1, apiObjectBase2, apiObjectBase3, + apiObjectBase4, apiObjectBase5, apiObjectBase6, apiObjectBase7, apiObjectBase8); + listTag1.sort(comparator); + listTag2.sort(comparator); + listTag3.sort(comparator); + listTag4.sort(comparator); + listTag5.sort(comparator); + + s_logger.debug("Create network and apply tag in Tungsten-Fabric"); + tungstenApi.createTungstenNetwork("9291ae28-56cf-448c-b848-f2334b3c86da", "network1", "network1", projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + tungstenApi.applyTungstenNetworkTag(List.of("9291ae28-56cf-448c-b848-f2334b3c86da"), + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + tungstenApi.applyTungstenNetworkTag(List.of("9291ae28-56cf-448c-b848-f2334b3c86da"), + "6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe"); + + s_logger.debug("Create vm and apply tag in Tungsten-Fabric"); + tungstenApi.createTungstenVirtualMachine("124d0792-e890-4b7e-8fe8-1b7a6d63c66a", "vm1"); + tungstenApi.applyTungstenVmTag(List.of("124d0792-e890-4b7e-8fe8-1b7a6d63c66a"), + "7d5575eb-d029-467e-8b78-6056a8c94a71"); + tungstenApi.applyTungstenVmTag(List.of("124d0792-e890-4b7e-8fe8-1b7a6d63c66a"), + "88729834-3ebd-413a-adf9-40aff73cf638"); + + s_logger.debug("Creating vmi and apply tag in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", "vmi1", "02:fc:f3:d6:83:c3", + "9291ae28-56cf-448c-b848-f2334b3c86da", "124d0792-e890-4b7e-8fe8-1b7a6d63c66a", projectUuid, "10.0.0.1", true); + tungstenApi.applyTungstenNicTag(List.of("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d"), + "105f0dea-0196-11ec-a1ed-b42e99f6e187"); + tungstenApi.applyTungstenNicTag(List.of("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d"), + "7b062909-ba9d-4cf3-bbd3-7db93cf6b4fe"); + + s_logger.debug("Creating policy and apply tag in Tungsten-Fabric."); + tungstenApi.createTungstenPolicy("205f0dea-0196-11ec-a1ed-b42e99f6e187", "policy", projectUuid); + tungstenApi.applyTungstenPolicyTag("205f0dea-0196-11ec-a1ed-b42e99f6e187", + "8d5575eb-d029-467e-8b78-6056a8c94a71"); + tungstenApi.applyTungstenPolicyTag("205f0dea-0196-11ec-a1ed-b42e99f6e187", + "98729834-3ebd-413a-adf9-40aff73cf638"); + + s_logger.debug("Check if tag was listed with network in Tungsten-Fabric"); + List listTag6 = tungstenApi.listTungstenTag("9291ae28-56cf-448c-b848-f2334b3c86da", + null, null, null, null, null); + listTag6.sort(comparator); + assertEquals(listTag1, listTag6); + + s_logger.debug("Check if tag was listed with vm in Tungsten-Fabric"); + List listTag7 = tungstenApi.listTungstenTag(null, + "124d0792-e890-4b7e-8fe8-1b7a6d63c66a", null, null, null + , null); + listTag7.sort(comparator); + assertEquals(listTag2, listTag7); + + s_logger.debug("Check if tag was listed with nic in Tungsten-Fabric"); + List listTag8 = tungstenApi.listTungstenTag(null, null, + "c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", null, null, + null); + listTag8.sort(comparator); + assertEquals(listTag3, listTag8); + + s_logger.debug("Check if tag was listed with policy in Tungsten-Fabric"); + List listTag9 = tungstenApi.listTungstenTag(null, null, null, + "205f0dea-0196-11ec-a1ed-b42e99f6e187", null, null); + listTag9.sort(comparator); + assertEquals(listTag4, listTag9); + + s_logger.debug("Check if tag was listed all in Tungsten-Fabric"); + List listTag10 = tungstenApi.listTungstenTag(null, null, null, null, null, null); + listTag10.sort(comparator); + assertEquals(listTag5, listTag10); + + s_logger.debug("Check if tag was listed with uuid in Tungsten-Fabric"); + List listTag11 = tungstenApi.listTungstenTag(null, null, null, null, + null, "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + listTag11.sort(comparator); + assertEquals(listTag, listTag11); + } + + @Test + public void listTungstenTagTypeTest() { + s_logger.debug("Create tag type in Tungsten-Fabric"); + ApiObjectBase tagType1 = tungstenApi.createTungstenTagType("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype1"); + ApiObjectBase tagType2 = tungstenApi.createTungstenTagType("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "tagtype2"); + List tagTypeList1 = Arrays.asList(tagType1, tagType2); + tagTypeList1.sort(comparator); + List tagTypeList2 = List.of(tagType1); + + s_logger.debug("Check if tag type was listed all in Tungsten-Fabric"); + List tagTypeList3 = tungstenApi.listTungstenTagType(null); + tagTypeList3.sort(comparator); + assertEquals(tagTypeList1, tagTypeList3); + + s_logger.debug("Check if tag type was listed with uuid in Tungsten-Fabric"); + List tagTypeList4 = tungstenApi.listTungstenTagType( + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(tagTypeList2, tagTypeList4); + } + + @Test + public void listTungstenNetworkPolicyTest() { + s_logger.debug("Create network in Tungsten-Fabric"); + tungstenApi.createTungstenNetwork("005f0dea-0196-11ec-a1ed-b42e99f6e187", "network1", "network1", projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create policy in Tungsten-Fabric"); + ApiObjectBase apiObjectBase1 = tungstenApi.createTungstenPolicy("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", + "policy1", projectUuid); + ApiObjectBase apiObjectBase2 = tungstenApi.createTungstenPolicy("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "policy2", projectUuid); + List policyList1 = Arrays.asList(apiObjectBase1, apiObjectBase2); + List policyList2 = List.of(apiObjectBase1); + policyList1.sort(comparator); + + s_logger.debug("Apply network policy to network in Tungsten-Fabric."); + tungstenApi.applyTungstenNetworkPolicy("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", 1, 1); + tungstenApi.applyTungstenNetworkPolicy("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", 1, 2); + + s_logger.debug("Check if network policy was listed all in Tungsten-Fabric"); + List policyList3 = tungstenApi.listTungstenNetworkPolicy( + "005f0dea-0196-11ec-a1ed-b42e99f6e187", null); + assertEquals(policyList1, policyList3); + + s_logger.debug("Check if network policy was listed with uuid in Tungsten-Fabric"); + List policyList4 = tungstenApi.listTungstenNetworkPolicy( + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe"); + assertEquals(policyList2, policyList4); + } + + @Test + public void listTungstenApplicationPolicySetTest() { + s_logger.debug("Create application policy set in Tungsten-Fabric"); + ApiObjectBase applicationPolicySet1 = tungstenApi.createTungstenApplicationPolicySet( + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "aps1"); + ApiObjectBase applicationPolicySet2 = tungstenApi.createTungstenApplicationPolicySet( + "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "aps2"); + List apsList1 = Arrays.asList(applicationPolicySet1, applicationPolicySet2); + apsList1.sort(comparator); + List apsList2 = List.of(applicationPolicySet1); + + s_logger.debug("Check if application policy set was listed all in Tungsten-Fabric"); + List apsList3 = tungstenApi.listTungstenApplicationPolicySet(null); + apsList3.sort(comparator); + assertEquals(apsList1, apsList3); + + s_logger.debug("Check if application policy set was listed with uuid in Tungsten-Fabric"); + List apsList4 = tungstenApi.listTungstenApplicationPolicySet( + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(apsList2, apsList4); + } + + @Test + public void listTungstenFirewallPolicyTest() { + s_logger.debug("Create application policy set in Tungsten-Fabric"); + tungstenApi.createTungstenApplicationPolicySet("f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "aps1"); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("7d5575eb-d029-467e-8b78-6056a8c94a71", "tagtype1", "tagvalue1", "123"); + + s_logger.debug("Create firewall policy in Tungsten-Fabric"); + ApiObjectBase fwPolicy1 = tungstenApi.createTungstenFirewallPolicy("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "firewallpolicy1", 1); + ApiObjectBase fwPolicy2 = tungstenApi.createTungstenFirewallPolicy("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "firewallpolicy2", 1); + List fwPolicyList1 = Arrays.asList(fwPolicy1, fwPolicy2); + fwPolicyList1.sort(comparator); + List fwPolicyList2 = List.of(fwPolicy1); + + s_logger.debug("Check if firewall policy set was listed all with application policy set in Tungsten-Fabric"); + List fwPolicyList3 = tungstenApi.listTungstenFirewallPolicy( + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", null); + fwPolicyList3.sort(comparator); + assertEquals(fwPolicyList1, fwPolicyList3); + + s_logger.debug( + "Check if firewall policy set was listed with uuid and application policy set in Tungsten-Fabric"); + List fwPolicyList4 = tungstenApi.listTungstenFirewallPolicy( + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4"); + assertEquals(fwPolicyList2, fwPolicyList4); + } + + @Test + public void listTungstenFirewallRuleTest() { + s_logger.debug("Create application policy set in Tungsten-Fabric"); + tungstenApi.createTungstenApplicationPolicySet("f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "aps"); + + s_logger.debug("Create firewall policy in Tungsten-Fabric"); + tungstenApi.createTungstenFirewallPolicy("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "firewallpolicy", 1); + + s_logger.debug("Create service group in Tungsten-Fabric"); + tungstenApi.createTungstenServiceGroup("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "servicegroup1", "tcp", 80, 90); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "tagtype1", "tagvalue1", "123"); + + s_logger.debug("Create tag in Tungsten-Fabric"); + tungstenApi.createTungstenTag("7d5575eb-d029-467e-8b78-6056a8c94a71", "tagtype2", "tagvalue2", "123"); + + s_logger.debug("Create address group in Tungsten-Fabric"); + tungstenApi.createTungstenAddressGroup("88729834-3ebd-413a-adf9-40aff73cf638", "addressgroup1", "10.0.0.0", 24); + + s_logger.debug("Create address group in Tungsten-Fabric"); + tungstenApi.createTungstenAddressGroup("9291ae28-56cf-448c-b848-f2334b3c86da", "addressgroup2", "10.0.0.0", 24); + + s_logger.debug("Create tag type in Tungsten-Fabric"); + tungstenApi.createTungstenTagType("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", "tagtype1"); + + s_logger.debug("Create firewall rule in Tungsten-Fabric"); + ApiObjectBase firewallRule1 = tungstenApi.createTungstenFirewallRule("124d0792-e890-4b7e-8fe8-1b7a6d63c66a", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "firewallrule1", "pass", "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "88729834-3ebd-413a-adf9-40aff73cf638", null, ">", + "7d5575eb-d029-467e-8b78-6056a8c94a71", "9291ae28-56cf-448c-b848-f2334b3c86da", + null, "c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", 1); + ApiObjectBase firewallRule2 = tungstenApi.createTungstenFirewallRule("224d0792-e890-4b7e-8fe8-1b7a6d63c66a", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "firewallrule2", "pass", "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", "88729834-3ebd-413a-adf9-40aff73cf638", null, ">", + "7d5575eb-d029-467e-8b78-6056a8c94a71", "9291ae28-56cf-448c-b848-f2334b3c86da", + null, "c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", 1); + + List fwRuleList1 = Arrays.asList(firewallRule1, firewallRule2); + fwRuleList1.sort(comparator); + List fwRuleList2 = List.of(firewallRule1); + + s_logger.debug("Check if firewall rule set was listed all with firewall policy in Tungsten-Fabric"); + List fwRuleList3 = tungstenApi.listTungstenFirewallRule( + "005f0dea-0196-11ec-a1ed-b42e99f6e187", null); + fwRuleList3.sort(comparator); + assertEquals(fwRuleList1, fwRuleList3); + + s_logger.debug("Check if firewall rule set was listed with uuid and firewall policy in Tungsten-Fabric"); + List fwRuleList4 = tungstenApi.listTungstenFirewallRule( + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "124d0792-e890-4b7e-8fe8-1b7a6d63c66a"); + assertEquals(fwRuleList2, fwRuleList4); + } + + @Test + public void listTungstenServiceGroupTest() { + s_logger.debug("Create service group in Tungsten-Fabric"); + ApiObjectBase serviceGroup1 = tungstenApi.createTungstenServiceGroup("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "serviceGroup1", "tcp", 80, 80); + ApiObjectBase serviceGroup2 = tungstenApi.createTungstenServiceGroup("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "serviceGroup2", "tcp", 80, 80); + List serviceGroupList1 = Arrays.asList(serviceGroup1, serviceGroup2); + serviceGroupList1.sort(comparator); + List serviceGroupList2 = List.of(serviceGroup1); + + s_logger.debug("Check if service group was listed all in Tungsten-Fabric"); + List serviceGroupList3 = tungstenApi.listTungstenServiceGroup(null); + serviceGroupList3.sort(comparator); + assertEquals(serviceGroupList1, serviceGroupList3); + + s_logger.debug("Check if tag type was listed with uuid in Tungsten-Fabric"); + List serviceGroupList4 = tungstenApi.listTungstenServiceGroup( + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(serviceGroupList2, serviceGroupList4); + } + + @Test + public void listTungstenAddressGroupTest() { + s_logger.debug("Create address group in Tungsten-Fabric"); + ApiObjectBase addressGroup1 = tungstenApi.createTungstenAddressGroup("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "addressGroup1", "10.0.0.0", 24); + ApiObjectBase addressGroup2 = tungstenApi.createTungstenAddressGroup("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "addressGroup2", "10.0.0.0", 24); + List addressGroupList1 = Arrays.asList(addressGroup1, addressGroup2); + addressGroupList1.sort(comparator); + List addressGroupList2 = List.of(addressGroup1); + + s_logger.debug("Check if service group was listed all in Tungsten-Fabric"); + List addressGroupList3 = tungstenApi.listTungstenAddressGroup(null); + addressGroupList3.sort(comparator); + assertEquals(addressGroupList1, addressGroupList3); + + s_logger.debug("Check if service group was listed with uuid in Tungsten-Fabric"); + List addressGroupList4 = tungstenApi.listTungstenAddressGroup( + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(addressGroupList2, addressGroupList4); + } + + @Test + public void removeTungstenNetworkPolicyRuleTest() { + s_logger.debug("Create policy in Tungsten-Fabric"); + tungstenApi.createTungstenPolicy("005f0dea-0196-11ec-a1ed-b42e99f6e187", "policy", projectUuid); + + s_logger.debug("Add policy rule in Tungsten-Fabric"); + tungstenApi.addTungstenPolicyRule("c1680d93-2614-4f99-a8c5-d4f11b3dfc9d", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "pass", "tcp", ">", "network1", "192.168.100.0", 24, 8080, 8081, + "network2", "10.0.0.0", 16, 80, 81); + + s_logger.debug("Check if policy rule was add to network policy in Tungsten-Fabric"); + NetworkPolicy networkPolicy1 = (NetworkPolicy) tungstenApi.getTungstenObject(NetworkPolicy.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(1, networkPolicy1.getEntries().getPolicyRule().size()); + + s_logger.debug("Check if policy rule was remove from network policy in Tungsten-Fabric"); + assertNotNull(tungstenApi.removeTungstenNetworkPolicyRule("005f0dea-0196-11ec-a1ed-b42e99f6e187", + "c1680d93-2614-4f99-a8c5-d4f11b3dfc9d")); + NetworkPolicy networkPolicy2 = (NetworkPolicy) tungstenApi.getTungstenObject(NetworkPolicy.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(0, networkPolicy2.getEntries().getPolicyRule().size()); + } + + @Test + public void updateTungstenVrouterConfig() { + GlobalVrouterConfig globalVrouterConfig = (GlobalVrouterConfig) tungstenApi.updateTungstenVrouterConfig("l3"); + assertEquals("l3", globalVrouterConfig.getForwardingMode()); + } + + @Test + public void deleteTungstenObjectTest() { + s_logger.debug("Create tag type in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenTagType("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype")); + + s_logger.debug("Check if tag type was deleted in Tungsten-Fabric"); + ApiObjectBase apiObjectBase = tungstenApi.getTungstenObject(TagType.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertTrue(tungstenApi.deleteTungstenObject(apiObjectBase)); + assertNull(tungstenApi.getTungstenObject(TagType.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void deleteTungstenObjectWithUuidTest() { + s_logger.debug("Create tag type in Tungsten-Fabric"); + assertNotNull(tungstenApi.createTungstenTagType("005f0dea-0196-11ec-a1ed-b42e99f6e187", "tagtype")); + + s_logger.debug("Check if tag type was deleted in Tungsten-Fabric"); + assertTrue(tungstenApi.deleteTungstenObject(TagType.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + assertNull(tungstenApi.getTungstenObject(TagType.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void getTungstenListObjectTest() { + s_logger.debug("Create network in Tungsten-Fabric"); + VirtualNetwork network1 = tungstenApi.createTungstenNetwork("005f0dea-0196-11ec-a1ed-b42e99f6e187", "network1", + "network1", projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", + false, false, ""); + VirtualNetwork network2 = tungstenApi.createTungstenNetwork("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "network2", + "network2", projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", + false, false, ""); + List list1 = Arrays.asList(network1, network2); + list1.sort(comparator); + List list2 = List.of(network1); + + s_logger.debug("Check if network was listed all in Tungsten-Fabric"); + List list3 = tungstenApi.getTungstenListObject(VirtualNetwork.class, project, null); + list3.sort(comparator); + assertEquals(list1, list3); + + s_logger.debug("Check if network was listed with uuid in Tungsten-Fabric"); + List list4 = tungstenApi.getTungstenListObject(VirtualNetwork.class, null, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(list2, list4); + } + + @Test + public void addInstanceToSecurityGroupTest() { + String projectFqn = TungstenApi.TUNGSTEN_DEFAULT_DOMAIN + ":" + TungstenApi.TUNGSTEN_DEFAULT_PROJECT; + + s_logger.debug("Create a security group in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenSecurityGroup(tungstenSecurityGroupUuid, tungstenSecurityGroupName, + "TungstenSecurityGroupDescription", projectFqn)); + + s_logger.debug("Create virtual network in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, + projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, + "")); + + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + assertNotNull(tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName)); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + assertNotNull( + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true)); + + s_logger.debug("Check if instance have no security group in Tungsten-Fabric."); + VirtualMachineInterface virtualMachineInterface1 = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertNull(virtualMachineInterface1.getSecurityGroup()); + assertFalse(virtualMachineInterface1.getPortSecurityEnabled()); + + s_logger.debug("Add instance to security group in Tungsten-Fabric."); + tungstenApi.addInstanceToSecurityGroup(vmiUuid, List.of(tungstenSecurityGroupUuid)); + + s_logger.debug("Check if instance was added to security group in Tungsten-Fabric."); + VirtualMachineInterface virtualMachineInterface2 = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertEquals(1, virtualMachineInterface2.getSecurityGroup().size()); + assertEquals(tungstenSecurityGroupUuid, virtualMachineInterface2.getSecurityGroup().get(0).getUuid()); + assertTrue(virtualMachineInterface2.getPortSecurityEnabled()); + } + + @Test + public void removeInstanceFromSecurityGroupTest() { + String projectFqn = TungstenApi.TUNGSTEN_DEFAULT_DOMAIN + ":" + TungstenApi.TUNGSTEN_DEFAULT_PROJECT; + + s_logger.debug("Create a security group in Tungsten-Fabric."); + tungstenApi.createTungstenSecurityGroup(tungstenSecurityGroupUuid, tungstenSecurityGroupName, + "TungstenSecurityGroupDescription", projectFqn); + + s_logger.debug("Create virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Add instance to security group in Tungsten-Fabric."); + tungstenApi.addInstanceToSecurityGroup(vmiUuid, List.of(tungstenSecurityGroupUuid)); + + s_logger.debug("Check if instance was added to security group in Tungsten-Fabric."); + VirtualMachineInterface virtualMachineInterface1 = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertEquals(1, virtualMachineInterface1.getSecurityGroup().size()); + + s_logger.debug("Remove instance from security group in Tungsten-Fabric."); + assertTrue(tungstenApi.removeInstanceFromSecurityGroup(vmiUuid, List.of(tungstenSecurityGroupUuid))); + + s_logger.debug("Check if instance was removed from security group in Tungsten-Fabric."); + VirtualMachineInterface virtualMachineInterface2 = (VirtualMachineInterface) tungstenApi.getTungstenObject( + VirtualMachineInterface.class, vmiUuid); + assertEquals(0, virtualMachineInterface2.getSecurityGroup().size()); + assertFalse(virtualMachineInterface2.getPortSecurityEnabled()); + } + + @Test + public void addSecondaryIpAddressTest() { + s_logger.debug("Create virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if secondary ip address was not exist in Tungsten-Fabric."); + assertNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "secondaryip")); + + s_logger.debug("Check if secondary ip address was added to nic in Tungsten-Fabric."); + assertTrue(tungstenApi.addSecondaryIpAddress(tungstenNetworkUuid, vmiUuid, "secondaryip1", "10.0.0.100")); + InstanceIp instanceIp2 = (InstanceIp) tungstenApi.getTungstenObjectByName(InstanceIp.class, null, + "secondaryip1"); + assertEquals("10.0.0.100", instanceIp2.getAddress()); + assertEquals(tungstenNetworkUuid, instanceIp2.getVirtualNetwork().get(0).getUuid()); + assertEquals(vmiUuid, instanceIp2.getVirtualMachineInterface().get(0).getUuid()); + assertTrue(instanceIp2.getSecondary()); + + s_logger.debug("Check if secondary ip address with ip v6 was added to nic in Tungsten-Fabric."); + assertTrue(tungstenApi.addSecondaryIpAddress(tungstenNetworkUuid, vmiUuid, "secondaryip2", "fd00::100")); + InstanceIp instanceIp3 = (InstanceIp) tungstenApi.getTungstenObjectByName(InstanceIp.class, null, + "secondaryip2"); + assertEquals("fd00::100", instanceIp3.getAddress()); + assertEquals("v6", instanceIp3.getFamily()); + } + + @Test + public void removeSecondaryIpAddressTest() { + s_logger.debug("Create virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create virtual machine in Tungsten-Fabric."); + tungstenApi.createTungstenVirtualMachine(tungstenVmUuid, tungstenVmName); + + s_logger.debug("Create virtual machine interface in Tungsten-Fabric."); + tungstenApi.createTungstenVmInterface(vmiUuid, vmiName, "02:fc:f3:d6:83:c3", tungstenNetworkUuid, tungstenVmUuid, + projectUuid, "10.0.0.1", true); + + s_logger.debug("Check if secondary ip address was added to nic in Tungsten-Fabric."); + assertTrue(tungstenApi.addSecondaryIpAddress(tungstenNetworkUuid, vmiUuid, "secondaryip", "10.0.0.100")); + assertNotNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "secondaryip")); + + s_logger.debug("Check if secondary ip address was removed from nic in Tungsten-Fabric."); + assertTrue(tungstenApi.removeSecondaryIpAddress("secondaryip")); + assertNull(tungstenApi.getTungstenObjectByName(InstanceIp.class, null, "secondaryip")); + } + + @Test + public void createRoutingLogicalRouterTest() { + s_logger.debug("Check if logical router was not exist in Tungsten-Fabric."); + assertNull(tungstenApi.getTungstenObject(LogicalRouter.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + + s_logger.debug("Check if logical router was created in Tungsten-Fabric."); + assertNotNull(tungstenApi.createRoutingLogicalRouter(projectUuid, "005f0dea-0196-11ec-a1ed-b42e99f6e187", + "TungstenLogicalRouter")); + assertNotNull(tungstenApi.getTungstenObject(LogicalRouter.class, "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + } + + @Test + public void listRoutingLogicalRouterTest() { + s_logger.debug("Create logical router in Tungsten-Fabric."); + ApiObjectBase apiObjectBase1 = tungstenApi.createRoutingLogicalRouter(projectUuid, + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "logicalRouter1"); + ApiObjectBase apiObjectBase2 = tungstenApi.createRoutingLogicalRouter(projectUuid, + "baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", "logicalRouter2"); + List list1 = Arrays.asList(apiObjectBase1, apiObjectBase2); + list1.sort(comparator); + List list2 = List.of(apiObjectBase1); + + s_logger.debug("Check if logical router was listed all in Tungsten-Fabric."); + List list3 = tungstenApi.listRoutingLogicalRouter(null); + list3.sort(comparator); + assertEquals(list1, list3); + List list4 = tungstenApi.listRoutingLogicalRouter("005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(list2, list4); + } + + @Test + public void addNetworkGatewayToLogicalRouterTest() { + s_logger.debug("Create virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + false, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create logical router in Tungsten-Fabric."); + tungstenApi.createRoutingLogicalRouter(projectUuid, "005f0dea-0196-11ec-a1ed-b42e99f6e187", "logicalRouter1"); + + s_logger.debug("Check if logical router have no network gateway in Tungsten-Fabric."); + LogicalRouter logicalRouter1 = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertNull(logicalRouter1.getVirtualMachineInterface()); + + s_logger.debug("Check if network gateway was added to logical router in Tungsten-Fabric."); + assertNotNull( + tungstenApi.addNetworkGatewayToLogicalRouter(tungstenNetworkUuid, "005f0dea-0196-11ec-a1ed-b42e99f6e187", + "192.168.100.100")); + LogicalRouter logicalRouter2 = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(1, logicalRouter2.getVirtualMachineInterface().size()); + } + + @Test + public void removeNetworkGatewayFromLogicalRouterTest() { + s_logger.debug("Create virtual network in Tungsten-Fabric."); + tungstenApi.createTungstenNetwork(tungstenNetworkUuid, tungstenNetworkName, tungstenNetworkName, projectUuid, + false, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", "10.0.0.20", false, false, ""); + + s_logger.debug("Create logical router in Tungsten-Fabric."); + tungstenApi.createRoutingLogicalRouter(projectUuid, "005f0dea-0196-11ec-a1ed-b42e99f6e187", "logicalRouter1"); + + s_logger.debug("Check if network gateway was added to logical router in Tungsten-Fabric."); + assertNotNull( + tungstenApi.addNetworkGatewayToLogicalRouter(tungstenNetworkUuid, "005f0dea-0196-11ec-a1ed-b42e99f6e187", + "192.168.100.100")); + LogicalRouter logicalRouter1 = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(1, logicalRouter1.getVirtualMachineInterface().size()); + + s_logger.debug("Check if network gateway was removed from logical router in Tungsten-Fabric."); + assertNotNull(tungstenApi.removeNetworkGatewayFromLogicalRouter(tungstenNetworkUuid, + "005f0dea-0196-11ec-a1ed-b42e99f6e187")); + LogicalRouter logicalRouter2 = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + assertEquals(0, logicalRouter2.getVirtualMachineInterface().size()); + } + + @Test + public void listConnectedNetworkFromLogicalRouterTest() { + s_logger.debug("Create network in Tungsten-Fabric"); + VirtualNetwork virtualNetwork1 = tungstenApi.createTungstenNetwork("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", + "network1", "network1", projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", + "10.0.0.20", false, false, ""); + VirtualNetwork virtualNetwork2 = tungstenApi.createTungstenNetwork("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "network2", "network2", projectUuid, true, false, "10.0.0.0", 24, "10.0.0.1", true, null, "10.0.0.10", + "10.0.0.20", false, false, ""); + List list1 = Arrays.asList(virtualNetwork1, virtualNetwork2); + list1.sort(comparator); + + s_logger.debug("Create logical router in Tungsten-Fabric."); + tungstenApi.createRoutingLogicalRouter(projectUuid, "005f0dea-0196-11ec-a1ed-b42e99f6e187", "logicalRouter"); + + s_logger.debug("Add network gateway to logical router in Tungsten-Fabric."); + tungstenApi.addNetworkGatewayToLogicalRouter("6b062909-ba9d-4cf3-bbd3-7db93cf6b4fe", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "192.168.100.100"); + tungstenApi.addNetworkGatewayToLogicalRouter("baf714fa-80a1-454f-9c32-c4d4a6f5c5a4", + "005f0dea-0196-11ec-a1ed-b42e99f6e187", "192.168.100.101"); + + s_logger.debug("Check if connected network in logical router was listed in Tungsten-Fabric."); + LogicalRouter logicalRouter = (LogicalRouter) tungstenApi.getTungstenObject(LogicalRouter.class, + "005f0dea-0196-11ec-a1ed-b42e99f6e187"); + List list2 = tungstenApi.listConnectedNetworkFromLogicalRouter(logicalRouter); + list2.sort(comparator); + assertEquals(list1, list2); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenElementTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenElementTest.java new file mode 100644 index 00000000000..bad5669d7ac --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenElementTest.java @@ -0,0 +1,1061 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +import com.cloud.agent.AgentManager; +import com.cloud.api.ApiDBUtils; +import com.cloud.configuration.Config; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.HostPodVO; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.HostPodDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.Networks; +import com.cloud.network.PhysicalNetworkServiceProvider; +import com.cloud.network.TungstenGuestNetworkIpAddressVO; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.LoadBalancerCertMapDao; +import com.cloud.network.dao.LoadBalancerDao; +import com.cloud.network.dao.LoadBalancerVMMapDao; +import com.cloud.network.dao.LoadBalancerVMMapVO; +import com.cloud.network.dao.LoadBalancerVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.NetworkServiceMapDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; +import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.dao.TungstenGuestNetworkIpAddressDao; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.network.rules.PortForwardingRule; +import com.cloud.network.rules.StaticNatImpl; +import com.cloud.user.AccountManager; +import com.cloud.user.User; +import com.cloud.uservm.UserVm; +import com.cloud.utils.EncryptionUtil; +import com.cloud.utils.Pair; +import com.cloud.utils.TungstenUtils; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.fsm.StateMachine2; +import com.cloud.utils.net.Ip; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.VMInstanceDao; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenPortForwardingCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AssignTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkLoadbalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenVirtualMachineCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVRouterPortCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmInterfaceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ReleaseTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerHealthMonitorCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerListenerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerMemberCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadBalancerPoolCommand; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorDao; +import org.apache.cloudstack.network.tungsten.dao.TungstenFabricLBHealthMonitorVO; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ApiDBUtils.class, EncryptionUtil.class}) +public class TungstenElementTest { + @Mock + TungstenFabricUtils tungstenFabricUtils; + @Mock + NetworkModel networkModel; + @Mock + IPAddressDao ipAddressDao; + @Mock + VMInstanceDao vmInstanceDao; + @Mock + LoadBalancerVMMapDao lbVmMapDao; + @Mock + TungstenGuestNetworkIpAddressDao tungstenGuestNetworkIpAddressDao; + @Mock + IpAddressManager ipAddressMgr; + @Mock + ConfigurationDao configDao; + @Mock + LoadBalancerDao lbDao; + @Mock + AccountManager accountMgr; + @Mock + HostDao hostDao; + @Mock + MessageBus messageBus; + @Mock + PhysicalNetworkTrafficTypeDao physicalNetworkTrafficTypeDao; + @Mock + PhysicalNetworkDao physicalNetworkDao; + @Mock + TungstenProviderDao tungstenProviderDao; + @Mock + DataCenterDao dataCenterDao; + @Mock + VlanDao vlanDao; + @Mock + NetworkServiceMapDao networkServiceMapDao; + @Mock + HostPodDao hostPodDao; + @Mock + NetworkDetailsDao networkDetailsDao; + @Mock + AgentManager agentManager; + @Mock + NetworkDao networkDao; + @Mock + TungstenService tungstenService; + @Mock + TungstenFabricLBHealthMonitorDao tungstenFabricLBHealthMonitorDao; + @Mock + LoadBalancerCertMapDao loadBalancerCertMapDao; + + TungstenElement tungstenElement; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + tungstenElement = new TungstenElement(); + tungstenElement.tungstenFabricUtils = tungstenFabricUtils; + tungstenElement.networkModel = networkModel; + tungstenElement.ipAddressDao = ipAddressDao; + tungstenElement.vmInstanceDao = vmInstanceDao; + tungstenElement.lbVmMapDao = lbVmMapDao; + tungstenElement.tungstenGuestNetworkIpAddressDao = tungstenGuestNetworkIpAddressDao; + tungstenElement.ipAddressMgr = ipAddressMgr; + tungstenElement.configDao = configDao; + tungstenElement.lbDao = lbDao; + tungstenElement.accountMgr = accountMgr; + tungstenElement.hostDao = hostDao; + tungstenElement.messageBus = messageBus; + tungstenElement.physicalNetworkDao = physicalNetworkDao; + tungstenElement.tungstenService = tungstenService; + tungstenElement.tungstenProviderDao = tungstenProviderDao; + tungstenElement.dataCenterDao = dataCenterDao; + tungstenElement.vlanDao = vlanDao; + tungstenElement.networkServiceMapDao = networkServiceMapDao; + tungstenElement.podDao = hostPodDao; + tungstenElement.agentMgr = agentManager; + tungstenElement.networkDetailsDao = networkDetailsDao; + tungstenElement.networkDao = networkDao; + tungstenElement.physicalNetworkTrafficTypeDao = physicalNetworkTrafficTypeDao; + tungstenElement.tungstenFabricLBHealthMonitorDao = tungstenFabricLBHealthMonitorDao; + tungstenElement.loadBalancerCertMapDao = loadBalancerCertMapDao; + + mockStatic(ApiDBUtils.class); + mockStatic(EncryptionUtil.class); + + when(tungstenService.getTungstenProjectFqn(any())).thenReturn("default-domain:default-project"); + } + + @Test + public void canHandleSuccessTest() { + Network network = mock(Network.class); + Network.Service service = mock(Network.Service.class); + + when(networkModel.isProviderForNetwork(any(), anyLong())).thenReturn(true); + + assertTrue(tungstenElement.canHandle(network, service)); + } + + @Test + public void canHandleFailTest() { + Network network = mock(Network.class); + Network.Service service = mock(Network.Service.class); + + when(networkModel.isProviderForNetwork(any(), anyLong())).thenReturn(false); + + assertFalse(tungstenElement.canHandle(network, service)); + } + + @Test + public void applyStaticNatsAddRuleSuccessTest() { + Network network = mock(Network.class); + StaticNatImpl staticNat = mock(StaticNatImpl.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + TungstenAnswer assignFloatingIpAnswer = mock(TungstenAnswer.class); + Nic nic = mock(Nic.class); + Network publicNetwork = mock(Network.class); + List staticNatList = List.of(staticNat); + + when(staticNat.isForRevoke()).thenReturn(false); + when(assignFloatingIpAnswer.getResult()).thenReturn(true); + when(ipAddressDao.findByIdIncludingRemoved(anyLong())).thenReturn(ipAddressVO); + when(vmInstanceDao.findByIdIncludingRemoved(anyLong())).thenReturn(vmInstanceVO); + when(networkModel.getNicInNetworkIncludingRemoved(anyLong(), anyLong())).thenReturn(nic); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(AssignTungstenFloatingIpCommand.class), anyLong())).thenReturn(assignFloatingIpAnswer); + + assertTrue(tungstenElement.applyStaticNats(network, staticNatList)); + } + + @Test + public void applyStaticNatsAddRuleFailTest() { + Network network = mock(Network.class); + StaticNatImpl staticNat = mock(StaticNatImpl.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + TungstenAnswer assignFloatingIpAnswer = mock(TungstenAnswer.class); + Nic nic = mock(Nic.class); + Network publicNetwork = mock(Network.class); + List staticNatList = List.of(staticNat); + + when(staticNat.isForRevoke()).thenReturn(false); + when(assignFloatingIpAnswer.getResult()).thenReturn(false); + when(ipAddressDao.findByIdIncludingRemoved(anyLong())).thenReturn(ipAddressVO); + when(vmInstanceDao.findByIdIncludingRemoved(anyLong())).thenReturn(vmInstanceVO); + when(networkModel.getNicInNetworkIncludingRemoved(anyLong(), anyLong())).thenReturn(nic); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(AssignTungstenFloatingIpCommand.class), anyLong())).thenReturn(assignFloatingIpAnswer); + + assertFalse(tungstenElement.applyStaticNats(network, staticNatList)); + } + + @Test + public void applyStaticNatsRevokeRuleSuccessTest() { + Network network = mock(Network.class); + StaticNatImpl staticNat = mock(StaticNatImpl.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + TungstenAnswer releaseFloatingIpAnswer = mock(TungstenAnswer.class); + Nic nic = mock(Nic.class); + Network publicNetwork = mock(Network.class); + List staticNatList = List.of(staticNat); + + when(staticNat.isForRevoke()).thenReturn(true); + when(releaseFloatingIpAnswer.getResult()).thenReturn(true); + when(ipAddressDao.findByIdIncludingRemoved(anyLong())).thenReturn(ipAddressVO); + when(vmInstanceDao.findByIdIncludingRemoved(anyLong())).thenReturn(vmInstanceVO); + when(networkModel.getNicInNetworkIncludingRemoved(anyLong(), anyLong())).thenReturn(nic); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(ReleaseTungstenFloatingIpCommand.class), anyLong())).thenReturn(releaseFloatingIpAnswer); + + assertTrue(tungstenElement.applyStaticNats(network, staticNatList)); + } + + @Test + public void applyStaticNatsRevokeRuleFailTest() { + Network network = mock(Network.class); + StaticNatImpl staticNat = mock(StaticNatImpl.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + TungstenAnswer releaseFloatingIpAnswer = mock(TungstenAnswer.class); + Nic nic = mock(Nic.class); + Network publicNetwork = mock(Network.class); + List staticNatList = List.of(staticNat); + + when(staticNat.isForRevoke()).thenReturn(true); + when(releaseFloatingIpAnswer.getResult()).thenReturn(false); + when(ipAddressDao.findByIdIncludingRemoved(anyLong())).thenReturn(ipAddressVO); + when(vmInstanceDao.findByIdIncludingRemoved(anyLong())).thenReturn(vmInstanceVO); + when(networkModel.getNicInNetworkIncludingRemoved(anyLong(), anyLong())).thenReturn(nic); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(ReleaseTungstenFloatingIpCommand.class), anyLong())).thenReturn(releaseFloatingIpAnswer); + + assertFalse(tungstenElement.applyStaticNats(network, staticNatList)); + } + + @Test + public void applyLBRulesAddRuleSuccessTest() { + User caller = mock(User.class); + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + Ip ip = mock(Ip.class); + LoadBalancingRule loadBalancingRule1 = mock(LoadBalancingRule.class); + LoadBalancerVMMapVO loadBalancerVMMapVO = mock(LoadBalancerVMMapVO.class); + LoadBalancerVO loadBalancerVO = mock(LoadBalancerVO.class); + LoadBalancingRule.LbStickinessPolicy lbStickinessPolicy = mock(LoadBalancingRule.LbStickinessPolicy.class); + List loadBalancingRuleList1 = List.of(loadBalancingRule1); + List loadBalancerVMMapVOList = List.of(loadBalancerVMMapVO); + List lbStickinessPolicyList = List.of(lbStickinessPolicy); + List loadBalancerVOList = List.of(loadBalancerVO); + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = mock(TungstenFabricLBHealthMonitorVO.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + TungstenAnswer createTungstenNetworkLoadbalancerAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenLoadBalancerPoolAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenLoadBalancerMemberAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenLoadBalancerListenerAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenHealthMonitorAnswer = mock(TungstenAnswer.class); + LoadBalancingRule.LbSslCert lbSslCert = mock(LoadBalancingRule.LbSslCert.class); + when(lbStickinessPolicy.getMethodName()).thenReturn("AppCookie"); + List> pairList = List.of(new Pair<>("cookieName", "cookieValue")); + + when(accountMgr.getActiveUser(anyLong())).thenReturn(caller); + when(caller.getApiKey()).thenReturn("apikey"); + when(caller.getSecretKey()).thenReturn("secreatekey"); + when(lbStickinessPolicy.getParams()).thenReturn(pairList); + when(loadBalancingRule1.getId()).thenReturn(1L); + when(loadBalancingRule1.getState()).thenReturn(FirewallRule.State.Add); + when(loadBalancingRule1.getAlgorithm()).thenReturn("roundrobin"); + when(loadBalancingRule1.getSourcePortStart()).thenReturn(443); + when(loadBalancingRule1.getDefaultPortStart()).thenReturn(443); + when(loadBalancingRule1.getStickinessPolicies()).thenReturn(lbStickinessPolicyList); + when(loadBalancingRule1.getSourceIp()).thenReturn(ip); + when(loadBalancingRule1.getLbSslCert()).thenReturn(lbSslCert); + when(loadBalancingRule1.getUuid()).thenReturn("loadbalancingruleuuid"); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(ipAddressVO.getAddress()).thenReturn(ip); + when(lbVmMapDao.listByLoadBalancerId(anyLong(), anyBoolean())).thenReturn(loadBalancerVMMapVOList); + when(tungstenGuestNetworkIpAddressVO.getGuestIpAddress()).thenReturn(ip); + when(ip.addr()).thenReturn("10.10.10.10"); + when(tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp(anyLong(), anyString())).thenReturn(tungstenGuestNetworkIpAddressVO); + when(ipAddressMgr.acquireGuestIpAddress(any(), any())).thenReturn("192.168.100.100"); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkLoadbalancerCommand.class), anyLong())).thenReturn(createTungstenNetworkLoadbalancerAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerPoolCommand.class), anyLong())).thenReturn(updateTungstenLoadBalancerPoolAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerMemberCommand.class), anyLong())).thenReturn(updateTungstenLoadBalancerMemberAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerListenerCommand.class), anyLong())).thenReturn(updateTungstenLoadBalancerListenerAnswer); + when(createTungstenNetworkLoadbalancerAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadBalancerPoolAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadBalancerMemberAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadBalancerListenerAnswer.getResult()).thenReturn(true); + when(updateTungstenHealthMonitorAnswer.getResult()).thenReturn(true); + when(configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key())).thenReturn("enabled"); + when(tungstenService.updateLoadBalancer(any(), any())).thenReturn(true); + when(lbDao.listByIpAddress(anyLong())).thenReturn(loadBalancerVOList); + when(EncryptionUtil.generateSignature(anyString(), anyString())).thenReturn("generatedString"); + when(tungstenFabricLBHealthMonitorDao.findByLbId(anyLong())).thenReturn(tungstenFabricLBHealthMonitorVO); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerHealthMonitorCommand.class), anyLong())).thenReturn(updateTungstenHealthMonitorAnswer); + + assertTrue(tungstenElement.applyLBRules(network, loadBalancingRuleList1)); + } + + @Test + public void applyLBRulesAddRuleFailTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + Ip ip = mock(Ip.class); + LoadBalancingRule loadBalancingRule1 = mock(LoadBalancingRule.class); + LoadBalancerVMMapVO loadBalancerVMMapVO = mock(LoadBalancerVMMapVO.class); + LoadBalancerVO loadBalancerVO = mock(LoadBalancerVO.class); + LoadBalancingRule.LbStickinessPolicy lbStickinessPolicy = mock(LoadBalancingRule.LbStickinessPolicy.class); + List loadBalancingRuleList1 = List.of(loadBalancingRule1); + List loadBalancerVMMapVOList = List.of(loadBalancerVMMapVO); + List lbStickinessPolicyList = List.of(lbStickinessPolicy); + List loadBalancerVOList = List.of(loadBalancerVO); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + TungstenAnswer createTungstenNetworkLoadbalancerAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenLoadBalancerPoolAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenLoadBalancerMemberAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenHealthMonitorAnswer = mock(TungstenAnswer.class); + List> pairList = List.of(new Pair<>("cookieName", "cookieValue")); + TungstenFabricLBHealthMonitorVO tungstenFabricLBHealthMonitorVO = mock(TungstenFabricLBHealthMonitorVO.class); + + when(lbStickinessPolicy.getMethodName()).thenReturn("AppCookie"); + when(lbStickinessPolicy.getParams()).thenReturn(pairList); + when(loadBalancingRule1.getId()).thenReturn(1L); + when(loadBalancingRule1.getState()).thenReturn(FirewallRule.State.Add); + when(loadBalancingRule1.getAlgorithm()).thenReturn("roundrobin"); + when(loadBalancingRule1.getSourcePortStart()).thenReturn(80); + when(loadBalancingRule1.getDefaultPortStart()).thenReturn(443); + when(loadBalancingRule1.getStickinessPolicies()).thenReturn(lbStickinessPolicyList); + when(loadBalancingRule1.getSourceIp()).thenReturn(ip); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(ipAddressVO.getAddress()).thenReturn(ip); + when(lbVmMapDao.listByLoadBalancerId(anyLong(), anyBoolean())).thenReturn(loadBalancerVMMapVOList); + when(tungstenGuestNetworkIpAddressVO.getGuestIpAddress()).thenReturn(ip); + when(ip.addr()).thenReturn("10.10.10.10"); + when(ipAddressMgr.acquireGuestIpAddress(any(), any())).thenReturn("192.168.100.100"); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkLoadbalancerCommand.class), anyLong())).thenReturn(createTungstenNetworkLoadbalancerAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerPoolCommand.class), anyLong())).thenReturn(updateTungstenLoadBalancerPoolAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerMemberCommand.class), anyLong())).thenReturn(updateTungstenLoadBalancerMemberAnswer); + when(createTungstenNetworkLoadbalancerAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadBalancerPoolAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadBalancerMemberAnswer.getResult()).thenReturn(true); + when(configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key())).thenReturn("disabled"); + when(tungstenService.updateLoadBalancerSsl(any(), any())).thenReturn(false); + when(lbDao.listByIpAddress(anyLong())).thenReturn(loadBalancerVOList); + when(tungstenFabricLBHealthMonitorDao.findByLbId(anyLong())).thenReturn(tungstenFabricLBHealthMonitorVO); + when(updateTungstenHealthMonitorAnswer.getResult()).thenReturn(true); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenLoadBalancerHealthMonitorCommand.class), anyLong())).thenReturn(updateTungstenHealthMonitorAnswer); + + assertFalse(tungstenElement.applyLBRules(network, loadBalancingRuleList1)); + } + + @Test + public void applyLBRulesRevokeRuleFailTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + Ip ip1 = mock(Ip.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + LoadBalancingRule loadBalancingRule1 = mock(LoadBalancingRule.class); + LoadBalancerVO loadBalancerVO1 = mock(LoadBalancerVO.class); + List loadBalancingRuleList1 = List.of(loadBalancingRule1); + List loadBalancerVOList1 = List.of(loadBalancerVO1); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + TungstenAnswer deleteTungstenLoadBalancerListenerAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenLoadBalancerCommand = mock(TungstenAnswer.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(loadBalancingRule1.getSourceIp()).thenReturn(ip1); + when(loadBalancingRule1.getState()).thenReturn(FirewallRule.State.Revoke); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(ipAddressVO.getAddress()).thenReturn(ip1); + when(ip1.addr()).thenReturn("10.10.10.10"); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenLoadBalancerListenerCommand.class), anyLong())).thenReturn(deleteTungstenLoadBalancerListenerAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenLoadBalancerCommand.class), anyLong())).thenReturn(deleteTungstenLoadBalancerCommand); + when(deleteTungstenLoadBalancerListenerAnswer.getResult()).thenReturn(true); + when(deleteTungstenLoadBalancerCommand.getResult()).thenReturn(true); + when(tungstenService.updateLoadBalancerSsl(any(), any())).thenReturn(false); + when(lbDao.listByIpAddress(anyLong())).thenReturn(loadBalancerVOList1); + when(tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp(anyLong(),anyString())).thenReturn(tungstenGuestNetworkIpAddressVO); + when(tungstenGuestNetworkIpAddressDao.remove(anyLong())).thenReturn(false); + + assertFalse(tungstenElement.applyLBRules(network, loadBalancingRuleList1)); + } + + @Test + public void applyLBRulesRevokeRuleSuccessTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + Ip ip = mock(Ip.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + LoadBalancingRule loadBalancingRule = mock(LoadBalancingRule.class); + LoadBalancerVO loadBalancerVO1 = mock(LoadBalancerVO.class); + LoadBalancerVO loadBalancerVO2 = mock(LoadBalancerVO.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + TungstenAnswer deleteTungstenLoadBalancerListenerAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenLoadBalancerCommand = mock(TungstenAnswer.class); + List loadBalancingRuleList = List.of(loadBalancingRule); + List loadBalancerVOList = Arrays.asList(loadBalancerVO1, loadBalancerVO2); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(loadBalancingRule.getSourceIp()).thenReturn(ip); + when(loadBalancingRule.getState()).thenReturn(FirewallRule.State.Revoke); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(ipAddressVO.getAddress()).thenReturn(ip); + when(ip.addr()).thenReturn("10.10.10.10"); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenLoadBalancerListenerCommand.class), anyLong())).thenReturn(deleteTungstenLoadBalancerListenerAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenLoadBalancerCommand.class), anyLong())).thenReturn(deleteTungstenLoadBalancerCommand); + when(deleteTungstenLoadBalancerListenerAnswer.getResult()).thenReturn(true); + when(deleteTungstenLoadBalancerCommand.getResult()).thenReturn(true); + when(tungstenService.updateLoadBalancer(any(), any())).thenReturn(true); + when(lbDao.listByIpAddress(anyLong())).thenReturn(loadBalancerVOList); + when(tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp(anyLong(),anyString())).thenReturn(tungstenGuestNetworkIpAddressVO); + + assertTrue(tungstenElement.applyLBRules(network, loadBalancingRuleList)); + } + + @Test + public void applyPFRulesAddRuleSuccessTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + PortForwardingRule portForwardingRule = mock(PortForwardingRule.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + UserVm userVm = mock(UserVm.class); + Nic nic = mock(Nic.class); + TungstenAnswer applyTungstenPortForwardingAnswer = mock(TungstenAnswer.class); + List portForwardingRuleList = List.of(portForwardingRule); + + when(portForwardingRule.getState()).thenReturn(FirewallRule.State.Add); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(ApiDBUtils.findIpAddressById(anyLong())).thenReturn(ipAddressVO); + when(ApiDBUtils.findUserVmById(anyLong())).thenReturn(userVm); + when(networkModel.getNicInNetwork(anyLong(), anyLong())).thenReturn(nic); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenPortForwardingCommand.class), anyLong())).thenReturn(applyTungstenPortForwardingAnswer); + when(applyTungstenPortForwardingAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.applyPFRules(network, portForwardingRuleList)); + } + + @Test + public void applyPFRulesAddRuleFailTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + PortForwardingRule portForwardingRule = mock(PortForwardingRule.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + UserVm userVm = mock(UserVm.class); + Nic nic = mock(Nic.class); + TungstenAnswer applyTungstenPortForwardingAnswer = mock(TungstenAnswer.class); + List portForwardingRuleList = List.of(portForwardingRule); + + when(portForwardingRule.getState()).thenReturn(FirewallRule.State.Add); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(ApiDBUtils.findIpAddressById(anyLong())).thenReturn(ipAddressVO); + when(ApiDBUtils.findUserVmById(anyLong())).thenReturn(userVm); + when(networkModel.getNicInNetwork(anyLong(), anyLong())).thenReturn(nic); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenPortForwardingCommand.class), anyLong())).thenReturn(applyTungstenPortForwardingAnswer); + when(applyTungstenPortForwardingAnswer.getResult()).thenReturn(false); + + assertFalse(tungstenElement.applyPFRules(network, portForwardingRuleList)); + } + + @Test + public void applyPFRulesRevokeRuleSuccessTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + PortForwardingRule portForwardingRule = mock(PortForwardingRule.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + UserVm userVm = mock(UserVm.class); + Nic nic = mock(Nic.class); + TungstenAnswer applyTungstenPortForwardingAnswer = mock(TungstenAnswer.class); + List portForwardingRuleList = List.of(portForwardingRule); + + when(portForwardingRule.getState()).thenReturn(FirewallRule.State.Revoke); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(ApiDBUtils.findIpAddressById(anyLong())).thenReturn(ipAddressVO); + when(ApiDBUtils.findUserVmById(anyLong())).thenReturn(userVm); + when(networkModel.getNicInNetwork(anyLong(), anyLong())).thenReturn(nic); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenPortForwardingCommand.class), anyLong())).thenReturn(applyTungstenPortForwardingAnswer); + when(applyTungstenPortForwardingAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.applyPFRules(network, portForwardingRuleList)); + } + + @Test + public void applyPFRulesRevokeRuleFailTest() { + Network network = mock(Network.class); + Network publicNetwork = mock(Network.class); + PortForwardingRule portForwardingRule = mock(PortForwardingRule.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + UserVm userVm = mock(UserVm.class); + Nic nic = mock(Nic.class); + TungstenAnswer applyTungstenPortForwardingAnswer = mock(TungstenAnswer.class); + List portForwardingRuleList = List.of(portForwardingRule); + + when(portForwardingRule.getState()).thenReturn(FirewallRule.State.Revoke); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(publicNetwork); + when(ApiDBUtils.findIpAddressById(anyLong())).thenReturn(ipAddressVO); + when(ApiDBUtils.findUserVmById(anyLong())).thenReturn(userVm); + when(networkModel.getNicInNetwork(anyLong(), anyLong())).thenReturn(nic); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenPortForwardingCommand.class), anyLong())).thenReturn(applyTungstenPortForwardingAnswer); + when(applyTungstenPortForwardingAnswer.getResult()).thenReturn(false); + + assertFalse(tungstenElement.applyPFRules(network, portForwardingRuleList)); + } + + @Test + public void preparePublicNetworkTest() throws ConcurrentOperationException { + Network network = mock(Network.class); + NicProfile nicProfile = new NicProfile(); + VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + DeployDestination deployDestination = mock(DeployDestination.class); + ReservationContext reservationContext = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO host = mock(HostVO.class); + TungstenAnswer createTungstenVMAnswer = mock(TungstenAnswer.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + TungstenAnswer createTungstenNetworkPolicyAnswer = mock(TungstenAnswer.class); + + nicProfile.setIPv4Address("192.168.100.100"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Public); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), anyLong())).thenReturn(createTungstenVMAnswer); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createTungstenNetworkPolicyAnswer); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.ConsoleProxy); + when(createTungstenVMAnswer.getResult()).thenReturn(true); + when(createTungstenNetworkPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.prepare(network, nicProfile, virtualMachineProfile, deployDestination, reservationContext)); + assertEquals(Nic.ReservationStrategy.Create, nicProfile.getReservationStrategy()); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN, nicProfile.getBroadcastType()); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"), nicProfile.getBroadCastUri()); + assertEquals(TungstenUtils.DEFAULT_VHOST_INTERFACE, nicProfile.getName()); + } + + @Test + public void prepareManagementNetworkTest() throws ConcurrentOperationException { + Network network = mock(Network.class); + NicProfile nicProfile = new NicProfile(); + VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + DeployDestination deployDestination = mock(DeployDestination.class); + ReservationContext reservationContext = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO host = mock(HostVO.class); + TungstenAnswer createTungstenVMAnswer = mock(TungstenAnswer.class); + + nicProfile.setIPv4Address("192.168.100.100"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Management); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), anyLong())).thenReturn(createTungstenVMAnswer); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.SecondaryStorageVm); + when(createTungstenVMAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.prepare(network, nicProfile, virtualMachineProfile, deployDestination, reservationContext)); + assertEquals(Nic.ReservationStrategy.Create, nicProfile.getReservationStrategy()); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN, nicProfile.getBroadcastType()); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"), nicProfile.getBroadCastUri()); + assertEquals(TungstenUtils.DEFAULT_VHOST_INTERFACE, nicProfile.getName()); + } + + @Test(expected = CloudRuntimeException.class) + public void prepareWithExceptionTest() throws ConcurrentOperationException { + Network network = mock(Network.class); + NicProfile nicProfile = new NicProfile(); + VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + DeployDestination deployDestination = mock(DeployDestination.class); + ReservationContext reservationContext = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO host = mock(HostVO.class); + TungstenAnswer createTungstenVMAnswer = mock(TungstenAnswer.class); + + nicProfile.setIPv4Address("192.168.100.100"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Management); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), anyLong())).thenReturn(createTungstenVMAnswer); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.SecondaryStorageVm); + + tungstenElement.prepare(network, nicProfile, virtualMachineProfile, deployDestination, reservationContext); + } + + @Test + public void releasePublicNetworkTest() throws ConcurrentOperationException, ResourceUnavailableException { + Network network = mock(Network.class); + NicProfile nicProfile = mock(NicProfile.class); + VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + ReservationContext reservationContext = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO host = mock(HostVO.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + TungstenAnswer deleteTungstenVRouterPortAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteVmiAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteVmAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenNetworkPolicyAnswer = mock(TungstenAnswer.class); + + when(nicProfile.getIPv4Address()).thenReturn("192.168.100.100"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Public); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.SecondaryStorageVm); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), anyLong())).thenReturn(deleteTungstenVRouterPortAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmInterfaceCommand.class), anyLong())).thenReturn(deleteVmiAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmCommand.class), anyLong())).thenReturn(deleteVmAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(deleteTungstenNetworkPolicyAnswer); + when(deleteTungstenVRouterPortAnswer.getResult()).thenReturn(true); + when(deleteVmiAnswer.getResult()).thenReturn(true); + when(deleteVmAnswer.getResult()).thenReturn(true); + when(deleteTungstenNetworkPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.release(network, nicProfile, virtualMachineProfile, reservationContext)); + } + + @Test + public void releaseManagementNetworkTest() throws ConcurrentOperationException, ResourceUnavailableException { + Network network = mock(Network.class); + NicProfile nicProfile = mock(NicProfile.class); + VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + ReservationContext reservationContext = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO host = mock(HostVO.class); + TungstenAnswer deleteTungstenVRouterPortAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteVmiAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteVmAnswer = mock(TungstenAnswer.class); + + when(nicProfile.getIPv4Address()).thenReturn("192.168.100.100"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Management); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.SecondaryStorageVm); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), anyLong())).thenReturn(deleteTungstenVRouterPortAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmInterfaceCommand.class), anyLong())).thenReturn(deleteVmiAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmCommand.class), anyLong())).thenReturn(deleteVmAnswer); + when(deleteTungstenVRouterPortAnswer.getResult()).thenReturn(true); + when(deleteVmiAnswer.getResult()).thenReturn(true); + when(deleteVmAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.release(network, nicProfile, virtualMachineProfile, reservationContext)); + } + + @Test(expected = CloudRuntimeException.class) + public void releaseWithExceptionTest() throws ConcurrentOperationException, ResourceUnavailableException { + Network network = mock(Network.class); + NicProfile nicProfile = mock(NicProfile.class); + VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + ReservationContext reservationContext = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO host = mock(HostVO.class); + TungstenAnswer deleteTungstenVRouterPortAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteVmiAnswer = mock(TungstenAnswer.class); + + when(nicProfile.getIPv4Address()).thenReturn("192.168.100.100"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Management); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.SecondaryStorageVm); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), anyLong())).thenReturn(deleteTungstenVRouterPortAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmInterfaceCommand.class), anyLong())).thenReturn(deleteVmiAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmCommand.class), anyLong())).thenThrow(IllegalArgumentException.class); + when(deleteTungstenVRouterPortAnswer.getResult()).thenReturn(true); + when(deleteVmiAnswer.getResult()).thenReturn(true); + + tungstenElement.release(network, nicProfile, virtualMachineProfile, reservationContext); + } + + @Test + public void destroyTest() throws ConcurrentOperationException, ResourceUnavailableException { + IPAddressVO ipAddressVO1 = mock(IPAddressVO.class); + IPAddressVO ipAddressVO2 = mock(IPAddressVO.class); + Network network = mock(Network.class); + ReservationContext reservationContext = mock(ReservationContext.class); + List ipAddressVOList = Arrays.asList(ipAddressVO1, ipAddressVO2); + TungstenAnswer tungstenDeleteFIPAnswer = mock(TungstenAnswer.class); + TungstenAnswer tungstenDeleteNPAnswer = mock(TungstenAnswer.class); + + when(ipAddressDao.listByAssociatedNetwork(anyLong(), anyBoolean())).thenReturn(ipAddressVOList); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenFloatingIpCommand.class), anyLong())).thenReturn(tungstenDeleteFIPAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(tungstenDeleteNPAnswer); + when(tungstenDeleteFIPAnswer.getResult()).thenReturn(true); + when(tungstenDeleteNPAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.destroy(network, reservationContext)); + } + + @Test + public void isReadyTest() { + PhysicalNetworkServiceProvider physicalNetworkServiceProvider = mock(PhysicalNetworkServiceProvider.class); + PhysicalNetworkTrafficTypeVO physicalNetworkTrafficTypeVO = mock(PhysicalNetworkTrafficTypeVO.class); + + when(physicalNetworkTrafficTypeDao.findBy(anyLong(), eq(Networks.TrafficType.Management))).thenReturn(physicalNetworkTrafficTypeVO); + + assertTrue(tungstenElement.isReady(physicalNetworkServiceProvider)); + } + + @Test + public void shutdownProviderInstancesTest() throws ConcurrentOperationException { + PhysicalNetworkServiceProvider physicalNetworkServiceProvider = mock(PhysicalNetworkServiceProvider.class); + ReservationContext reservationContext = mock(ReservationContext.class); + PhysicalNetworkVO physicalNetworkVO = mock(PhysicalNetworkVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + Network publicNetwork = mock(Network.class); + VlanVO vlanVO1 = mock(VlanVO.class); + VlanVO vlanVO2 = mock(VlanVO.class); + List vlanVOList = Arrays.asList(vlanVO1, vlanVO2); + HostPodVO hostPodVO1 = mock(HostPodVO.class); + HostPodVO hostPodVO2 = mock(HostPodVO.class); + List hostPodVOList = Arrays.asList(hostPodVO1, hostPodVO2); + + when(physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetworkVO); + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(vlanDao.listVlansByNetworkIdIncludingRemoved(anyLong())).thenReturn(vlanVOList); + when(hostPodDao.listByDataCenterId(anyLong())).thenReturn(hostPodVOList); + + assertTrue(tungstenElement.shutdownProviderInstances(physicalNetworkServiceProvider, reservationContext)); + verify(networkServiceMapDao, times(1)).deleteByNetworkId(anyLong()); + verify(tungstenService, times(2)).removePublicNetworkSubnet(any(VlanVO.class)); + verify(tungstenService, times(1)).deletePublicNetwork(anyLong()); + verify(tungstenService, times(2)).removeManagementNetworkSubnet(any(HostPodVO.class)); + verify(tungstenService, times(1)).deleteManagementNetwork(anyLong()); + } + + //@Test + //public void processConnectWithoutSecurityGroupTest() throws ConnectionException { + // Host host = mock(Host.class); + // StartupCommand startupCommand = mock(StartupCommand.class); + // TungstenProviderVO tungstenProvider = mock(TungstenProviderVO.class); + // DataCenterVO dataCenterVO = mock(DataCenterVO.class); + // VlanVO vlanVO1 = mock(VlanVO.class); + // VlanVO vlanVO2 = mock(VlanVO.class); + // List vlanList = Arrays.asList(vlanVO1, vlanVO2); + // Network publicNetwork = mock(Network.class); + // NetworkDetailVO networkDetail = mock(NetworkDetailVO.class); +// + // when(host.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM); + // when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProvider); + // when(host.getPublicIpAddress()).thenReturn("192.168.100.100"); + // when(tungstenProvider.getGateway()).thenReturn("192.168.100.100"); + // when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + // when(vlanDao.listByZone(anyLong())).thenReturn(vlanList); + // when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + // when(networkDetailsDao.findDetail(anyLong(), anyString())).thenReturn(networkDetail); + // when(vlanVO1.getVlanGateway()).thenReturn("192.168.100.1"); + // when(vlanVO1.getVlanNetmask()).thenReturn("255.255.255.0"); + // when(vlanVO2.getVlanGateway()).thenReturn("192.168.101.1"); + // when(vlanVO2.getVlanNetmask()).thenReturn("255.255.255.0"); + // when(dataCenterVO.isSecurityGroupEnabled()).thenReturn(false); +// + // tungstenElement.processConnect(host, startupCommand, true); + // verify(agentManager, times(1)).easySend(anyLong(), any(SetupTungstenVRouterCommand.class)); + //} + + //@Test + //public void processConnectWithSecurityGroupTest() throws ConnectionException { + // Host host = mock(Host.class); + // StartupCommand startupCommand = mock(StartupCommand.class); + // TungstenProviderVO tungstenProvider = mock(TungstenProviderVO.class); + // DataCenterVO dataCenterVO = mock(DataCenterVO.class); + // NetworkVO network = mock(NetworkVO.class); + // NetworkDetailVO networkDetail = mock(NetworkDetailVO.class); + // Network publicNetwork = mock(Network.class); +// + // when(host.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM); + // when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProvider); + // when(host.getPublicIpAddress()).thenReturn("192.168.100.100"); + // when(tungstenProvider.getGateway()).thenReturn("192.168.100.100"); + // when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + // when(networkDao.listByZoneSecurityGroup(anyLong())).thenReturn(Arrays.asList(network)); + // when(networkDetailsDao.findDetail(anyLong(), anyString())).thenReturn(networkDetail); + // when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + // when(dataCenterVO.isSecurityGroupEnabled()).thenReturn(true); +// + // tungstenElement.processConnect(host, startupCommand, true); + // verify(agentManager, times(1)).easySend(anyLong(), any(SetupTungstenVRouterCommand.class)); + //} + + @Test + public void processHostAboutToBeRemovedWithSecurityGroupTest() { + HostVO hostVO = mock(HostVO.class); + TungstenProviderVO tungstenProvider = mock(TungstenProviderVO.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + NetworkVO network = mock(NetworkVO.class); + + when(hostVO.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM); + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProvider); + when(hostVO.getPublicIpAddress()).thenReturn("192.168.100.100"); + when(tungstenProvider.getGateway()).thenReturn("192.168.100.100"); + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + when(dataCenterVO.isSecurityGroupEnabled()).thenReturn(true); + when(networkDao.listByZoneSecurityGroup(anyLong())).thenReturn(List.of(network)); + + tungstenElement.processHostAboutToBeRemoved(1L); + verify(agentManager, times(1)).easySend(anyLong(), any(SetupTungstenVRouterCommand.class)); + } + + @Test + public void processHostAboutToBeRemovedWithoutSecurityGroupTest() { + HostVO hostVO = mock(HostVO.class); + TungstenProviderVO tungstenProvider = mock(TungstenProviderVO.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(hostVO.getHypervisorType()).thenReturn(Hypervisor.HypervisorType.KVM); + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProvider); + when(hostVO.getPublicIpAddress()).thenReturn("192.168.100.100"); + when(tungstenProvider.getGateway()).thenReturn("192.168.100.100"); + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + when(dataCenterVO.isSecurityGroupEnabled()).thenReturn(false); + + tungstenElement.processHostAboutToBeRemoved(1L); + verify(agentManager, times(1)).easySend(anyLong(), any(SetupTungstenVRouterCommand.class)); + } + + @Test + public void applyFWRulesWithAddEgressRuleTest() throws ResourceUnavailableException { + Network network = mock(Network.class); + FirewallRuleVO firewallRuleVO = mock(FirewallRuleVO.class); + Network publicNetwork = mock(Network.class); + TungstenAnswer createNetworkPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer applyNetworkPolicyAnswer = mock(TungstenAnswer.class); + + when(firewallRuleVO.getState()).thenReturn(FirewallRule.State.Add); + when(firewallRuleVO.getSourceCidrList()).thenReturn(List.of("192.168.100.0/24")); + when(firewallRuleVO.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(firewallRuleVO.getPurpose()).thenReturn(FirewallRule.Purpose.Firewall); + when(firewallRuleVO.getTrafficType()).thenReturn(FirewallRule.TrafficType.Egress); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createNetworkPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyNetworkPolicyAnswer); + when(createNetworkPolicyAnswer.getResult()).thenReturn(true); + when(applyNetworkPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.applyFWRules(network, List.of(firewallRuleVO))); + } + + @Test + public void applyFWRulesWithAddIngressRuleTest() throws ResourceUnavailableException { + Network network = mock(Network.class); + FirewallRuleVO firewallRuleVO = mock(FirewallRuleVO.class); + Network publicNetwork = mock(Network.class); + TungstenAnswer createNetworkPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer applyNetworkPolicyAnswer = mock(TungstenAnswer.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + Ip ip = mock(Ip.class); + + when(firewallRuleVO.getState()).thenReturn(FirewallRule.State.Add); + when(firewallRuleVO.getSourceCidrList()).thenReturn(List.of("192.168.100.0/24")); + when(firewallRuleVO.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(ipAddressDao.findById(anyLong())).thenReturn(ipAddressVO); + when(ipAddressVO.getAddress()).thenReturn(ip); + when(firewallRuleVO.getPurpose()).thenReturn(FirewallRule.Purpose.Firewall); + when(firewallRuleVO.getTrafficType()).thenReturn(FirewallRule.TrafficType.Ingress); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createNetworkPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyNetworkPolicyAnswer); + when(createNetworkPolicyAnswer.getResult()).thenReturn(true); + when(applyNetworkPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.applyFWRules(network, List.of(firewallRuleVO))); + } + + @Test + public void applyFWRulesWithRevokeRuleTest() throws ResourceUnavailableException { + Network network = mock(Network.class); + FirewallRuleVO firewallRuleVO = mock(FirewallRuleVO.class); + Network publicNetwork = mock(Network.class); + TungstenAnswer deleteNetworkPolicyAnswer = mock(TungstenAnswer.class); + + when(firewallRuleVO.getState()).thenReturn(FirewallRule.State.Revoke); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(firewallRuleVO.getPurpose()).thenReturn(FirewallRule.Purpose.Firewall); + when(firewallRuleVO.getTrafficType()).thenReturn(FirewallRule.TrafficType.Ingress); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(deleteNetworkPolicyAnswer); + when(deleteNetworkPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.applyFWRules(network, List.of(firewallRuleVO))); + } + + @Test + public void postStateTransitionEventWithVmStartedTest() { + StateMachine2.Transition transition = mock(StateMachine2.Transition.class); + VMInstanceVO vo = mock(VMInstanceVO.class); + Object opaque = mock(Object.class); + + when(transition.getCurrentState()).thenReturn(VirtualMachine.State.Starting); + when(transition.getToState()).thenReturn(VirtualMachine.State.Running); + when(tungstenService.addTungstenVmSecurityGroup(any(VMInstanceVO.class))).thenReturn(true); + + assertTrue(tungstenElement.postStateTransitionEvent(transition, vo, true, opaque)); + } + + @Test + public void postStateTransitionEventWithVmStopedTest() { + StateMachine2.Transition transition = mock(StateMachine2.Transition.class); + VMInstanceVO vo = mock(VMInstanceVO.class); + Object opaque = mock(Object.class); + + when(transition.getCurrentState()).thenReturn(VirtualMachine.State.Stopping); + when(transition.getToState()).thenReturn(VirtualMachine.State.Stopped); + when(tungstenService.removeTungstenVmSecurityGroup(any(VMInstanceVO.class))).thenReturn(true); + + assertTrue(tungstenElement.postStateTransitionEvent(transition, vo, true, opaque)); + } + + @Test + public void prepareMigrationTest() { + NicProfile nic = mock(NicProfile.class); + Network network = mock(Network.class); + VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + DeployDestination dest = mock(DeployDestination.class); + ReservationContext context = mock(ReservationContext.class); + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + HostVO hostVO = mock(HostVO.class); + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(vm.getType()).thenReturn(VirtualMachine.Type.ConsoleProxy); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Public); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenElement.prepareMigration(nic, network, vm, dest, context)); + } + + @Test + public void rollbackMigration() { + NicProfile nic = mock(NicProfile.class); + Network network = mock(Network.class); + VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + ReservationContext src = mock(ReservationContext.class); + ReservationContext dest = mock(ReservationContext.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + HostVO hostVO = mock(HostVO.class); + + when(vm.getType()).thenReturn(VirtualMachine.Type.ConsoleProxy); + when(vm.getVirtualMachine()).thenReturn(virtualMachine); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + + tungstenElement.rollbackMigration(nic, network, vm, src, dest); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), anyLong()); + } + + @Test + public void commitMigration() { + NicProfile nic = mock(NicProfile.class); + Network network = mock(Network.class); + VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + ReservationContext src = mock(ReservationContext.class); + ReservationContext dest = mock(ReservationContext.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + HostVO hostVO = mock(HostVO.class); + + when(vm.getType()).thenReturn(VirtualMachine.Type.ConsoleProxy); + when(vm.getVirtualMachine()).thenReturn(virtualMachine); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + + tungstenElement.commitMigration(nic, network, vm, src, dest); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), anyLong()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtilsTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtilsTest.java new file mode 100644 index 00000000000..2961826a4da --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenFabricUtilsTest.java @@ -0,0 +1,95 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.cloud.agent.AgentManager; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class TungstenFabricUtilsTest { + @Mock + AgentManager agentMgr; + @Mock + TungstenProviderDao tungstenProviderDao; + + TungstenFabricUtils tungstenFabricUtils; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + tungstenFabricUtils = new TungstenFabricUtils(); + tungstenFabricUtils.agentMgr = agentMgr; + tungstenFabricUtils.tungstenProviderDao = tungstenProviderDao; + } + + @Test + public void sendTungstenCommandSuccessTest() { + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + TungstenCommand tungstenCommand = mock(TungstenCommand.class); + + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + when(agentMgr.easySend(anyLong(), any(TungstenCommand.class))).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertEquals(tungstenAnswer, tungstenFabricUtils.sendTungstenCommand(tungstenCommand, anyLong())); + } + + @Test(expected = InvalidParameterValueException.class) + public void sendTungstenCommandWithNullTungstenProvider() { + TungstenCommand tungstenCommand = mock(TungstenCommand.class); + + tungstenFabricUtils.sendTungstenCommand(tungstenCommand, anyLong()); + } + + @Test(expected = InvalidParameterValueException.class) + public void sendTungstenCommandWithNullAnswer() { + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenCommand tungstenCommand = mock(TungstenCommand.class); + + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + + tungstenFabricUtils.sendTungstenCommand(tungstenCommand, anyLong()); + } + + @Test(expected = InvalidParameterValueException.class) + public void sendTungstenCommandWithFalseAnswer() { + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + TungstenCommand tungstenCommand = mock(TungstenCommand.class); + + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + when(agentMgr.easySend(anyLong(), any(TungstenCommand.class))).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(false); + when(tungstenAnswer.getDetails()).thenReturn(""); + + tungstenFabricUtils.sendTungstenCommand(tungstenCommand, anyLong()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuruTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuruTest.java new file mode 100644 index 00000000000..810ba64ff6d --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenGuestNetworkGuruTest.java @@ -0,0 +1,532 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.cloud.agent.AgentManager; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.VlanVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.dc.dao.VlanDao; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.exception.InsufficientVirtualNetworkCapacityException; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.NetworkProfile; +import com.cloud.network.Networks; +import com.cloud.network.PhysicalNetwork; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.PhysicalNetworkDao; +import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.offering.NetworkOffering; +import com.cloud.offerings.dao.NetworkOfferingServiceMapDao; +import com.cloud.user.Account; +import com.cloud.user.dao.AccountDao; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.Nic; +import com.cloud.vm.NicProfile; +import com.cloud.vm.NicVO; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.VMInstanceDao; +import net.juniper.tungsten.api.types.LogicalRouter; +import org.apache.cloudstack.network.tungsten.agent.api.ClearTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenVirtualMachineCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVRouterPortCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenVmInterfaceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNatIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ReleaseTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetTungstenNetworkGatewayCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenCommand; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(TungstenGuestNetworkGuru.class) +public class TungstenGuestNetworkGuruTest { + + @Mock + NetworkOfferingServiceMapDao ntwkOfferingSrvcDao; + @Mock + DataCenterVO dc; + @Mock + PhysicalNetworkDao physicalNetworkDao; + @Mock + NetworkOffering offering; + @Mock + DataCenterDao dcDao; + @Mock + DeploymentPlan plan; + @Mock + PhysicalNetworkVO physicalNetwork; + @Mock + NetworkModel networkModel; + @Mock + TungstenFabricUtils tungstenFabricUtils; + @Mock + TungstenService tungstenService; + @Mock + AccountDao accountDao; + @Mock + IpAddressManager ipAddressManager; + @Mock + IPAddressDao ipAddressDao; + @Mock + VlanDao vlanDao; + @Mock + VMInstanceDao vmInstanceDao; + @Mock + HostDao hostDao; + @Mock + NetworkDao networkDao; + @Mock + FirewallRulesDao firewallRulesDao; + @Mock + NetworkDetailsDao networkDetailsDao; + @Mock + TungstenProviderDao tungstenProviderDao; + @Mock + NicDao nicDao; + @Mock + AgentManager agentMgr; + + TungstenGuestNetworkGuru guru; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + guru = new TungstenGuestNetworkGuru(); + Whitebox.setInternalState(guru, "_physicalNetworkDao", physicalNetworkDao); + Whitebox.setInternalState(guru, "_dcDao", dcDao); + Whitebox.setInternalState(guru, "_networkModel", networkModel); + Whitebox.setInternalState(guru, "_nicDao", nicDao); + guru.networkOfferingServiceMapDao = ntwkOfferingSrvcDao; + guru.tungstenFabricUtils = tungstenFabricUtils; + guru.tungstenService = tungstenService; + guru.accountDao = accountDao; + guru.ipAddressManager = ipAddressManager; + guru.ipAddressDao = ipAddressDao; + guru.vlanDao = vlanDao; + guru.vmInstanceDao = vmInstanceDao; + guru.hostDao = hostDao; + guru.networkDao = networkDao; + guru.firewallRulesDao = firewallRulesDao; + guru.networkDetailsDao = networkDetailsDao; + guru.tungstenProviderDao = tungstenProviderDao; + guru.agentMgr = agentMgr; + + when(dc.getNetworkType()).thenReturn(DataCenter.NetworkType.Advanced); + when(dc.getGuestNetworkCidr()).thenReturn("10.1.1.1/24"); + when(dc.getId()).thenReturn(1L); + when(dcDao.findById(anyLong())).thenReturn(dc); + + when(physicalNetwork.getId()).thenReturn(1L); + when(physicalNetwork.getIsolationMethods()).thenReturn(List.of("TF")); + when(physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetwork); + + when(offering.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(offering.getGuestType()).thenReturn(Network.GuestType.Isolated); + when(offering.getId()).thenReturn(1L); + + when(ntwkOfferingSrvcDao.isProviderForNetworkOffering(offering.getId(), Network.Provider.Tungsten)).thenReturn( + true); + + when(plan.getDataCenterId()).thenReturn(1L); + when(plan.getPhysicalNetworkId()).thenReturn(1L); + } + + @Test + public void testIsMyIsolationMethod() { + assertTrue(guru.isMyIsolationMethod(physicalNetwork)); + } + + @Test + public void testIsolationMethods() { + PhysicalNetwork.IsolationMethod[] expected = new PhysicalNetwork.IsolationMethod[] { + new PhysicalNetwork.IsolationMethod("TF")}; + assertEquals(expected, guru.getIsolationMethods()); + } + + @Test + public void testTrafficTypes() { + assertTrue(guru.isMyTrafficType(Networks.TrafficType.Guest)); + } + + @Test + public void testCanHandle() { + assertTrue(guru.canHandle(offering, dc.getNetworkType(), physicalNetwork)); + } + + @Test + public void testCanDesign() { + List networkOfferingServiceList = new ArrayList<>( + Arrays.asList(Network.Service.Connectivity, Network.Service.Dns, Network.Service.Dhcp, + Network.Service.SourceNat, Network.Service.StaticNat, Network.Service.UserData)); + when(networkModel.listNetworkOfferingServices(anyLong())).thenReturn(networkOfferingServiceList); + + final Network network = mock(Network.class); + final Account account = mock(Account.class); + + final Network designedNetwork = guru.design(offering, plan, network, account); + assertNotNull(designedNetwork); + assertSame(Networks.BroadcastDomainType.TUNGSTEN, designedNetwork.getBroadcastDomainType()); + assertSame(Network.State.Allocated, designedNetwork.getState()); + } + + @Test + public void testDeallocate() { + final Network network = mock(Network.class); + final NicProfile nicProfile = mock(NicProfile.class); + final VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + final NicVO nicVO = mock(NicVO.class); + + when(network.getDataCenterId()).thenReturn(1L); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.User); + when(nicDao.listByVmId(anyLong())).thenReturn(List.of(nicVO)); + + guru.deallocate(network, nicProfile, virtualMachineProfile); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVmCommand.class), anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVmInterfaceCommand.class), anyLong()); + } + + @Test(expected = CloudRuntimeException.class) + public void testDeallocateWithException() { + final Network network = mock(Network.class); + final NicProfile nicProfile = mock(NicProfile.class); + final VirtualMachineProfile virtualMachineProfile = mock(VirtualMachineProfile.class); + final NicVO nicVO = mock(NicVO.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVmCommand.class), anyLong())).thenThrow( + new IllegalArgumentException()); + when(nicDao.listByVmId(anyLong())).thenReturn(List.of(nicVO)); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(virtualMachineProfile.getType()).thenReturn(VirtualMachine.Type.User); + + guru.deallocate(network, nicProfile, virtualMachineProfile); + } + + @Test + public void testImplementGuestNetwork() { + final Network network = mock(Network.class); + final DeployDestination deployDestination = mock(DeployDestination.class); + final ReservationContext reservationContext = mock(ReservationContext.class); + final IPAddressVO ipAddressVO = mock(IPAddressVO.class); + + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(network.getMode()).thenReturn(Networks.Mode.Dhcp); + when(network.getGateway()).thenReturn("192.168.1.1"); + when(network.getCidr()).thenReturn("192.168.1.0/24"); + when(network.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.TUNGSTEN); + when(network.getNetworkOfferingId()).thenReturn(1L); + when(network.getState()).thenReturn(Network.State.Implementing); + when(network.getDataCenterId()).thenReturn(2L); + when(network.getPhysicalNetworkId()).thenReturn(3L); + when(offering.isRedundantRouter()).thenReturn(false); + when(offering.getGuestType()).thenReturn(Network.GuestType.Isolated); + when(tungstenService.getTungstenProjectFqn(network)).thenReturn("default-domain:default-project"); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(new NetworkVO()); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkCommand.class), anyLong())).thenReturn( + new TungstenAnswer(new TungstenCommand(), true, "")); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenLogicalRouterCommand.class), + anyLong())).thenReturn(new TungstenAnswer(new TungstenCommand(), new LogicalRouter(), true, "")); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNatIpCommand.class), anyLong())).thenReturn( + new TungstenAnswer(new TungstenCommand(), true, "192.168.1.100")); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(tungstenService.allocateDnsIpAddress(any(Network.class), any(), anyString())).thenReturn(true); + + final Network implemented = guru.implement(network, offering, deployDestination, reservationContext); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"), implemented.getBroadcastUri()); + assertEquals("192.168.1.1", implemented.getGateway()); + assertEquals("192.168.1.0/24", implemented.getCidr()); + assertEquals(Networks.Mode.Dhcp, implemented.getMode()); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN, implemented.getBroadcastDomainType()); + assertEquals(1L, implemented.getNetworkOfferingId()); + assertEquals(Network.State.Implemented, implemented.getState()); + assertEquals(2L, implemented.getDataCenterId()); + assertEquals(3L, implemented.getPhysicalNetworkId().longValue()); + assertFalse(implemented.isRedundant()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(CreateTungstenNetworkCommand.class), anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(CreateTungstenLogicalRouterCommand.class), + anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(GetTungstenNatIpCommand.class), anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(SetTungstenNetworkGatewayCommand.class), + anyLong()); + } + + @Test + public void testImplementSharedNetwork() { + final Network network = mock(Network.class); + final DeployDestination deployDestination = mock(DeployDestination.class); + final ReservationContext reservationContext = mock(ReservationContext.class); + + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(network.getMode()).thenReturn(Networks.Mode.Dhcp); + when(network.getGateway()).thenReturn("192.168.1.1"); + when(network.getCidr()).thenReturn("192.168.1.0/24"); + when(network.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.TUNGSTEN); + when(network.getNetworkOfferingId()).thenReturn(1L); + when(network.getState()).thenReturn(Network.State.Implementing); + when(network.getDataCenterId()).thenReturn(2L); + when(network.getPhysicalNetworkId()).thenReturn(3L); + when(offering.isRedundantRouter()).thenReturn(false); + when(offering.getGuestType()).thenReturn(Network.GuestType.Shared); + when(vlanDao.listVlansByNetworkId(anyLong())).thenReturn(List.of(new VlanVO())); + when(tungstenService.createSharedNetwork(any(Network.class), any(VlanVO.class))).thenReturn(true); + + final Network implemented = guru.implement(network, offering, deployDestination, reservationContext); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"), implemented.getBroadcastUri()); + assertEquals("192.168.1.1", implemented.getGateway()); + assertEquals("192.168.1.0/24", implemented.getCidr()); + assertEquals(Networks.Mode.Dhcp, implemented.getMode()); + assertEquals(Networks.BroadcastDomainType.TUNGSTEN, implemented.getBroadcastDomainType()); + assertEquals(1L, implemented.getNetworkOfferingId()); + assertEquals(Network.State.Implemented, implemented.getState()); + assertEquals(2L, implemented.getDataCenterId()); + assertEquals(3L, implemented.getPhysicalNetworkId().longValue()); + assertFalse(implemented.isRedundant()); + } + + @Test(expected = CloudRuntimeException.class) + public void testImplementWithException() { + final Network network = mock(Network.class); + final DeployDestination deployDestination = mock(DeployDestination.class); + final ReservationContext reservationContext = mock(ReservationContext.class); + + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(network.getMode()).thenReturn(Networks.Mode.Dhcp); + when(network.getGateway()).thenReturn("192.168.1.1"); + when(network.getCidr()).thenReturn("192.168.1.0/24"); + when(network.getBroadcastDomainType()).thenReturn(Networks.BroadcastDomainType.TUNGSTEN); + when(network.getState()).thenReturn(Network.State.Implementing); + when(offering.isRedundantRouter()).thenReturn(false); + when(offering.getGuestType()).thenReturn(Network.GuestType.Isolated); + when(tungstenService.getTungstenProjectFqn(any(Network.class))).thenReturn("default-domain:default-project"); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(new NetworkVO()); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkCommand.class), anyLong())).thenReturn( + new TungstenAnswer(new TungstenCommand(), new IOException())); + + guru.implement(network, offering, deployDestination, reservationContext); + } + + @Test + public void testReserve() throws InsufficientVirtualNetworkCapacityException, InsufficientAddressCapacityException { + final NicProfile nic = mock(NicProfile.class); + final Network network = mock(Network.class); + final VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + final DeployDestination dest = mock(DeployDestination.class); + final ReservationContext context = mock(ReservationContext.class); + final VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + final HostVO host = mock(HostVO.class); + + when(nic.getReservationStrategy()).thenReturn(Nic.ReservationStrategy.Start); + when(vm.getType()).thenReturn(VirtualMachine.Type.User); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(host); + + guru.reserve(nic, network, vm, dest, context); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), + anyLong()); + } + + @Test + public void testRelease() { + final NicProfile nic = mock(NicProfile.class); + final VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + final IPAddressVO ipAddressVO = mock(IPAddressVO.class); + final VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + final HostVO host = mock(HostVO.class); + + when(vm.getType()).thenReturn(VirtualMachine.Type.User); + when(hostDao.findById(anyLong())).thenReturn(host); + when(ipAddressDao.findByAssociatedVmId(anyLong())).thenReturn(ipAddressVO); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(new NetworkVO()); + when( + tungstenFabricUtils.sendTungstenCommand(any(ReleaseTungstenFloatingIpCommand.class), anyLong())).thenReturn( + new TungstenAnswer(new TungstenCommand(), true, "")); + when( + tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), anyLong())).thenReturn( + new TungstenAnswer(new TungstenCommand(), true, "")); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + + guru.release(nic, vm, "test"); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), + anyLong()); + } + + @Test + public void testShutdown() { + final NetworkProfile profile = mock(NetworkProfile.class); + final IPAddressVO ipAddressVO = mock(IPAddressVO.class); + final FirewallRuleVO firewallRuleVO = mock(FirewallRuleVO.class); + + when(offering.getGuestType()).thenReturn(Network.GuestType.Isolated); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), any())).thenReturn(new NetworkVO()); + when(ipAddressDao.listByAssociatedNetwork(anyLong(), any())).thenReturn(List.of(ipAddressVO)); + when(firewallRulesDao.listByNetworkAndPurpose(anyLong(), any())).thenReturn(List.of(firewallRuleVO)); + + guru.shutdown(profile, offering); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenFloatingIpCommand.class), + anyLong()); + verify(tungstenFabricUtils, times(2)).sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), + anyLong()); + } + + @Test + public void testTrash() { + final Network network = mock(Network.class); + + guru.trash(network, offering); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), + anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(ClearTungstenNetworkGatewayCommand.class), + anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenNetworkCommand.class), anyLong()); + verify(tungstenService, times(1)).deallocateDnsIpAddress(any(), any(), anyString()); + } + + @Test + public void testTrashSharedNetwork() { + final Network network = mock(Network.class); + final NetworkDetailVO networkDetailVO = mock(NetworkDetailVO.class); + final TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + final HostVO hostVO = mock(HostVO.class); + + when(network.getGuestType()).thenReturn(Network.GuestType.Shared); + when(networkDetailsDao.findDetail(anyLong(), anyString())).thenReturn(networkDetailVO); + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + when(hostDao.findByPublicIp(any())).thenReturn(hostVO); + + guru.trash(network, offering); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), + anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(ClearTungstenNetworkGatewayCommand.class), + anyLong()); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenNetworkCommand.class), anyLong()); + verify(tungstenService, times(1)).deallocateDnsIpAddress(any(), any(), anyString()); + verify(agentMgr, times(1)).easySend(any(), any(SetupTungstenVRouterCommand.class)); + verify(networkDetailsDao, times(1)).expunge(anyLong()); + } + + @Test + public void testPrepareMigration() { + final NicProfile nic = mock(NicProfile.class); + final Network network = mock(Network.class); + final VirtualMachineProfile vm = mock(VirtualMachineProfile.class); + final DeployDestination dest = mock(DeployDestination.class); + final ReservationContext context = mock(ReservationContext.class); + final VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + final HostVO hostVO = mock(HostVO.class); + + when(vm.getType()).thenReturn(VirtualMachine.Type.User); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(vmInstanceDao.findById(anyLong())).thenReturn(vmInstanceVO); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), + anyLong())).thenReturn(new TungstenAnswer(new TungstenCommand(), true, "")); + + guru.prepareMigration(nic, network, vm, dest, context); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(CreateTungstenVirtualMachineCommand.class), + anyLong()); + } + + @Test + public void testRollbackMigration() { + final NicProfile nic = mock(NicProfile.class); + final Network network = mock(Network.class); + final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class); + final ReservationContext context = mock(ReservationContext.class); + final VirtualMachine vm = mock(VirtualMachine.class); + final HostVO hostVO = mock(HostVO.class); + + when(vmProfile.getType()).thenReturn(VirtualMachine.Type.User); + when(vmProfile.getVirtualMachine()).thenReturn(vm); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + + guru.rollbackMigration(nic, network, vmProfile, context, context); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), + anyLong()); + } + + @Test + public void testCommitMigration() { + final NicProfile nic = mock(NicProfile.class); + final Network network = mock(Network.class); + final VirtualMachineProfile vmProfile = mock(VirtualMachineProfile.class); + final ReservationContext context = mock(ReservationContext.class); + final VirtualMachine vm = mock(VirtualMachine.class); + final HostVO hostVO = mock(HostVO.class); + + when(vmProfile.getType()).thenReturn(VirtualMachine.Type.User); + when(vmProfile.getVirtualMachine()).thenReturn(vm); + when(hostDao.findById(anyLong())).thenReturn(hostVO); + + guru.commitMigration(nic, network, vmProfile, context, context); + verify(tungstenFabricUtils, times(1)).sendTungstenCommand(any(DeleteTungstenVRouterPortCommand.class), + anyLong()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApiTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApiTest.java new file mode 100644 index 00000000000..b893a7df4f0 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenIntrospectApiTest.java @@ -0,0 +1,58 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.when; + +import org.apache.cloudstack.network.tungsten.vrouter.IntrospectApiConnector; +import org.apache.cloudstack.network.tungsten.vrouter.IntrospectApiConnectorFactory; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(IntrospectApiConnectorFactory.class) +public class TungstenIntrospectApiTest { + @Before + public void setup() { + mockStatic(IntrospectApiConnectorFactory.class); + } + + @Test + public void getLinkLocalIpTest() { + IntrospectApiConnector introspectApiConnector = mock(IntrospectApiConnector.class); + Document document = mock(Document.class); + NodeList nodeList = mock(NodeList.class); + Node node = mock(Node.class); + + when(IntrospectApiConnectorFactory.getInstance(anyString(), anyString())).thenReturn(introspectApiConnector); + when(introspectApiConnector.getSnhItfReq(anyString())).thenReturn(document); + when(document.getElementsByTagName(anyString())).thenReturn(nodeList); + when(nodeList.getLength()).thenReturn(1); + when(nodeList.item(0)).thenReturn(node); + assertEquals(node.getTextContent(), TungstenIntrospectApi.getLinkLocalIp("192.168.100.100", "8085", "948f421c-edde-4518-a391-09299cc25dc2")); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceTest.java new file mode 100644 index 00000000000..0a62a22c00e --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenProviderServiceTest.java @@ -0,0 +1,133 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.Mockito.when; + +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.domain.dao.DomainDao; +import com.cloud.host.Host; +import com.cloud.host.dao.HostDetailsDao; +import com.cloud.network.TungstenProvider; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.projects.dao.ProjectDao; +import com.cloud.resource.ResourceManager; +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.network.tungsten.api.command.CreateTungstenFabricProviderCmd; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import java.util.Arrays; +import java.util.List; + +public class TungstenProviderServiceTest { + + @Mock + DataCenterDao dcDao; + @Mock + DataCenterVO zone; + @Mock + Host host; + @Mock + ResourceManager resourceMgr; + @Mock + DomainDao domainDao; + @Mock + ProjectDao projectDao; + @Mock + TungstenProviderDao tungstenProviderDao; + @Mock + HostDetailsDao hostDetailsDao; + @Mock + MessageBus messageBus; + + TungstenProviderServiceImpl tungstenProviderService; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + tungstenProviderService = new TungstenProviderServiceImpl(); + tungstenProviderService.zoneDao = dcDao; + tungstenProviderService.resourceMgr = resourceMgr; + tungstenProviderService.domainDao = domainDao; + tungstenProviderService.projectDao = projectDao; + tungstenProviderService.tungstenProviderDao = tungstenProviderDao; + tungstenProviderService.hostDetailsDao = hostDetailsDao; + tungstenProviderService.messageBus = messageBus; + + when(dcDao.findById(anyLong())).thenReturn(zone); + when(zone.getName()).thenReturn("ZoneName"); + when(resourceMgr.addHost(anyLong(), any(), any(), anyMap())).thenReturn(host); + when(host.getId()).thenReturn(1L); + when(domainDao.listAll()).thenReturn(null); + when(projectDao.listAll()).thenReturn(null); + } + + @Test + public void addTungstenProviderTest() { + CreateTungstenFabricProviderCmd cmd = Mockito.mock(CreateTungstenFabricProviderCmd.class); + when(cmd.getZoneId()).thenReturn(1L); + when(cmd.getName()).thenReturn("TungstenProviderName"); + when(cmd.getHostname()).thenReturn("192.168.0.100"); + when(cmd.getPort()).thenReturn("8082"); + when(cmd.getGateway()).thenReturn("192.168.0.101"); + when(cmd.getVrouterPort()).thenReturn("9091"); + when(cmd.getIntrospectPort()).thenReturn("8085"); + + try { + TungstenProvider tungstenProvider = tungstenProviderService.addProvider(cmd); + assertNotNull(tungstenProvider); + } catch (CloudRuntimeException e) { + e.printStackTrace(); + fail("Failed to add Tungsten-Fabric provider due to internal error."); + } + } + + @Test + public void listTungstenProviderWithZoneIdTest() { + TungstenProviderVO tungstenProviderVO = Mockito.mock(TungstenProviderVO.class); + + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + + List baseResponseList = tungstenProviderService.listTungstenProvider(1L); + assertEquals(1, baseResponseList.size()); + } + + @Test + public void listTungstenProviderWithoutZoneIdTest() { + TungstenProviderVO tungstenProviderVO1 = Mockito.mock(TungstenProviderVO.class); + TungstenProviderVO tungstenProviderVO2 = Mockito.mock(TungstenProviderVO.class); + + when(tungstenProviderDao.listAll()).thenReturn(Arrays.asList(tungstenProviderVO1, tungstenProviderVO2)); + + List baseResponseList = tungstenProviderService.listTungstenProvider(null); + assertEquals(2, baseResponseList.size()); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImplTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImplTest.java new file mode 100644 index 00000000000..6b199e27abb --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenServiceImplTest.java @@ -0,0 +1,1789 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.whenNew; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.configuration.Config; +import com.cloud.configuration.ConfigurationManager; +import com.cloud.dc.DataCenter; +import com.cloud.dc.DataCenterIpAddressVO; +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.DataCenterDao; +import com.cloud.dc.dao.DataCenterIpAddressDao; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.network.IpAddressManager; +import com.cloud.network.Network; +import com.cloud.network.NetworkModel; +import com.cloud.network.NetworkService; +import com.cloud.network.Networks; +import com.cloud.network.TungstenGuestNetworkIpAddressVO; +import com.cloud.network.dao.FirewallRulesDao; +import com.cloud.network.dao.IPAddressDao; +import com.cloud.network.dao.IPAddressVO; +import com.cloud.network.dao.LoadBalancerCertMapDao; +import com.cloud.network.dao.LoadBalancerCertMapVO; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkDetailVO; +import com.cloud.network.dao.NetworkDetailsDao; +import com.cloud.network.dao.NetworkVO; +import com.cloud.network.dao.SslCertVO; +import com.cloud.network.dao.TungstenGuestNetworkIpAddressDao; +import com.cloud.network.dao.TungstenProviderDao; +import com.cloud.network.element.TungstenProviderVO; +import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.rules.FirewallRule; +import com.cloud.network.rules.FirewallRuleVO; +import com.cloud.network.security.SecurityGroup; +import com.cloud.network.security.SecurityGroupManager; +import com.cloud.network.security.SecurityGroupRuleVO; +import com.cloud.network.security.SecurityGroupService; +import com.cloud.network.security.SecurityGroupVO; +import com.cloud.network.security.SecurityRule; +import com.cloud.network.security.TungstenSecurityGroupRuleVO; +import com.cloud.network.security.dao.SecurityGroupDao; +import com.cloud.network.security.dao.SecurityGroupRuleDao; +import com.cloud.network.security.dao.SecurityGroupVMMapDao; +import com.cloud.network.security.dao.TungstenSecurityGroupRuleDao; +import com.cloud.projects.ProjectManager; +import com.cloud.projects.ProjectVO; +import com.cloud.projects.dao.ProjectDao; +import com.cloud.user.AccountVO; +import com.cloud.user.DomainManager; +import com.cloud.user.dao.AccountDao; +import com.cloud.utils.db.EntityManager; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallback; +import com.cloud.utils.net.Ip; +import com.cloud.utils.net.NetUtils; +import com.cloud.vm.Nic; +import com.cloud.vm.NicSecondaryIp; +import com.cloud.vm.NicVO; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.NicSecondaryIpDao; +import com.cloud.vm.dao.NicSecondaryIpVO; +import net.juniper.tungsten.api.ApiObjectBase; +import net.juniper.tungsten.api.ApiPropertyBase; +import net.juniper.tungsten.api.ObjectReference; +import net.juniper.tungsten.api.types.ActionListType; +import net.juniper.tungsten.api.types.AddressGroup; +import net.juniper.tungsten.api.types.AddressType; +import net.juniper.tungsten.api.types.ApplicationPolicySet; +import net.juniper.tungsten.api.types.FirewallPolicy; +import net.juniper.tungsten.api.types.FirewallRuleEndpointType; +import net.juniper.tungsten.api.types.FirewallRuleMatchTagsType; +import net.juniper.tungsten.api.types.FirewallSequence; +import net.juniper.tungsten.api.types.FirewallServiceGroupType; +import net.juniper.tungsten.api.types.FirewallServiceType; +import net.juniper.tungsten.api.types.Loadbalancer; +import net.juniper.tungsten.api.types.LogicalRouter; +import net.juniper.tungsten.api.types.NetworkPolicy; +import net.juniper.tungsten.api.types.PolicyEntriesType; +import net.juniper.tungsten.api.types.PolicyRuleType; +import net.juniper.tungsten.api.types.PortType; +import net.juniper.tungsten.api.types.ServiceGroup; +import net.juniper.tungsten.api.types.SubnetListType; +import net.juniper.tungsten.api.types.SubnetType; +import net.juniper.tungsten.api.types.Tag; +import net.juniper.tungsten.api.types.TagType; +import net.juniper.tungsten.api.types.VirtualMachine; +import net.juniper.tungsten.api.types.VirtualMachineInterface; +import net.juniper.tungsten.api.types.VirtualNetwork; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.MessageSubscriber; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkGatewayToLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.AddTungstenVmToSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ApplyTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDefaultProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.CreateTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenDomainCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenFloatingIpPoolCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenNetworkPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenProjectCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.DeleteTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenFabricNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenLoadBalancerCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenNetworkDnsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.GetTungstenSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenAddressGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenApplicationPolicySetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenFirewallRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNetworkCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenNicCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenRoutingLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenServiceGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenTagTypeCommand; +import org.apache.cloudstack.network.tungsten.agent.api.ListTungstenVmCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkGatewayFromLogicalRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenNetworkSubnetCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenPolicyRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecondaryIpAddressCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenSecurityGroupRuleCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenTagCommand; +import org.apache.cloudstack.network.tungsten.agent.api.RemoveTungstenVmFromSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.SetupTungstenVRouterCommand; +import org.apache.cloudstack.network.tungsten.agent.api.TungstenAnswer; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateLoadBalancerServiceInstanceCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenDefaultSecurityGroupCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadbalancerSslCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenLoadbalancerStatsCommand; +import org.apache.cloudstack.network.tungsten.agent.api.UpdateTungstenVrouterConfigCommand; +import org.apache.cloudstack.network.tungsten.model.TungstenLogicalRouter; +import org.apache.cloudstack.network.tungsten.model.TungstenNetworkPolicy; +import org.apache.cloudstack.network.tungsten.model.TungstenRule; +import org.apache.cloudstack.network.tungsten.model.TungstenTag; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import java.util.Arrays; +import java.util.List; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({Transaction.class, TungstenServiceImpl.class}) +public class TungstenServiceImplTest { + @Mock + MessageBus messageBus; + @Mock + ProjectDao projectDao; + @Mock + AccountDao accountDao; + @Mock + NetworkDao networkDao; + @Mock + ConfigurationDao configDao; + @Mock + IPAddressDao ipAddressDao; + @Mock + EntityManager entityMgr; + @Mock + NetworkModel networkModel; + @Mock + DomainDao domainDao; + @Mock + LoadBalancerCertMapDao lbCertMapDao; + @Mock + FirewallRulesDao fwRulesDao; + @Mock + TungstenGuestNetworkIpAddressDao tungstenGuestNetworkIpAddressDao; + @Mock + TungstenProviderDao tungstenProviderDao; + @Mock + TungstenFabricUtils tungstenFabricUtils; + @Mock + AgentManager agentMgr; + @Mock + HostDao hostDao; + @Mock + NetworkDetailsDao networkDetailsDao; + @Mock + SecurityGroupDao securityGroupDao; + @Mock + NicDao nicDao; + @Mock + TungstenSecurityGroupRuleDao tungstenSecurityGroupRuleDao; + @Mock + SecurityGroupVMMapDao securityGroupVMMapDao; + @Mock + SecurityGroupRuleDao securityGroupRuleDao; + @Mock + SecurityGroupManager securityGroupManager; + @Mock + NicSecondaryIpDao nicSecIpDao; + @Mock + DataCenterIpAddressDao dataCenterIpAddressDao; + @Mock + DataCenterDao dataCenterDao; + @Mock + IpAddressManager ipAddressManager; + + TungstenServiceImpl tungstenService; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + tungstenService = new TungstenServiceImpl(); + tungstenService.projectDao = projectDao; + tungstenService.tungstenProviderDao = tungstenProviderDao; + tungstenService.networkModel = networkModel; + tungstenService.ipAddressDao = ipAddressDao; + tungstenService.tungstenFabricUtils = tungstenFabricUtils; + tungstenService.domainDao = domainDao; + tungstenService.accountDao = accountDao; + tungstenService.dataCenterIpAddressDao = dataCenterIpAddressDao; + tungstenService.networkDetailsDao = networkDetailsDao; + tungstenService.agentMgr = agentMgr; + tungstenService.hostDao = hostDao; + tungstenService.configDao = configDao; + tungstenService.fwRulesDao = fwRulesDao; + tungstenService.lbCertMapDao = lbCertMapDao; + tungstenService.entityMgr = entityMgr; + tungstenService.tungstenGuestNetworkIpAddressDao = tungstenGuestNetworkIpAddressDao; + tungstenService.securityGroupDao = securityGroupDao; + tungstenService.tungstenSecurityGroupRuleDao = tungstenSecurityGroupRuleDao; + tungstenService.securityGroupVMMapDao = securityGroupVMMapDao; + tungstenService.nicDao = nicDao; + tungstenService.nicSecIpDao = nicSecIpDao; + tungstenService.securityGroupRuleDao = securityGroupRuleDao; + tungstenService.securityGroupManager = securityGroupManager; + tungstenService.networkDao = networkDao; + tungstenService.dataCenterDao = dataCenterDao; + tungstenService.ipAddressManager = ipAddressManager; + tungstenService.messageBus = messageBus; + } + + @Test + public void createTungstenFloatingIpTest() throws Exception { + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer createTungstenFloatingIpAnswer = mock(TungstenAnswer.class); + Ip ip = mock(Ip.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(networkVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenFloatingIpCommand.class), anyLong())).thenReturn(createTungstenFloatingIpAnswer); + when(createTungstenFloatingIpAnswer.getResult()).thenReturn(true); + when(ipAddressVO.getAddress()).thenReturn(ip); + + assertTrue(Whitebox.invokeMethod(tungstenService, "createTungstenFloatingIp", 1L, ipAddressVO)); + } + + @Test + public void deleteTungstenFloatingIpWithIpAddressTest() throws Exception { + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer deleteTungstenFloatingIpAnswer = mock(TungstenAnswer.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(networkVO); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenFloatingIpCommand.class), anyLong())).thenReturn(deleteTungstenFloatingIpAnswer); + when(deleteTungstenFloatingIpAnswer.getResult()).thenReturn(true); + + assertTrue(Whitebox.invokeMethod(tungstenService, "deleteTungstenFloatingIp", 1L, ipAddressVO)); + } + + @Test + public void deleteTungstenDomainTest() throws Exception { + DomainVO domainVO = mock(DomainVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer deleteTungstenDomainAnswer = mock(TungstenAnswer.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenDomainCommand.class), anyLong())).thenReturn(deleteTungstenDomainAnswer); + when(deleteTungstenDomainAnswer.getResult()).thenReturn(true); + + assertTrue(Whitebox.invokeMethod(tungstenService, "deleteTungstenDomain", domainVO)); + } + + @Test + public void deleteTungstenProjectTest() throws Exception { + ProjectVO projectVO = mock(ProjectVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer deleteTungstenProjectAnswer = mock(TungstenAnswer.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenProjectCommand.class), anyLong())).thenReturn(deleteTungstenProjectAnswer); + when(deleteTungstenProjectAnswer.getResult()).thenReturn(true); + + assertTrue(Whitebox.invokeMethod(tungstenService, "deleteTungstenProject", projectVO)); + } + + @Test + public void addTungstenDefaultNetworkPolicyTest() { + TungstenRule tungstenRule = mock(TungstenRule.class); + TungstenAnswer createTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer applyTungstenPolicyAnswer = mock(TungstenAnswer.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createTungstenPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyTungstenPolicyAnswer); + when(createTungstenPolicyAnswer.getApiObjectBase()).thenReturn(networkPolicy); + when(createTungstenPolicyAnswer.getResult()).thenReturn(true); + when(applyTungstenPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.addTungstenDefaultNetworkPolicy(1L, "default-domain:default-project", "policyName", "7279ed91-314e-45be-81b4-b10395fd2ae3" + , List.of(tungstenRule), 1, 1)); + } + + @Test + public void createManagementNetworkTest() { + Network managementNetwork = mock(Network.class); + VirtualNetwork managementVirtualNetwork = mock(VirtualNetwork.class); + VirtualNetwork fabricVirtualNetwork = mock(VirtualNetwork.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + TungstenAnswer createTungstenNetworkAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenDefaultSecurityGroupAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenGlobalVrouterConfigAnswer = mock(TungstenAnswer.class); + TungstenAnswer getTungstenFabricNetworkAnswer = mock(TungstenAnswer.class); + TungstenAnswer createTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer applyTungstenPolicyAnswer = mock(TungstenAnswer.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), + eq(Networks.TrafficType.Management))).thenReturn(managementNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkCommand.class), anyLong())).thenReturn(createTungstenNetworkAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenDefaultSecurityGroupCommand.class), anyLong())).thenReturn(updateTungstenDefaultSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenVrouterConfigCommand.class), anyLong())).thenReturn(updateTungstenGlobalVrouterConfigAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenFabricNetworkCommand.class), anyLong())).thenReturn(getTungstenFabricNetworkAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createTungstenPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyTungstenPolicyAnswer); + when(createTungstenNetworkAnswer.getResult()).thenReturn(true); + when(createTungstenNetworkAnswer.getApiObjectBase()).thenReturn(managementVirtualNetwork); + when(createTungstenPolicyAnswer.getApiObjectBase()).thenReturn(networkPolicy); + when(getTungstenFabricNetworkAnswer.getApiObjectBase()).thenReturn(fabricVirtualNetwork); + when(updateTungstenDefaultSecurityGroupAnswer.getResult()).thenReturn(true); + when(updateTungstenGlobalVrouterConfigAnswer.getResult()).thenReturn(true); + when(getTungstenFabricNetworkAnswer.getResult()).thenReturn(true); + when(createTungstenPolicyAnswer.getResult()).thenReturn(true); + when(applyTungstenPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.createManagementNetwork(1L)); + } + + @Test + public void addManagementNetworkSubnetTest() { + HostPodVO hostPodVO = mock(HostPodVO.class); + Network managementNetwork = mock(Network.class); + TungstenAnswer addTungstenNetworkSubnetAnswer = mock(TungstenAnswer.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + DataCenterIpAddressVO dataCenterIpAddressVO = mock(DataCenterIpAddressVO.class); + + when(hostPodVO.getDescription()).thenReturn("192.168.100.100-192.168.100.200"); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), + eq(Networks.TrafficType.Management))).thenReturn(managementNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenNetworkSubnetCommand.class), anyLong())).thenReturn(addTungstenNetworkSubnetAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(addTungstenNetworkSubnetAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.100.150"); + when(managementNetwork.getCidr()).thenReturn("192.168.100.0/24"); + when(managementNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Management); + when(dataCenterIpAddressDao.listByPodIdDcIdIpAddress(anyLong(), anyLong(), anyString())).thenReturn(List.of(dataCenterIpAddressVO)); + when(dataCenterIpAddressDao.mark(anyLong(), anyLong(), anyString())).thenReturn(true); + + assertTrue(tungstenService.addManagementNetworkSubnet(hostPodVO)); + } + + @Test + public void deleteManagementNetworkTest() { + Network managementNetwork = mock(Network.class); + TungstenAnswer deleteTungstenManagementPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer getTungstenFabricNetworkAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenFabricPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenNetworkAnswer = mock(TungstenAnswer.class); + VirtualNetwork fabricVirtualNetwork = mock(VirtualNetwork.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), + eq(Networks.TrafficType.Management))).thenReturn(managementNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(deleteTungstenManagementPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenFabricNetworkCommand.class), anyLong())).thenReturn(getTungstenFabricNetworkAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(deleteTungstenFabricPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkCommand.class), anyLong())).thenReturn(deleteTungstenNetworkAnswer); + when(getTungstenFabricNetworkAnswer.getApiObjectBase()).thenReturn(fabricVirtualNetwork); + when(deleteTungstenManagementPolicyAnswer.getResult()).thenReturn(true); + when(getTungstenFabricNetworkAnswer.getResult()).thenReturn(true); + when(deleteTungstenFabricPolicyAnswer.getResult()).thenReturn(true); + when(deleteTungstenNetworkAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteManagementNetwork(1L)); + } + + @Test + public void removeManagementNetworkSubnetTest() { + HostPodVO hostPodVO = mock(HostPodVO.class); + Network managementNetwork = mock(Network.class); + TungstenAnswer removeTungstenNetworkSubnetAnswer = mock(TungstenAnswer.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + DataCenterIpAddressVO dataCenterIpAddressVO = mock(DataCenterIpAddressVO.class); + + when(hostPodVO.getDescription()).thenReturn("192.168.100.100-192.168.100.200"); + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), + eq(Networks.TrafficType.Management))).thenReturn(managementNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenNetworkSubnetCommand.class), anyLong())).thenReturn(removeTungstenNetworkSubnetAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(removeTungstenNetworkSubnetAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.100.150"); + when(managementNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Management); + when(dataCenterIpAddressDao.listByPodIdDcIdIpAddress(anyLong(), anyLong(), anyString())).thenReturn(List.of(dataCenterIpAddressVO)); + + assertTrue(tungstenService.removeManagementNetworkSubnet(hostPodVO)); + verify(dataCenterIpAddressDao, times(1)).releasePodIpAddress(anyLong()); + } + + @Test + public void createPublicNetworkTest() { + Network publicNetwork = mock(Network.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + NetworkDetailVO networkDetailVO = mock(NetworkDetailVO.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + TungstenAnswer createPublicNetworkAnswer = mock(TungstenAnswer.class); + TungstenAnswer createFloatingIpPoolAnswer = mock(TungstenAnswer.class); + TungstenAnswer createTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer applyTungstenPolicyAnswer = mock(TungstenAnswer.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkCommand.class), anyLong())).thenReturn(createPublicNetworkAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenFloatingIpPoolCommand.class), anyLong())).thenReturn(createFloatingIpPoolAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createTungstenPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyTungstenPolicyAnswer); + when(createPublicNetworkAnswer.getResult()).thenReturn(true); + when(createFloatingIpPoolAnswer.getResult()).thenReturn(true); + when(createTungstenPolicyAnswer.getResult()).thenReturn(true); + when(applyTungstenPolicyAnswer.getResult()).thenReturn(true); + when(createPublicNetworkAnswer.getApiObjectBase()).thenReturn(virtualNetwork); + when(createTungstenPolicyAnswer.getApiObjectBase()).thenReturn(networkPolicy); + when(networkDetailsDao.persist(any(NetworkDetailVO.class))).thenReturn(networkDetailVO); + when(virtualNetwork.getQualifiedName()).thenReturn(Arrays.asList("default-domain", "default-project", "publicNetwork")); + + assertTrue(tungstenService.createPublicNetwork(1L)); + } + + @Test + public void addPublicNetworkSubnetTest() { + VlanVO vlanVO = mock(VlanVO.class); + Network publicNetwork = mock(Network.class); + TungstenAnswer addTungstenNetworkSubnetAnswer = mock(TungstenAnswer.class); + TungstenAnswer createTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer applyTungstenPolicyAnswer = mock(TungstenAnswer.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenNetworkSubnetCommand.class), anyLong())).thenReturn(addTungstenNetworkSubnetAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(createTungstenPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyTungstenPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.100.150"); + when(vlanVO.getIpRange()).thenReturn("192.168.100.100-192.168.100.200"); + when(vlanVO.getVlanGateway()).thenReturn("192.168.100.1"); + when(vlanVO.getVlanNetmask()).thenReturn("255.255.255.0"); + when(publicNetwork.getCidr()).thenReturn("192.168.100.0/24"); + when(addTungstenNetworkSubnetAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(addTungstenNetworkSubnetAnswer.getResult()).thenReturn(true); + when(createTungstenPolicyAnswer.getResult()).thenReturn(true); + when(applyTungstenPolicyAnswer.getResult()).thenReturn(true); + when(publicNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Public); + when(createTungstenPolicyAnswer.getApiObjectBase()).thenReturn(networkPolicy); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(ipAddressDao.mark(anyLong(), any(Ip.class))).thenReturn(true); + + assertTrue(tungstenService.addPublicNetworkSubnet(vlanVO)); + } + + @Test + public void deletePublicNetworkTest() { + Network publicNetwork = mock(Network.class); + TungstenAnswer deleteTungstenNetworkPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenFloatingIpPoolAnswer = mock(TungstenAnswer.class); + TungstenAnswer deleteTungstenNetworkAnswer = mock(TungstenAnswer.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(deleteTungstenNetworkPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenFloatingIpPoolCommand.class), anyLong())).thenReturn(deleteTungstenFloatingIpPoolAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkCommand.class), anyLong())).thenReturn(deleteTungstenNetworkAnswer); + when(deleteTungstenNetworkPolicyAnswer.getResult()).thenReturn(true); + when(deleteTungstenFloatingIpPoolAnswer.getResult()).thenReturn(true); + when(deleteTungstenNetworkAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deletePublicNetwork(1L)); + } + + @Test + public void removePublicNetworkSubnetTest() { + VlanVO vlanVO = mock(VlanVO.class); + Network publicNetwork = mock(Network.class); + TungstenAnswer deleteTungstenNetworkPolicyAnswer = mock(TungstenAnswer.class); + TungstenAnswer removeTungstenNetworkSubnetAnswer = mock(TungstenAnswer.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(deleteTungstenNetworkPolicyAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenNetworkSubnetCommand.class), anyLong())).thenReturn(removeTungstenNetworkSubnetAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(deleteTungstenNetworkPolicyAnswer.getResult()).thenReturn(true); + when(removeTungstenNetworkSubnetAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.100.150"); + when(publicNetwork.getTrafficType()).thenReturn(Networks.TrafficType.Public); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + + assertTrue(tungstenService.removePublicNetworkSubnet(vlanVO)); + verify(ipAddressDao, times(1)).unassignIpAddress(anyLong()); + } + + @Test + public void allocateDnsIpAddressTest() { + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(networkVO.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(networkVO.getGuestType()).thenReturn(Network.GuestType.Isolated); + when(tungstenGuestNetworkIpAddressDao.persist(any(TungstenGuestNetworkIpAddressVO.class))).thenReturn(tungstenGuestNetworkIpAddressVO); + when(networkVO.getCidr()).thenReturn("192.168.100.0/24"); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.100.100"); + + assertTrue(tungstenService.allocateDnsIpAddress(networkVO, null, "test")); + } + + @Test + public void deallocateDnsIpAddressTest() { + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(networkVO.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(networkVO.getGuestType()).thenReturn(Network.GuestType.Isolated); + when(tungstenGuestNetworkIpAddressDao.findByNetworkAndGuestIpAddress(anyLong(), anyString())).thenReturn(tungstenGuestNetworkIpAddressVO); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.100.100"); + + tungstenService.deallocateDnsIpAddress(networkVO, null, "test"); + verify(tungstenGuestNetworkIpAddressDao, times(1)).expunge(anyLong()); + } + + @Test + public void subscribeTungstenEventTest() { + tungstenService.subscribeTungstenEvent(); + + verify(messageBus, times(1)).subscribe(eq(IpAddressManager.MESSAGE_ASSIGN_IPADDR_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(IpAddressManager.MESSAGE_RELEASE_IPADDR_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(TungstenService.MESSAGE_APPLY_NETWORK_POLICY_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(ConfigurationManager.MESSAGE_CREATE_VLAN_IP_RANGE_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(ConfigurationManager.MESSAGE_DELETE_VLAN_IP_RANGE_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(ConfigurationManager.MESSAGE_CREATE_POD_IP_RANGE_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(ConfigurationManager.MESSAGE_DELETE_POD_IP_RANGE_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(DomainManager.MESSAGE_CREATE_TUNGSTEN_DOMAIN_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(DomainManager.MESSAGE_DELETE_TUNGSTEN_DOMAIN_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(ProjectManager.MESSAGE_DELETE_TUNGSTEN_PROJECT_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(TungstenService.MESSAGE_SYNC_TUNGSTEN_DB_WITH_DOMAINS_AND_PROJECTS_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(SecurityGroupService.MESSAGE_CREATE_TUNGSTEN_SECURITY_GROUP_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(SecurityGroupService.MESSAGE_DELETE_TUNGSTEN_SECURITY_GROUP_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(SecurityGroupService.MESSAGE_ADD_SECURITY_GROUP_RULE_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(SecurityGroupService.MESSAGE_REMOVE_SECURITY_GROUP_RULE_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(NetworkService.MESSAGE_ASSIGN_NIC_SECONDARY_IP_EVENT), any(MessageSubscriber.class)); + verify(messageBus, times(1)).subscribe(eq(NetworkService.MESSAGE_RELEASE_NIC_SECONDARY_IP_EVENT), any(MessageSubscriber.class)); + } + + @Test + public void syncTungstenDbWithCloudstackProjectsAndDomainsTest() { + DomainVO domainVO = mock(DomainVO.class); + ProjectVO projectVO = mock(ProjectVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer createTungstenDomainAnswer = mock(TungstenAnswer.class); + TungstenAnswer createTungstenProjectAnswer = mock(TungstenAnswer.class); + TungstenAnswer createTungstenDefaultProjectAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateTungstenDefaultSecurityGroupAnswer = mock(TungstenAnswer.class); + + when(domainDao.listAll()).thenReturn(List.of(domainVO)); + when(projectDao.listAll()).thenReturn(List.of(projectVO)); + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenDomainCommand.class), anyLong())).thenReturn(createTungstenDomainAnswer); + when(createTungstenDomainAnswer.getResult()).thenReturn(true); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenProjectCommand.class), anyLong())).thenReturn(createTungstenProjectAnswer); + when(createTungstenProjectAnswer.getResult()).thenReturn(true); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateTungstenDefaultSecurityGroupCommand.class), anyLong())).thenReturn(updateTungstenDefaultSecurityGroupAnswer); + when(updateTungstenDefaultSecurityGroupAnswer.getResult()).thenReturn(true); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenDefaultProjectCommand.class), anyLong())).thenReturn(createTungstenDefaultProjectAnswer); + when(createTungstenDefaultProjectAnswer.getResult()).thenReturn(true); + when(domainDao.findById(anyLong())).thenReturn(domainVO); + + assertTrue(tungstenService.syncTungstenDbWithCloudstackProjectsAndDomains()); + } + + @Test + public void updateLoadBalancerTest() { + Network network = mock(Network.class); + LoadBalancingRule loadBalancingRule = mock(LoadBalancingRule.class); + Network publicNetwork = mock(Network.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + HostVO hostVO = mock(HostVO.class); + TungstenAnswer getTungstenLoadBalancerAnswer = mock(TungstenAnswer.class); + TungstenAnswer updateLoadBalancerServiceInstanceAnswer = mock(TungstenAnswer.class); + Answer updateTungstenLoadbalancerStatsAnswer = mock(Answer.class); + Answer updateTungstenLoadbalancerSslAnswer = mock(Answer.class); + FirewallRuleVO firewallRuleVO = mock(FirewallRuleVO.class); + LoadBalancerCertMapVO loadBalancerCertMapVO = mock(LoadBalancerCertMapVO.class); + SslCertVO sslCertVO = mock(SslCertVO.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + Ip ip = mock(Ip.class); + AccountVO accountVO = mock(AccountVO.class); + Loadbalancer loadbalancer = mock(Loadbalancer.class); + + when(networkModel.getSystemNetworkByZoneAndTrafficType(anyLong(), eq(Networks.TrafficType.Public))).thenReturn(publicNetwork); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(hostDao.listAllHostsByZoneAndHypervisorType(anyLong(), eq(Hypervisor.HypervisorType.KVM))).thenReturn(List.of(hostVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenLoadBalancerCommand.class), anyLong())).thenReturn(getTungstenLoadBalancerAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(UpdateLoadBalancerServiceInstanceCommand.class), anyLong())).thenReturn(updateLoadBalancerServiceInstanceAnswer); + when(agentMgr.easySend(anyLong(), any(UpdateTungstenLoadbalancerStatsCommand.class))).thenReturn(updateTungstenLoadbalancerStatsAnswer); + when(agentMgr.easySend(anyLong(), any(UpdateTungstenLoadbalancerSslCommand.class))).thenReturn(updateTungstenLoadbalancerSslAnswer); + when(getTungstenLoadBalancerAnswer.getResult()).thenReturn(true); + when(updateLoadBalancerServiceInstanceAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadbalancerStatsAnswer.getResult()).thenReturn(true); + when(updateTungstenLoadbalancerSslAnswer.getResult()).thenReturn(true); + when(configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key())).thenReturn("enabled"); + when(fwRulesDao.listByIpAndPurposeAndNotRevoked(anyLong(), eq(FirewallRule.Purpose.LoadBalancing))).thenReturn(List.of(firewallRuleVO)); + when(lbCertMapDao.findByLbRuleId(anyLong())).thenReturn(loadBalancerCertMapVO); + when(entityMgr.findById(eq(SslCertVO.class), anyLong())).thenReturn(sslCertVO); + when(tungstenGuestNetworkIpAddressDao.findByNetworkIdAndPublicIp(anyLong(), anyString())).thenReturn(tungstenGuestNetworkIpAddressVO); + when(loadBalancingRule.getSourceIp()).thenReturn(ip); + when(accountDao.findById(anyLong())).thenReturn(accountVO); + when(ip.addr()).thenReturn("192.168.100.100"); + when(getTungstenLoadBalancerAnswer.getApiObjectBase()).thenReturn(loadbalancer); + when(ipAddressVO.getAddress()).thenReturn(ip); + when(tungstenGuestNetworkIpAddressVO.getGuestIpAddress()).thenReturn(ip); + + assertTrue(tungstenService.updateLoadBalancer(network, loadBalancingRule)); + } + + @Test + public void createTungstenSecurityGroupTest() { + SecurityGroup securityGroup = mock(SecurityGroup.class); + ProjectVO projectVO = mock(ProjectVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + DomainVO domainVO = mock(DomainVO.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + TungstenAnswer createTungstenSecurityGroupAnswer = mock(TungstenAnswer.class); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + mockStatic(Transaction.class); + + when(projectDao.findByProjectAccountId(anyLong())).thenReturn(projectVO); + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(domainDao.findById(anyLong())).thenReturn(domainVO); + when(projectDao.findByUuid(anyString())).thenReturn(projectVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenSecurityGroupCommand.class), anyLong())).thenReturn(createTungstenSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(addTungstenSecurityGroupRuleAnswer); + when(createTungstenSecurityGroupAnswer.getResult()).thenReturn(true); + when(addTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + PowerMockito.when(Transaction.execute(any(TransactionCallback.class))).thenReturn(List.of(tungstenSecurityGroupRuleVO)); + + assertTrue(tungstenService.createTungstenSecurityGroup(securityGroup)); + } + + @Test + public void deleteTungstenSecurityGroupTest() { + SecurityGroup securityGroup = mock(SecurityGroup.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer deleteTungstenSecurityGroupAnswer = mock(TungstenAnswer.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenSecurityGroupCommand.class), anyLong())).thenReturn(deleteTungstenSecurityGroupAnswer); + when(deleteTungstenSecurityGroupAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenSecurityGroup(securityGroup)); + } + + @Test + public void addTungstenSecurityGroupEgressRuleTest() { + SecurityRule securityRule = mock(SecurityRule.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenAnswer getTungstenSecurityGroupAnswer = mock(TungstenAnswer.class); + TungstenAnswer removeTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + net.juniper.tungsten.api.types.SecurityGroup securityGroup = mock(net.juniper.tungsten.api.types.SecurityGroup.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + NicVO nicVO = mock(NicVO.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(securityGroupDao.findById(anyLong())).thenReturn(securityGroupVO); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenSecurityGroupCommand.class), anyLong())).thenReturn(getTungstenSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(removeTungstenSecurityGroupRuleAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(addTungstenSecurityGroupRuleAnswer); + when(getTungstenSecurityGroupAnswer.getResult()).thenReturn(true); + when(removeTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(addTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(getTungstenSecurityGroupAnswer.getApiObjectBase()).thenReturn(securityGroup); + when(securityRule.getRuleType()).thenReturn(SecurityRule.SecurityRuleType.EgressRule); + when(tungstenSecurityGroupRuleDao.findDefaultSecurityRule(anyLong(), anyString(), anyString())).thenReturn(tungstenSecurityGroupRuleVO); + when(securityRule.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(securityRule.getEndPort()).thenReturn(NetUtils.PORT_RANGE_MIN); + when(securityGroupVMMapDao.listVmIdsBySecurityGroup(anyLong())).thenReturn(List.of(1L)); + when(nicDao.findDefaultNicForVM(anyLong())).thenReturn(nicVO); + when(nicVO.getIPv4Address()).thenReturn("192.168.100.100"); + when(nicVO.getIPv6Address()).thenReturn("fd00::1"); + when(nicVO.getSecondaryIp()).thenReturn(true); + when(nicSecIpDao.getSecondaryIpAddressesForNic(anyLong())).thenReturn(List.of("192.168.100.200")); + when(tungstenSecurityGroupRuleDao.persist(any(TungstenSecurityGroupRuleVO.class))).thenReturn(tungstenSecurityGroupRuleVO); + when(securityRule.getAllowedNetworkId()).thenReturn(1L); + + assertTrue(tungstenService.addTungstenSecurityGroupRule(List.of(securityRule))); + } + + @Test + public void addTungstenSecurityGroupIngressRuleTest() { + SecurityRule securityRule = mock(SecurityRule.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenAnswer getTungstenSecurityGroupAnswer = mock(TungstenAnswer.class); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + net.juniper.tungsten.api.types.SecurityGroup securityGroup = mock(net.juniper.tungsten.api.types.SecurityGroup.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(securityGroupDao.findById(anyLong())).thenReturn(securityGroupVO); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenSecurityGroupCommand.class), anyLong())).thenReturn(getTungstenSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(addTungstenSecurityGroupRuleAnswer); + when(getTungstenSecurityGroupAnswer.getResult()).thenReturn(true); + when(addTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(getTungstenSecurityGroupAnswer.getApiObjectBase()).thenReturn(securityGroup); + when(securityRule.getRuleType()).thenReturn(SecurityRule.SecurityRuleType.IngressRule); + when(securityRule.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(securityRule.getEndPort()).thenReturn(NetUtils.PORT_RANGE_MIN); + when(securityRule.getAllowedNetworkId()).thenReturn(null); + + assertTrue(tungstenService.addTungstenSecurityGroupRule(List.of(securityRule))); + } + + @Test + public void removeTungstenSecurityGroupEgressRuleTest() { + SecurityRule securityRule = mock(SecurityRule.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + TungstenAnswer removeTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + NicVO nicVO = mock(NicVO.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(securityGroupDao.findById(anyLong())).thenReturn(securityGroupVO); + when(securityRule.getRuleType()).thenReturn(SecurityRule.SecurityRuleType.EgressRule); + when(securityRule.getType()).thenReturn("egress"); + when(tungstenSecurityGroupRuleDao.persist(any(TungstenSecurityGroupRuleVO.class))).thenReturn(tungstenSecurityGroupRuleVO); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(addTungstenSecurityGroupRuleAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(removeTungstenSecurityGroupRuleAnswer); + when(addTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(removeTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(securityRule.getAllowedNetworkId()).thenReturn(1L); + when(securityGroupVMMapDao.listVmIdsBySecurityGroup(anyLong())).thenReturn(List.of(1L)); + when(nicDao.findDefaultNicForVM(anyLong())).thenReturn(nicVO); + when(tungstenSecurityGroupRuleDao.expunge(anyLong())).thenReturn(true); + when(nicVO.getIPv4Address()).thenReturn("192.168.100.100"); + when(nicVO.getIPv6Address()).thenReturn("fd00::1"); + when(nicVO.getSecondaryIp()).thenReturn(true); + when(nicSecIpDao.getSecondaryIpAddressesForNic(anyLong())).thenReturn(List.of("192.168.100.200")); + when(tungstenSecurityGroupRuleDao.findBySecurityGroupAndRuleTypeAndRuleTarget(anyLong(), anyString(), anyString())).thenReturn(tungstenSecurityGroupRuleVO); + + assertTrue(tungstenService.removeTungstenSecurityGroupRule(securityRule)); + } + + @Test + public void removeTungstenSecurityGroupIngressRuleTest() { + SecurityRule securityRule = mock(SecurityRule.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer removeTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(securityGroupDao.findById(anyLong())).thenReturn(securityGroupVO); + when(securityRule.getRuleType()).thenReturn(SecurityRule.SecurityRuleType.IngressRule); + when(securityRule.getType()).thenReturn("ingress"); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(removeTungstenSecurityGroupRuleAnswer); + when(removeTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(securityRule.getAllowedNetworkId()).thenReturn(null); + + assertTrue(tungstenService.removeTungstenSecurityGroupRule(securityRule)); + } + + @Test + public void addTungstenNicSecondaryIpAddressTest() { + NicSecondaryIp nicSecondaryIp = mock(NicSecondaryIp.class); + Network network = mock(Network.class); + DataCenter dataCenter = mock(DataCenter.class); + Nic nic = mock(Nic.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + SecurityGroupRuleVO securityGroupRuleVO = mock(SecurityGroupRuleVO.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer addTungstenSecondaryIpAddressAnswer = mock(TungstenAnswer.class); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + + when(entityMgr.findById(eq(NicSecondaryIp.class), anyLong())).thenReturn(nicSecondaryIp); + when(entityMgr.findById(eq(Network.class), anyLong())).thenReturn(network); + when(entityMgr.findById(eq(DataCenter.class), anyLong())).thenReturn(dataCenter); + when(entityMgr.findById(eq(Nic.class), anyLong())).thenReturn(nic); + when(nicSecondaryIp.getIp4Address()).thenReturn("192.168.100.100"); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecondaryIpAddressCommand.class), anyLong())).thenReturn(addTungstenSecondaryIpAddressAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(addTungstenSecurityGroupRuleAnswer); + when(addTungstenSecondaryIpAddressAnswer.getResult()).thenReturn(true); + when(addTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(dataCenter.isSecurityGroupEnabled()).thenReturn(true); + when(network.getGuestType()).thenReturn(Network.GuestType.Shared); + when(securityGroupManager.getSecurityGroupsForVm(anyLong())).thenReturn(List.of(securityGroupVO)); + when(securityGroupRuleDao.listByAllowedSecurityGroupId(anyLong())).thenReturn(List.of(securityGroupRuleVO)); + when(tungstenSecurityGroupRuleDao.persist(any(TungstenSecurityGroupRuleVO.class))).thenReturn(tungstenSecurityGroupRuleVO); + when(securityGroupRuleVO.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + + assertTrue(tungstenService.addTungstenNicSecondaryIpAddress(1L)); + } + + @Test + public void removeTungstenNicSecondaryIpAddressTest() { + NicSecondaryIpVO nicSecondaryIpVO = mock(NicSecondaryIpVO.class); + Network network = mock(Network.class); + DataCenter dataCenter = mock(DataCenter.class); + TungstenAnswer removeTungstenSecondaryIpAddressAnswer = mock(TungstenAnswer.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenAnswer removeTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + + when(entityMgr.findById(eq(Network.class), anyLong())).thenReturn(network); + when(entityMgr.findById(eq(DataCenter.class), anyLong())).thenReturn(dataCenter); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenSecondaryIpAddressCommand.class), anyLong())).thenReturn(removeTungstenSecondaryIpAddressAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(removeTungstenSecurityGroupRuleAnswer); + when(removeTungstenSecondaryIpAddressAnswer.getResult()).thenReturn(true); + when(removeTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(dataCenter.isSecurityGroupEnabled()).thenReturn(true); + when(network.getGuestType()).thenReturn(Network.GuestType.Shared); + when(tungstenSecurityGroupRuleDao.listByRuleTarget(anyString())).thenReturn(List.of(tungstenSecurityGroupRuleVO)); + when(securityGroupDao.findById(anyLong())).thenReturn(securityGroupVO); + when(tungstenSecurityGroupRuleDao.expunge(anyLong())).thenReturn(true); + when(nicSecondaryIpVO.getIp4Address()).thenReturn("192.168.100.100"); + + assertTrue(tungstenService.removeTungstenNicSecondaryIpAddress(nicSecondaryIpVO)); + } + + @Test + public void createTungstenPolicyTest() { + TungstenAnswer createTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenNetworkPolicy tungstenNetworkPolicy = mock(TungstenNetworkPolicy.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenPolicyCommand.class), anyLong())).thenReturn(createTungstenPolicyAnswer); + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(createTungstenPolicyAnswer.getResult()).thenReturn(true); + when(createTungstenPolicyAnswer.getTungstenModel()).thenReturn(tungstenNetworkPolicy); + when(tungstenNetworkPolicy.getNetworkPolicy()).thenReturn(networkPolicy); + + assertNotNull(tungstenService.createTungstenPolicy(1L, "test")); + } + + @Test + public void addTungstenPolicyRuleTest() throws Exception { + AddTungstenPolicyRuleCommand addTungstenPolicyRuleCommand = mock(AddTungstenPolicyRuleCommand.class); + TungstenAnswer addTungstenPolicyRuleAnswer = mock(TungstenAnswer.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + PolicyEntriesType policyEntriesType = mock(PolicyEntriesType.class); + PolicyRuleType policyRuleType = mock(PolicyRuleType.class); + ActionListType actionListType = mock(ActionListType.class); + AddressType addressType = mock(AddressType.class); + SubnetType subnetType = mock(SubnetType.class); + PortType portType = mock(PortType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenPolicyRuleCommand.class), anyLong())).thenReturn(addTungstenPolicyRuleAnswer); + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(addTungstenPolicyRuleAnswer.getResult()).thenReturn(true); + when(addTungstenPolicyRuleAnswer.getApiObjectBase()).thenReturn(networkPolicy); + when(networkPolicy.getEntries()).thenReturn(policyEntriesType); + when(policyEntriesType.getPolicyRule()).thenReturn(List.of(policyRuleType)); + whenNew(AddTungstenPolicyRuleCommand.class).withAnyArguments().thenReturn(addTungstenPolicyRuleCommand); + PowerMockito.when(addTungstenPolicyRuleCommand, "getUuid").thenReturn("8b4637b6-5629-46de-8fb2-d0b0502bfa85"); + when(policyRuleType.getRuleUuid()).thenReturn("8b4637b6-5629-46de-8fb2-d0b0502bfa85"); + when(policyRuleType.getActionList()).thenReturn(actionListType); + when(actionListType.getSimpleAction()).thenReturn("pass"); + when(policyRuleType.getSrcAddresses()).thenReturn(List.of(addressType)); + when(addressType.getSubnet()).thenReturn(subnetType); + when(policyRuleType.getSrcPorts()).thenReturn(List.of(portType)); + when(policyRuleType.getDstAddresses()).thenReturn(List.of(addressType)); + when(policyRuleType.getDstPorts()).thenReturn(List.of(portType)); + + assertNotNull(tungstenService.addTungstenPolicyRule(1L, "948f421c-edde-4518-a391-09299cc25dc2", "pass", + "<>", "tcp", "network1", "192.168.100.100", 32, 80, 80, + "network2", "192.168.200.200", 32, 80, 80)); + } + + @Test + public void listTungstenPolicyTest() { + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer listTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenNetworkPolicy tungstenNetworkPolicy = mock(TungstenNetworkPolicy.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(networkDao.findById(anyLong())).thenReturn(networkVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenPolicyCommand.class), anyLong())).thenReturn(listTungstenPolicyAnswer); + when(listTungstenPolicyAnswer.getResult()).thenReturn(true); + when(listTungstenPolicyAnswer.getTungstenModelList()).thenReturn(List.of(tungstenNetworkPolicy)); + when(tungstenNetworkPolicy.getNetworkPolicy()).thenReturn(networkPolicy); + when(tungstenNetworkPolicy.getVirtualNetworkList()).thenReturn( + List.of(virtualNetwork)); + + assertNotNull(tungstenService.listTungstenPolicy(1L, 2L, 3L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void listTungstenNetworkTest() { + TungstenAnswer listTungstenNetworkAnswer = mock(TungstenAnswer.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenNetworkCommand.class), anyLong())).thenReturn(listTungstenNetworkAnswer); + when(listTungstenNetworkAnswer.getResult()).thenReturn(true); + doReturn(List.of(virtualNetwork)).when(listTungstenNetworkAnswer).getApiObjectBaseList(); + when((virtualNetwork.getName())).thenReturn("guestNetwork1"); + + assertNotNull(tungstenService.listTungstenNetwork(1L, "948f421c-edde-4518-a391-09299cc25dc2", false)); + } + + @Test + public void listTungstenNicTest() { + TungstenAnswer listTungstenNicAnswer = mock(TungstenAnswer.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenNicCommand.class), anyLong())).thenReturn(listTungstenNicAnswer); + when(listTungstenNicAnswer.getResult()).thenReturn(true); + doReturn(List.of(virtualMachineInterface)).when(listTungstenNicAnswer).getApiObjectBaseList(); + + assertNotNull(tungstenService.listTungstenNic(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void listTungstenVmTest() { + TungstenAnswer listTungstenVmAnswer = mock(TungstenAnswer.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenVmCommand.class), anyLong())).thenReturn(listTungstenVmAnswer); + when(listTungstenVmAnswer.getResult()).thenReturn(true); + doReturn(List.of(virtualMachine)).when(listTungstenVmAnswer).getApiObjectBaseList(); + + assertNotNull(tungstenService.listTungstenVm(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenPolicyTest() { + TungstenAnswer deleteTungstenPolicyAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenPolicyCommand.class), anyLong())).thenReturn(deleteTungstenPolicyAnswer); + when(deleteTungstenPolicyAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenPolicy(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void listTungstenPolicyRuleWithRuleUuidTest() { + TungstenAnswer listTungstenPolicyRuleAnswer = mock(TungstenAnswer.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + PolicyEntriesType policyEntriesType = mock(PolicyEntriesType.class); + PolicyRuleType policyRuleType = mock(PolicyRuleType.class); + ActionListType actionListType = mock(ActionListType.class); + AddressType addressType = mock(AddressType.class); + SubnetType subnetType = mock(SubnetType.class); + PortType portType = mock(PortType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenPolicyRuleCommand.class), anyLong())).thenReturn(listTungstenPolicyRuleAnswer); + when(listTungstenPolicyRuleAnswer.getResult()).thenReturn(true); + doReturn(networkPolicy).when(listTungstenPolicyRuleAnswer).getApiObjectBase(); + when(networkPolicy.getEntries()).thenReturn(policyEntriesType); + when(policyEntriesType.getPolicyRule()).thenReturn(List.of(policyRuleType)); + when(policyRuleType.getRuleUuid()).thenReturn("8b4637b6-5629-46de-8fb2-d0b0502bfa85"); + when(policyRuleType.getActionList()).thenReturn(actionListType); + when(actionListType.getSimpleAction()).thenReturn("pass"); + when(policyRuleType.getSrcAddresses()).thenReturn(List.of(addressType)); + when(addressType.getSubnet()).thenReturn(subnetType); + when(policyRuleType.getSrcPorts()).thenReturn(List.of(portType)); + when(policyRuleType.getDstAddresses()).thenReturn(List.of(addressType)); + when(policyRuleType.getDstPorts()).thenReturn(List.of(portType)); + + assertNotNull(tungstenService.listTungstenPolicyRule(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void listTungstenPolicyRuleWithAllRuleTest() { + TungstenAnswer listTungstenPolicyRuleAnswer = mock(TungstenAnswer.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + PolicyEntriesType policyEntriesType = mock(PolicyEntriesType.class); + PolicyRuleType policyRuleType = mock(PolicyRuleType.class); + ActionListType actionListType = mock(ActionListType.class); + AddressType addressType = mock(AddressType.class); + SubnetType subnetType = mock(SubnetType.class); + PortType portType = mock(PortType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenPolicyRuleCommand.class), anyLong())).thenReturn(listTungstenPolicyRuleAnswer); + when(listTungstenPolicyRuleAnswer.getResult()).thenReturn(true); + doReturn(networkPolicy).when(listTungstenPolicyRuleAnswer).getApiObjectBase(); + when(networkPolicy.getEntries()).thenReturn(policyEntriesType); + when(policyEntriesType.getPolicyRule()).thenReturn(List.of(policyRuleType)); + when(policyRuleType.getRuleUuid()).thenReturn("8b4637b6-5629-46de-8fb2-d0b0502bfa85"); + when(policyRuleType.getActionList()).thenReturn(actionListType); + when(actionListType.getSimpleAction()).thenReturn("pass"); + when(policyRuleType.getSrcAddresses()).thenReturn(List.of(addressType)); + when(addressType.getSubnet()).thenReturn(subnetType); + when(policyRuleType.getSrcPorts()).thenReturn(List.of(portType)); + when(policyRuleType.getDstAddresses()).thenReturn(List.of(addressType)); + when(policyRuleType.getDstPorts()).thenReturn(List.of(portType)); + + assertNotNull(tungstenService.listTungstenPolicyRule(1L, "948f421c-edde-4518-a391-09299cc25dc2", null)); + } + + @Test + public void removeTungstenPolicyRuleTest() { + TungstenAnswer removeTungstenPolicyRuleAnswer = mock(TungstenAnswer.class); + TungstenNetworkPolicy tungstenNetworkPolicy = mock(TungstenNetworkPolicy.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenPolicyRuleCommand.class), anyLong())).thenReturn(removeTungstenPolicyRuleAnswer); + when(removeTungstenPolicyRuleAnswer.getResult()).thenReturn(true); + when(removeTungstenPolicyRuleAnswer.getTungstenModel()).thenReturn(tungstenNetworkPolicy); + when(tungstenNetworkPolicy.getNetworkPolicy()).thenReturn(networkPolicy); + when(tungstenNetworkPolicy.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.removeTungstenPolicyRule(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void createTungstenTagTest() { + TungstenAnswer createTungstenTagAnswer = mock(TungstenAnswer.class); + TungstenTag tungstenTag = mock(TungstenTag.class); + Tag tag = mock(Tag.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenTagCommand.class), anyLong())).thenReturn(createTungstenTagAnswer); + when(createTungstenTagAnswer.getResult()).thenReturn(true); + when(createTungstenTagAnswer.getTungstenModel()).thenReturn(tungstenTag); + when(tungstenTag.getTag()).thenReturn(tag); + doReturn(List.of(virtualNetwork)).when(tungstenTag).getVirtualNetworkList(); + doReturn(List.of(virtualMachine)).when(tungstenTag).getVirtualMachineList(); + doReturn(List.of(virtualMachineInterface)).when(tungstenTag).getVirtualMachineInterfaceList(); + doReturn(List.of(networkPolicy)).when(tungstenTag).getNetworkPolicyList(); + + assertNotNull(tungstenService.createTungstenTag(1L, "testTag", "testTagType")); + } + + @Test + public void createTungstenTagTypeTest() { + TungstenAnswer createTungstenTagTypeAnswer = mock(TungstenAnswer.class); + TagType tagtype = mock(TagType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenTagTypeCommand.class), anyLong())).thenReturn(createTungstenTagTypeAnswer); + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(createTungstenTagTypeAnswer.getResult()).thenReturn(true); + when(createTungstenTagTypeAnswer.getApiObjectBase()).thenReturn(tagtype); + + assertNotNull(tungstenService.createTungstenTagType(1L, "testTagType")); + } + + @Test + public void listTungstenTagsTest() { + TungstenAnswer listTungstenTagAnswer = mock(TungstenAnswer.class); + TungstenTag tungstenTag = mock(TungstenTag.class); + Tag tag = mock(Tag.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + ApplicationPolicySet applicationPolicySet = mock(ApplicationPolicySet.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenTagCommand.class), anyLong())).thenReturn(listTungstenTagAnswer); + when(listTungstenTagAnswer.getResult()).thenReturn(true); + when(listTungstenTagAnswer.getTungstenModelList()).thenReturn(List.of(tungstenTag)); + when(tungstenTag.getTag()).thenReturn(tag); + doReturn(List.of(virtualNetwork)).when(tungstenTag).getVirtualNetworkList(); + doReturn(List.of(virtualMachine)).when(tungstenTag).getVirtualMachineList(); + doReturn(List.of(virtualMachineInterface)).when(tungstenTag).getVirtualMachineInterfaceList(); + doReturn(List.of(networkPolicy)).when(tungstenTag).getNetworkPolicyList(); + doReturn(List.of(applicationPolicySet)).when(tungstenTag).getApplicationPolicySetList(); + + assertNotNull(tungstenService.listTungstenTags(1L, "948f421c-edde-4518-a391-09299cc25dc2" + , "8b4637b6-5629-46de-8fb2-d0b0502bfa85", "8d097a79-a38d-4db4-8a41-16f15d9c5afa", "a329662e-1805-4a89-9b05-2b818ea35978", + "d5e3f5c5-97ed-41b6-9b6f-7f696b9eddeb", "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652")); + } + + @Test + public void listTungstenTagTypesTest() { + TungstenAnswer listTungstenTagTypeAnswer = mock(TungstenAnswer.class); + TagType tagtype = mock(TagType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenTagTypeCommand.class), anyLong())).thenReturn(listTungstenTagTypeAnswer); + when(listTungstenTagTypeAnswer.getResult()).thenReturn(true); + doReturn(List.of(tagtype)).when(listTungstenTagTypeAnswer).getApiObjectBaseList(); + + assertNotNull(tungstenService.listTungstenTagTypes(1L, "testTagType")); + } + + @Test + public void deleteTungstenTagTest() { + TungstenAnswer deleteTungstenTagAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenTagCommand.class), anyLong())).thenReturn(deleteTungstenTagAnswer); + when(deleteTungstenTagAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenTag(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenTagTypeTest() { + TungstenAnswer deleteTungstenTagTypeAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenTagTypeCommand.class), anyLong())).thenReturn(deleteTungstenTagTypeAnswer); + when(deleteTungstenTagTypeAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenTagType(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void applyTungstenPolicyTest() { + TungstenAnswer applyTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenNetworkPolicy tungstenNetworkPolicy = mock(TungstenNetworkPolicy.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenNetworkPolicyCommand.class), anyLong())).thenReturn(applyTungstenPolicyAnswer); + when(applyTungstenPolicyAnswer.getResult()).thenReturn(true); + when(applyTungstenPolicyAnswer.getTungstenModel()).thenReturn(tungstenNetworkPolicy); + when(tungstenNetworkPolicy.getNetworkPolicy()).thenReturn(networkPolicy); + when(tungstenNetworkPolicy.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.applyTungstenPolicy(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85", 1, 1)); + } + + @Test + public void applyTungstenTagTest() { + TungstenAnswer applyTungstenTagAnswer = mock(TungstenAnswer.class); + TungstenTag tungstenTag = mock(TungstenTag.class); + Tag tag = mock(Tag.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ApplyTungstenTagCommand.class), anyLong())).thenReturn(applyTungstenTagAnswer); + when(applyTungstenTagAnswer.getResult()).thenReturn(true); + when(applyTungstenTagAnswer.getTungstenModel()).thenReturn(tungstenTag); + when(tungstenTag.getTag()).thenReturn(tag); + when(tungstenTag.getNetworkPolicyList()).thenReturn(List.of(networkPolicy)); + when(tungstenTag.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + when(tungstenTag.getVirtualMachineList()).thenReturn(List.of(virtualMachine)); + when(tungstenTag.getVirtualMachineInterfaceList()).thenReturn(List.of(virtualMachineInterface)); + + assertNotNull(tungstenService.applyTungstenTag(1L, List.of("948f421c-edde-4518-a391-09299cc25dc2"), List.of("8b4637b6-5629-46de-8fb2-d0b0502bfa85") + , List.of("8d097a79-a38d-4db4-8a41-16f15d9c5afa"), "a329662e-1805-4a89-9b05-2b818ea35978", "d5e3f5c5-97ed-41b6-9b6f-7f696b9eddeb" + , "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652")); + } + + @Test + public void removeTungstenPolicyTest() { + TungstenAnswer removeTungstenPolicyAnswer = mock(TungstenAnswer.class); + TungstenNetworkPolicy tungstenNetworkPolicy = mock(TungstenNetworkPolicy.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenPolicyCommand.class), anyLong())).thenReturn(removeTungstenPolicyAnswer); + when(removeTungstenPolicyAnswer.getResult()).thenReturn(true); + when(removeTungstenPolicyAnswer.getTungstenModel()).thenReturn(tungstenNetworkPolicy); + when(tungstenNetworkPolicy.getNetworkPolicy()).thenReturn(networkPolicy); + when(tungstenNetworkPolicy.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.removeTungstenPolicy(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void removeTungstenTagTest() { + TungstenAnswer removeTungstenTagAnswer = mock(TungstenAnswer.class); + TungstenTag tungstenTag = mock(TungstenTag.class); + Tag tag = mock(Tag.class); + NetworkPolicy networkPolicy = mock(NetworkPolicy.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + VirtualMachine virtualMachine = mock(VirtualMachine.class); + VirtualMachineInterface virtualMachineInterface = mock(VirtualMachineInterface.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenTagCommand.class), anyLong())).thenReturn(removeTungstenTagAnswer); + when(removeTungstenTagAnswer.getResult()).thenReturn(true); + when(removeTungstenTagAnswer.getTungstenModel()).thenReturn(tungstenTag); + when(tungstenTag.getTag()).thenReturn(tag); + when(tungstenTag.getNetworkPolicyList()).thenReturn(List.of(networkPolicy)); + when(tungstenTag.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + when(tungstenTag.getVirtualMachineList()).thenReturn(List.of(virtualMachine)); + when(tungstenTag.getVirtualMachineInterfaceList()).thenReturn(List.of(virtualMachineInterface)); + + assertNotNull(tungstenService.removeTungstenTag(1L, List.of("948f421c-edde-4518-a391-09299cc25dc2"), + List.of("8b4637b6-5629-46de-8fb2-d0b0502bfa85"), + List.of("8d097a79-a38d-4db4-8a41-16f15d9c5afa"), "a329662e-1805-4a89-9b05-2b818ea35978", null, + "d5e3f5c5-97ed-41b6-9b6f-7f696b9eddeb")); + } + + @Test + public void createTungstenAddressGroupTest() { + TungstenAnswer createTungstenAddressGroupAnswer = mock(TungstenAnswer.class); + AddressGroup addressGroup = mock(AddressGroup.class); + SubnetListType subnetListType = mock(SubnetListType.class); + SubnetType subnetType = mock(SubnetType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenAddressGroupCommand.class), anyLong())).thenReturn(createTungstenAddressGroupAnswer); + when(createTungstenAddressGroupAnswer.getResult()).thenReturn(true); + when(createTungstenAddressGroupAnswer.getApiObjectBase()).thenReturn(addressGroup); + when(addressGroup.getPrefix()).thenReturn(subnetListType); + when(subnetListType.getSubnet()).thenReturn(List.of(subnetType)); + + assertNotNull(tungstenService.createTungstenAddressGroup(1L, "test", "192.168.100.0", 24)); + } + + @Test + public void createTungstenServiceGroupTest() { + TungstenAnswer createTungstenServiceGroupAnswer = mock(TungstenAnswer.class); + ServiceGroup serviceGroup = mock(ServiceGroup.class); + FirewallServiceGroupType firewallServiceGroupType = mock(FirewallServiceGroupType.class); + FirewallServiceType firewallServiceType = mock(FirewallServiceType.class); + PortType portType = mock(PortType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenServiceGroupCommand.class), anyLong())).thenReturn(createTungstenServiceGroupAnswer); + when(createTungstenServiceGroupAnswer.getResult()).thenReturn(true); + when(createTungstenServiceGroupAnswer.getApiObjectBase()).thenReturn(serviceGroup); + when(serviceGroup.getFirewallServiceList()).thenReturn(firewallServiceGroupType); + when(firewallServiceGroupType.getFirewallService()).thenReturn(List.of(firewallServiceType)); + when(firewallServiceType.getDstPorts()).thenReturn(portType); + + assertNotNull(tungstenService.createTungstenServiceGroup(1L, "test", "tcp", 80, 80)); + } + + @Test + public void createTungstenFirewallRuleTest() { + TungstenAnswer createTungstenFirewallRuleAnswer = mock(TungstenAnswer.class); + net.juniper.tungsten.api.types.FirewallRule firewallRule = mock(net.juniper.tungsten.api.types.FirewallRule.class); + ActionListType actionListType = mock(ActionListType.class); + ObjectReference serviceGroup = mock(ObjectReference.class); + FirewallRuleEndpointType firewallRuleEndpointType1 = mock(FirewallRuleEndpointType.class); + FirewallRuleEndpointType firewallRuleEndpointType2 = mock(FirewallRuleEndpointType.class); + FirewallRuleMatchTagsType firewallRuleMatchTagsType = mock(FirewallRuleMatchTagsType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenFirewallRuleCommand.class), anyLong())).thenReturn(createTungstenFirewallRuleAnswer); + when(createTungstenFirewallRuleAnswer.getResult()).thenReturn(true); + when(createTungstenFirewallRuleAnswer.getApiObjectBase()).thenReturn(firewallRule); + when(firewallRule.getActionList()).thenReturn(actionListType); + when(actionListType.getSimpleAction()).thenReturn("pass"); + when(firewallRule.getServiceGroup()).thenReturn(List.of(serviceGroup)); + when(serviceGroup.getReferredName()).thenReturn(List.of("service")); + when(firewallRule.getEndpoint1()).thenReturn(firewallRuleEndpointType1); + when(firewallRule.getEndpoint2()).thenReturn(firewallRuleEndpointType2); + when(firewallRuleEndpointType1.getTags()).thenReturn(List.of("tag")); + when(firewallRuleEndpointType2.getTags()).thenReturn(null); + when(firewallRuleEndpointType2.getAddressGroup()).thenReturn("address:group"); + when(firewallRule.getMatchTags()).thenReturn(firewallRuleMatchTagsType); + + assertNotNull(tungstenService.createTungstenFirewallRule(1L, "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652", "test", "pass", "948f421c-edde-4518-a391-09299cc25dc2", + "8b4637b6-5629-46de-8fb2-d0b0502bfa85", "8d097a79-a38d-4db4-8a41-16f15d9c5afa", null, "<>", "a329662e-1805-4a89-9b05-2b818ea35978" + , "d5e3f5c5-97ed-41b6-9b6f-7f696b9eddeb", null, "df8e4490-2a40-4d63-a6f3-1f829ffe4fc6", 1)); + } + + @Test + public void createTungstenFirewallPolicyTest() { + TungstenAnswer createTungstenFirewallPolicyAnswer = mock(TungstenAnswer.class); + FirewallPolicy firewallPolicy = mock(FirewallPolicy.class); + ObjectReference firewallSequenceObjectReference = mock(ObjectReference.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenFirewallPolicyCommand.class), anyLong())).thenReturn(createTungstenFirewallPolicyAnswer); + when(createTungstenFirewallPolicyAnswer.getResult()).thenReturn(true); + when(createTungstenFirewallPolicyAnswer.getApiObjectBase()).thenReturn(firewallPolicy); + when(firewallPolicy.getFirewallRule()).thenReturn(List.of(firewallSequenceObjectReference)); + when(firewallSequenceObjectReference.getReferredName()).thenReturn(List.of("firewallrule")); + + assertNotNull(tungstenService.createTungstenFirewallPolicy(1L, "f5ba12c8-d4c5-4c20-a57d-67a9b6fca652","test", 1)); + } + + @Test + public void createTungstenApplicationPolicySetTest() { + TungstenAnswer createTungstenApplicationPolicySetAnswer = mock(TungstenAnswer.class); + ApplicationPolicySet applicationPolicySet = mock(ApplicationPolicySet.class); + ObjectReference objectReference = mock(ObjectReference.class); + ObjectReference firewallSequenceObjectReference = mock(ObjectReference.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenApplicationPolicySetCommand.class), anyLong())).thenReturn(createTungstenApplicationPolicySetAnswer); + when(createTungstenApplicationPolicySetAnswer.getResult()).thenReturn(true); + when(createTungstenApplicationPolicySetAnswer.getApiObjectBase()).thenReturn(applicationPolicySet); + when(applicationPolicySet.getTag()).thenReturn(List.of(objectReference)); + when(objectReference.getReferredName()).thenReturn(List.of("tag")); + when(applicationPolicySet.getFirewallPolicy()).thenReturn(List.of(firewallSequenceObjectReference)); + when(firewallSequenceObjectReference.getReferredName()).thenReturn(List.of("firewallrule")); + + assertNotNull(tungstenService.createTungstenApplicationPolicySet(1L, "test")); + } + + @Test + public void listTungstenApplicationPolicySetTest() { + TungstenAnswer listTungstenApplicationPolicySetAnswer = mock(TungstenAnswer.class); + ApplicationPolicySet applicationPolicySet = mock(ApplicationPolicySet.class); + ObjectReference objectReference = mock(ObjectReference.class); + ObjectReference firewallSequenceObjectReference = mock(ObjectReference.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenApplicationPolicySetCommand.class), anyLong())).thenReturn(listTungstenApplicationPolicySetAnswer); + when(listTungstenApplicationPolicySetAnswer.getResult()).thenReturn(true); + doReturn(List.of(applicationPolicySet)).when(listTungstenApplicationPolicySetAnswer).getApiObjectBaseList(); + when(applicationPolicySet.getTag()).thenReturn(List.of(objectReference)); + when(objectReference.getReferredName()).thenReturn(List.of("tag")); + when(applicationPolicySet.getFirewallPolicy()).thenReturn(List.of(firewallSequenceObjectReference)); + when(firewallSequenceObjectReference.getReferredName()).thenReturn(List.of("firewallrule")); + + assertNotNull(tungstenService.listTungstenApplicationPolicySet(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void listTungstenFirewallPolicyTest() { + TungstenAnswer listTungstenFirewallPolicyAnswer = mock(TungstenAnswer.class); + FirewallPolicy firewallPolicy = mock(FirewallPolicy.class); + ObjectReference firewallSequenceObjectReference = mock(ObjectReference.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenFirewallPolicyCommand.class), anyLong())).thenReturn(listTungstenFirewallPolicyAnswer); + when(listTungstenFirewallPolicyAnswer.getResult()).thenReturn(true); + doReturn(List.of(firewallPolicy)).when(listTungstenFirewallPolicyAnswer).getApiObjectBaseList(); + when(firewallPolicy.getFirewallRule()).thenReturn(List.of(firewallSequenceObjectReference)); + when(firewallSequenceObjectReference.getReferredName()).thenReturn(List.of("firewallrule")); + + assertNotNull(tungstenService.listTungstenFirewallPolicy(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void listTungstenFirewallRuleTest() { + TungstenAnswer listTungstenFirewallRuleAnswer = mock(TungstenAnswer.class); + net.juniper.tungsten.api.types.FirewallRule firewallRule = mock(net.juniper.tungsten.api.types.FirewallRule.class); + ActionListType actionListType = mock(ActionListType.class); + ObjectReference serviceGroup = mock(ObjectReference.class); + FirewallRuleEndpointType firewallRuleEndpointType1 = mock(FirewallRuleEndpointType.class); + FirewallRuleEndpointType firewallRuleEndpointType2 = mock(FirewallRuleEndpointType.class); + FirewallRuleMatchTagsType firewallRuleMatchTagsType = mock(FirewallRuleMatchTagsType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenFirewallRuleCommand.class), anyLong())).thenReturn(listTungstenFirewallRuleAnswer); + when(listTungstenFirewallRuleAnswer.getResult()).thenReturn(true); + doReturn(List.of(firewallRule)).when(listTungstenFirewallRuleAnswer).getApiObjectBaseList(); + when(firewallRule.getActionList()).thenReturn(actionListType); + when(actionListType.getSimpleAction()).thenReturn("pass"); + when(firewallRule.getServiceGroup()).thenReturn(List.of(serviceGroup)); + when(serviceGroup.getReferredName()).thenReturn(List.of("service")); + when(firewallRule.getEndpoint1()).thenReturn(firewallRuleEndpointType1); + when(firewallRule.getEndpoint2()).thenReturn(firewallRuleEndpointType2); + when(firewallRuleEndpointType1.getTags()).thenReturn(List.of("tag")); + when(firewallRuleEndpointType2.getTags()).thenReturn(null); + when(firewallRuleEndpointType2.getAddressGroup()).thenReturn("address:group"); + when(firewallRule.getMatchTags()).thenReturn(firewallRuleMatchTagsType); + + assertNotNull(tungstenService.listTungstenFirewallRule(1L, "948f421c-edde-4518-a391-09299cc25dc2", + "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void listTungstenAddressGroupTest() { + TungstenAnswer listTungstenAddressGroupAnswer = mock(TungstenAnswer.class); + AddressGroup addressGroup = mock(AddressGroup.class); + SubnetListType subnetListType = mock(SubnetListType.class); + SubnetType subnetType = mock(SubnetType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenAddressGroupCommand.class), anyLong())).thenReturn(listTungstenAddressGroupAnswer); + when(listTungstenAddressGroupAnswer.getResult()).thenReturn(true); + doReturn(List.of(addressGroup)).when(listTungstenAddressGroupAnswer).getApiObjectBaseList(); + when(addressGroup.getPrefix()).thenReturn(subnetListType); + when(subnetListType.getSubnet()).thenReturn( + List.of(subnetType)); + + assertNotNull(tungstenService.listTungstenAddressGroup(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void listTungstenServiceGroupTest() { + TungstenAnswer listTungstenServiceGroupAnswer = mock(TungstenAnswer.class); + ServiceGroup serviceGroup = mock(ServiceGroup.class); + FirewallServiceGroupType firewallServiceGroupType = mock(FirewallServiceGroupType.class); + FirewallServiceType firewallServiceType = mock(FirewallServiceType.class); + PortType portType = mock(PortType.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenServiceGroupCommand.class), anyLong())).thenReturn(listTungstenServiceGroupAnswer); + when(listTungstenServiceGroupAnswer.getResult()).thenReturn(true); + doReturn(List.of(serviceGroup)).when(listTungstenServiceGroupAnswer).getApiObjectBaseList(); + when(serviceGroup.getFirewallServiceList()).thenReturn(firewallServiceGroupType); + when(firewallServiceGroupType.getFirewallService()).thenReturn(List.of(firewallServiceType)); + when(firewallServiceType.getDstPorts()).thenReturn(portType); + + assertNotNull(tungstenService.listTungstenServiceGroup(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenApplicationPolicySetTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenApplicationPolicySetCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenApplicationPolicySet(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenFirewallPolicyTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenFirewallPolicyCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenFirewallPolicy(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenFirewallRuleTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenFirewallRuleCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenFirewallRule(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenServiceGroupTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenServiceGroupCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenServiceGroup(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deleteTungstenAddressGroupTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenAddressGroupCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteTungstenAddressGroup(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void createSharedNetworkTest() { + Network network = mock(Network.class); + Vlan vlan = mock(Vlan.class); + AccountVO accountVO = mock(AccountVO.class); + TungstenAnswer createTungstenSharedNetworkAnswer = mock(TungstenAnswer.class); + TungstenAnswer addNetworkSubnetAnswer = mock(TungstenAnswer.class); + TungstenAnswer getTungstenNetworkDnsAnswer = mock(TungstenAnswer.class); + NetworkDetailVO networkDetailVO = mock(NetworkDetailVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + HostVO hostVO = mock(HostVO.class); + Answer answer = mock(Answer.class); + IPAddressVO ipAddressVO = mock(IPAddressVO.class); + ApiObjectBase apiObjectBase = mock(ApiObjectBase.class); + + when(accountDao.findById(anyLong())).thenReturn(accountVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenNetworkCommand.class), anyLong())).thenReturn(createTungstenSharedNetworkAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenNetworkSubnetCommand.class), anyLong())).thenReturn(addNetworkSubnetAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenNetworkDnsCommand.class), anyLong())).thenReturn(getTungstenNetworkDnsAnswer); + when(createTungstenSharedNetworkAnswer.getResult()).thenReturn(true); + when(addNetworkSubnetAnswer.getResult()).thenReturn(true); + when(getTungstenNetworkDnsAnswer.getResult()).thenReturn(true); + when(network.getMode()).thenReturn(Networks.Mode.Dhcp); + when(network.getCidr()).thenReturn("192.168.100.0/24"); + when(vlan.getIpRange()).thenReturn("192.168.100.100-192.168.100.200"); + when(vlan.getVlanGateway()).thenReturn("192.168.100.1"); + when(vlan.getIp6Gateway()).thenReturn("fd00::1"); + when(networkDetailsDao.persist(any(NetworkDetailVO.class))).thenReturn(networkDetailVO); + when(tungstenProviderDao.findByZoneId(anyLong())).thenReturn(tungstenProviderVO); + when(hostDao.findByPublicIp(anyString())).thenReturn(hostVO); + when(agentMgr.easySend(anyLong(), any(SetupTungstenVRouterCommand.class))).thenReturn(answer); + when(answer.getResult()).thenReturn(true); + when(vlan.getIp6Cidr()).thenReturn("fd00::1/64"); + when(vlan.getIp6Range()).thenReturn("fd00::100-fd00::200"); + when(getTungstenNetworkDnsAnswer.getDetails()).thenReturn("192.168.1.150"); + when(network.getTrafficType()).thenReturn(Networks.TrafficType.Guest); + when(network.getGuestType()).thenReturn(Network.GuestType.Shared); + when(ipAddressDao.findByIpAndDcId(anyLong(), anyString())).thenReturn(ipAddressVO); + when(ipAddressDao.mark(anyLong(), any(Ip.class))).thenReturn(true); + when(createTungstenSharedNetworkAnswer.getApiObjectBase()).thenReturn(apiObjectBase); + when(apiObjectBase.getQualifiedName()).thenReturn(List.of("network")); + when(tungstenProviderVO.getGateway()).thenReturn("192.168.100.1"); + + assertTrue(tungstenService.createSharedNetwork(network, vlan)); + } + + @Test + public void addTungstenVmSecurityGroupTest() { + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenProviderVO tungstenProviderVO = mock(TungstenProviderVO.class); + TungstenAnswer getTungstenSecurityGroupAnswer = mock(TungstenAnswer.class); + TungstenAnswer addTungstenVmToSecurityGroupAnswer = mock(TungstenAnswer.class); + net.juniper.tungsten.api.types.SecurityGroup securityGroup = mock(net.juniper.tungsten.api.types.SecurityGroup.class); + NicVO nicVO = mock(NicVO.class); + SecurityGroupRuleVO securityGroupRuleVO = mock(SecurityGroupRuleVO.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + TungstenAnswer addTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(dataCenterVO.isSecurityGroupEnabled()).thenReturn(true); + when(securityGroupManager.getSecurityGroupsForVm(anyLong())).thenReturn(List.of(securityGroupVO)); + when(tungstenProviderDao.findAll()).thenReturn(List.of(tungstenProviderVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(GetTungstenSecurityGroupCommand.class), anyLong())).thenReturn(getTungstenSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenVmToSecurityGroupCommand.class), anyLong())).thenReturn(addTungstenVmToSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(addTungstenSecurityGroupRuleAnswer); + when(getTungstenSecurityGroupAnswer.getResult()).thenReturn(true); + when(addTungstenVmToSecurityGroupAnswer.getResult()).thenReturn(true); + when(addTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(getTungstenSecurityGroupAnswer.getApiObjectBase()).thenReturn(securityGroup); + when(nicDao.findDefaultNicForVM(anyLong())).thenReturn(nicVO); + when(nicVO.getBroadcastUri()).thenReturn(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf")); + when(securityGroupRuleDao.listByAllowedSecurityGroupId(anyLong())).thenReturn(List.of(securityGroupRuleVO)); + when(nicVO.getIPv4Address()).thenReturn("192.168.100.100"); + when(nicVO.getIPv6Address()).thenReturn("fd00::1"); + when(nicVO.getSecondaryIp()).thenReturn(true); + when(nicSecIpDao.getSecondaryIpAddressesForNic(anyLong())).thenReturn(List.of("192.168.100.200")); + when(securityGroupRuleVO.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(tungstenSecurityGroupRuleDao.persist(any(TungstenSecurityGroupRuleVO.class))).thenReturn(tungstenSecurityGroupRuleVO); + + assertTrue(tungstenService.addTungstenVmSecurityGroup(vmInstanceVO)); + } + + @Test + public void removeTungstenVmSecurityGroupTest() { + VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + SecurityGroupVO securityGroupVO = mock(SecurityGroupVO.class); + TungstenAnswer removeTungstenVmFromSecurityGroupAnswer = mock(TungstenAnswer.class); + NicVO nicVO = mock(NicVO.class); + SecurityGroupRuleVO securityGroupRuleVO = mock(SecurityGroupRuleVO.class); + TungstenAnswer removeTungstenSecurityGroupRuleAnswer = mock(TungstenAnswer.class); + TungstenSecurityGroupRuleVO tungstenSecurityGroupRuleVO = mock(TungstenSecurityGroupRuleVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(dataCenterVO.isSecurityGroupEnabled()).thenReturn(true); + when(securityGroupManager.getSecurityGroupsForVm(anyLong())).thenReturn(List.of(securityGroupVO)); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenVmFromSecurityGroupCommand.class), anyLong())).thenReturn(removeTungstenVmFromSecurityGroupAnswer); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenSecurityGroupRuleCommand.class), anyLong())).thenReturn(removeTungstenSecurityGroupRuleAnswer); + when(removeTungstenVmFromSecurityGroupAnswer.getResult()).thenReturn(true); + when(removeTungstenSecurityGroupRuleAnswer.getResult()).thenReturn(true); + when(nicDao.findDefaultNicForVM(anyLong())).thenReturn(nicVO); + when(nicVO.getBroadcastUri()).thenReturn(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf")); + when(securityGroupRuleDao.listByAllowedSecurityGroupId(anyLong())).thenReturn(List.of(securityGroupRuleVO)); + when(nicVO.getIPv4Address()).thenReturn("192.168.100.100"); + when(nicVO.getIPv6Address()).thenReturn("fd00::1"); + when(nicVO.getSecondaryIp()).thenReturn(true); + when(nicSecIpDao.getSecondaryIpAddressesForNic(anyLong())).thenReturn(List.of("192.168.100.200")); + when(securityGroupRuleVO.getProtocol()).thenReturn(NetUtils.ALL_PROTO); + when(tungstenSecurityGroupRuleDao.expunge(anyLong())).thenReturn(true); + when(tungstenSecurityGroupRuleDao.listByRuleTarget(anyString())).thenReturn(List.of(tungstenSecurityGroupRuleVO)); + when(securityGroupDao.findById(anyLong())).thenReturn(securityGroupVO); + + assertTrue(tungstenService.removeTungstenVmSecurityGroup(vmInstanceVO)); + } + + @Test + public void createRoutingLogicalRouterTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + TungstenLogicalRouter tungstenLogicalRouter = mock(TungstenLogicalRouter.class); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(CreateTungstenRoutingLogicalRouterCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + when(tungstenAnswer.getTungstenModel()).thenReturn(tungstenLogicalRouter); + when(tungstenLogicalRouter.getLogicalRouter()).thenReturn(logicalRouter); + when(tungstenLogicalRouter.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.createRoutingLogicalRouter(1L, "default-domain:default-project", "testLR")); + } + + @Test + public void addNetworkGatewayToLogicalRouterTest() { + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + TungstenLogicalRouter tungstenLogicalRouter = mock(TungstenLogicalRouter.class); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(networkDao.findByUuid(anyString())).thenReturn(networkVO); + when(ipAddressManager.acquireLastGuestIpAddress(any(Network.class))).thenReturn("192.168.100.100"); + when(tungstenFabricUtils.sendTungstenCommand(any(AddTungstenNetworkGatewayToLogicalRouterCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + when(tungstenAnswer.getTungstenModel()).thenReturn(tungstenLogicalRouter); + when(tungstenLogicalRouter.getLogicalRouter()).thenReturn(logicalRouter); + when(tungstenLogicalRouter.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.addNetworkGatewayToLogicalRouter(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void listRoutingLogicalRouterTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + TungstenLogicalRouter tungstenLogicalRouter = mock(TungstenLogicalRouter.class); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(tungstenFabricUtils.sendTungstenCommand(any(ListTungstenRoutingLogicalRouterCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + when(tungstenAnswer.getTungstenModelList()).thenReturn(List.of(tungstenLogicalRouter)); + when(tungstenLogicalRouter.getLogicalRouter()).thenReturn(logicalRouter); + when(tungstenLogicalRouter.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.listRoutingLogicalRouter(1L, null, "948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void removeNetworkGatewayFromLogicalRouterTest() { + NetworkVO networkVO = mock(NetworkVO.class); + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + TungstenGuestNetworkIpAddressVO tungstenGuestNetworkIpAddressVO = mock(TungstenGuestNetworkIpAddressVO.class); + TungstenLogicalRouter tungstenLogicalRouter = mock(TungstenLogicalRouter.class); + LogicalRouter logicalRouter = mock(LogicalRouter.class); + VirtualNetwork virtualNetwork = mock(VirtualNetwork.class); + DataCenterVO dataCenterVO = mock(DataCenterVO.class); + + when(dataCenterDao.findById(anyLong())).thenReturn(dataCenterVO); + when(networkDao.findByUuid(anyString())).thenReturn(networkVO); + when(tungstenGuestNetworkIpAddressDao.findByNetworkAndLogicalRouter(anyLong(), anyString())).thenReturn(tungstenGuestNetworkIpAddressVO); + when(tungstenFabricUtils.sendTungstenCommand(any(RemoveTungstenNetworkGatewayFromLogicalRouterCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + when(tungstenAnswer.getTungstenModel()).thenReturn(tungstenLogicalRouter); + when(tungstenLogicalRouter.getLogicalRouter()).thenReturn(logicalRouter); + when(tungstenLogicalRouter.getVirtualNetworkList()).thenReturn(List.of(virtualNetwork)); + + assertNotNull(tungstenService.removeNetworkGatewayFromLogicalRouter(1L, "948f421c-edde-4518-a391-09299cc25dc2", "8b4637b6-5629-46de-8fb2-d0b0502bfa85")); + } + + @Test + public void deleteLogicalRouterTest() { + TungstenAnswer tungstenAnswer = mock(TungstenAnswer.class); + + when(tungstenFabricUtils.sendTungstenCommand(any(DeleteTungstenRoutingLogicalRouterCommand.class), anyLong())).thenReturn(tungstenAnswer); + when(tungstenAnswer.getResult()).thenReturn(true); + + assertTrue(tungstenService.deleteLogicalRouter(1L, "948f421c-edde-4518-a391-09299cc25dc2")); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApiTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApiTest.java new file mode 100644 index 00000000000..e717fbde61a --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/service/TungstenVRouterApiTest.java @@ -0,0 +1,78 @@ +// 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.network.tungsten.service; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.when; + +import org.apache.cloudstack.network.tungsten.vrouter.Port; +import org.apache.cloudstack.network.tungsten.vrouter.VRouterApiConnector; +import org.apache.cloudstack.network.tungsten.vrouter.VRouterApiConnectorFactory; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.IOException; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(VRouterApiConnectorFactory.class) +public class TungstenVRouterApiTest { + @Before + public void setup() { + mockStatic(VRouterApiConnectorFactory.class); + } + + @Test + public void addTungstenVrouterPortSuccessTest() throws IOException { + Port port = mock(Port.class); + VRouterApiConnector vRouterApiConnector = mock(VRouterApiConnector.class); + + when(VRouterApiConnectorFactory.getInstance(anyString(), anyString())).thenReturn(vRouterApiConnector); + when(vRouterApiConnector.addPort(any(Port.class))).thenReturn(true); + + assertTrue(TungstenVRouterApi.addTungstenVrouterPort("192.168.100.100", "9091", port)); + } + + @Test + public void addTungstenVrouterPortFailTest() throws IOException { + Port port = mock(Port.class); + VRouterApiConnector vRouterApiConnector = mock(VRouterApiConnector.class); + + when(VRouterApiConnectorFactory.getInstance(anyString(), anyString())).thenReturn(vRouterApiConnector); + when(vRouterApiConnector.addPort(any(Port.class))).thenThrow(IOException.class); + + assertFalse(TungstenVRouterApi.addTungstenVrouterPort("192.168.100.100", "9091", port)); + } + + + @Test + public void deleteTungstenVrouterPortTest() { + VRouterApiConnector vRouterApiConnector = mock(VRouterApiConnector.class); + + when(VRouterApiConnectorFactory.getInstance(anyString(), anyString())).thenReturn(vRouterApiConnector); + when(vRouterApiConnector.deletePort(anyString())).thenReturn(true); + + assertTrue(TungstenVRouterApi.deleteTungstenVrouterPort("192.168.100.100", "9091", "1")); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImplTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImplTest.java new file mode 100644 index 00000000000..cf1cd68029a --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/IntrospectApiConnectorImplTest.java @@ -0,0 +1,127 @@ +// 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.network.tungsten.vrouter; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({HttpClients.class, DocumentBuilderFactory.class}) +public class IntrospectApiConnectorImplTest { + IntrospectApiConnector introspectApiConnector; + + @Before + public void setup() { + VRouter vRouter = mock(VRouter.class); + introspectApiConnector = new IntrospectApiConnectorImpl(vRouter); + PowerMockito.mockStatic(HttpClients.class); + PowerMockito.mockStatic(DocumentBuilderFactory.class); + } + + @Test + public void getSnhItfReqTest() throws Exception { + Document document = mock(Document.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + InputStream inputStream = mock(InputStream.class); + DocumentBuilderFactory documentBuilderFactory = mock(DocumentBuilderFactory.class); + DocumentBuilder documentBuilder = mock(DocumentBuilder.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(httpEntity.getContent()).thenReturn(inputStream); + when(DocumentBuilderFactory.newInstance()).thenReturn(documentBuilderFactory); + when(documentBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilder); + when(documentBuilder.parse(any(InputStream.class))).thenReturn(document); + + assertEquals(document, introspectApiConnector.getSnhItfReq("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void getSnhItfReqWithIOExceptionTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertNull(introspectApiConnector.getSnhItfReq("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void getSnhItfReqWithParserConfigurationExceptionTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + InputStream inputStream = mock(InputStream.class); + DocumentBuilderFactory documentBuilderFactory = mock(DocumentBuilderFactory.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(httpEntity.getContent()).thenReturn(inputStream); + when(DocumentBuilderFactory.newInstance()).thenReturn(documentBuilderFactory); + when(documentBuilderFactory.newDocumentBuilder()).thenThrow(ParserConfigurationException.class); + + assertNull(introspectApiConnector.getSnhItfReq("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void getSnhItfReqWithSAXExceptionTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + InputStream inputStream = mock(InputStream.class); + DocumentBuilderFactory documentBuilderFactory = mock(DocumentBuilderFactory.class); + DocumentBuilder documentBuilder = mock(DocumentBuilder.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(httpEntity.getContent()).thenReturn(inputStream); + when(DocumentBuilderFactory.newInstance()).thenReturn(documentBuilderFactory); + when(documentBuilderFactory.newDocumentBuilder()).thenReturn(documentBuilder); + when(documentBuilder.parse(any(InputStream.class))).thenThrow(SAXException.class); + + assertNull(introspectApiConnector.getSnhItfReq("948f421c-edde-4518-a391-09299cc25dc2")); + } +} diff --git a/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImplTest.java b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImplTest.java new file mode 100644 index 00000000000..11a2d9c1e83 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/java/org/apache/cloudstack/network/tungsten/vrouter/VRouterApiConnectorImplTest.java @@ -0,0 +1,222 @@ +// 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.network.tungsten.vrouter; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.IOException; +import java.util.Arrays; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({HttpClients.class, EntityUtils.class}) +public class VRouterApiConnectorImplTest { + VRouterApiConnector vRouterApiConnector; + + @Before + public void setup() { + VRouter vRouter = mock(VRouter.class); + vRouterApiConnector = new VRouterApiConnectorImpl(vRouter); + PowerMockito.mockStatic(HttpClients.class); + PowerMockito.mockStatic(EntityUtils.class); + } + + @Test + public void addPortTest() throws Exception { + Port port = mock(Port.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{}"); + + assertTrue(vRouterApiConnector.addPort(port)); + } + + @Test + public void addPortWithExceptionTest() throws Exception { + Port port = mock(Port.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertFalse(vRouterApiConnector.addPort(port)); + } + + @Test + public void addPortWithFailTest() throws Exception { + Port port = mock(Port.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{error:404}"); + + assertFalse(vRouterApiConnector.addPort(port)); + } + + @Test + public void deletePortTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{}"); + + assertTrue(vRouterApiConnector.deletePort("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void deletePortWithExceptionTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertFalse(vRouterApiConnector.deletePort("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void enablePortTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{}"); + + assertTrue(vRouterApiConnector.enablePort("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void enablePortWithExceptionTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertFalse(vRouterApiConnector.enablePort("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void disablePortTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{}"); + + assertTrue(vRouterApiConnector.disablePort("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void disablePortWithExceptionTest() throws Exception { + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertFalse(vRouterApiConnector.disablePort("948f421c-edde-4518-a391-09299cc25dc2")); + } + + @Test + public void addGatewayTest() throws Exception { + Gateway gateway1 = mock(Gateway.class); + Gateway gateway2 = mock(Gateway.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{}"); + + assertTrue(vRouterApiConnector.addGateway(Arrays.asList(gateway1, gateway2))); + } + + @Test + public void addGatewayWithExceptionTest() throws Exception { + Gateway gateway1 = mock(Gateway.class); + Gateway gateway2 = mock(Gateway.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertFalse(vRouterApiConnector.addGateway(Arrays.asList(gateway1, gateway2))); + } + + @Test + public void deleteGatewayTest() throws Exception { + Gateway gateway1 = mock(Gateway.class); + Gateway gateway2 = mock(Gateway.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + CloseableHttpResponse closeableHttpResponse = mock(CloseableHttpResponse.class); + HttpEntity httpEntity = mock(HttpEntity.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenReturn(closeableHttpResponse); + when(closeableHttpResponse.getEntity()).thenReturn(httpEntity); + when(EntityUtils.toString(any(HttpEntity.class))).thenReturn("{}"); + + assertTrue(vRouterApiConnector.deleteGateway(Arrays.asList(gateway1, gateway2))); + } + + @Test + public void deleteGatewayWithExceptionTest() throws Exception { + Gateway gateway1 = mock(Gateway.class); + Gateway gateway2 = mock(Gateway.class); + CloseableHttpClient httpClient = mock(CloseableHttpClient.class); + + when(HttpClients.createDefault()).thenReturn(httpClient); + when(httpClient.execute(any(HttpUriRequest.class))).thenThrow(IOException.class); + + assertFalse(vRouterApiConnector.deleteGateway(Arrays.asList(gateway1, gateway2))); + } +} diff --git a/plugins/network-elements/tungsten/src/test/resources/db.properties b/plugins/network-elements/tungsten/src/test/resources/db.properties new file mode 100644 index 00000000000..235de858697 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/resources/db.properties @@ -0,0 +1,68 @@ +# 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. + +cluster.servlet.port=9090 + +# CloudStack database settings +db.cloud.username=cloud +db.cloud.password=cloud +db.root.password= +db.cloud.host=localhost +db.cloud.driver=jdbc:mysql +db.cloud.port=3306 +db.cloud.name=cloud + +# CloudStack database tuning parameters +db.cloud.maxActive=250 +db.cloud.maxIdle=30 +db.cloud.maxWait=10000 +db.cloud.autoReconnect=true +db.cloud.validationQuery=SELECT 1 +db.cloud.testOnBorrow=true +db.cloud.testWhileIdle=true +db.cloud.timeBetweenEvictionRunsMillis=40000 +db.cloud.minEvictableIdleTimeMillis=240000 +db.cloud.poolPreparedStatements=false +db.cloud.url.params=prepStmtCacheSize=517&cachePrepStmts=true&prepStmtCacheSqlLimit=4096 + +# usage database settings +db.usage.username=cloud +db.usage.password=cloud +db.usage.host=localhost +# It's not guaranteed that using a different DB provider than the one from the regular cloud DB will work +db.usage.driver=jdbc:mysql +db.usage.port=3306 +db.usage.name=cloud_usage + +# usage database tuning parameters +db.usage.maxActive=100 +db.usage.maxIdle=30 +db.usage.maxWait=10000 +db.usage.autoReconnect=true + +# Simulator database settings +db.simulator.username=cloud +db.simulator.password=cloud +db.simulator.host=localhost +# It's not guaranteed that using a different DB provider than the one from the regular cloud DB will work +db.simulator.driver=jdbc:mysql +db.simulator.port=3306 +db.simulator.name=simulator +db.simulator.maxActive=250 +db.simulator.maxIdle=30 +db.simulator.maxWait=10000 +db.simulator.autoReconnect=true diff --git a/plugins/network-elements/tungsten/src/test/resources/log4j.properties b/plugins/network-elements/tungsten/src/test/resources/log4j.properties new file mode 100644 index 00000000000..8c012b184e4 --- /dev/null +++ b/plugins/network-elements/tungsten/src/test/resources/log4j.properties @@ -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. + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n +log4j.appender.stdout.threshold=INFO +log4j.rootLogger=INFO, stdout, rolling +log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender +log4j.appender.rolling.layout=org.apache.log4j.PatternLayout +log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%c{3}] (%t:%x) %m%n +log4j.appender.rolling.file.threshold=DEBUG +log4j.appender.rolling.File=./target/logs/testclient.log +log4j.appender.rolling.DatePattern='.'yyy-MM-dd +log4j.appender.rolling.file.append=false +log4j.category.org.apache=INFO, rolling, stdout +#log4j.category.com.cloud.utils.db.Transaction=ALL +log4j.category.org.apache.cloudstack.network.contrail=ALL +log4j.category.com.cloud.network=ALL + diff --git a/plugins/pom.xml b/plugins/pom.xml index d89f982221a..2ad3e5ba3c8 100755 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -109,6 +109,7 @@ network-elements/stratosphere-ssp network-elements/brocade-vcs network-elements/vxlan + network-elements/tungsten outofbandmanagement-drivers/ipmitool outofbandmanagement-drivers/nested-cloudstack diff --git a/scripts/vm/network/tungsten/create_tap_device.sh b/scripts/vm/network/tungsten/create_tap_device.sh new file mode 100644 index 00000000000..c10a0e72105 --- /dev/null +++ b/scripts/vm/network/tungsten/create_tap_device.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# 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. + +ip tuntap add dev $1 mode tap +ip link set $1 up \ No newline at end of file diff --git a/scripts/vm/network/tungsten/delete_tap_device.sh b/scripts/vm/network/tungsten/delete_tap_device.sh new file mode 100644 index 00000000000..37d668af8af --- /dev/null +++ b/scripts/vm/network/tungsten/delete_tap_device.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# 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. + +ip tuntap del dev $1 mode tap \ No newline at end of file diff --git a/scripts/vm/network/tungsten/setup_tungsten_vrouter.sh b/scripts/vm/network/tungsten/setup_tungsten_vrouter.sh new file mode 100644 index 00000000000..e041eac4c55 --- /dev/null +++ b/scripts/vm/network/tungsten/setup_tungsten_vrouter.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# 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. + +vif=$(vif --list | grep $2) +if [ -z "$vif" ] || [ $1 == 'delete' ] +then + container=$(docker ps | grep contrail-vrouter-agent | awk '{print $1}') + docker exec $container python /opt/contrail/utils/provision_vgw_interface.py --oper $1 --interface $2 --subnets "$3" --routes "$4" --vrf $5 +fi \ No newline at end of file diff --git a/scripts/vm/network/tungsten/update_tungsten_loadbalancer_ssl.sh b/scripts/vm/network/tungsten/update_tungsten_loadbalancer_ssl.sh new file mode 100644 index 00000000000..1cf966b3bef --- /dev/null +++ b/scripts/vm/network/tungsten/update_tungsten_loadbalancer_ssl.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# 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. +i=0; +while [ ! -f /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf ]; +do + sleep 1; + ((i=i+1)) + if [ $i -eq 5 ]; then exit 1; fi +done +if grep -qw "bind $5:$6 $" /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf; then +rm -rf /var/lib/contrail/loadbalancer/haproxy/$1/$2.pem +cat >> /var/lib/contrail/loadbalancer/haproxy/$1/$2.pem << EOF +$3 +$4 +EOF +sed -i "/bind $5:$6 $/c\ bind $5:$6 ssl crt /var/lib/contrail/loadbalancer/haproxy/$1/$2.pem" /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf +container=$(docker ps | grep contrail-vrouter-agent | awk '{print $1}') +netns=$(ls /var/run/netns | grep $1) +docker exec $container ip netns exec $netns haproxy -D -f /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf \ +-p /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.pid -sf $(cat /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.pid) &>/dev/null +fi diff --git a/scripts/vm/network/tungsten/update_tungsten_loadbalancer_stats.sh b/scripts/vm/network/tungsten/update_tungsten_loadbalancer_stats.sh new file mode 100644 index 00000000000..3076765fc20 --- /dev/null +++ b/scripts/vm/network/tungsten/update_tungsten_loadbalancer_stats.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# 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. + +i=0; +while [ ! -f /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf ]; +do + sleep 1; + ((i=i+1)) + if [ $i -eq 5 ]; then exit 1; fi +done +if ! grep -q "listen stats" /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf; then +cat << EOF >> /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf +listen stats :$2 + mode http + stats enable + stats realm Haproxy\ Statistics + stats uri $3 + stats auth $4 +EOF +container=$(docker ps | grep contrail-vrouter-agent | awk '{print $1}') +netns=$(ls /var/run/netns | grep $1) +dev=$(docker exec $container ip netns exec $netns ls /sys/class/net | grep gw) +docker exec $container ip netns exec $netns ip route add default dev $dev +docker exec $container ip netns exec $netns haproxy -D -f /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.conf \ +-p /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.pid -sf $(cat /var/lib/contrail/loadbalancer/haproxy/$1/haproxy.pid) &>/dev/null +fi diff --git a/server/pom.xml b/server/pom.xml index 2d1c8111178..e967857137a 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -26,6 +26,13 @@ cloudstack 4.18.0.0-SNAPSHOT + + + juniper-tungsten-api + https://github.com/radu-todirica/tungsten-api/raw/master + + + mysql @@ -180,6 +187,11 @@ metrics-jvm 3.0.2 + + net.juniper.tungsten + juniper-tungsten-api + 2.0 + diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index 0b1dc67280b..8fffebb3303 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -2262,6 +2262,7 @@ public class ApiResponseHelper implements ResponseGenerator { serviceResponses.add(svcRsp); } response.setForVpc(_configMgr.isOfferingForVpc(offering)); + response.setForTungsten(offering.isForTungsten()); response.setServices(serviceResponses); //set network offering details Map details = _ntwkModel.getNtwkOffDetails(offering.getId()); @@ -2937,7 +2938,7 @@ public class ApiResponseHelper implements ResponseGenerator { for (Network.Provider serviceProvider : serviceProviders) { // return only Virtual Router/JuniperSRX/CiscoVnmc as a provider for the firewall if (service == Service.Firewall - && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.CiscoVnmc || serviceProvider == Provider.PaloAlto || serviceProvider == Provider.BigSwitchBcf)) { + && !(serviceProvider == Provider.VirtualRouter || serviceProvider == Provider.CiscoVnmc || serviceProvider == Provider.PaloAlto || serviceProvider == Provider.BigSwitchBcf || serviceProvider == Provider.Tungsten)) { continue; } diff --git a/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java index 59bb3691fa0..2f89b195868 100644 --- a/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/NetworkOfferingJoinVO.java @@ -154,6 +154,9 @@ public class NetworkOfferingJoinVO extends BaseViewVO implements NetworkOffering @Column(name = "for_vpc") private boolean forVpc; + @Column(name = "for_tungsten") + boolean forTungsten; + @Column(name = "service_package_id") private String servicePackageUuid = null; @@ -339,6 +342,11 @@ public class NetworkOfferingJoinVO extends BaseViewVO implements NetworkOffering return forVpc; } + @Override + public boolean isForTungsten() { + return forTungsten; + } + public void setForVpc(boolean forVpc) { this.forVpc = forVpc; } public String getServicePackage() { diff --git a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java index 2f2419eef83..c5a489ba832 100644 --- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -1538,6 +1539,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } }); + messageBus.publish(_name, MESSAGE_DELETE_POD_IP_RANGE_EVENT, PublishScope.LOCAL, pod); + return true; } @@ -1698,6 +1701,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati throw new CloudRuntimeException("Failed to create Pod IP range. Please contact Cloud Support."); } + messageBus.publish(_name, MESSAGE_CREATE_POD_IP_RANGE_EVENT, PublishScope.LOCAL, pod); + return pod; } @@ -1812,6 +1817,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati s_logger.error("Unable to delete Pod " + podId + "IP range due to " + e.getMessage(), e); throw new CloudRuntimeException("Failed to delete Pod " + podId + "IP range. Please contact Cloud Support."); } + + messageBus.publish(_name, MESSAGE_DELETE_POD_IP_RANGE_EVENT, PublishScope.LOCAL, pod); } @Override @@ -2170,6 +2177,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati _podDao.update(id, pod); } }); + + messageBus.publish(_name, MESSAGE_DELETE_POD_IP_RANGE_EVENT, PublishScope.LOCAL, pod); + messageBus.publish(_name, MESSAGE_CREATE_POD_IP_RANGE_EVENT, PublishScope.LOCAL, pod); } catch (final Exception e) { s_logger.error("Unable to edit pod due to " + e.getMessage(), e); throw new CloudRuntimeException("Failed to edit pod. Please contact Cloud Support."); @@ -2262,8 +2272,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final String startIpFinal = startIp; final String endIpFinal = endIp; - return Transaction.execute((TransactionCallback) status -> { - + HostPodVO hostPodVO = Transaction.execute((TransactionCallback) status -> { final HostPodVO pod = _podDao.persist(podFinal); if (StringUtils.isNotEmpty(startIpFinal)) { @@ -2279,6 +2288,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati return pod; }); + + messageBus.publish(_name, MESSAGE_CREATE_POD_IP_RANGE_EVENT, PublishScope.LOCAL, hostPodVO); + + return hostPodVO; } @DB @@ -4441,7 +4454,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati commitVlanLock.lock(5); s_logger.debug("Acquiring lock for committing vlan"); try { - return Transaction.execute(new TransactionCallback() { + Vlan vlan = Transaction.execute(new TransactionCallback() { @Override public Vlan doInTransaction(final TransactionStatus status) { String newVlanNetmask = newVlanNetmaskFinal; @@ -4470,6 +4483,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati return vlan; } }); + + messageBus.publish(_name, MESSAGE_CREATE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlan); + + return vlan; } finally { commitVlanLock.unlock(); } @@ -5272,6 +5289,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } }); + messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlanRange); + return true; } @@ -5834,6 +5853,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final Map detailsStr = cmd.getDetails(); final Boolean egressDefaultPolicy = cmd.getEgressDefaultPolicy(); Boolean forVpc = cmd.getForVpc(); + Boolean forTungsten = cmd.getForTungsten(); Integer maxconn = null; boolean enableKeepAlive = false; String servicePackageuuid = cmd.getServicePackageId(); @@ -5857,6 +5877,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } } + // if network offering is for tungsten check if every item from serviceProviderList has Tungsten-Fabric provider + // except ConfigDrive + if(Boolean.TRUE.equals(forTungsten)){ + for(Map.Entry> item : cmd.getServiceProviders().entrySet()) { + if (item.getValue().size() != 1 || !(item.getValue().contains("Tungsten") || item.getValue().contains("ConfigDrive"))) { + throw new InvalidParameterValueException("Please specify Tungsten-Fabric provider for the " + item.getKey() + " service provider."); + } + } + } + // Verify traffic type for (final TrafficType tType : TrafficType.values()) { if (tType.name().equalsIgnoreCase(trafficTypeString)) { @@ -5995,6 +6025,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati forVpc = true; } + if (forTungsten == null && Provider.Tungsten.equals(provider)){ + forTungsten = true; + } + if (service == Service.Dhcp) { dhcpProvider = provider; } @@ -6117,7 +6151,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } final NetworkOfferingVO offering = createNetworkOffering(name, displayText, trafficType, tags, specifyVlan, availability, networkRate, serviceProviderMap, false, guestType, false, - serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details, egressDefaultPolicy, maxconn, enableKeepAlive, forVpc, domainIds, zoneIds, enable, internetProtocol); + serviceOfferingId, conserveMode, serviceCapabilityMap, specifyIpRanges, isPersistent, details, egressDefaultPolicy, maxconn, enableKeepAlive, forVpc, forTungsten, domainIds, zoneIds, enable, internetProtocol); CallContext.current().setEventDetails(" Id: " + offering.getId() + " Name: " + name); CallContext.current().putContextParameter(NetworkOffering.class, offering.getId()); return offering; @@ -6264,7 +6298,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati final Long serviceOfferingId, final boolean conserveMode, final Map> serviceCapabilityMap, final boolean specifyIpRanges, final boolean isPersistent, final Map details, final boolean egressDefaultPolicy, final Integer maxconn, final boolean enableKeepAlive, Boolean forVpc, - final List domainIds, final List zoneIds, final boolean enableOffering, final NetUtils.InternetProtocol internetProtocol) { + Boolean forTungsten, final List domainIds, final List zoneIds, final boolean enableOffering, final NetUtils.InternetProtocol internetProtocol) { String servicePackageUuid; String spDescription = null; @@ -6433,6 +6467,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati offeringFinal.setServiceOfferingId(serviceOfferingId); } + offeringFinal.setForTungsten(Objects.requireNonNullElse(forTungsten, false)); + if (enableOffering) { offeringFinal.setState(NetworkOffering.State.Enabled); } diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index f6df85f2308..b690acd7dd9 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -43,6 +43,8 @@ import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.region.PortableIp; import org.apache.cloudstack.region.PortableIpDao; import org.apache.cloudstack.region.PortableIpVO; @@ -303,6 +305,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage HostPodDao _hpDao; @Inject private AnnotationDao annotationDao; + @Inject + MessageBus messageBus; SearchBuilder AssignIpAddressSearch; SearchBuilder AssignIpAddressFromPodVlanSearch; @@ -784,6 +788,19 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, false, true, requestedIp, null, isSystem, null, null, forSystemVms); } + @Override + public PublicIp assignSourceNatPublicIpAddress(long dcId, Long podId, Account owner, VlanType type, Long networkId, String requestedIp, boolean isSystem, boolean forSystemVms) + throws InsufficientAddressCapacityException { + IPAddressVO networkPublicIp = _ipAddressDao.findByIpAndNetworkIdAndDcId(networkId, dcId, requestedIp); + if(networkPublicIp != null) + return null; + IPAddressVO ipAddressVO = _ipAddressDao.findByIpAndDcId(dcId, requestedIp); + if (ipAddressVO.getState() != State.Free) { + throw new InsufficientAddressCapacityException("can not assign to this network", Network.class, networkId); + } + return fetchNewPublicIp(dcId, podId, null, owner, type, networkId, true, true, requestedIp, null, isSystem, null, null, forSystemVms); + } + @Override public PublicIp assignPublicIpAddressFromVlans(long dcId, Long podId, Account owner, VlanType type, List vlanDbIds, Long networkId, String requestedIp, String requestedGateway, boolean isSystem) throws InsufficientAddressCapacityException { @@ -1103,6 +1120,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage // Cleanup all the resources for ip address if there are any, and only then un-assign ip in the system if (cleanupIpResources(addr.getId(), Account.ACCOUNT_ID_SYSTEM, _accountMgr.getSystemAccount())) { _ipAddressDao.unassignIpAddress(addr.getId()); + messageBus.publish(_name, MESSAGE_RELEASE_IPADDR_EVENT, PublishScope.LOCAL, addr); } else { success = false; s_logger.warn("Failed to release resources for ip address id=" + addr.getId()); @@ -1291,6 +1309,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage } }); + messageBus.publish(_name, MESSAGE_ASSIGN_IPADDR_EVENT, PublishScope.LOCAL, ip.ip()); + } finally { if (accountToLock != null) { if (s_logger.isDebugEnabled()) { diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 8dabe5ce172..cd3b2b7671e 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -93,6 +93,7 @@ import com.cloud.network.dao.PhysicalNetworkServiceProviderVO; import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.dao.TungstenGuestNetworkIpAddressDao; import com.cloud.network.dao.UserIpv6AddressDao; import com.cloud.network.element.IpDeployer; import com.cloud.network.element.IpDeployingRequester; @@ -231,6 +232,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi NetworkOfferingDetailsDao _ntwkOffDetailsDao; @Inject private NetworkService _networkService; + @Inject + TungstenGuestNetworkIpAddressDao tungstenGuestNetworkIpAddressDao; private final HashMap _systemNetworks = new HashMap(5); @@ -2040,6 +2043,9 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi //Get ips used by load balancers List lbIps = _appLbRuleDao.listLbIpsBySourceIpNetworkId(network.getId()); ips.addAll(lbIps); + //Get ips used by tungsten + List tfIps = tungstenGuestNetworkIpAddressDao.listGuestIpAddressByNetworkId(network.getId()); + ips.addAll(tfIps); return ips; } diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index c868144a306..d27b8bc2c42 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -945,6 +945,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C } }); + _messageBus.publish(_name, MESSAGE_ASSIGN_NIC_SECONDARY_IP_EVENT, PublishScope.LOCAL, id); + return getNicSecondaryIp(id); } else { return null; @@ -1058,6 +1060,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C } }); + _messageBus.publish(_name, MESSAGE_RELEASE_NIC_SECONDARY_IP_EVENT, PublishScope.LOCAL, ipVO); + return true; } @@ -3889,6 +3893,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C //Add Internal Load Balancer element as a default network service provider addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId()); + //Add tungsten network service provider + addDefaultTungstenProviderToPhysicalNetwork(pNetwork.getId()); + // Add the config drive provider addConfigDriveToPhysicalNetwork(pNetwork.getId()); @@ -5193,6 +5200,16 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C return nsp; } + private PhysicalNetworkServiceProvider addDefaultTungstenProviderToPhysicalNetwork(long physicalNetworkId) { + PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, Network.Provider.Tungsten.getName(), null, null); + + NetworkElement networkElement = _networkModel.getElementImplementingProvider(Network.Provider.Tungsten.getName()); + if (networkElement == null) { + throw new CloudRuntimeException("Unable to find the Network Element implementing the " + Provider.Tungsten.getName() + " Provider"); + } + return nsp; + } + protected PhysicalNetworkServiceProvider addDefaultSecurityGroupProviderToPhysicalNetwork(long physicalNetworkId) { PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId, Network.Provider.SecurityGroupProvider.getName(), null, null); diff --git a/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl.java index a80cfa3430a..abbbd4965a4 100644 --- a/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl.java +++ b/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl.java @@ -48,6 +48,8 @@ import org.apache.cloudstack.api.command.user.securitygroup.UpdateSecurityGroupC import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.commons.codec.digest.DigestUtils; @@ -74,6 +76,7 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceInUseException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; +import com.cloud.network.Networks; import com.cloud.network.NetworkModel; import com.cloud.network.security.SecurityGroupWork.Step; import com.cloud.network.security.SecurityRule.SecurityRuleType; @@ -171,6 +174,8 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro NicDao _nicDao; @Inject NicSecondaryIpDao _nicSecIpDao; + @Inject + MessageBus messageBus; ScheduledExecutorService _executorPool; ScheduledExecutorService _cleanupExecutor; @@ -816,6 +821,8 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro } }); + messageBus.publish(_name, MESSAGE_ADD_SECURITY_GROUP_RULE_EVENT, PublishScope.LOCAL, newRules); + try { final ArrayList affectedVms = new ArrayList(); affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(securityGroup.getId())); @@ -901,6 +908,10 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro s_logger.debug("Can't update rules for host, ignore", e); } + if(Boolean.TRUE.equals(result)) { + messageBus.publish(_name, MESSAGE_REMOVE_SECURITY_GROUP_RULE_EVENT, PublishScope.LOCAL, rule); + } + return result; } @@ -1223,7 +1234,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro // check permissions _accountMgr.checkAccess(caller, null, true, group); - return Transaction.execute(new TransactionCallbackWithException() { + boolean result = Transaction.execute(new TransactionCallbackWithException() { @Override public Boolean doInTransaction(TransactionStatus status) throws ResourceInUseException { SecurityGroupVO group = _securityGroupDao.lockRow(groupId, true); @@ -1251,6 +1262,10 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro } }); + if(result) { + messageBus.publish(_name, MESSAGE_DELETE_TUNGSTEN_SECURITY_GROUP_EVENT, PublishScope.LOCAL, group); + } + return result; } @Override @@ -1424,6 +1439,12 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro } NicVO nic = _nicDao.findById(nicId); + + // Tungsten-Fabric will handle security group by themselves + if (nic.getBroadcastUri().equals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"))) { + return true; + } + long vmId = nic.getInstanceId(); UserVm vm = _userVMDao.findById(vmId); if (vm == null || vm.getType() != VirtualMachine.Type.User) { diff --git a/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl2.java b/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl2.java index 5b4b85fc70c..eadcc5f1e7d 100644 --- a/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl2.java +++ b/server/src/main/java/com/cloud/network/security/SecurityGroupManagerImpl2.java @@ -33,6 +33,7 @@ import com.cloud.agent.api.SecurityGroupRulesCmd; import com.cloud.agent.manager.Commands; import com.cloud.configuration.Config; import com.cloud.exception.AgentUnavailableException; +import com.cloud.network.Networks; import com.cloud.network.security.SecurityGroupWork.Step; import com.cloud.network.security.SecurityRule.SecurityRuleType; import com.cloud.uservm.UserVm; @@ -179,7 +180,7 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl { if (agentId != null) { NicVO nic = _nicDao.findFirstNicForVM(vm.getId()); List nicSecIps = null; - if (nic != null) { + if (nic != null && !nic.getBroadcastUri().equals(Networks.BroadcastDomainType.TUNGSTEN.toUri("tf"))) { if (nic.getSecondaryIp()) { nicSecIps = _nicSecIpDao.getSecondaryIpAddressesForNic(nic.getId()); } diff --git a/server/src/main/java/com/cloud/projects/ProjectManager.java b/server/src/main/java/com/cloud/projects/ProjectManager.java index 7bc91c52874..8615894990d 100644 --- a/server/src/main/java/com/cloud/projects/ProjectManager.java +++ b/server/src/main/java/com/cloud/projects/ProjectManager.java @@ -44,4 +44,7 @@ public interface ProjectManager extends ProjectService { long getInvitationTimeout(); + public static final String MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT = "Message.CreateTungstenProject.Event"; + public static final String MESSAGE_DELETE_TUNGSTEN_PROJECT_EVENT = "Message.DeleteTungstenProject.Event"; + } diff --git a/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java b/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java index 9be0dfc06e8..f87ab4a6d65 100644 --- a/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java +++ b/server/src/main/java/com/cloud/projects/ProjectManagerImpl.java @@ -50,6 +50,8 @@ import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.acl.dao.ProjectRoleDao; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -152,6 +154,8 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C private VMSnapshotDao _vmSnapshotDao; @Inject private VpcManager _vpcMgr; + @Inject + MessageBus messageBus; protected boolean _invitationRequired = false; protected long _invitationTimeOut = 86400000; @@ -259,7 +263,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C final Account ownerFinal = owner; User finalUser = user; - return Transaction.execute(new TransactionCallback() { + Project project = Transaction.execute(new TransactionCallback() { @Override public Project doInTransaction(TransactionStatus status) { @@ -286,6 +290,10 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C return project; } }); + + messageBus.publish(_name, ProjectManager.MESSAGE_CREATE_TUNGSTEN_PROJECT_EVENT, PublishScope.LOCAL, project); + + return project; } @Override @@ -375,6 +383,8 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager, C s_logger.warn("Failed to cleanup project's id=" + project.getId() + " resources, not removing the project yet"); return false; } else { + //check if any Tungsten-Fabric provider exists and delete the project from Tungsten-Fabric providers + messageBus.publish(_name, ProjectManager.MESSAGE_DELETE_TUNGSTEN_PROJECT_EVENT, PublishScope.LOCAL, project); return _projectDao.remove(project.getId()); } } else { diff --git a/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java b/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java index 56f20b4fa7e..56c34834458 100644 --- a/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/main/java/com/cloud/server/ConfigurationServerImpl.java @@ -992,6 +992,12 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio defaultSharedSGNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter); defaultSharedSGNetworkOfferingProviders.put(Service.SecurityGroup, Provider.SecurityGroupProvider); + final Map defaultTungstenSharedSGNetworkOfferingProviders = new HashMap<>(); + defaultTungstenSharedSGNetworkOfferingProviders.put(Service.Connectivity, Provider.Tungsten); + defaultTungstenSharedSGNetworkOfferingProviders.put(Service.Dhcp, Provider.Tungsten); + defaultTungstenSharedSGNetworkOfferingProviders.put(Service.Dns, Provider.Tungsten); + defaultTungstenSharedSGNetworkOfferingProviders.put(Service.SecurityGroup, Provider.Tungsten); + final Map defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap(); defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter); defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter); @@ -1047,6 +1053,21 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio s_logger.trace("Added service for the network offering: " + offService); } + NetworkOfferingVO defaultTungstenSharedSGNetworkOffering = + new NetworkOfferingVO(NetworkOffering.DEFAULT_TUNGSTEN_SHARED_NETWORK_OFFERING_WITH_SGSERVICE, "Offering for Tungsten Shared Security group enabled networks", + TrafficType.Guest, false, true, null, null, true, Availability.Optional, null, Network.GuestType.Shared, true, true, false, false, false, false); + + defaultTungstenSharedSGNetworkOffering.setForTungsten(true); + defaultTungstenSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled); + defaultTungstenSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultTungstenSharedSGNetworkOffering); + + for (Map.Entry service : defaultTungstenSharedSGNetworkOfferingProviders.entrySet()) { + NetworkOfferingServiceMapVO offService = + new NetworkOfferingServiceMapVO(defaultTungstenSharedSGNetworkOffering.getId(), service.getKey(), service.getValue()); + _ntwkOfferingServiceMapDao.persist(offService); + s_logger.trace("Added service for the network offering: " + offService); + } + // Offering #3 NetworkOfferingVO defaultIsolatedSourceNatEnabledNetworkOffering = new NetworkOfferingVO(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService, diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index 44205bbfa22..2a93908180d 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -40,6 +40,9 @@ import javax.crypto.spec.SecretKeySpec; import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.network.security.SecurityGroupService; +import com.cloud.network.security.SecurityGroupVO; +import com.cloud.utils.component.PluggableService; import org.apache.cloudstack.acl.APIChecker; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.QuerySelector; @@ -160,7 +163,6 @@ import com.cloud.utils.Pair; import com.cloud.utils.Ternary; import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; -import com.cloud.utils.component.PluggableService; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; @@ -889,6 +891,12 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M accountCleanupNeeded = true; } + // Cleanup tungsten security groups + List securityGroupList = _securityGroupDao.listByAccountId(accountId); + for(SecurityGroupVO securityGroupVO : securityGroupList) { + _messageBus.publish(_name, SecurityGroupService.MESSAGE_DELETE_TUNGSTEN_SECURITY_GROUP_EVENT, PublishScope.LOCAL, securityGroupVO); + } + // Cleanup security groups int numRemoved = _securityGroupDao.removeByAccountId(accountId); s_logger.info("deleteAccount: Deleted " + numRemoved + " network groups for account " + accountId); diff --git a/server/src/main/java/com/cloud/user/DomainManager.java b/server/src/main/java/com/cloud/user/DomainManager.java index 9bb2e01e0d3..19e15da6f1b 100644 --- a/server/src/main/java/com/cloud/user/DomainManager.java +++ b/server/src/main/java/com/cloud/user/DomainManager.java @@ -51,4 +51,6 @@ public interface DomainManager extends DomainService { public static final String MESSAGE_ADD_DOMAIN_EVENT = "Message.AddDomain.Event"; public static final String MESSAGE_PRE_REMOVE_DOMAIN_EVENT = "Message.PreRemoveDomain.Event"; public static final String MESSAGE_REMOVE_DOMAIN_EVENT = "Message.RemoveDomain.Event"; + public static final String MESSAGE_CREATE_TUNGSTEN_DOMAIN_EVENT = "Message.CreateTungstenDomain.Event"; + public static final String MESSAGE_DELETE_TUNGSTEN_DOMAIN_EVENT = "Message.DeleteTungstenDomain.Event"; } diff --git a/server/src/main/java/com/cloud/user/DomainManagerImpl.java b/server/src/main/java/com/cloud/user/DomainManagerImpl.java index b1b1976b0d0..da796d2e48f 100644 --- a/server/src/main/java/com/cloud/user/DomainManagerImpl.java +++ b/server/src/main/java/com/cloud/user/DomainManagerImpl.java @@ -225,6 +225,7 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom }); if (domain != null) { _messageBus.publish(_name, MESSAGE_ADD_DOMAIN_EVENT, PublishScope.LOCAL, domain.getId()); + _messageBus.publish(_name, MESSAGE_CREATE_TUNGSTEN_DOMAIN_EVENT, PublishScope.LOCAL, domain); } return domain; } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 37815bb71f4..ec9c1a745b1 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -112,6 +112,8 @@ import org.apache.cloudstack.framework.async.AsyncCallFuture; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.cloudstack.query.QueryService; import org.apache.cloudstack.reservation.dao.ReservationDao; @@ -264,6 +266,7 @@ import com.cloud.network.rules.RulesManager; import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.network.security.SecurityGroup; import com.cloud.network.security.SecurityGroupManager; +import com.cloud.network.security.SecurityGroupService; import com.cloud.network.security.dao.SecurityGroupDao; import com.cloud.network.vpc.VpcManager; import com.cloud.offering.DiskOffering; @@ -557,6 +560,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir @Inject private VmStatsDao vmStatsDao; @Inject + private MessageBus messageBus; + @Inject protected CommandSetupHelper commandSetupHelper; @Autowired @Qualifier("networkHelper") @@ -3638,6 +3643,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } defaultGroup = _securityGroupMgr.createSecurityGroup(SecurityGroupManager.DEFAULT_GROUP_NAME, SecurityGroupManager.DEFAULT_GROUP_DESCRIPTION, owner.getDomainId(), owner.getId(), owner.getAccountName()); + messageBus.publish(_name, SecurityGroupService.MESSAGE_CREATE_TUNGSTEN_SECURITY_GROUP_EVENT, + PublishScope.LOCAL, defaultGroup); securityGroupIdList.add(defaultGroup.getId()); } } diff --git a/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java b/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java index 05e38f66da9..715924d5c54 100644 --- a/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java +++ b/server/src/test/java/com/cloud/configuration/ConfigurationManagerTest.java @@ -53,6 +53,7 @@ import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBusBase; import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; @@ -207,6 +208,8 @@ public class ConfigurationManagerTest { DataCenterGuestIpv6PrefixDao dataCenterGuestIpv6PrefixDao; @Mock Ipv6GuestPrefixSubnetNetworkMapDao ipv6GuestPrefixSubnetNetworkMapDao; + @Mock + MessageBusBase messageBus; VlanVO vlan = new VlanVO(Vlan.VlanType.VirtualNetwork, "vlantag", "vlangateway", "vlannetmask", 1L, "iprange", 1L, 1L, null, null, null); @@ -1323,6 +1326,7 @@ public class ConfigurationManagerTest { ReflectionTestUtils.setField(pod, "id", 1L); return pod; }); + Mockito.doNothing().when(messageBus).publish(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); configurationMgr.createPod(zoneId, "TestPod", null, null, null, null, null); } } diff --git a/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java index 27361d5b7b3..96dc8277a91 100644 --- a/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java @@ -548,7 +548,7 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu Integer networkRate, Map> serviceProviderMap, boolean isDefault, GuestType type, boolean systemOnly, Long serviceOfferingId, boolean conserveMode, Map> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent, Map details, boolean egressDefaultPolicy, Integer maxconn, boolean enableKeepAlive, Boolean forVpc, - List domainIds, List zoneIds, boolean enableOffering, NetUtils.InternetProtocol internetProtocol) { + Boolean forTungsten, List domainIds, List zoneIds, boolean enableOffering, NetUtils.InternetProtocol internetProtocol) { // TODO Auto-generated method stub return null; } diff --git a/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java b/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java index 16a03646708..72bd7bb0cd8 100644 --- a/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java +++ b/server/src/test/java/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java @@ -132,7 +132,7 @@ public class CreateNetworkOfferingTest extends TestCase { public void createSharedNtwkOffWithVlan() { NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true, Availability.Optional, 200, null, false, Network.GuestType.Shared, false, - null, false, null, true, false, null, false, null, true, false, null, null, false, null); + null, false, null, true, false, null, false, null, true, false, false, null, null, false, null); assertNotNull("Shared network offering with specifyVlan=true failed to create ", off); } @@ -140,7 +140,7 @@ public class CreateNetworkOfferingTest extends TestCase { public void createSharedNtwkOffWithNoVlan() { NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, false, Availability.Optional, 200, null, false, Network.GuestType.Shared, - false, null, false, null, true, false, null, false, null, true, false, null, null, false, null); + false, null, false, null, true, false, null, false, null, true, false, false, null, null, false, null); assertNotNull("Shared network offering with specifyVlan=false was created", off); } @@ -148,7 +148,7 @@ public class CreateNetworkOfferingTest extends TestCase { public void createSharedNtwkOffWithSpecifyIpRanges() { NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true, Availability.Optional, 200, null, false, Network.GuestType.Shared, false, - null, false, null, true, false, null, false, null, true, false, null, null, false, null); + null, false, null, true, false, null, false, null, true, false, false, null, null, false, null); assertNotNull("Shared network offering with specifyIpRanges=true failed to create ", off); } @@ -157,7 +157,7 @@ public class CreateNetworkOfferingTest extends TestCase { public void createSharedNtwkOffWithoutSpecifyIpRanges() { NetworkOfferingVO off = configMgr.createNetworkOffering("shared", "shared", TrafficType.Guest, null, true, Availability.Optional, 200, null, false, Network.GuestType.Shared, - false, null, false, null, false, false, null, false, null, true, false, null, null, false, null); + false, null, false, null, false, false, null, false, null, true, false, false, null, null, false, null); assertNull("Shared network offering with specifyIpRanges=false was created", off); } @@ -170,7 +170,7 @@ public class CreateNetworkOfferingTest extends TestCase { serviceProviderMap.put(Network.Service.SourceNat, vrProvider); NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false, Availability.Optional, 200, serviceProviderMap, false, - Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, null, null, false, null); + Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, false, null, null, false, null); assertNotNull("Isolated network offering with specifyIpRanges=false failed to create ", off); } @@ -183,7 +183,7 @@ public class CreateNetworkOfferingTest extends TestCase { serviceProviderMap.put(Network.Service.SourceNat, vrProvider); NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true, Availability.Optional, 200, serviceProviderMap, false, - Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, null, null, false, null); + Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, false, false, null, null, false, null); assertNotNull("Isolated network offering with specifyVlan=true wasn't created", off); } @@ -196,7 +196,7 @@ public class CreateNetworkOfferingTest extends TestCase { serviceProviderMap.put(Network.Service.SourceNat, vrProvider); NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false, Availability.Optional, 200, serviceProviderMap, false, - Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, null, null, false, null); + Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, false, null, null, false, null); assertNull("Isolated network offering with specifyIpRanges=true and source nat service enabled, was created", off); } @@ -207,7 +207,7 @@ public class CreateNetworkOfferingTest extends TestCase { Set vrProvider = new HashSet(); NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, false, Availability.Optional, 200, serviceProviderMap, false, - Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, null, null, false, null); + Network.GuestType.Isolated, false, null, false, null, true, false, null, false, null, true, false, false, null, null, false, null); assertNotNull("Isolated network offering with specifyIpRanges=true and with no sourceNatService, failed to create", off); } @@ -225,7 +225,7 @@ public class CreateNetworkOfferingTest extends TestCase { serviceProviderMap.put(Network.Service.Lb, vrProvider); NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true, Availability.Optional, 200, serviceProviderMap, false, - Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, false, null); + Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, false, null, null, false, null); // System.out.println("Creating Vpc Network Offering"); assertNotNull("Vpc Isolated network offering with Vpc provider ", off); } @@ -245,7 +245,7 @@ public class CreateNetworkOfferingTest extends TestCase { serviceProviderMap.put(Network.Service.Lb, lbProvider); NetworkOfferingVO off = configMgr.createNetworkOffering("isolated", "isolated", TrafficType.Guest, null, true, Availability.Optional, 200, serviceProviderMap, false, - Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, null, null, false, null); + Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true, false, null, null, false, null); // System.out.println("Creating Vpc Network Offering"); assertNotNull("Vpc Isolated network offering with Vpc and Netscaler provider ", off); } diff --git a/setup/dev/advancedsgtf.cfg b/setup/dev/advancedsgtf.cfg new file mode 100644 index 00000000000..d9657d92986 --- /dev/null +++ b/setup/dev/advancedsgtf.cfg @@ -0,0 +1,131 @@ +# 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. +{ + "zones": [ + { + "name": "SG-TF-Zone", + "dns1": "8.8.8.8", + "physical_networks": [ + { + "broadcastdomainrange": "Zone", + "name": "SG-TF-PhysicalNetwork", + "traffictypes": [ + { + "typ": "Guest", + "kvm": "vhost0" + }, + { + "typ": "Management", + "kvm": "vhost0" + } + ], + "providers": [ + { + "broadcastdomainrange": "ZONE", + "name": "Tungsten" + } + ], + "isolationmethods": [ + "TF" + ] + } + ], + "securitygroupenabled": "true", + "tungstenprovider": { + "name": "tf-provider", + "hostname": "192.168.5.203", + "gateway": "192.168.5.203" + }, + "ipranges": [ + { + "startip": "192.168.3.100", + "endip": "192.168.3.200", + "netmask": "255.255.255.0", + "vlan": "untagged", + "gateway": "192.168.3.1" + } + ], + "networktype": "Advanced", + "pods": [ + { + "endip": "192.168.8.200", + "name": "SG-TF-Pod", + "startip": "192.168.8.100", + "netmask": "255.255.255.0", + "clusters": [ + { + "clustername": "SG-TF-Cluster", + "hypervisor": "KVM", + "hosts": [ + { + "username": "root", + "url": "http://192.168.5.203", + "password": "password" + }, + { + "username": "root", + "url": "http://192.168.5.202", + "password": "password" + } + ], + "clustertype": "CloudManaged", + "primaryStorages": [ + { + "url": "nfs://192.168.5.203:/export/primary", + "name": "SG-TF-PS" + } + ] + } + ], + "gateway": "192.168.8.1" + } + ], + "internaldns1": "192.168.5.204", + "secondaryStorages": [ + { + "url": "nfs://192.168.5.203:/export/secondary", + "provider" : "NFS" + } + ], + "networkofferingname": "DefaultTungstenSharedNetworkOfferingWithSGService" + } + ], + "dbSvr": { + "dbSvr": "192.168.5.203", + "passwd": "password", + "db": "cloud", + "port": 3306, + "user": "cloud" + }, + "logger": + { + "LogFolderPath": "/tmp" + } + , + "mgtSvr": [ + { + "mgtSvrIp": "192.168.5.203", + "passwd": "password", + "user": "root", + "port": 8888, + "hypervisor": "KVM", + "useHttps": "False", + "certCAPath": "NA", + "certPath": "NA" + } + ] +} diff --git a/setup/dev/advancedtf.cfg b/setup/dev/advancedtf.cfg new file mode 100644 index 00000000000..db27e282e24 --- /dev/null +++ b/setup/dev/advancedtf.cfg @@ -0,0 +1,134 @@ +# 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. +{ + "zones": [ + { + "name": "TF-Zone", + "guestcidraddress": "10.1.1.0/16", + "dns1": "8.8.8.8", + "physical_networks": [ + { + "broadcastdomainrange": "Zone", + "name": "TF-PhysicalNetwork", + "traffictypes": [ + { + "typ": "Guest", + "kvm": "vhost0" + }, + { + "typ": "Management", + "kvm": "vhost0" + }, + { + "typ": "Public", + "kvm": "vhost0" + } + ], + "providers": [ + { + "broadcastdomainrange": "ZONE", + "name": "Tungsten" + } + ], + "isolationmethods": [ + "TF" + ] + } + ], + "tungstenprovider": { + "name": "tf-provider", + "hostname": "192.168.5.203", + "gateway": "192.168.5.203" + }, + "ipranges": [ + { + "startip": "192.168.3.100", + "endip": "192.168.3.200", + "netmask": "255.255.255.0", + "vlan": "untagged", + "gateway": "192.168.3.1" + } + ], + "networktype": "Advanced", + "pods": [ + { + "endip": "192.168.6.200", + "name": "TF-Pod", + "startip": "192.168.6.100", + "netmask": "255.255.255.0", + "clusters": [ + { + "clustername": "TF-Cluster", + "hypervisor": "KVM", + "hosts": [ + { + "username": "root", + "url": "http://192.168.5.203", + "password": "password" + }, + { + "username": "root", + "url": "http://192.168.5.202", + "password": "password" + } + ], + "clustertype": "CloudManaged", + "primaryStorages": [ + { + "url": "nfs://192.168.5.203:/export/primary", + "name": "TF-PS" + } + ] + } + ], + "gateway": "192.168.6.1" + } + ], + "internaldns1": "192.168.5.202", + "secondaryStorages": [ + { + "url": "nfs://192.168.5.203:/export/secondary", + "provider" : "NFS" + } + ] + } + ], + "dbSvr": { + "dbSvr": "192.168.5.203", + "passwd": "password", + "db": "cloud", + "port": 3306, + "user": "cloud" + }, + "logger": + { + "LogFolderPath": "/tmp" + } + , + "mgtSvr": [ + { + "mgtSvrIp": "192.168.5.203", + "passwd": "password", + "user": "root", + "port": 8888, + "hypervisor": "KVM", + "useHttps": "False", + "certCAPath": "NA", + "certPath": "NA" + } + ] +} diff --git a/systemvm/debian/opt/cloud/bin/setup_tf_route.py b/systemvm/debian/opt/cloud/bin/setup_tf_route.py new file mode 100644 index 00000000000..76980c1d64b --- /dev/null +++ b/systemvm/debian/opt/cloud/bin/setup_tf_route.py @@ -0,0 +1,45 @@ +#!/usr/bin/python +# -- coding: utf-8 -- +# 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. +from cs.CsHelper import * +from cs.CsRoute import CsRoute +from cs.CsRule import CsRule + + +def main(argv): + if len(argv) != 3: + exit(1) + pubip = argv[1] + prinet = argv[2] + pubdev = get_device(pubip) + if pubdev == "": + exit(1) + list = execute("ip -o -f inet addr show %s | awk '/scope global/ {print $4}'" % pubdev) + if len(list) != 1: + exit(1) + pubnet = list[0] + csroute = CsRoute() + csroute.add_table(pubdev) + csrule = CsRule(pubdev) + csrule.addRule("from %s to %s" % (pubnet, prinet)) + cmd = "%s dev %s table %s" % (prinet, pubdev, csroute.get_tablename(pubdev)) + csroute.set_route(cmd) + + +if __name__ == '__main__': + main(sys.argv) diff --git a/test/integration/plugins/tf/common.py b/test/integration/plugins/tf/common.py new file mode 100644 index 00000000000..78628e58303 --- /dev/null +++ b/test/integration/plugins/tf/common.py @@ -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. + +import requests +from marvin.lib.utils import (validateList) +from marvin.lib.base import (VirtualMachine, FirewallRule, FirewallPolicy, TungstenTag, + ApplicationPolicySet, AddressGroup, ServiceGroup, LogicalRouter, + NetworkPolicy) +from marvin.cloudstackAPI import (listTungstenFabricProviders, listSystemVms) +from marvin.codes import PASS + +def not_tungsten_fabric_zone(apiclient, zone_id): + cmd = listTungstenFabricProviders.listTungstenFabricProvidersCmd() + cmd.zoneid = zone_id + + response = apiclient.listTungstenFabricProviders(cmd) + return validateList(response)[0] != PASS + + +def is_object_created(apiclient, zone_id, object, id): + cmd = listTungstenFabricProviders.listTungstenFabricProvidersCmd() + cmd.zoneid = zone_id + + response = apiclient.listTungstenFabricProviders(cmd) + if validateList(response)[0] != PASS: + raise Exception("Warning: zone tungsten provider doesn't exist") + + host = response[0].tungstenproviderhostname + port = response[0].tungstenproviderport + + r = requests.get("http://%s:%s/%s/%s" % (host, port, object, id)) + status_code = r.status_code + return status_code == 200 + + +def is_object_deleted(apiclient, zone_id, object, id): + cmd = listTungstenFabricProviders.listTungstenFabricProvidersCmd() + cmd.zoneid = zone_id + + response = apiclient.listTungstenFabricProviders(cmd) + if validateList(response)[0] != PASS: + raise Exception("Warning: zone tungsten provider doesn't exist") + + host = response[0].tungstenproviderhostname + port = response[0].tungstenproviderport + + r = requests.get("http://%s:%s/%s/%s" % (host, port, object, id)) + status_code = r.status_code + return status_code == 404 + + +def get_list_system_vm(apiclient, zone_id): + cmd = listSystemVms.listSystemVmsCmd() + cmd.zoneid = zone_id + + return apiclient.listSystemVms(cmd) + + +def cleanup_resources(api_client, zoneid, resources): + for obj in resources: + if isinstance(obj, VirtualMachine): + obj.delete(api_client, expunge=True) + elif isinstance(obj, FirewallRule): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, FirewallPolicy): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, TungstenTag): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, ApplicationPolicySet): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, ServiceGroup): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, AddressGroup): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, LogicalRouter): + obj.delete(api_client, zoneid, obj.uuid) + elif isinstance(obj, NetworkPolicy): + obj.delete(api_client, zoneid, obj.uuid) + else: + obj.delete(api_client) diff --git a/test/integration/plugins/tf/test_isolated_zone.py b/test/integration/plugins/tf/test_isolated_zone.py new file mode 100644 index 00000000000..0658e44b22f --- /dev/null +++ b/test/integration/plugins/tf/test_isolated_zone.py @@ -0,0 +1,1410 @@ +# 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. + +import logging +import time +import requests + +from nose.plugins.attrib import attr + +from marvin.cloudstackTestCase import cloudstackTestCase +from marvin.lib.base import (Network, NetworkOffering, Account, VirtualMachine, ServiceOffering, + NATRule, PublicIPAddress, EgressFireWallRule, Host, + FireWallRule, LoadBalancerRule, LogicalRouter, ApplicationPolicySet, + FirewallPolicy, FirewallRule, TungstenTag, ServiceGroup, + NetworkPolicy, PolicyRule) +from marvin.cloudstackAPI import migrateVirtualMachine +from marvin.lib.utils import (is_server_ssh_ready, get_host_credentials, execute_command_in_host) +from marvin.lib.common import get_zone, get_template +from marvin.lib.decoratorGenerators import skipTestIf +from .common import is_object_created, is_object_deleted, get_list_system_vm, cleanup_resources, not_tungsten_fabric_zone + +class Services: + """Test Tungsten Plugin + """ + + def __init__(self): + self.services = { + "network_offering": { + "name": "TungstenNetworkOffering", + "displaytext": "TungstenNetworkOffering", + "guestiptype": "Isolated", + "traffictype": "GUEST", + "supportedservices": [ + "Dhcp", + "Dns", + "Lb", + "UserData", + "SourceNat", + "StaticNat", + "PortForwarding", + "Connectivity", + "Firewall" + ], + "serviceProviderList": { + "Dhcp": "Tungsten", + "Dns": "Tungsten", + "Lb": "Tungsten", + "UserData": "ConfigDrive", + "SourceNat": "Tungsten", + "StaticNat": "Tungsten", + "PortForwarding": "Tungsten", + "Connectivity": "Tungsten", + "Firewall": "Tungsten" + }, + "useTungsten": "on" + }, + "networks": { + "network1": { + "name": "TF-Network1", + "displaytext": "TF-Network1", + "gateway": "10.1.1.1", + "netmask": "255.255.255.0", + "startip": "10.1.1.100", + "endip": "10.1.1.200" + }, + "network2": { + "name": "TF-Network2", + "displaytext": "TF-Network2", + "gateway": "10.1.2.1", + "netmask": "255.255.255.0", + "startip": "10.1.2.100", + "endip": "10.1.2.200" + } + }, + "ostype": "112", + "account": { + "email": "test@test.com", + "firstname": "Test", + "lastname": "User", + "username": "test", + "password": "password", + }, + "virtual_machines": { + "vm1": { + "name": "vm1", + "displayname": "vm1", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP' + + }, + "vm2": { + "name": "vm2", + "displayname": "vm2", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP' + }, + "vm3": { + "name": "vm3", + "displayname": "vm3", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP' + } + }, + "fw_rule": { + "startport": 80, + "endport": 80, + "cidr": '0.0.0.0/0', + "protocol": "TCP" + }, + "nat_rule": { + "privateport": 80, + "publicport": 80, + "protocol": 'TCP' + }, + "lbrule": { + "name": "SSH", + "alg": "roundrobin", + "privateport": 80, + "publicport": 80, + "protocol": 'TCP' + }, + "logicalrouter": { + "name": "TFLogicalRouter" + }, + "applicationpolicysets": { + "aps1": { + "name": "aps1" + } + }, + "firewallpolicys": { + "frontend": { + "name": "frontend" + }, + "internet": { + "name": "internet" + }, + "host": { + "name": "host" + } + }, + "firewallrules": { + "frontend": { + "name": "frontend", + "action": "pass", + "direction": "oneway" + }, + "internet": { + "name": "internet", + "action": "pass", + "direction": "oneway" + }, + "host": { + "name": "host", + "action": "pass", + "direction": "oneway" + } + }, + "servicegroups": { + "any": { + "name": "any", + "protocol": "any", + "startport": -1, + "endport": -1 + } + }, + "network_policy": { + "policy1": { + "name": "policy1", + "rules": { + "rule1": { + "action": "pass", + "direction": "twoway", + "protocol": "icmp", + "srcnetwork": "any", + "srcipprefix": "0.0.0.0", + "srcipprefixlend": 0, + "srcstartport": -1, + "srcendport": -1, + "destnetwork": "any", + "destipprefix": "0.0.0.0", + "destipprefixlen": 0, + "deststartport": -1, + "destendport": -1 + } + } + } + }, + "network_route_table": { + "route_table_1": { + "name": "Network Route Table 1", + "prefix": "10.1.2.0/24", + "nexthoptype": "ip-address", + "communities": "" + }, + "route_table_2": { + "name": "Network Route Table 2", + "prefix": "10.1.1.0/24", + "nexthoptype": "ip-address", + "communities": "" + } + }, + "interface_route_table": { + "route_table_1": { + "name": "Interface Route Table 1", + "prefix": "10.1.2.0/24", + "communities": "" + }, + "route_table_2": { + "name": "Interface Route Table 2", + "prefix": "10.1.1.0/24", + "communities": "" + } + }, + "routing_policy": { + "routing_policy_1": { + "name": "Routing Policy 1", + "matchall": "true", + "protocollist": [""], + "prefixlist": [ + "10.1.2.0/24&exact" + ], + "termlist": [ + "reject&action& " + ], + "communities": [""] + } + } + } + + +class TestIsolatedZone(cloudstackTestCase): + @classmethod + def setUpClass(cls): + cls.apiclient = cls.clstestclient.getApiClient() + cls.dbclient = cls.clstestclient.getDbConnection() + cls.services = Services().services + cls.testdata = cls.clstestclient.getParsedTestDataConfig() + cls.zone = get_zone(cls.apiclient, cls.clstestclient.getZoneForTests()) + cls.hypervisor = cls.clstestclient.getHypervisorInfo() + cls.tfgw = cls.getClsConfig()["zones"][0]["tungstenprovider"]["gateway"] + cls.config = cls.getClsConfig() + cls.template = get_template(cls.apiclient, cls.zone.id) + cls.hosts = Host.list(cls.apiclient, zoneid=cls.zone.id, type="routing") + for host in cls.hosts: + Host.reconnect(cls.apiclient, id=host.id) + cls.not_tungsten_fabric_zone = not_tungsten_fabric_zone(cls.apiclient, cls.zone.id) + cls.is_single_host = len(cls.hosts) < 2 + cls.can_not_migrate = cls.not_tungsten_fabric_zone or cls.is_single_host + cls._cleanup = [] + + cls.logger = logging.getLogger("TestIsolatedZone") + cls.stream_handler = logging.StreamHandler() + cls.logger.setLevel(logging.DEBUG) + cls.logger.addHandler(cls.stream_handler) + + @classmethod + def tearDownClass(self): + try: + cleanup_resources(self.apiclient, self.zone.id, self._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def setUp(self): + self.account = Account.create(self.apiclient, self.services["account"], admin=True) + self.service_offering = ServiceOffering.create(self.apiclient, self.testdata["service_offering"]) + self.cleanup = [self.account, self.service_offering] + return + + def tearDown(self): + try: + cleanup_resources(self.apiclient, self.zone.id, reversed(self.cleanup)) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_configuration(self): + # check if public network was created in tungsten fabric when deployed zone with setup/dev/advancedtf.cfg + list_public_network = Network.list(self.apiclient, zoneid=self.zone.id, issystem=True, + traffictype="Public") + self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-network", + list_public_network[0].id), True, + "Check if public network was created in tungsten") + + # check if management network was created in tungsten fabric when deployed zone with setup/dev/advancedtf.cfg + list_management_network = Network.list(self.apiclient, zoneid=self.zone.id, issystem=True, + traffictype="Management") + self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-network", + list_management_network[0].id), True, + "Check if management network was created in tungsten") + + # check if ssvm and proxyvm was created in tungsten fabric when deployed zone with setup/dev/advancedtf.cfg + list_system_vm = get_list_system_vm(self.apiclient, self.zone.id) + for system_vm in list_system_vm: + # check if system vm was created in tungsten fabric + self.assertEqual( + is_object_created(self.apiclient, self.zone.id, "virtual-machine", system_vm.id), + True, "Check if system vm was created in tungsten fabric") + + # check if tungsten fabric virtual gateway was created + username, password = get_host_credentials(self.config, self.tfgw) + ssh = is_server_ssh_ready(self.tfgw, 22, username, password) + vgw = ssh.execute("vif --list | grep vgw") + self.assertEqual( + str(vgw).count("vgw"), 1, "Check if vgw was created in host" + ) + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_connectivity(self): + # test create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # check if network offering was created + self.logger.info("network offering id is %s" % network_offering.id) + list_network_offering_response = NetworkOffering.list(self.apiclient, + id=network_offering.id) + self.assertEqual(isinstance(list_network_offering_response, list), True, + "Check for a valid list network response") + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + + # check if network was created in cloudstack + self.logger.info("network id is %s" % network.id) + list_network_response = Network.list(self.apiclient, id=network.id, listall=True) + self.assertEqual(isinstance(list_network_response, list), True, + "Check for a valid list network response") + + # create virtual machine 1 + vm1 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + + # create virtual machine 2 + vm2 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + + # check if vm 1 was created in cloudstack + self.logger.info("vm id is %s" % vm1.id) + list_vm_response = VirtualMachine.list(self.apiclient, id=vm1.id, listall=True) + self.assertEqual(isinstance(list_vm_response, list), True, + "Check for a valid list vm response") + + # check if vm 2 was created in cloudstack + self.logger.info("vm id is %s" % vm2.id) + list_vm_response = VirtualMachine.list(self.apiclient, id=vm2.id, listall=True) + self.assertEqual(isinstance(list_vm_response, list), True, + "Check for a valid list vm response") + + # wait for vm start + time.sleep(30) + + # tungsten fabric network was only created when network was implemented + # check if network was created in tungsten fabric + self.assertEqual( + is_object_created(self.apiclient, self.zone.id, "virtual-network", network.id), True, + "Check if network was created in tungsten") + + # check if vm 1 was created in tungsten fabric + self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-machine", vm1.id), + True, "Check if vm1 was created in tungsten") + + # check if vm 2 was created in tungsten fabric + self.assertEqual(is_object_created(self.apiclient, self.zone.id, "virtual-machine", vm2.id), + True, "Check if vm1 was created in tungsten") + + # check if nic 1 was created in tungsten fabric + self.assertEqual( + is_object_created(self.apiclient, self.zone.id, "virtual-machine-interface", vm1.nic[0].id), + True, "Check if nic 1 was created in tungsten") + + # check if nic 2 was created in tungsten fabric + self.assertEqual( + is_object_created(self.apiclient, self.zone.id, "virtual-machine-interface", vm2.nic[0].id), + True, "Check if nic 2 was created in tungsten") + + # check vm1 vif interface was created in host + host1 = Host.list(self.apiclient, id=vm1.hostid) + username, password = get_host_credentials(self.config, host1[0].ipaddress) + tap1 = "tap" + vm1.nic[0].macaddress.replace(":", "") + cmd1 = "vif --list | grep %s" % tap1 + vif1 = execute_command_in_host(host1[0].ipaddress, 22, username, password, cmd1) + self.assertEqual( + str(vif1).count(tap1), 1, "Check if vm1 tap interface was created in host" + ) + + # check vm2 vif interface was created in host + host2 = Host.list(self.apiclient, id=vm2.hostid) + username, password = get_host_credentials(self.config, host2[0].ipaddress) + tap2 = "tap" + vm2.nic[0].macaddress.replace(":", "") + cmd2 = "vif --list | grep %s" % tap2 + vif2 = execute_command_in_host(host2[0].ipaddress, 22, username, password, cmd2) + self.assertEqual( + str(vif2).count(tap2), 1, "Check if vm2 tap interface was created in host" + ) + + # ssh vm 1 and ping vm2 + ssh1 = vm1.get_ssh_client() + res_1 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + + # ssh vm 2 and ping vm1 + ssh2 = vm2.get_ssh_client() + res_2 = ssh2.execute("ping -c1 %s" % vm1.ipaddress) + + self.assertEqual( + str(res_1).count("1 received"), + 1, + "Ping vm_2 from vm_1 should be successful" + ) + + self.assertEqual( + str(res_2).count("1 received"), + 1, + "Ping vm_1 from vm_2 should be successful" + ) + + # delete vm 1 + try: + vm1.delete(self.apiclient, expunge=True) + except Exception as e: + raise Exception("Warning: Exception in expunging vms: %s" % e) + + # delete vm 2 + try: + vm2.delete(self.apiclient, expunge=True) + except Exception as e: + raise Exception("Warning: Exception in expunging vms: %s" % e) + + # check if nic 1 was deleted in tungsten fabric + self.assertEqual( + is_object_deleted(self.apiclient, self.zone.id, "virtual-machine-interface", vm1.nic[0].id), + True, "Check if nic 1 was deleted in tungsten") + + # check if nic 2 was deleted in tungsten fabric + self.assertEqual( + is_object_deleted(self.apiclient, self.zone.id, "virtual-machine-interface", vm2.nic[0].id), + True, "Check if nic 2 was deleted in tungsten") + + # check if vm 1 was deleted in tungsten fabric + self.assertEqual( + is_object_deleted(self.apiclient, self.zone.id, "virtual-machine", vm1.id), + True, "Check if vm was deleted in tungsten") + + # check if vm 2 was deleted in tungsten fabric + self.assertEqual( + is_object_deleted(self.apiclient, self.zone.id, "virtual-machine", vm2.id), + True, "Check if vm was deleted in tungsten") + + network.delete(self.apiclient) + + # check if network was deleted in tungsten fabric + self.assertEqual( + is_object_deleted(self.apiclient, self.zone.id, "virtual-network", network.id), + True, "Check if network was deleted in tungsten") + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_sourcenat(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create virtual machine + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm) + + # open firewall rule + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + # wait for vm start + # time.sleep(30) + + # ssh vm, ping google.com and verified response package + ssh = vm.get_ssh_client() + res = ssh.execute("ping -c1 google.com") + self.assertEqual( + str(res).count("1 received"), + 1, + "Ping google.com from vm should be successful" + ) + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_staticnat(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create virtual machine + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm) + + # wait for vm start + time.sleep(30) + + public_ip = PublicIPAddress.create( + apiclient=self.apiclient, + accountid=self.account.name, + zoneid=self.zone.id, + domainid=self.account.domainid, + services=self.services, + networkid=network.id + ) + + FireWallRule.create( + apiclient=self.apiclient, + ipaddressid=public_ip.ipaddress.id, + protocol='TCP', + cidrlist=['0.0.0.0/0'], + startport=80, + endport=80 + ) + + NATRule.create( + apiclient=self.apiclient, + virtual_machine=vm, + services=self.services["nat_rule"], + ipaddressid=public_ip.ipaddress.id + ) + + # ssh vm, start httpd, clear iptables + ssh = vm.get_ssh_client() + ssh.execute("service httpd start") + ssh.execute("iptables -F") + ssh.execute("echo test > /var/www/html/test.html") + + headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'} + r = requests.get("http://%s/test.html" % public_ip.ipaddress.ipaddress, headers=headers) + self.assertEqual(r.status_code, 200, "Static nat was created and applied to vm") + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_loadbalancing(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create virtual machine 1 + vm1 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm1) + + # create virtual machine 2 + vm2 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm2) + + public_ip = PublicIPAddress.create( + apiclient=self.apiclient, + accountid=self.account.name, + zoneid=self.zone.id, + domainid=self.account.domainid, + services=self.services, + networkid=network.id + ) + + # open firewall rule + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + firewall_rule = FireWallRule.create( + apiclient=self.apiclient, + ipaddressid=public_ip.ipaddress.id, + protocol='TCP', + cidrlist=['0.0.0.0/0'], + startport=80, + endport=80 + ) + self.cleanup.append(firewall_rule) + + lb_rule = LoadBalancerRule.create( + self.apiclient, + self.services["lbrule"], + ipaddressid=public_ip.ipaddress.id, + accountid=self.account.name + ) + self.cleanup.append(lb_rule) + lb_rule.assign(self.apiclient, [vm1, vm2]) + + # ssh vm1 and vm2, start httpd, clear iptables + ssh1 = vm1.get_ssh_client() + ssh1.execute("service httpd start") + ssh1.execute("iptables -F") + ssh1.execute("echo test1 > /var/www/html/test.html") + ssh2 = vm2.get_ssh_client() + ssh2.execute("service httpd start") + ssh2.execute("iptables -F") + ssh2.execute("echo test2 > /var/www/html/test.html") + + # wait for tungsten instance service create + time.sleep(120) + + # check if load balancing was apply and content was load balancing with round robin method + contents = ["test1", "test2"] + headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'} + r1 = requests.get("http://%s/test.html" % public_ip.ipaddress.ipaddress, headers=headers) + self.assertEqual(r1.status_code, 200, "Load balance was created and applied to vms") + self.logger.info("http response 1 content %s" % r1.text) + contents.remove(r1.text.rstrip()) + self.assertEqual(len(contents), 1, "Contents was load balancing with test1 or test2") + + r2 = requests.get("http://%s/test.html" % public_ip.ipaddress.ipaddress, headers=headers) + self.assertEqual(r2.status_code, 200, "Load balance was created and applied to vms") + self.logger.info("http response 2 content %s" % r2.text) + contents.remove(r2.text.rstrip()) + self.assertEqual(len(contents), 0, "Contents was load balancing with the rest of contents") + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_logicalrouter(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network 1 + network1 = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network1) + + # create virtual machine 1 + vm1 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network1.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm1) + + # create network 2 + network2 = Network.create( + self.apiclient, + self.services["networks"]["network2"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network2) + + # create virtual machine 2 + vm2 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network2.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm2) + + ssh1 = vm1.get_ssh_client() + res1 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res1).count("0 received"), + 1, + "Ping vm2 from vm1 should be not successful" + ) + + logicalrouter = LogicalRouter.create( + self.apiclient, + self.zone.id, + self.services["logicalrouter"]["name"] + ) + self.cleanup.append(logicalrouter) + + LogicalRouter.add( + self.apiclient, + self.zone.id, + logicalrouter.uuid, + network1.id) + + LogicalRouter.add( + self.apiclient, + self.zone.id, + logicalrouter.uuid, + network2.id) + + # open firewall rule for network 1 + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network1.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + # open firewall rule for network 2 + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network2.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + ssh2 = vm1.get_ssh_client() + res2 = ssh2.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res2).count("1 received"), + 1, + "Ping vm2 from vm1 should be successful" + ) + + LogicalRouter.remove( + self.apiclient, + self.zone.id, + logicalrouter.uuid, + network1.id) + + LogicalRouter.remove( + self.apiclient, + self.zone.id, + logicalrouter.uuid, + network2.id) + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_firewall(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create virtual machine + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm) + + # ssh vm, ping google.com and verified response package + ssh1 = vm.get_ssh_client() + res1 = ssh1.execute("ping -c1 google.com") + self.assertEqual( + str(res1).count("0 received"), + 1, + "Ping google.com from vm should be fail" + ) + + # open firewall rule + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + # wait for vm start + time.sleep(30) + + # ssh vm, ping google.com and verified response package + ssh2 = vm.get_ssh_client() + res2 = ssh2.execute("ping -c1 google.com") + self.assertEqual( + str(res2).count("1 received"), + 1, + "Ping google.com from vm should be successful" + ) + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_network_policy(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + networkpolicy = NetworkPolicy.create( + self.apiclient, + self.zone.id, + self.services["network_policy"]["policy1"]["name"] + ) + self.cleanup.append(networkpolicy) + + self.assertEqual( + is_object_created(self.apiclient, self.zone.id, "network-policy", networkpolicy.uuid), + True, "Check if network policy was created in tungsten") + + # create virtual machine + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm) + + ssh = vm.get_ssh_client() + res = ssh.execute("ping -c1 google.com") + self.assertEqual( + str(res).count("0 received"), + 1, + "Ping google.com from vm should not be successful" + ) + + NetworkPolicy.apply( + self.apiclient, + self.zone.id, + network.id, + networkpolicy.uuid, + 1, + 1 + ) + + policyrule = PolicyRule.create( + self.apiclient, + self.zone.id, + networkpolicy.uuid, + self.services["network_policy"]["policy1"]["rules"]["rule1"]["action"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["direction"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["protocol"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcnetwork"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcipprefix"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcipprefixlend"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcstartport"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["srcendport"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["destnetwork"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["destipprefix"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["destipprefixlen"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["deststartport"], + self.services["network_policy"]["policy1"]["rules"]["rule1"]["destendport"] + ) + + ssh1 = vm.get_ssh_client() + res1 = ssh1.execute("ping -c1 google.com") + self.assertEqual( + str(res1).count("1 received"), + 1, + "Ping google.com from vm should be successful" + ) + + PolicyRule.delete( + self.apiclient, + self.zone.id, + networkpolicy.uuid, + policyrule.uuid + ) + + NetworkPolicy.remove( + self.apiclient, + self.zone.id, + network.id, + networkpolicy.uuid + ) + + return + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_application_policy_set(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create virtual machine 1 + vm1 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm1) + + # create virtual machine 2 + vm2 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm2) + + # create virtual machine 3 + vm3 = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm3"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced' + ) + self.cleanup.append(vm3) + + applicationtag = TungstenTag.create( + self.apiclient, + zoneid=self.zone.id, + tagtype="application", + tagvalue="webapp" + ) + self.cleanup.append(applicationtag) + + frontendtag = TungstenTag.create( + self.apiclient, + zoneid=self.zone.id, + tagtype="tier", + tagvalue="frontend" + ) + self.cleanup.append(frontendtag) + + backendtag = TungstenTag.create( + self.apiclient, + zoneid=self.zone.id, + tagtype="tier", + tagvalue="backend" + ) + self.cleanup.append(backendtag) + + aps = ApplicationPolicySet.create( + self.apiclient, + self.zone.id, + self.services["applicationpolicysets"]["aps1"]["name"] + ) + self.cleanup.append(aps) + + frontendpolicy = FirewallPolicy.create( + self.apiclient, + self.zone.id, + aps.uuid, + self.services["firewallpolicys"]["frontend"]["name"], + 1 + ) + self.cleanup.append(frontendpolicy) + + internetpolicy = FirewallPolicy.create( + self.apiclient, + self.zone.id, + aps.uuid, + self.services["firewallpolicys"]["internet"]["name"], + 3 + ) + self.cleanup.append(internetpolicy) + + hostpolicy = FirewallPolicy.create( + self.apiclient, + self.zone.id, + aps.uuid, + self.services["firewallpolicys"]["host"]["name"], + 4 + ) + self.cleanup.append(hostpolicy) + + anyservicegroup = ServiceGroup.create( + self.apiclient, + self.zone.id, + self.services["servicegroups"]["any"]["name"], + self.services["servicegroups"]["any"]["protocol"], + self.services["servicegroups"]["any"]["startport"], + self.services["servicegroups"]["any"]["endport"] + ) + self.cleanup.append(anyservicegroup) + + frontendrule = FirewallRule.create( + self.apiclient, + self.zone.id, + frontendpolicy.uuid, + name=self.services["firewallrules"]["frontend"]["name"], + action=self.services["firewallrules"]["frontend"]["action"], + direction=self.services["firewallrules"]["frontend"]["direction"], + servicegroupuuid=anyservicegroup.uuid, + srctaguuid=frontendtag.uuid, + desttaguuid=backendtag.uuid, + sequence=1 + ) + self.cleanup.append(frontendrule) + + internetrule = FirewallRule.create( + self.apiclient, + self.zone.id, + internetpolicy.uuid, + name=self.services["firewallrules"]["internet"]["name"], + action=self.services["firewallrules"]["internet"]["action"], + direction=self.services["firewallrules"]["internet"]["direction"], + servicegroupuuid=anyservicegroup.uuid, + srctaguuid=applicationtag.uuid, + destnetworkuuid=network.id, + sequence=1 + ) + self.cleanup.append(internetrule) + + publicnetwork = Network.list(self.apiclient, listall=True, issystem=True, traffictype="Public") + hostrule = FirewallRule.create( + self.apiclient, + self.zone.id, + hostpolicy.uuid, + name=self.services["firewallrules"]["host"]["name"], + action=self.services["firewallrules"]["host"]["action"], + direction=self.services["firewallrules"]["host"]["direction"], + servicegroupuuid=anyservicegroup.uuid, + srcnetworkuuid=publicnetwork[0].id, + desttaguuid=applicationtag.uuid, + sequence=1 + ) + self.cleanup.append(hostrule) + + TungstenTag.apply( + self.apiclient, + self.zone.id, + applicationpolicysetuuid=aps.uuid, + taguuid=applicationtag.uuid + ) + + TungstenTag.apply( + self.apiclient, + self.zone.id, + taguuid=applicationtag.uuid, + nicuuid=vm1.nic[0].id + ) + + TungstenTag.apply( + self.apiclient, + self.zone.id, + taguuid=frontendtag.uuid, + nicuuid=vm1.nic[0].id + ) + + TungstenTag.apply( + self.apiclient, + self.zone.id, + taguuid=applicationtag.uuid, + nicuuid=vm2.nic[0].id + ) + + TungstenTag.apply( + self.apiclient, + self.zone.id, + taguuid=backendtag.uuid, + nicuuid=vm2.nic[0].id + ) + + # open firewall rule for network + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + ssh1 = vm1.get_ssh_client() + ssh2 = vm2.get_ssh_client() + ssh3 = vm3.get_ssh_client() + + # vm1 can access to internet + res1 = ssh1.execute("ping -c1 google.com") + self.assertEqual( + str(res1).count("1 received"), + 1, + "Ping google from vm1 should be successful" + ) + + # vm2 can access to internet + res2 = ssh2.execute("ping -c1 google.com") + self.assertEqual( + str(res2).count("1 received"), + 1, + "Ping google from vm2 should be successful" + ) + + # vm3 can access to internet + res3 = ssh3.execute("ping -c1 google.com") + self.assertEqual( + str(res3).count("1 received"), + 1, + "Ping google from vm3 should be successful" + ) + + # vm3(outside) can not ping to vm1 + res4 = ssh3.execute("ping -c1 %s" % vm1.ipaddress) + self.assertEqual( + str(res4).count("0 received"), + 1, + "Ping vm1 from vm3 should be not successful" + ) + + # vm3(outside) can not ping to vm2 + res5 = ssh3.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res5).count("0 received"), + 1, + "Ping vm2 from vm3 should be not successful" + ) + + # vm1(frontend) can ping to vm2(backend) + res6 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res6).count("1 received"), + 1, + "Ping vm1 from vm2 should be successful" + ) + + TungstenTag.remove( + self.apiclient, + self.zone.id, + applicationpolicysetuuid=aps.uuid, + taguuid=applicationtag.uuid + ) + TungstenTag.remove( + self.apiclient, + self.zone.id, + taguuid=applicationtag.uuid, + nicuuid=vm1.nic[0].id + ) + TungstenTag.remove( + self.apiclient, + self.zone.id, + taguuid=frontendtag.uuid, + nicuuid=vm1.nic[0].id + ) + TungstenTag.remove( + self.apiclient, + self.zone.id, + taguuid=applicationtag.uuid, + nicuuid=vm2.nic[0].id + ) + TungstenTag.remove( + self.apiclient, + self.zone.id, + taguuid=backendtag.uuid, + nicuuid=vm2.nic[0].id + ) + return + + @skipTestIf("can_not_migrate") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_vm_migration(self): + # create network offering + network_offering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) + network_offering.update(self.apiclient, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.apiclient, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create virtual machine + vm = VirtualMachine.create( + self.apiclient, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + mode='advanced', + hostid=self.hosts[0].id + ) + self.cleanup.append(vm) + + # open firewall rule for network 1 + EgressFireWallRule.create( + apiclient=self.apiclient, + networkid=network.id, + protocol='All', + cidrlist='0.0.0.0/0' + ) + + ssh = vm.get_ssh_client() + res = ssh.execute("ping -c1 google.com") + self.assertEqual( + str(res).count("1 received"), + 1, + "Ping google.com from vm1 should be successful" + ) + + cmd = migrateVirtualMachine.migrateVirtualMachineCmd() + cmd.virtualmachineid = vm.id + cmd.hostid = self.hosts[1].id + migrate = self.apiclient.migrateVirtualMachine(cmd) + + ssh = vm.get_ssh_client() + res = ssh.execute("ping -c1 google.com") + self.assertEqual( + str(res).count("1 received"), + 1, + "Ping google.com from vm1 should be successful" + ) diff --git a/test/integration/plugins/tf/test_shared_zone.py b/test/integration/plugins/tf/test_shared_zone.py new file mode 100644 index 00000000000..8d13f005950 --- /dev/null +++ b/test/integration/plugins/tf/test_shared_zone.py @@ -0,0 +1,972 @@ +# 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. + +import os +import subprocess +import socket + +from nose.plugins.attrib import attr + +from marvin.cloudstackTestCase import cloudstackTestCase +from marvin.lib.base import (Account, ServiceOffering, VirtualMachine, NetworkOffering, Network + , SecurityGroup) +from marvin.cloudstackAPI import (authorizeSecurityGroupIngress + , authorizeSecurityGroupEgress, revokeSecurityGroupIngress, revokeSecurityGroupEgress) +from marvin.lib.common import get_zone, get_template +from marvin.lib.decoratorGenerators import skipTestIf +from .common import cleanup_resources, not_tungsten_fabric_zone + + +class Services: + """Test Tungsten Plugin + """ + + def __init__(self): + self.services = { + "network_offering": { + "name": "TungstenSharedNetworkOffering", + "displaytext": "TungstenSharedNetworkOffering", + "guestiptype": "Shared", + "traffictype": "GUEST", + "supportedservices": [ + "Dhcp", + "Dns", + "Connectivity", + "SecurityGroup" + ], + "serviceProviderList": { + "Dhcp": "Tungsten", + "Dns": "Tungsten", + "Connectivity": "Tungsten", + "SecurityGroup": "Tungsten" + }, + "useTungsten": "on", + "specifyVlan": "true", + "specifyIpRanges": "true" + }, + "networks": { + "network1": { + "name": "TF-Network1", + "displaytext": "TF-Network1", + "gateway": "192.168.6.1", + "netmask": "255.255.255.0", + "startip": "192.168.6.100", + "endip": "192.168.6.200", + "vlan": "untagged" + } + }, + "account": { + "email": "test@test.com", + "firstname": "Test", + "lastname": "User", + "username": "test", + "password": "password", + }, + "virtual_machines": { + "vm1": { + "name": "vm1", + "displayname": "vm1", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP' + + }, + "vm2": { + "name": "vm2", + "displayname": "vm2", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP' + }, + "vm3": { + "name": "vm3", + "displayname": "vm3", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'KVM', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP' + } + }, + "security_groups": { + "security_group1": { + "name": "sg1" + }, + "security_group2": { + "name": "sg2" + }, + "security_group3": { + "name": "sg3" + } + }, + "ostype": 'CentOS 5.6 (64-bit)' + } + + +class TestSharedZone(cloudstackTestCase): + @classmethod + def setUpClass(cls): + cls.api_client = cls.clstestclient.getApiClient() + cls.services = Services().services + cls.test_data = cls.clstestclient.getParsedTestDataConfig() + cls.zone = get_zone(cls.api_client, cls.clstestclient.getZoneForTests()) + cls.template = get_template(cls.api_client, cls.zone.id, cls.test_data["ostype"]) + cls.not_tungsten_fabric_zone = not_tungsten_fabric_zone(cls.api_client, cls.zone.id) + cls._cleanup = [] + + @classmethod + def tearDownClass(self): + try: + cleanup_resources(self.api_client, self.zone.id, self._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def setUp(self): + self.account = Account.create(self.api_client, self.services["account"], admin=True) + self.service_offering = ServiceOffering.create(self.api_client, self.test_data["service_offering"]) + self.cleanup = [self.account, self.service_offering] + return + + def tearDown(self): + try: + cleanup_resources(self.api_client, self.zone.id, reversed(self.cleanup)) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def getLocalMachineIpAddress(self): + """ Get IP address of the machine on which test case is running """ + socket_ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + socket_.connect(('8.8.8.8', 0)) + return socket_.getsockname()[0] + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_test_default_security_group_rule(self): + + # Validate the following: + # 1. deploy vm + # 2. ping vm from test machine ( should fail as default security group rule ) + # 3. create icmp ingress security group rule with test machine ip address cidr + # 4. ping vm from test machine again ( should success as icmp ingress security group rule) + # 5. create ssh ingress security group rule with test machine ip address cidr + # 6. ssh to vm from test machine + # 7. ping google from vm ( should success as default security group rule ) + + network_offering = NetworkOffering.create(self.api_client, self.services["network_offering"]) + network_offering.update(self.api_client, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.api_client, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create security group + security_group = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group1"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group) + + # create virtual machine + vm = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[network.id], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group.id], + mode='advanced' + ) + self.cleanup.append(vm) + + # ping vm from test machine + if os.name == 'nt': + result = subprocess.call( + ['ping', '-n', '1', vm.ipaddress]) + else: + result = subprocess.call( + ['ping', '-c', '1', vm.ipaddress]) + + self.assertEqual( + result, + 1, + "Ping should be fail as default security group deny all incoming traffic" + ) + + test_machine_ip_address = self.getLocalMachineIpAddress() + cidr = test_machine_ip_address + "/32" + + # create icmp ingress security group rule with test machine ip address cidr + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.cidrlist = cidr + icmp_ingress_rule = self.api_client.authorizeSecurityGroupIngress(cmd) + + # ping vm from test machine again + if os.name == 'nt': + result = subprocess.call( + ['ping', '-n', '1', vm.ipaddress]) + else: + result = subprocess.call( + ['ping', '-c', '1', vm.ipaddress]) + + self.assertEqual( + result, + 0, + "Ping should be successful" + ) + + # create ssh ingress security group rule with test machine ip address cidr + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = cidr + ssh_ingress_rule = self.api_client.authorizeSecurityGroupIngress(cmd) + + # ssh to vm from test machine + ssh = vm.get_ssh_client() + + # ping google from vm + res = ssh.execute("ping -c1 google.com") + self.assertEqual( + str(res).count("1 received"), + 1, + "Ping google.com from vm should be successful " + "as default security group permit all outcoming traffic" + ) + + # revoke icmp ingress security group rule + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = icmp_ingress_rule.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # revoke ssh ingress security group rule + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ssh_ingress_rule.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_test_ingress_rule_security_group_with_cidr(self): + + # Validate the following: + # 1. deploy 2 vm : vm1 and vm2 + # 2. create ssh ingress security group rule with test machine ip address cidr + # 3. ssh to vm1 + # 4. ssh to vm2 from vm1 ( should fail as ssh ingress security group rule ) + # 5. create ssh ingress security group rule with vm1 ip address cidr + # 4. ssh to vm2 from vm1 again ( should success as ssh ingress security group rule ) + + network_offering = NetworkOffering.create(self.api_client, self.services["network_offering"]) + network_offering.update(self.api_client, state='Enabled') + self.cleanup.append(network_offering) + + # create network + network = Network.create( + self.api_client, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # create security group + security_group = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group1"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group) + + # create virtual machine 1 + vm1 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group.id], + mode='advanced' + ) + self.cleanup.append(vm1) + + # create virtual machine 2 + vm2 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group.id], + mode='advanced' + ) + self.cleanup.append(vm2) + + # create ssh ingress security group rule with test machine ip address cidr + test_machine_ip_address = self.getLocalMachineIpAddress() + cidr = test_machine_ip_address + "/32" + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = cidr + ingress_rule1 = self.api_client.authorizeSecurityGroupIngress(cmd) + + ssh = vm1.get_ssh_client() + res1 = ssh.execute("ssh %s@%s -v" % (vm2.username, vm2.ssh_ip)) + self.debug("Response is :%s" % res1) + self.assertFalse("connection established" in str(res1).lower(), "SSH to VM 2 should fail") + + # create ssh ingress security group rule with vm1 ip address cidr + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = vm1.ipaddress + "/32" + ingress_rule2 = self.api_client.authorizeSecurityGroupIngress(cmd) + + res2 = ssh.execute("ssh %s@%s -v" % (vm2.username, vm2.ssh_ip)) + self.debug("Response is :%s" % res2) + self.assertTrue("connection established" in str(res2).lower(), "SSH to VM 2 should success") + + # revoke ssh ingress security group rule 1 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ingress_rule1.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # revoke ssh ingress security group rule 2 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ingress_rule2.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_test_ingress_rule_security_group_with_account(self): + + # Validate the following: + # 1. create network 1 + # 2. create security group 1 + # 3. create security group 2 + # 4. deploy vm 1 + # 5. deploy vm 2 + # 6. create ssh ingress security group 1 rule with test machine ip address cidr + # 7. ssh to vm1 from test machine + # 8. ping vm2 from vm1 ( should fail ) + # 9. create icmp ingress security group 2 rule with account and security group 1 + # 10. ping vm2 from vm1 again ( should success ) + # 11. create ssh ingress security group 2 rule with test machine ip address cidr + # 12. ssh to vm2 from test machine + # 13. ping vm1 from vm2 ( should fail ) + # 14. create icmp ingress security group 1 rule with account and security group 2 + # 15. ping vm1 from vm2 again ( should success ) + # 16. revoke ssh ingress security group rule 1 + # 17. revoke ssh ingress security group rule 2 + # 18. revoke icmp ingress security group rule 1 + # 19. revoke icmp ingress security group rule 2 + + network_offering = NetworkOffering.create(self.api_client, self.services["network_offering"]) + network_offering.update(self.api_client, state='Enabled') + self.cleanup.append(network_offering) + + # 1. create network 1 + network = Network.create( + self.api_client, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # 2. create security group 1 + security_group1 = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group1"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group1) + + # 3. create security group 2 + security_group2 = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group2"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group2) + + # 4. deploy vm 1 + vm1 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group1.id], + mode='advanced' + ) + self.cleanup.append(vm1) + + # 5. deploy vm 2 + vm2 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group2.id], + mode='advanced' + ) + self.cleanup.append(vm2) + + # 6. create ssh ingress security group 1 rule with test machine ip address cidr + test_machine_ip_address = self.getLocalMachineIpAddress() + cidr = test_machine_ip_address + "/32" + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = cidr + ssh_ingress_rule1 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 7. ssh to vm1 from test machine + ssh1 = vm1.get_ssh_client() + + # 8. ping vm2 from vm1 ( should fail ) + res1 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res1).count("0 received"), + 1, + "Ping vm2 from vm1 should be fail" + ) + + # 9. create icmp ingress security group 2 rule with account and security group 1 + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group2.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.usersecuritygrouplist = [{'account':str(self.account.name),'group': str(security_group1.name)}] + icmp_ingress_rule1 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 10. ping vm2 from vm1 again ( should success ) + res2 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res2).count("1 received"), + 1, + "Ping vm2 from vm1 should be success" + ) + + # 11. create ssh ingress security group 2 rule with test machine ip address cidr + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group2.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = cidr + ssh_ingress_rule2 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 12. ssh to vm2 from test machine + ssh2 = vm2.get_ssh_client() + + # 13. ping vm1 from vm2 ( should fail ) + res3 = ssh2.execute("ping -c1 %s" % vm1.ipaddress) + self.assertEqual( + str(res3).count("0 received"), + 1, + "Ping vm1 from vm2 should be fail" + ) + + # 14. create icmp ingress security group 1 rule with account and security group 2 + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.usersecuritygrouplist = [{'account':str(self.account.name),'group': str(security_group2.name)}] + icmp_ingress_rule2 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 15. ping vm1 from vm2 again ( should success ) + res4 = ssh2.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res4).count("1 received"), + 1, + "Ping vm1 from vm2 should be success" + ) + + # 16. revoke ssh ingress security group rule 1 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ssh_ingress_rule1.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 17. revoke ssh ingress security group rule 2 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ssh_ingress_rule2.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 18. revoke icmp ingress security group rule 1 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = icmp_ingress_rule1.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 19. revoke icmp ingress security group rule 2 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = icmp_ingress_rule2.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_test_egress_rule_security_group_with_cidr(self): + + # Validate the following: + # 1. create network offering + # 2. create network 1 + # 3. create security group 1 + # 4. deploy vm1 + # 5. create ssh ingress security group 1 rule with test machine ip address cidr + # 6. ssh to vm1 from test machine + # 7. ping 8.8.8.8 from vm1 ( should success ) + # 8. ping 4.4.4.4 from vm1 ( should success ) + # 9. create icmp egress security group 1 rule with 8.8.8.8/32 cidr + # 10. ping 8.8.8.8 from vm 1 ( should success ) + # 11. ping 8.8.4.4 from vm1 ( should fail ) + # 12. create icmp egress security group 1 rule with 8.8.4.4/32 cidr + # 13. ping 8.8.4.4 from vm1 ( should success ) + + # 1. create network offering + network_offering = NetworkOffering.create( + self.api_client, + self.services["network_offering"] + ) + network_offering.update(self.api_client, state='Enabled') + self.cleanup.append(network_offering) + + # 2. create network 1 + network = Network.create( + self.api_client, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # 3. create security group 1 + security_group1 = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group1"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group1) + + # 4. deploy vm 1 + vm1 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group1.id], + mode='advanced' + ) + self.cleanup.append(vm1) + + # 5. create ssh ingress security group 1 rule with test machine ip address cidr + test_machine_ip_address = self.getLocalMachineIpAddress() + cidr = test_machine_ip_address + "/32" + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = cidr + ssh_ingress_rule1 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 6. ssh to vm1 from test machine + ssh1 = vm1.get_ssh_client() + + # 7. ping 8.8.8.8 from vm 1 ( should success ) + res1 = ssh1.execute("ping -c1 8.8.8.8") + self.assertEqual( + str(res1).count("1 received"), + 1, + "Ping 8.8.8.8 from vm1 should be success" + ) + + # 8. ping 8.8.4.4 from vm1 ( should success ) + res2 = ssh1.execute("ping -c1 8.8.4.4") + self.assertEqual( + str(res2).count("1 received"), + 1, + "Ping 8.8.4.4 from vm1 should be success" + ) + + # 9. create icmp egress security group 1 rule with 8.8.8.8/32 cidr + cmd = authorizeSecurityGroupEgress.authorizeSecurityGroupEgressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.cidrlist = '8.8.8.8/32' + icmp_egress_rule1 = self.api_client.authorizeSecurityGroupEgress(cmd) + + # 10. ping 8.8.8.8 from vm 1 ( should success ) + res3 = ssh1.execute("ping -c1 8.8.8.8") + self.assertEqual( + str(res3).count("1 received"), + 1, + "Ping 8.8.8.8 from vm1 should be success" + ) + + # 11. ping 8.8.4.4 from vm1 ( should fail ) + res4 = ssh1.execute("ping -c1 8.8.4.4") + self.assertEqual( + str(res4).count("0 received"), + 1, + "Ping 8.8.4.4 from vm1 should be fail" + ) + + # 12. create icmp egress security group 1 rule with 8.8.4.4 cidr + cmd = authorizeSecurityGroupEgress.authorizeSecurityGroupEgressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.cidrlist = "8.8.4.4/32" + icmp_egress_rule2 = self.api_client.authorizeSecurityGroupEgress(cmd) + + # 13. ping vm2 from vm1 ( should success ) + res5 = ssh1.execute("ping -c1 8.8.4.4") + self.assertEqual( + str(res5).count("1 received"), + 1, + "Ping 8.8.4.4 from vm1 should be success" + ) + + # 14. revoke ssh ingress security group rule 1 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ssh_ingress_rule1.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 15. revoke icmp egress security group rule 1 + cmd = revokeSecurityGroupEgress.revokeSecurityGroupEgressCmd() + cmd.id = icmp_egress_rule1.egressrule[0].ruleid + self.api_client.revokeSecurityGroupEgress(cmd) + + # 16. revoke icmp egress security group rule 2 + cmd = revokeSecurityGroupEgress.revokeSecurityGroupEgressCmd() + cmd.id = icmp_egress_rule2.egressrule[0].ruleid + self.api_client.revokeSecurityGroupEgress(cmd) + + @skipTestIf("not_tungsten_fabric_zone") + @attr(tags=["tungstenfabric"], required_hardware="false") + def test_01_test_egress_rule_security_group_with_account(self): + + # Validate the following: + # 1. create network offering + # 2. create network 1 + # 3. create security group 1 + # 4. create security group 2 + # 5. create security group 3 + # 6. deploy vm1 + # 7. deploy vm2 + # 8. deploy vm3 + # 9. create ssh ingress security group 1 rule with test machine ip address cidr + # 10. create icmp ingress security group 2 rule with security group 1 + # 11. create icmp ingress security group 3 rule with security group 1 + # 12. ssh to vm1 from test machine + # 13. ping vm2 from vm1 ( should success ) + # 14. ping vm3 from vm1 ( should success ) + # 15. create icmp egress security group 1 rule with security group 2 + # 16. ping vm2 from vm1 ( should success ) + # 17. ping vm3 from vm1 ( should fail ) + # 18. create icmp egress security group 1 rule with security group 3 + # 19. ping vm2 from vm1 ( should success ) + # 20. ping vm3 from vm1 ( should success ) + # 21. revoke ssh ingress security group rule 1 + # 22. revoke icmp ingress security group rule 1 + # 23. revoke icmp ingress security group rule 2 + # 24. revoke icmp egress security group rule 1 + # 25. revoke icmp egress security group rule 2 + + # 1. create network offering + network_offering = NetworkOffering.create( + self.api_client, + self.services["network_offering"] + ) + network_offering.update(self.api_client, state='Enabled') + self.cleanup.append(network_offering) + + # 2. create network 1 + network = Network.create( + self.api_client, + self.services["networks"]["network1"], + networkofferingid=network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(network) + + # 3. create security group 1 + security_group1 = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group1"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group1) + + # 4. create security group 2 + security_group2 = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group2"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group2) + + # 5. create security group 3 + security_group3 = SecurityGroup.create( + self.api_client, + self.services["security_groups"]["security_group3"], + account=self.account.name, + domainid=self.account.domainid + ) + self.cleanup.append(security_group3) + + # 6. deploy vm1 + vm1 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm1"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group1.id], + mode='advanced' + ) + self.cleanup.append(vm1) + + # 7. deploy vm2 + vm2 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm2"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group2.id], + mode='advanced' + ) + self.cleanup.append(vm2) + + # 8. deploy vm3 + vm3 = VirtualMachine.create( + self.api_client, + self.services["virtual_machines"]["vm3"], + serviceofferingid=self.service_offering.id, + templateid=self.template.id, + networkids=[str(network.id)], + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid, + securitygroupids=[security_group3.id], + mode='advanced' + ) + self.cleanup.append(vm3) + + # 9. create ssh ingress security group 1 rule with test machine ip address cidr + test_machine_ip_address = self.getLocalMachineIpAddress() + cidr = test_machine_ip_address + "/32" + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'TCP' + cmd.startport = 22 + cmd.endport = 22 + cmd.cidrlist = cidr + ssh_ingress_rule1 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 10. create icmp ingress security group 2 rule with security group 1 + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group2.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.usersecuritygrouplist = [{'account':str(self.account.name),'group': str(security_group1.name)}] + icmp_ingress_rule1 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 11. create icmp ingress security group 3 rule with security group 1 + cmd = authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() + cmd.securitygroupid = security_group3.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.usersecuritygrouplist = [{'account':str(self.account.name),'group': str(security_group1.name)}] + icmp_ingress_rule2 = self.api_client.authorizeSecurityGroupIngress(cmd) + + # 12. ssh to vm1 from test machine + ssh1 = vm1.get_ssh_client() + + # 13. ping vm2 from vm1 ( should success ) + res1 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res1).count("1 received"), + 1, + "Ping vm2 from vm1 should be success" + ) + + # 14. ping vm3 from vm1 ( should success ) + res2 = ssh1.execute("ping -c1 %s" % vm3.ipaddress) + self.assertEqual( + str(res2).count("1 received"), + 1, + "Ping vm3 from vm1 should be success" + ) + + # 15. create icmp egress security group 1 rule with security group 2 + cmd = authorizeSecurityGroupEgress.authorizeSecurityGroupEgressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.usersecuritygrouplist = [{'account':str(self.account.name),'group': str(security_group2.name)}] + icmp_egress_rule1 = self.api_client.authorizeSecurityGroupEgress(cmd) + + # 16. ping vm2 from vm1 ( should success ) + res3 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res3).count("1 received"), + 1, + "Ping vm2 from vm1 should be success" + ) + + # 17. ping vm3 from vm1 ( should fail ) + res4 = ssh1.execute("ping -c1 %s" % vm3.ipaddress) + self.assertEqual( + str(res4).count("0 received"), + 1, + "Ping vm3 from vm1 should be fail" + ) + + # 18. create icmp egress security group 1 rule with security group 3 + cmd = authorizeSecurityGroupEgress.authorizeSecurityGroupEgressCmd() + cmd.securitygroupid = security_group1.id + cmd.protocol = 'ICMP' + cmd.icmptype = "-1" + cmd.icmpcode = "-1" + cmd.usersecuritygrouplist = [{'account':str(self.account.name),'group': str(security_group3.name)}] + icmp_egress_rule2 = self.api_client.authorizeSecurityGroupEgress(cmd) + + # 19. ping vm2 from vm1 ( should success ) + res5 = ssh1.execute("ping -c1 %s" % vm2.ipaddress) + self.assertEqual( + str(res5).count("1 received"), + 1, + "Ping vm2 from vm1 should be success" + ) + + # 20. ping vm3 from vm1 ( should success ) + res6 = ssh1.execute("ping -c1 %s" % vm3.ipaddress) + self.assertEqual( + str(res6).count("1 received"), + 1, + "Ping vm3 from vm1 should be success" + ) + + # 21. revoke ssh ingress security group rule 1 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = ssh_ingress_rule1.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 22. revoke icmp ingress security group rule 1 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = icmp_ingress_rule1.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 23. revoke icmp ingress security group rule 2 + cmd = revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() + cmd.id = icmp_ingress_rule2.ingressrule[0].ruleid + self.api_client.revokeSecurityGroupIngress(cmd) + + # 24. revoke icmp egress security group rule 1 + cmd = revokeSecurityGroupEgress.revokeSecurityGroupEgressCmd() + cmd.id = icmp_egress_rule1.egressrule[0].ruleid + self.api_client.revokeSecurityGroupEgress(cmd) + + # 25. revoke icmp egress security group rule 2 + cmd = revokeSecurityGroupEgress.revokeSecurityGroupEgressCmd() + cmd.id = icmp_egress_rule2.egressrule[0].ruleid + self.api_client.revokeSecurityGroupEgress(cmd) diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py index 441b21f1d92..9624169db5c 100644 --- a/tools/apidoc/gen_toc.py +++ b/tools/apidoc/gen_toc.py @@ -87,6 +87,80 @@ known_categories = { 'OpenDaylight': 'Network', 'createServiceInstance': 'Network', 'addGloboDnsHost': 'Network', + 'createTungstenFabricController': 'Tungsten', + 'createTungstenFabricProvider': 'Tungsten', + 'deleteTungstenFabricProvider': 'Tungsten', + 'listTungstenFabricProviders': 'Tungsten', + 'getTungstenFabricProviders': 'Tungsten', + 'configTungstenFabricService': 'Tungsten', + 'createTungstenFabricPublicNetwork': 'Tungsten', + 'synchronizeTungstenFabricData': 'Tungsten', + 'addTungstenFabricPolicyRule': 'Tungsten', + 'createTungstenFabricPolicy': 'Tungsten', + 'deleteTungstenFabricPolicy': 'Tungsten', + 'removeTungstenFabricPolicyRule': 'Tungsten', + 'listTungstenFabricTag': 'Tungsten', + 'listTungstenFabricTagType': 'Tungsten', + 'listTungstenFabricPolicy': 'Tungsten', + 'listTungstenFabricPolicyRule': 'Tungsten', + 'listTungstenFabricNetwork': 'Tungsten', + 'listTungstenFabricVm': 'Tungsten', + 'listTungstenFabricNic': 'Tungsten', + 'createTungstenFabricTag': 'Tungsten', + 'createTungstenFabricTagType': 'Tungsten', + 'deleteTungstenFabricTag': 'Tungsten', + 'deleteTungstenFabricTagType': 'Tungsten', + 'applyTungstenFabricPolicy': 'Tungsten', + 'applyTungstenFabricTag': 'Tungsten', + 'removeTungstenFabricTag': 'Tungsten', + 'removeTungstenFabricPolicy': 'Tungsten', + 'createTungstenFabricApplicationPolicySet': 'Tungsten', + 'createTungstenFabricFirewallPolicy': 'Tungsten', + 'createTungstenFabricFirewallRule': 'Tungsten', + 'createTungstenFabricServiceGroup': 'Tungsten', + 'createTungstenFabricAddressGroup': 'Tungsten', + 'createTungstenFabricInterfaceRouteTable': 'Tungsten', + 'createTungstenFabricNetworkRouteTable': 'Tungsten', + 'createTungstenFabricLogicalRouter': 'Tungsten', + 'createTungstenFabricRoutingPolicy': 'Tungsten', + 'addTungstenFabricFirewallPolicy': 'Tungsten', + 'addTungstenFabricFirewallRule': 'Tungsten', + 'addTungstenFabricRouteTableToInterface': 'Tungsten', + 'addTungstenFabricRouteTableToNetwork': 'Tungsten', + 'addTungstenFabricInterfaceStaticRoute': 'Tungsten', + 'addTungstenFabricNetworkStaticRoute': 'Tungsten', + 'addTungstenFabricNetworkGatewayToLogicalRouter': 'Tungsten', + 'addTungstenFabricRoutingPolicyTerm': 'Tungsten', + 'listTungstenFabricApplicationPolicySet': 'Tungsten', + 'listTungstenFabricFirewallPolicy': 'Tungsten', + 'listTungstenFabricFirewallRule': 'Tungsten', + 'listTungstenFabricServiceGroup': 'Tungsten', + 'listTungstenFabricAddressGroup': 'Tungsten', + 'listTungstenFabricInterfaceRouteTable': 'Tungsten', + 'listTungstenFabricNetworkRouteTable': 'Tungsten', + 'listTungstenFabricInterfaceStaticRoute': 'Tungsten', + 'listTungstenFabricNetworkStaticRoute': 'Tungsten', + 'listTungstenFabricLogicalRouter': 'Tungsten', + 'listTungstenFabricRoutingPolicy': 'Tungsten', + 'deleteTungstenFabricApplicationPolicySet': 'Tungsten', + 'deleteTungstenFabricFirewallPolicy': 'Tungsten', + 'deleteTungstenFabricFirewallRule': 'Tungsten', + 'deleteTungstenFabricAddressGroup': 'Tungsten', + 'deleteTungstenFabricServiceGroup': 'Tungsten', + 'deleteTungstenFabricLogicalRouter': 'Tungsten', + 'removeTungstenFabricFirewallPolicy': 'Tungsten', + 'removeTungstenFabricFirewallRule': 'Tungsten', + 'removeTungstenFabricInterfaceRouteTable': 'Tungsten', + 'removeTungstenFabricNetworkRouteTable': 'Tungsten', + 'removeTungstenFabricInterfaceStaticRoute': 'Tungsten', + 'removeTungstenFabricNetworkStaticRoute': 'Tungsten', + 'removeTungstenFabricRouteTableFromInterface': 'Tungsten', + 'removeTungstenFabricRouteTableFromNetwork': 'Tungsten', + 'removeTungstenFabricNetworkGatewayFromLogicalRouter': 'Tungsten', + 'removeTungstenFabricRoutingPolicy': 'Tungsten', + 'removeTungstenFabricRoutingPolicyTerm': 'Tungsten', + 'updateTungstenFabricLBHealthMonitor': 'Tungsten', + 'listTungstenFabricLBHealthMonitor': 'Tungsten', 'Vpn': 'VPN', 'Limit': 'Limit', 'ResourceCount': 'Limit', diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index adc3de5cdd3..95417ae507f 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -315,6 +315,8 @@ class DeployDataCenters(object): podId, networkId) self.createClusters(pod.clusters, zoneId, podId, vmwareDc=pod.vmwaredc) + if self.isTungstenZone: + self.createTungstenManagementNetwork(podId) except Exception as e: print("Exception Occurred: %s" % GetDetailExceptionInfo(e)) self.__tcRunLogger.\ @@ -752,11 +754,18 @@ class DeployDataCenters(object): "====Zone: %s Creation Failed. So Exiting=====" % str(zone.name)) self.__cleanAndExit() + self.isTungstenZone = False for pnet in zone.physical_networks: phynetwrk = self.createPhysicalNetwork(pnet, zoneId) self.configureProviders(phynetwrk, pnet.providers) self.updatePhysicalNetwork(phynetwrk.id, "Enabled", vlan=pnet.vlan) + if "TF" in pnet.isolationmethods: + self.isTungstenZone = True + self.configureTungstenService(zoneId, phynetwrk.id, zone.tungstenprovider) + if zone.securitygroupenabled: + self.enableTungstenProvider(zoneId, phynetwrk.id) + if zone.networktype == "Basic": listnetworkoffering =\ listNetworkOfferings.listNetworkOfferingsCmd() @@ -788,6 +797,8 @@ class DeployDataCenters(object): self.createPods(zone.pods, zoneId) self.createVlanIpRanges(zone.networktype, zone.ipranges, zoneId) + if self.isTungstenZone: + self.createTungstenPublicNetwork(zoneId) elif (zone.networktype == "Advanced" and zone.securitygroupenabled == "true"): listnetworkoffering =\ @@ -929,6 +940,51 @@ class DeployDataCenters(object): self.__cleanAndExit() return FAILED + def configureTungstenService(self, zoneId, physicalNetworkId, tungstenprovider): + try: + createTFProviderCmd = createTungstenFabricProvider.createTungstenFabricProviderCmd() + createTFProviderCmd.zoneid = zoneId + createTFProviderCmd.name = tungstenprovider.name + createTFProviderCmd.tungstenproviderhostname = tungstenprovider.hostname + createTFProviderCmd.tungstengateway = tungstenprovider.gateway + self.__apiClient.createTungstenFabricProvider(createTFProviderCmd) + configTFServiceCmd = configTungstenFabricService.configTungstenFabricServiceCmd() + configTFServiceCmd.zoneid = zoneId + configTFServiceCmd.physicalnetworkid = physicalNetworkId + self.__apiClient.configTungstenFabricService(configTFServiceCmd) + except Exception as e: + print("\nException Occurred when config tungsten fabric service :%s" % GetDetailExceptionInfo(e)) + self.__tcRunLogger.exception("====Config Tungsten Fabric Service Failed===") + self.__cleanAndExit() + + def enableTungstenProvider(self, zoneId, physicalNetworkId): + provider = listNetworkServiceProviders.listNetworkServiceProvidersCmd() + provider.name = "Tungsten" + provider.physicalnetworkid = physicalNetworkId + provider.state = "Disabled" + providerres = self.__apiClient.listNetworkServiceProviders(provider) + if providerres and len(providerres) == 1: + self.enableProvider(providerres[0].id) + + def createTungstenManagementNetwork(self, podId): + try: + createTFManagementNetworkCmd = createTungstenFabricManagementNetwork.createTungstenFabricManagementNetworkCmd() + createTFManagementNetworkCmd.podid = podId + self.__apiClient.createTungstenFabricManagementNetwork(createTFManagementNetworkCmd) + except Exception as e: + print("\nException Occurred when create tungsten fabric management network :%s" % GetDetailExceptionInfo(e)) + self.__tcRunLogger.exception("====Create Tungsten Fabric Management Failed===") + self.__cleanAndExit() + + def createTungstenPublicNetwork(self, zoneId): + try: + createTFPublicNetworkCmd = createTungstenFabricPublicNetwork.createTungstenFabricPublicNetworkCmd() + createTFPublicNetworkCmd.zoneid = zoneId + self.__apiClient.createTungstenFabricPublicNetwork(createTFPublicNetworkCmd) + except Exception as e: + print("\nException Occurred when create tungsten fabric public network :%s" % GetDetailExceptionInfo(e)) + self.__tcRunLogger.exception("====Create Tungsten Fabric Public Failed===") + self.__cleanAndExit() class DeleteDataCenters: diff --git a/tools/marvin/marvin/lib/base.py b/tools/marvin/marvin/lib/base.py index 22864f9cf7b..a9f8e06cddd 100755 --- a/tools/marvin/marvin/lib/base.py +++ b/tools/marvin/marvin/lib/base.py @@ -2765,6 +2765,8 @@ class NetworkOffering: if "useVpc" in services: cmd.forvpc = (services["useVpc"] == "on") + if "useTungsten" in services: + cmd.fortungsten = (services["useTungsten"] == "on") cmd.serviceproviderlist = [] if "serviceProviderList" in services: for service, provider in list(services["serviceProviderList"].items()): @@ -6134,3 +6136,377 @@ class NetworkPermission: cmd = listNetworkPermissions.listNetworkPermissionsCmd() [setattr(cmd, k, v) for k, v in list(kwargs.items())] return (apiclient.listNetworkPermissions(cmd)) + +class LogicalRouter: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, name): + cmd = createTungstenFabricLogicalRouter.createTungstenFabricLogicalRouterCmd() + cmd.zoneid = zoneid + cmd.name = name + return LogicalRouter(apiclient.createTungstenFabricLogicalRouter(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, logicalrouteruuid, networkuuid): + cmd = listTungstenFabricLogicalRouter.listTungstenFabricLogicalRouterCmd() + cmd.zoneid = zoneid + cmd.logicalrouteruuid = logicalrouteruuid + cmd.networkuuid = networkuuid + return apiclient.listTungstenFabricLogicalRouter(cmd) + + @classmethod + def add(cls, apiclient, zoneid, logicalrouteruuid, networkuuid): + cmd = addTungstenFabricNetworkGatewayToLogicalRouter.addTungstenFabricNetworkGatewayToLogicalRouterCmd() + cmd.zoneid = zoneid + cmd.logicalrouteruuid = logicalrouteruuid + cmd.networkuuid = networkuuid + return apiclient.addTungstenFabricNetworkGatewayToLogicalRouter(cmd) + + @classmethod + def remove(cls, apiclient, zoneid, logicalrouteruuid, networkuuid): + cmd = removeTungstenFabricNetworkGatewayFromLogicalRouter.removeTungstenFabricNetworkGatewayFromLogicalRouterCmd() + cmd.zoneid = zoneid + cmd.logicalrouteruuid = logicalrouteruuid + cmd.networkuuid = networkuuid + return apiclient.removeTungstenFabricNetworkGatewayFromLogicalRouter(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, logicalrouteruuid): + cmd = deleteTungstenFabricLogicalRouter.deleteTungstenFabricLogicalRouterCmd() + cmd.zoneid = zoneid + cmd.logicalrouteruuid = logicalrouteruuid + return apiclient.deleteTungstenFabricLogicalRouter(cmd) + + +class ApplicationPolicySet: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, name): + cmd = createTungstenFabricApplicationPolicySet.createTungstenFabricApplicationPolicySetCmd() + cmd.zoneid = zoneid + cmd.name = name + + return ApplicationPolicySet( + apiclient.createTungstenFabricApplicationPolicySet(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, applicationpolicysetuuid): + cmd = listTungstenFabricApplicationPolicySet.listTungstenFabricApplicationPolicySetCmd() + cmd.zoneid = zoneid + cmd.applicationpolicysetuuid = applicationpolicysetuuid + return apiclient.listTungstenFabricApplicationPolicySet(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, applicationpolicysetuuid): + cmd = deleteTungstenFabricApplicationPolicySet.deleteTungstenFabricApplicationPolicySetCmd() + cmd.zoneid = zoneid + cmd.applicationpolicysetuuid = applicationpolicysetuuid + return apiclient.deleteTungstenFabricApplicationPolicySet(cmd) + + +class FirewallPolicy: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, applicationpolicysetuuid, name, sequence): + cmd = createTungstenFabricFirewallPolicy.createTungstenFabricFirewallPolicyCmd() + cmd.zoneid = zoneid + cmd.applicationpolicysetuuid = applicationpolicysetuuid + cmd.name = name + cmd.sequence = sequence + return FirewallPolicy(apiclient.createTungstenFabricFirewallPolicy(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, applicationpolicysetuuid, firewallpolicyuuid): + cmd = listTungstenFabricFirewallPolicy.listTungstenFabricFirewallPolicyCmd() + cmd.zoneid = zoneid + cmd.applicationpolicysetuuid = applicationpolicysetuuid + cmd.firewallpolicyuuid = firewallpolicyuuid + return apiclient.listTungstenFabricFirewallPolicy(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, firewallpolicyuuid): + cmd = deleteTungstenFabricFirewallPolicy.deleteTungstenFabricFirewallPolicyCmd() + cmd.zoneid = zoneid + cmd.firewallpolicyuuid = firewallpolicyuuid + return apiclient.deleteTungstenFabricFirewallPolicy(cmd) + + +class FirewallRule: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, firewallpolicyuuid, name, action, direction, + servicegroupuuid, sequence, + srctaguuid=None, desttaguuid=None, srcaddressgroupuuid=None, + destaddressgroupuuid=None, srcnetworkuuid=None, + destnetworkuuid=None, tagtypeuuid=None): + cmd = createTungstenFabricFirewallRule.createTungstenFabricFirewallRuleCmd() + cmd.zoneid = zoneid + cmd.firewallpolicyuuid = firewallpolicyuuid + cmd.name = name + cmd.action = action + cmd.direction = direction + cmd.servicegroupuuid = servicegroupuuid + cmd.sequence = sequence + + if srctaguuid: + cmd.srctaguuid = srctaguuid + if desttaguuid: + cmd.desttaguuid = desttaguuid + if srcaddressgroupuuid: + cmd.srcaddressgroupuuid = srcaddressgroupuuid + if destaddressgroupuuid: + cmd.destaddressgroupuuid = destaddressgroupuuid + if srcnetworkuuid: + cmd.srcnetworkuuid = srcnetworkuuid + if destnetworkuuid: + cmd.destnetworkuuid = destnetworkuuid + if tagtypeuuid: + cmd.tagtypeuuid = tagtypeuuid + return FirewallRule(apiclient.createTungstenFabricFirewallRule(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, firewallpolicyuuid, firewallruleuuid): + cmd = listTungstenFabricFirewallRule.listTungstenFabricFirewallRuleCmd() + cmd.zoneid = zoneid + cmd.firewallpolicyuuid = firewallpolicyuuid + cmd.firewallruleuuid = firewallruleuuid + return apiclient.listTungstenFabricFirewallRule(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, firewallruleuuid): + cmd = deleteTungstenFabricFirewallRule.deleteTungstenFabricFirewallRuleCmd() + cmd.zoneid = zoneid + cmd.firewallruleuuid = firewallruleuuid + return apiclient.deleteTungstenFabricFirewallRule(cmd) + + +class TungstenTag: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, tagtype, tagvalue): + cmd = createTungstenFabricTag.createTungstenFabricTagCmd() + cmd.zoneid = zoneid + cmd.tagtype = tagtype + cmd.tagvalue = tagvalue + return TungstenTag(apiclient.createTungstenFabricTag(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, applicationpolicysetuuid, networkuuid, nicuuid, policyuuid, vmuuid, taguuid): + cmd = listTungstenFabricTag.listTungstenFabricTagCmd() + cmd.zoneid = zoneid + cmd.applicationpolicysetuuid = applicationpolicysetuuid + cmd.networkuuid = networkuuid + cmd.nicuuid = nicuuid + cmd.policyuuid = policyuuid + cmd.vmuuid = vmuuid + cmd.taguuid = taguuid + return apiclient.listTungstenFabricTag(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, taguuid): + cmd = deleteTungstenFabricTag.deleteTungstenFabricTagCmd() + cmd.zoneid = zoneid + cmd.taguuid = taguuid + return apiclient.deleteTungstenFabricTag(cmd) + + @classmethod + def apply(cls, apiclient, zoneid, applicationpolicysetuuid=None, taguuid=None, networkuuid=None, + vmuuid=None, nicuuid=None, policyuuid=None): + cmd = applyTungstenFabricTag.applyTungstenFabricTagCmd() + cmd.zoneid = zoneid + cmd.taguuid = taguuid + if applicationpolicysetuuid: + cmd.applicationpolicysetuuid = applicationpolicysetuuid + if networkuuid: + cmd.networkuuid = networkuuid + if vmuuid: + cmd.vmuuid = vmuuid + if nicuuid: + cmd.nicuuid = nicuuid + if policyuuid: + cmd.policyuuid = policyuuid + return apiclient.applyTungstenFabricTag(cmd) + + @classmethod + def remove(cls, apiclient, zoneid, applicationpolicysetuuid=None, taguuid=None, + networkuuid=None, vmuuid=None, + nicuuid=None, policyuuid=None): + cmd = removeTungstenFabricTag.removeTungstenFabricTagCmd() + cmd.zoneid = zoneid + cmd.taguuid = taguuid + if applicationpolicysetuuid: + cmd.applicationpolicysetuuid = applicationpolicysetuuid + if networkuuid: + cmd.networkuuid = networkuuid + if vmuuid: + cmd.vmuuid = vmuuid + if nicuuid: + cmd.nicuuid = nicuuid + if policyuuid: + cmd.policyuuid = policyuuid + return apiclient.removeTungstenFabricTag(cmd) + + +class ServiceGroup: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, name, protocol, startport, endport): + cmd = createTungstenFabricServiceGroup.createTungstenFabricServiceGroupCmd() + cmd.zoneid = zoneid + cmd.name = name + cmd.protocol = protocol + cmd.startport = startport + cmd.endport = endport + return ServiceGroup(apiclient.createTungstenFabricServiceGroup(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, servicegroupuuid): + cmd = listTungstenFabricServiceGroup.listTungstenFabricServiceGroupCmd() + cmd.zoneid = zoneid + cmd.servicegroupuuid = servicegroupuuid + return apiclient.listTungstenFabricServiceGroup(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, servicegroupuuid): + cmd = deleteTungstenFabricServiceGroup.deleteTungstenFabricServiceGroupCmd() + cmd.zoneid = zoneid + cmd.servicegroupuuid = servicegroupuuid + return apiclient.deleteTungstenFabricServiceGroup(cmd) + + +class AddressGroup: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, name, ipprefix, ipprefixlen): + cmd = createTungstenFabricAddressGroup.createTungstenFabricAddressGroupCmd() + cmd.zoneid = zoneid + cmd.name = name + cmd.ipprefix = ipprefix + cmd.ipprefixlen = ipprefixlen + return AddressGroup(apiclient.createTungstenFabricAddressGroup(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, addressgroupuuid): + cmd = listTungstenFabricAddressGroup.listTungstenFabricAddressGroupCmd() + cmd.zoneid = zoneid + cmd.addressgroupuuid = addressgroupuuid + return apiclient.listTungstenFabricAddressGroup(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, addressgroupuuid): + cmd = deleteTungstenFabricAddressGroup.deleteTungstenFabricAddressGroupCmd() + cmd.zoneid = zoneid + cmd.addressgroupuuid = addressgroupuuid + return apiclient.deleteTungstenFabricAddressGroup(cmd) + + +class NetworkPolicy: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, name): + cmd = createTungstenFabricPolicy.createTungstenFabricPolicyCmd() + cmd.zoneid = zoneid + cmd.name = name + return NetworkPolicy(apiclient.createTungstenFabricPolicy(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, policyuuid, networkuuid, ipaddressid): + cmd = listTungstenFabricPolicy.listTungstenFabricPolicyCmd() + cmd.zoneid = zoneid + cmd.policyuuid = policyuuid + cmd.networkid = networkuuid + cmd.ipaddressid = ipaddressid + return apiclient.listTungstenFabricPolicy(cmd) + + @classmethod + def apply(cls, apiclient, zoneid, networkuuid, policyuuid, majorsequence, minorsequence): + cmd = applyTungstenFabricPolicy.applyTungstenFabricPolicyCmd() + cmd.zoneid = zoneid + cmd.policyuuid = policyuuid + cmd.networkuuid = networkuuid + cmd.majorsequence = majorsequence + cmd.minorsequence = minorsequence + return apiclient.applyTungstenFabricPolicy(cmd) + + @classmethod + def remove(cls, apiclient, zoneid, networkuuid, policyuuid): + cmd = removeTungstenFabricPolicy.removeTungstenFabricPolicyCmd() + cmd.zoneid = zoneid + cmd.networkuuid = networkuuid + cmd.policyuuid = policyuuid + return apiclient.removeTungstenFabricPolicy(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, policyuuid): + cmd = deleteTungstenFabricPolicy.deleteTungstenFabricPolicyCmd() + cmd.zoneid = zoneid + cmd.policyuuid = policyuuid + return apiclient.deleteTungstenFabricPolicy(cmd) + + +class PolicyRule: + + def __init__(self, items): + self.__dict__.update(items) + + @classmethod + def create(cls, apiclient, zoneid, policyuuid, action, direction, protocol, srcnetwork, + srcipprefix, srcipprefixlend, srcstartport, srcendport, destnetwork, destipprefix, + destipprefixlen, deststartport, destendport): + cmd = addTungstenFabricPolicyRule.addTungstenFabricPolicyRuleCmd() + cmd.zoneid = zoneid + cmd.policyuuid = policyuuid + cmd.action = action + cmd.direction = direction + cmd.protocol = protocol + cmd.srcnetwork = srcnetwork + cmd.srcipprefix = srcipprefix + cmd.srcipprefixlen = srcipprefixlend + cmd.srcstartport = srcstartport + cmd.srcendport = srcendport + cmd.destnetwork = destnetwork + cmd.destipprefix = destipprefix + cmd.destipprefixlen = destipprefixlen + cmd.deststartport = deststartport + cmd.destendport = destendport + return PolicyRule(apiclient.addTungstenFabricPolicyRule(cmd).__dict__) + + @classmethod + def list(cls, apiclient, zoneid, policyuuid, ruleuuid): + cmd = listTungstenFabricPolicyRule.listTungstenFabricPolicyRuleCmd() + cmd.zoneid = zoneid + cmd.policyuuid = policyuuid + cmd.ruleuuid = ruleuuid + return apiclient.listTungstenFabricPolicyRule(cmd) + + @classmethod + def delete(cls, apiclient, zoneid, policyuuid, ruleuuid): + cmd = removeTungstenFabricPolicyRule.removeTungstenFabricPolicyRuleCmd() + cmd.zoneid = zoneid + cmd.policyuuid = policyuuid + cmd.ruleuuid = ruleuuid + return apiclient.removeTungstenFabricPolicyRule(cmd) diff --git a/utils/src/main/java/com/cloud/utils/TungstenUtils.java b/utils/src/main/java/com/cloud/utils/TungstenUtils.java new file mode 100644 index 00000000000..95640627f9f --- /dev/null +++ b/utils/src/main/java/com/cloud/utils/TungstenUtils.java @@ -0,0 +1,290 @@ +// 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.utils; + +import com.cloud.utils.net.NetUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class TungstenUtils { + private static final String GUEST_TYPE = "Guest"; + private static final String SECURITY_GROUP = "securityGroup"; + public static final String INGRESS_RULE = "ingress"; + public static final String EGRESS_RULE = "egress"; + public static final String LOCAL = "local"; + public static final String DEFAULT_VHOST_INTERFACE = "vhost0"; + public static final String DEFAULT_FORWARDING_MODE = "l3"; + public static final int MAX_CIDR = 32; + public static final int MAX_IPV6_CIDR = 128; + public static final int DNS_SERVICE_PORT = 53; + public static final int NTP_SERVICE_PORT = 123; + public static final int WEB_SERVICE_PORT = 8080; + public static final String IPV4 = "IPv4"; + public static final String IPV6 = "IPv6"; + public static final String ALL_IP4_PREFIX = "0.0.0.0"; + public static final String ALL_IP6_PREFIX = "::"; + public static final String ANY = "any"; + public static final String DENY_ACTION = "deny"; + public static final String PASS_ACTION = "pass"; + public static final String ONE_WAY_DIRECTION = ">"; + public static final String TWO_WAY_DIRECTION = "<>"; + public static final String FABRIC_NETWORK_FQN = "default-domain:default-project:ip-fabric"; + public static final String ROUTINGLR_NAME = "routingLR"; + public static final String GUEST_NETWORK_NAME = "guestNetwork"; + public static final String PUBLIC_NETWORK_NAME = "publicNetwork"; + public static final String MANAGEMENT_NETWORK_NAME = "managementNetwork"; + public static final String SHARED_NETWORK_NAME = "sharedNetwork"; + public static final String SNAT_NETWORK_END_NAME = "right"; + + private TungstenUtils() { + } + + public static String getTapName(final String macAddress) { + return "tap" + macAddress.replace(":", ""); + } + + public static String getVmiName(String trafficType, String vmType, String vmName, long nicId) { + if (nicId != 0 && trafficType.equals(GUEST_TYPE)) + return "vmi" + trafficType + vmType + nicId; + else + return "vmi" + trafficType + vmType + vmName; + } + + public static String getInstanceIpName(String trafficType, String vmType, String vmName, long nicId) { + if (nicId != 0 && trafficType.equals(GUEST_TYPE)) + return "instanceIp" + trafficType + vmType + nicId; + else + return "instanceIp" + trafficType + vmType + vmName; + } + + public static String getV6InstanceIpName(String trafficType, String vmType, String vmName, long nicId) { + if (nicId != 0 && trafficType.equals(GUEST_TYPE)) + return "instanceV6Ip" + trafficType + vmType + nicId; + else + return "instanceV6Ip" + trafficType + vmType + vmName; + } + + public static String getSecondaryInstanceIpName(long nicSecondaryIpId) { + return "instanceIpSecondaryIp" + nicSecondaryIpId; + } + + public static String getLogicalRouterName(long networkId) { + return "logicalRouter" + networkId; + } + + public static String getNetworkGatewayVmiName(long vnId) { + return "internalGatewayVmi" + vnId; + } + + public static String getRoutingGatewayVmiName(String routerName, String networkName) { + return "routingGatewayVmi" + routerName + networkName; + } + + public static String getNetworkGatewayIiName(long pvnId) { + return "internalGatewayIi" + pvnId; + } + + public static String getRoutingGatewayIiName(String routerName, String networkName) { + return "routingGatewayIi" + routerName + networkName; + } + + public static String getPublicNetworkName(long zoneId) { + return PUBLIC_NETWORK_NAME + zoneId; + } + + public static String getGuestNetworkName(String networkName, String networkUuid) { + return GUEST_NETWORK_NAME + networkName + networkUuid; + } + + public static String getSharedNetworkName(long networkId) { + return SHARED_NETWORK_NAME + networkId; + } + + public static String getManagementNetworkName(long mvnId) { + return MANAGEMENT_NETWORK_NAME + mvnId; + } + + + public static String getVgwName(long zoneId) { + return "vgw" + zoneId; + } + + public static String getSgVgwName(long networkId) { + return "sgvgw" + networkId; + } + + public static String getVrfNetworkName(List networkQualifiedName) { + List vrfList = new ArrayList<>(networkQualifiedName); + vrfList.add(networkQualifiedName.get(networkQualifiedName.size() - 1)); + return StringUtils.join(vrfList, ":"); + } + + public static String getFloatingIpPoolName(long zoneId) { + return "floating-ip-pool" + zoneId; + } + + public static String getFloatingIpName(long nicId) { + return "floating-ip" + nicId; + } + + public static String getSnatNetworkStartName(List projectFqn, String logicalRouterUuid) { + return StringUtils.join(projectFqn, "__") + "__snat_" + logicalRouterUuid; + } + + public static String getPublicNetworkPolicyName(long publicIpAddressId) { + return "public-network-policy" + publicIpAddressId; + } + + public static String getManagementPolicyName(long zoneId) { + return "management-network-policy" + zoneId; + } + + public static String getFabricPolicyName(long zoneId) { + return "fabric-network-policy" + zoneId; + } + + public static String getVirtualNetworkPolicyName(long networkId) { + return "virtual-network-policy" + networkId; + } + + public static String getDefaultPublicNetworkPolicyName(long zoneId) { + return "default-public-network-policy" + zoneId; + } + + public static String getDefaultPublicSubnetPolicyName(long subnetId) { + return "default-public-subnet-policy" + subnetId; + } + + public static String getRuleNetworkPolicyName(long ruleId) { + return "rule-network-policy" + ruleId; + } + + public static String getSubnetName(long networkId) { + return "subnet-name" + networkId; + } + + public static String getIPV4SubnetName(long networkId) { + return "subnet-name-IPV4" + networkId; + } + + public static String getIPV6SubnetName(long networkId) { + return "subnet-name-IPV6" + networkId; + } + + public static String getLoadBalancerVmiName(long publicIpId) { + return "loadbalancer-vmi" + publicIpId; + } + + public static String getLoadBalancerIiName(long publicIpId) { + return "loadbalancer-ii" + publicIpId; + } + + public static String getLoadBalancerName(long publicIpId) { + return "loadbalancer" + publicIpId; + } + + public static String getLoadBalancerListenerName(long ruleId) { + return "loadbalancer-listener" + ruleId; + } + + public static String getLoadBalancerHealthMonitorName(long publicIpId) { + return "loadbalancer-healthmonitor" + publicIpId; + } + + public static String getLoadBalancerPoolName(long ruleId) { + return "loadbalancer-pool" + ruleId; + } + + public static String getLoadBalancerMemberName(long ruleId, String memberIp) { + return "loadbalancer-member" + ruleId + memberIp; + } + + public static String getLoadBalancerAlgorithm(String algorithm) { + switch (algorithm) { + case "leastconn": + return "LEAST_CONNECTIONS"; + case "source": + return "SOURCE_IP"; + default: + return "ROUND_ROBIN"; + } + } + + public static String getLoadBalancerSession(String stickiness) { + switch (stickiness) { + case "LbCookie": + return "HTTP_COOKIE"; + case "AppCookie": + return "APP_COOKIE"; + case "SourceBased": + return "SOURCE_IP"; + default: + return null; + } + } + + public static String getEthertTypeFromCidr(String cidr) { + if (NetUtils.isValidIp4Cidr(cidr)) { + return IPV4; + } else { + return IPV6; + } + } + + public static String getTungstenProtocol(String protocol, String cidr) { + switch (protocol) { + case NetUtils.TCP_PROTO: + return NetUtils.TCP_PROTO; + case NetUtils.UDP_PROTO: + return NetUtils.UDP_PROTO; + case NetUtils.ICMP_PROTO: + if (NetUtils.isValidIp4Cidr(cidr)) + return NetUtils.ICMP_PROTO; + else + return NetUtils.ICMP6_PROTO; + default: + return NetUtils.ANY_PROTO; + } + } + + public static String getSecurityGroupName(String name, long accountId) { + return SECURITY_GROUP + name + accountId; + } + + public static String getSingleIpAddressCidr(String ipAddress) { + if (NetUtils.isValidIp4(ipAddress)) { + return ipAddress + "/" + MAX_CIDR; + } + + if (NetUtils.isValidIp6(ipAddress)) { + return ipAddress + "/" + MAX_IPV6_CIDR; + } + + return null; + } + + public static String getNameFromNetwork(String network) { + if (network.startsWith(GUEST_NETWORK_NAME)) { + String[] name = network.split("-"); + return name[0].replaceFirst(GUEST_NETWORK_NAME, ""); + } else { + return network; + } + } +} \ No newline at end of file diff --git a/utils/src/main/java/com/cloud/utils/net/NetUtils.java b/utils/src/main/java/com/cloud/utils/net/NetUtils.java index 41c917558f2..137cebb516a 100644 --- a/utils/src/main/java/com/cloud/utils/net/NetUtils.java +++ b/utils/src/main/java/com/cloud/utils/net/NetUtils.java @@ -77,6 +77,7 @@ public class NetUtils { public final static String TCP_PROTO = "tcp"; public final static String ANY_PROTO = "any"; public final static String ICMP_PROTO = "icmp"; + public static final String ICMP6_PROTO = "icmp6"; public final static String ALL_PROTO = "all"; public final static String HTTP_PROTO = "http"; public final static String SSL_PROTO = "ssl";