From 2f50069e64f49045b57e43ef621b354f1402f85d Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Tue, 7 Jun 2022 12:43:25 +0200 Subject: [PATCH 01/51] initial parameter organisation move ipaddress parrameter and add snat selection option to network offering --- .../com/cloud/offering/NetworkOffering.java | 2 ++ .../admin/network/CreateNetworkCmdByAdmin.java | 16 ---------------- .../command/user/network/CreateNetworkCmd.java | 17 ++++++++++++++++- .../com/cloud/offerings/NetworkOfferingVO.java | 11 +++++++++++ .../api/query/vo/NetworkOfferingJoinVO.java | 12 ++++++++++++ 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/api/src/main/java/com/cloud/offering/NetworkOffering.java b/api/src/main/java/com/cloud/offering/NetworkOffering.java index 207880ea28c0..211cb081c9c5 100644 --- a/api/src/main/java/com/cloud/offering/NetworkOffering.java +++ b/api/src/main/java/com/cloud/offering/NetworkOffering.java @@ -151,4 +151,6 @@ public enum Detail { String getServicePackage(); Date getCreated(); + + boolean isSelectSnatIpAllowed(); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java index 53b02718ea35..4d065e5c2091 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java @@ -16,7 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.admin.network; -import org.apache.cloudstack.api.ApiArgValidator; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -43,14 +42,6 @@ public class CreateNetworkCmdByAdmin extends CreateNetworkCmd implements AdminCm @Parameter(name=ApiConstants.HIDE_IP_ADDRESS_USAGE, type=CommandType.BOOLEAN, description="when true ip address usage for the network will not be exported by the listUsageRecords API") private Boolean hideIpAddressUsage; - @Parameter(name = ApiConstants.ROUTER_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to a router in a shared network", since = "4.16", - validations = {ApiArgValidator.NotNullOrEmpty}) - private String routerIp; - - @Parameter(name = ApiConstants.ROUTER_IPV6, type = CommandType.STRING, description = "IPV6 address to be assigned to a router in a shared network", since = "4.16", - validations = {ApiArgValidator.NotNullOrEmpty}) - private String routerIpv6; - ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -73,11 +64,4 @@ public Boolean getHideIpAddressUsage() { return false; } - public String getRouterIp() { - return routerIp; - } - - public String getRouterIpv6() { - return routerIpv6; - } } 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 8b8ce1040769..5f787cdc2346 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 @@ -16,9 +16,9 @@ // under the License. package org.apache.cloudstack.api.command.user.network; -import com.cloud.network.NetworkService; import org.apache.log4j.Logger; +import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; @@ -43,6 +43,7 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; import com.cloud.network.Network; +import com.cloud.network.NetworkService; import com.cloud.network.Network.GuestType; import com.cloud.offering.NetworkOffering; import com.cloud.utils.net.NetUtils; @@ -162,6 +163,12 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { since = "4.17.0", description = "The network this network is associated to. only available if create a Shared network") private Long associatedNetworkId; + @Parameter(name = ApiConstants.ROUTER_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to a router in a shared network", since = "4.16", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String routerIp; + @Parameter(name = ApiConstants.ROUTER_IPV6, type = CommandType.STRING, description = "IPV6 address to be assigned to a router in a shared network", since = "4.16", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String routerIpv6; @Parameter(name = ApiConstants.PUBLIC_MTU, type = CommandType.INTEGER, description = "MTU to be configured on the network VR's public facing interfaces", since = "4.18.0") @@ -379,6 +386,14 @@ public String getIp6Dns2() { return ip6Dns2; } + public String getRouterIp() { + return routerIp; + } + + public String getRouterIpv6() { + return routerIpv6; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// 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 ae5e6fb95ea9..38fb1c00cea2 100644 --- a/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java +++ b/engine/schema/src/main/java/com/cloud/offerings/NetworkOfferingVO.java @@ -168,6 +168,17 @@ public String getDisplayText() { @Column(name="service_package_id") String servicePackageUuid = null; + @Column(name = "select_snat_address_allowed") + boolean selectSnatIpAllowed = false; + + public boolean isSelectSnatIpAllowed() { + return selectSnatIpAllowed; + } + + public void setSelectSnatIpAllowed(boolean selectSnatIpAllowed) { + this.selectSnatIpAllowed = selectSnatIpAllowed; + } + @Override public boolean isKeepAliveEnabled() { return keepAliveEnabled; 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 2f89b195868c..00dc014dfcb8 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 @@ -184,6 +184,9 @@ public class NetworkOfferingJoinVO extends BaseViewVO implements NetworkOffering @Column(name = "internet_protocol") private String internetProtocol = null; + @Column(name = "select_snat_address_allowed") + boolean selectSnatIpAllowed = false; + public NetworkOfferingJoinVO() { } @@ -347,6 +350,10 @@ public boolean isForTungsten() { return forTungsten; } + public boolean isSelectSnatIpAllowed() { + return selectSnatIpAllowed; + } + public void setForVpc(boolean forVpc) { this.forVpc = forVpc; } public String getServicePackage() { @@ -417,4 +424,9 @@ public String getInternetProtocol() { public boolean isSupportsVmAutoScaling() { return supportsVmAutoScaling; } + + @Override + public void setSelectSnatIpAllowed(boolean selectSnatIpAllowed) { + this.selectSnatIpAllowed = selectSnatIpAllowed; + } } From 10e7b52b11ca69bcc1b8d66d4327aa74e6a0abf1 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Wed, 8 Jun 2022 10:52:01 +0200 Subject: [PATCH 02/51] upgrade-path-fix --- .../main/resources/META-INF/db/schema-41720to41800-cleanup.sql | 2 ++ .../src/main/resources/META-INF/db/schema-41720to41800.sql | 1 + .../src/main/resources/META-INF/db/schema-41810to41900.sql | 2 ++ 3 files changed, 5 insertions(+) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql index 9e200d76fb4c..1a7004b30c6f 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql @@ -18,3 +18,5 @@ --; -- Schema upgrade cleanup from 4.17.2.0 to 4.18.0.0 --; + +ALTER TABLE cloud.network_offerings ADD select_snat_address_allowed tinyint(1) DEFAULT 0 NOT NULL COMMENT 'true if it is allowed to spicify the primary public ip for this network on creation'; 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 b8eee33cad74..9ea05176b6d0 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 @@ -1521,6 +1521,7 @@ INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`) ALTER TABLE `cloud_usage`.`quota_usage` MODIFY COLUMN quota_used decimal(20,8) unsigned NOT NULL; + ALTER TABLE `cloud`.`user` ADD COLUMN `is_user_2fa_enabled` tinyint NOT NULL DEFAULT 0; ALTER TABLE `cloud`.`user` ADD COLUMN `key_for_2fa` varchar(255) default NULL; ALTER TABLE `cloud`.`user` ADD COLUMN `user_2fa_provider` varchar(255) default NULL; diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql b/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql index 5e13b1c0157e..ea154da98f8d 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41810to41900.sql @@ -19,3 +19,5 @@ -- Schema upgrade from 4.18.1.0 to 4.19.0.0 --; +-- select initial ip for VPCs -- +ALTER TABLE cloud.network_offerings ADD select_snat_address_allowed tinyint(1) DEFAULT 0 NOT NULL COMMENT 'true if it is allowed to spicify the primary public ip for this network on creation'; From 055a9ddbed68d1ec23609e1928144ed50b015bb0 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Wed, 8 Jun 2022 15:13:33 +0200 Subject: [PATCH 03/51] add field to view --- .../db/schema-41720to41800-cleanup.sql | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql index 1a7004b30c6f..bbaecfb533fb 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql @@ -20,3 +20,73 @@ --; ALTER TABLE cloud.network_offerings ADD select_snat_address_allowed tinyint(1) DEFAULT 0 NOT NULL COMMENT 'true if it is allowed to spicify the primary public ip for this network on creation'; + +-- cloud.network_offering_view source + +CREATE OR REPLACE +ALGORITHM = UNDEFINED VIEW `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`.`for_vpc` AS `for_vpc`, + `network_offerings`.`service_package_id` AS `service_package_id`, + `network_offerings`.`select_snat_address_allowed` as `select_snat_address_allowed`, + group_concat(distinct `domain`.`id` separator ',') AS `domain_id`, + group_concat(distinct `domain`.`uuid` separator ',') AS `domain_uuid`, + group_concat(distinct `domain`.`name` separator ',') AS `domain_name`, + group_concat(distinct `domain`.`path` separator ',') AS `domain_path`, + group_concat(distinct `zone`.`id` separator ',') AS `zone_id`, + group_concat(distinct `zone`.`uuid` separator ',') AS `zone_uuid`, + group_concat(distinct `zone`.`name` separator ',') AS `zone_name`, + `offering_details`.`value` AS `internet_protocol` +from + (((((`network_offerings` +left join `network_offering_details` `domain_details` on + (((`domain_details`.`network_offering_id` = `network_offerings`.`id`) + and (`domain_details`.`name` = 'domainid')))) +left join `domain` on + ((0 <> find_in_set(`domain`.`id`, `domain_details`.`value`)))) +left join `network_offering_details` `zone_details` on + (((`zone_details`.`network_offering_id` = `network_offerings`.`id`) + and (`zone_details`.`name` = 'zoneid')))) +left join `data_center` `zone` on + ((0 <> find_in_set(`zone`.`id`, `zone_details`.`value`)))) +left join `network_offering_details` `offering_details` on + (((`offering_details`.`network_offering_id` = `network_offerings`.`id`) + and (`offering_details`.`name` = 'internetProtocol')))) +group by + `network_offerings`.`id`; \ No newline at end of file From b7db1fc194c0bbfb6bd3949e430743d5f105b6e7 Mon Sep 17 00:00:00 2001 From: Daan Hoogland Date: Thu, 16 Jun 2022 15:18:23 +0200 Subject: [PATCH 04/51] add router ip parameters to offerings --- .../com/cloud/network/vpc/VpcOffering.java | 2 + .../apache/cloudstack/api/ApiConstants.java | 1 + .../user/network/CreateNetworkCmd.java | 6 ++- .../api/command/user/vpc/CreateVPCCmd.java | 11 ++++- .../api/response/NetworkOfferingResponse.java | 8 +++ .../api/response/VpcOfferingResponse.java | 8 +++ .../com/cloud/network/vpc/VpcOfferingVO.java | 11 +++++ .../db/schema-41720to41800-cleanup.sql | 49 ++++++++++++++++++- .../query/dao/NetworkOfferingJoinDaoImpl.java | 1 + .../api/query/dao/VpcOfferingJoinDaoImpl.java | 1 + .../cloud/api/query/vo/VpcOfferingJoinVO.java | 11 +++++ .../network/CreateIsolatedNetworkForm.vue | 38 ++++++++++++++ ui/src/views/network/CreateVpc.vue | 21 ++++++++ 13 files changed, 164 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/com/cloud/network/vpc/VpcOffering.java b/api/src/main/java/com/cloud/network/vpc/VpcOffering.java index b4df8e38dbac..5df7627c29b6 100644 --- a/api/src/main/java/com/cloud/network/vpc/VpcOffering.java +++ b/api/src/main/java/com/cloud/network/vpc/VpcOffering.java @@ -73,4 +73,6 @@ public enum State { Date getRemoved(); Date getCreated(); + + boolean isSelectSnatIpAllowed(); } 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 6e93d45abdb2..ade7f427be0d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -1017,6 +1017,7 @@ public class ApiConstants { public static final String LOGIN = "login"; public static final String LOGOUT = "logout"; public static final String LIST_IDPS = "listIdps"; + public static final String IS_SELECTION_OF_STATIC_NAT_ALLOWED = "selectsnatipallowed"; public static final String PUBLIC_MTU = "publicmtu"; public static final String PRIVATE_MTU = "privatemtu"; 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 5f787cdc2346..47cf67b3da30 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 @@ -163,10 +163,12 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { since = "4.17.0", description = "The network this network is associated to. only available if create a Shared network") private Long associatedNetworkId; - @Parameter(name = ApiConstants.ROUTER_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to a router in a shared network", since = "4.16", + + @Parameter(name = ApiConstants.ROUTER_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to the router of the network", since = "4.16", validations = {ApiArgValidator.NotNullOrEmpty}) private String routerIp; - @Parameter(name = ApiConstants.ROUTER_IPV6, type = CommandType.STRING, description = "IPV6 address to be assigned to a router in a shared network", since = "4.16", + + @Parameter(name = ApiConstants.ROUTER_IPV6, type = CommandType.STRING, description = "IPV6 address to be assigned to the router of the network", since = "4.16", validations = {ApiArgValidator.NotNullOrEmpty}) private String routerIpv6; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java index 40048a2cd6c6..8f446fbb63f0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateVPCCmd.java @@ -16,11 +16,11 @@ // under the License. package org.apache.cloudstack.api.command.user.vpc; -import com.cloud.network.NetworkService; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; @@ -41,6 +41,7 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; +import com.cloud.network.NetworkService; import com.cloud.network.vpc.Vpc; @APICommand(name = "createVPC", description = "Creates a VPC", responseObject = VpcResponse.class, responseView = ResponseView.Restricted, entityType = {Vpc.class}, @@ -113,6 +114,14 @@ public class CreateVPCCmd extends BaseAsyncCreateCmd implements UserCmd { @Parameter(name = ApiConstants.IP6_DNS2, type = CommandType.STRING, description = "the second IPv6 DNS for the VPC", since = "4.18.0") private String ip6Dns2; + @Parameter(name = ApiConstants.ROUTER_IP, type = CommandType.STRING, description = "IPV4 address to be assigned to the router of the network", since = "4.18", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String routerIp; + + @Parameter(name = ApiConstants.ROUTER_IPV6, type = CommandType.STRING, description = "IPV6 address to be assigned to the router of the network", since = "4.18", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String routerIpv6; + // /////////////////////////////////////////////////// // ///////////////// Accessors /////////////////////// // /////////////////////////////////////////////////// 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 b92725d883e4..bb543b61c3d9 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 @@ -147,6 +147,10 @@ public class NetworkOfferingResponse extends BaseResponseWithAnnotations { @Param(description = "the internet protocol of the network offering") private String internetProtocol; + @SerializedName(ApiConstants.IS_SELECTION_OF_STATIC_NAT_ALLOWED) + @Param(description = "Are users allowed to select a primarey SNAT public address") + boolean selectSnatIpAllowed; + public void setId(String id) { this.id = id; } @@ -282,4 +286,8 @@ public String getInternetProtocol() { public void setInternetProtocol(String internetProtocol) { this.internetProtocol = internetProtocol; } + + public void setSelectSnatIpAllowed(boolean selectSnatIpAllowed) { + this.selectSnatIpAllowed = selectSnatIpAllowed; + } } diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VpcOfferingResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VpcOfferingResponse.java index 6881969646b2..cb8ab3d8e2f9 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/VpcOfferingResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/VpcOfferingResponse.java @@ -86,6 +86,10 @@ public class VpcOfferingResponse extends BaseResponse { @Param(description = "the internet protocol of the vpc offering") private String internetProtocol; + @SerializedName(ApiConstants.IS_SELECTION_OF_STATIC_NAT_ALLOWED) + @Param(description = "Are users allowed to select a primarey SNAT public address") + boolean selectSnatIpAllowed; + public void setId(String id) { this.id = id; } @@ -161,4 +165,8 @@ public String getInternetProtocol() { public void setInternetProtocol(String internetProtocol) { this.internetProtocol = internetProtocol; } + + public void setSelectSnatIpAllowed(boolean selectSnatIpAllowed) { + this.selectSnatIpAllowed = selectSnatIpAllowed; + } } diff --git a/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java b/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java index aa26f16568a9..1914ccb8ea94 100644 --- a/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java +++ b/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java @@ -79,6 +79,9 @@ public class VpcOfferingVO implements VpcOffering { @Column(name = "sort_key") int sortKey; + @Column(name = "select_snat_address_allowed") + boolean selectSnatIpAllowed = false; + public VpcOfferingVO() { this.uuid = UUID.randomUUID().toString(); } @@ -204,4 +207,12 @@ public int getSortKey() { return sortKey; } + public boolean isSelectSnatIpAllowed() { + return selectSnatIpAllowed; + } + + public void setSelectSnatIpAllowed(boolean selectSnatIpAllowed) { + this.selectSnatIpAllowed = selectSnatIpAllowed; + } + } diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql index bbaecfb533fb..6a4f3d5227af 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41720to41800-cleanup.sql @@ -20,6 +20,7 @@ --; ALTER TABLE cloud.network_offerings ADD select_snat_address_allowed tinyint(1) DEFAULT 0 NOT NULL COMMENT 'true if it is allowed to spicify the primary public ip for this network on creation'; +ALTER TABLE cloud.vpc_offerings ADD select_snat_address_allowed tinyint(1) DEFAULT 0 NOT NULL COMMENT 'true if it is allowed to spicify the primary public ip for this vpc on creation'; -- cloud.network_offering_view source @@ -89,4 +90,50 @@ left join `network_offering_details` `offering_details` on (((`offering_details`.`network_offering_id` = `network_offerings`.`id`) and (`offering_details`.`name` = 'internetProtocol')))) group by - `network_offerings`.`id`; \ No newline at end of file + `network_offerings`.`id`; + +-- cloud.vpc_offering_view source + +CREATE OR REPLACE +ALGORITHM = UNDEFINED VIEW `vpc_offering_view` AS +select + `vpc_offerings`.`id` AS `id`, + `vpc_offerings`.`uuid` AS `uuid`, + `vpc_offerings`.`name` AS `name`, + `vpc_offerings`.`unique_name` AS `unique_name`, + `vpc_offerings`.`display_text` AS `display_text`, + `vpc_offerings`.`state` AS `state`, + `vpc_offerings`.`default` AS `default`, + `vpc_offerings`.`created` AS `created`, + `vpc_offerings`.`removed` AS `removed`, + `vpc_offerings`.`service_offering_id` AS `service_offering_id`, + `vpc_offerings`.`supports_distributed_router` AS `supports_distributed_router`, + `vpc_offerings`.`supports_region_level_vpc` AS `supports_region_level_vpc`, + `vpc_offerings`.`redundant_router_service` AS `redundant_router_service`, + `vpc_offerings`.`sort_key` AS `sort_key`, + `vpc_offerings`.`select_snat_address_allowed` as `select_snat_address_allowed`, + group_concat(distinct `domain`.`id` separator ',') AS `domain_id`, + group_concat(distinct `domain`.`uuid` separator ',') AS `domain_uuid`, + group_concat(distinct `domain`.`name` separator ',') AS `domain_name`, + group_concat(distinct `domain`.`path` separator ',') AS `domain_path`, + group_concat(distinct `zone`.`id` separator ',') AS `zone_id`, + group_concat(distinct `zone`.`uuid` separator ',') AS `zone_uuid`, + group_concat(distinct `zone`.`name` separator ',') AS `zone_name`, + `offering_details`.`value` AS `internet_protocol` +from + (((((`vpc_offerings` +left join `vpc_offering_details` `domain_details` on + (((`domain_details`.`offering_id` = `vpc_offerings`.`id`) + and (`domain_details`.`name` = 'domainid')))) +left join `domain` on + ((0 <> find_in_set(`domain`.`id`, `domain_details`.`value`)))) +left join `vpc_offering_details` `zone_details` on + (((`zone_details`.`offering_id` = `vpc_offerings`.`id`) + and (`zone_details`.`name` = 'zoneid')))) +left join `data_center` `zone` on + ((0 <> find_in_set(`zone`.`id`, `zone_details`.`value`)))) +left join `vpc_offering_details` `offering_details` on + (((`offering_details`.`offering_id` = `vpc_offerings`.`id`) + and (`offering_details`.`name` = 'internetprotocol')))) +group by + `vpc_offerings`.`id`; diff --git a/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java index 474409a976c3..89529d4bb6e1 100644 --- a/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java @@ -107,6 +107,7 @@ public NetworkOfferingResponse newNetworkOfferingResponse(NetworkOffering offeri } networkOfferingResponse.setInternetProtocol(protocol); } + networkOfferingResponse.setSelectSnatIpAllowed(offering.isSelectSnatIpAllowed()); networkOfferingResponse.setObjectName("networkoffering"); return networkOfferingResponse; diff --git a/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java index af0940609ba8..7af84d9d7150 100644 --- a/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java @@ -66,6 +66,7 @@ public VpcOfferingResponse newVpcOfferingResponse(VpcOffering offering) { offeringResponse.setSupportsDistributedRouter(offering.isSupportsDistributedRouter()); offeringResponse.setSupportsRegionLevelVpc(offering.isOffersRegionLevelVPC()); offeringResponse.setCreated(offering.getCreated()); + offeringResponse.setSelectSnatIpAllowed(offering.isSelectSnatIpAllowed()); if (offering instanceof VpcOfferingJoinVO) { VpcOfferingJoinVO offeringJoinVO = (VpcOfferingJoinVO) offering; offeringResponse.setDomainId(offeringJoinVO.getDomainUuid()); diff --git a/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java index 7eaaa0220df6..a91954c56b3b 100644 --- a/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java @@ -101,6 +101,9 @@ public class VpcOfferingJoinVO implements VpcOffering { @Column(name = "internet_protocol") private String internetProtocol = null; + @Column(name = "select_snat_address_allowed") + boolean selectSnatIpAllowed = false; + public VpcOfferingJoinVO() { } @@ -204,6 +207,14 @@ public String getInternetProtocol() { return internetProtocol; } + public boolean isSelectSnatIpAllowed() { + return selectSnatIpAllowed; + } + + public void setSelectSnatIpAllowed(boolean selectSnatIpAllowed) { + this.selectSnatIpAllowed = selectSnatIpAllowed; + } + @Override public String toString() { StringBuilder buf = new StringBuilder("[VPC Offering ["); diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue index 33502d679636..3d9a635f0583 100644 --- a/ui/src/views/network/CreateIsolatedNetworkForm.vue +++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue @@ -291,6 +291,44 @@ + + + + + + + + + + + + + + + +
+ + + + + + + + +