Fixed an issue where the cloud deployment wizard creates the cluster with the
High Availability even if that option is not selected. Fixes #7608
@ -36,7 +36,8 @@ details.
|
|||||||
|
|
||||||
* Use the *Region* field to select the region.
|
* Use the *Region* field to select the region.
|
||||||
|
|
||||||
* Use the *Database version* field to specify the PostgreSQL version to deploy.
|
* Use the *Public IP range* field to specify the IP Address range for permitting the
|
||||||
|
inbound traffic. Leave it blank for 0.0.0.0/0
|
||||||
|
|
||||||
* Use the *Instance type* field to select the instance type.
|
* Use the *Instance type* field to select the instance type.
|
||||||
|
|
||||||
@ -49,10 +50,7 @@ details.
|
|||||||
|
|
||||||
* Use the *Volume properties* field to specify the storage capacity.
|
* Use the *Volume properties* field to specify the storage capacity.
|
||||||
|
|
||||||
* Use the *Cloud type* field to specify the private or public network.
|
|
||||||
|
|
||||||
* Use the *Public IP range* field to specify the IP Address range for permitting the
|
|
||||||
inbound traffic. Leave it blank for 0.0.0.0/0
|
|
||||||
|
|
||||||
.. image:: images/cloud_biganimal_database.png
|
.. image:: images/cloud_biganimal_database.png
|
||||||
:alt: Cloud Deployment Provider
|
:alt: Cloud Deployment Provider
|
||||||
@ -74,6 +72,12 @@ Use the fields from the Database Details tab to specify the Instance details.
|
|||||||
|
|
||||||
* Use the *Confirm password* field to repeat the password.
|
* Use the *Confirm password* field to repeat the password.
|
||||||
|
|
||||||
|
* Use the *High Availability* field to create the cluster with high availability, which creates a cluster
|
||||||
|
with one primary and up to two standby replicas in different availability zones.
|
||||||
|
|
||||||
|
* Use the *Number of standby replicas* field to specify the standby replicas.
|
||||||
|
|
||||||
|
|
||||||
.. image:: images/cloud_biganimal_review.png
|
.. image:: images/cloud_biganimal_review.png
|
||||||
:alt: Cloud Deployment Provider
|
:alt: Cloud Deployment Provider
|
||||||
:align: center
|
:align: center
|
||||||
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 123 KiB |
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 101 KiB |
@ -33,3 +33,4 @@ Bug fixes
|
|||||||
| `Issue #7573 <https://redmine.postgresql.org/issues/7573>`_ - Ensure that autocomplete does not appear when navigating code using arrow keys.
|
| `Issue #7573 <https://redmine.postgresql.org/issues/7573>`_ - Ensure that autocomplete does not appear when navigating code using arrow keys.
|
||||||
| `Issue #7586 <https://redmine.postgresql.org/issues/7586>`_ - Fixed an issue with rendering geometry when selecting a complete column.
|
| `Issue #7586 <https://redmine.postgresql.org/issues/7586>`_ - Fixed an issue with rendering geometry when selecting a complete column.
|
||||||
| `Issue #7587 <https://redmine.postgresql.org/issues/7587>`_ - Ensure that the children of information_schema and pg_catalog node should be displayed.
|
| `Issue #7587 <https://redmine.postgresql.org/issues/7587>`_ - Ensure that the children of information_schema and pg_catalog node should be displayed.
|
||||||
|
| `Issue #7608 <https://redmine.postgresql.org/issues/7608>`_ - Fixed an issue where the cloud deployment wizard creates the cluster with the High Availability even if that option is not selected.
|
||||||
|
@ -70,17 +70,18 @@ class BigAnimalProvider(AbsProvider):
|
|||||||
parser_create_instance.add_argument('--public-ip', default='',
|
parser_create_instance.add_argument('--public-ip', default='',
|
||||||
help='Public IP '
|
help='Public IP '
|
||||||
'(default: 127.0.0.1)')
|
'(default: 127.0.0.1)')
|
||||||
parser_create_instance.add_argument('--high-availability',
|
parser_create_instance.add_argument('--cluster-arch',
|
||||||
required=True,
|
required=True,
|
||||||
help='High Availability')
|
help='Cluster Architecture')
|
||||||
|
parser_create_instance.add_argument('--nodes',
|
||||||
|
required=True,
|
||||||
|
help='No of Nodes')
|
||||||
|
|
||||||
def cmd_create_instance(self, args):
|
def cmd_create_instance(self, args):
|
||||||
""" Create a biganimal cluster """
|
""" Create a biganimal cluster """
|
||||||
|
|
||||||
try:
|
try:
|
||||||
private_network = True if args.private_network == '1' else False
|
private_network = True if args.private_network == '1' else False
|
||||||
high_availability = True if args.high_availability == '1' else\
|
|
||||||
False
|
|
||||||
ip = args.public_ip if args.public_ip else '0.0.0.0/0'
|
ip = args.public_ip if args.public_ip else '0.0.0.0/0'
|
||||||
IpRanges = []
|
IpRanges = []
|
||||||
|
|
||||||
@ -107,7 +108,8 @@ class BigAnimalProvider(AbsProvider):
|
|||||||
'replicas': 3,
|
'replicas': 3,
|
||||||
'volumePropertiesId': args.volume_properties,
|
'volumePropertiesId': args.volume_properties,
|
||||||
'volumeTypeId': args.volume_type,
|
'volumeTypeId': args.volume_type,
|
||||||
'zoneRedundantHa': high_availability,
|
'clusterArch': {'id': args.cluster_arch, 'nodes': int(
|
||||||
|
args.nodes)},
|
||||||
'pgConfigMap': [],
|
'pgConfigMap': [],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,10 @@ from pgadmin.utils.constants import MIMETYPE_APP_JSON
|
|||||||
|
|
||||||
MODULE_NAME = 'biganimal'
|
MODULE_NAME = 'biganimal'
|
||||||
|
|
||||||
|
SINGLE_CLUSTER_ARCH = 'single'
|
||||||
|
HA_CLUSTER_ARCH = 'ha' # High Availability
|
||||||
|
EHA_CLUSTER_ARCH = 'eha' # Extreme High Availability
|
||||||
|
|
||||||
|
|
||||||
class BigAnimalModule(PgAdminModule):
|
class BigAnimalModule(PgAdminModule):
|
||||||
"""Cloud module to deploy on EDB BigAnimal"""
|
"""Cloud module to deploy on EDB BigAnimal"""
|
||||||
@ -285,6 +289,8 @@ class BigAnimalProvider():
|
|||||||
if resp.status_code == 200 and resp.content:
|
if resp.status_code == 200 and resp.content:
|
||||||
pg_types_resp = json.loads(resp.content)
|
pg_types_resp = json.loads(resp.content)
|
||||||
for value in pg_types_resp['pgTypesList']:
|
for value in pg_types_resp['pgTypesList']:
|
||||||
|
# Extreme HA is in Beta, so avoid it
|
||||||
|
if len(value['supportedClusterArchitectureIds']) != 1:
|
||||||
pg_types.append({
|
pg_types.append({
|
||||||
'label': value['name'],
|
'label': value['name'],
|
||||||
'value': value['id']
|
'value': value['id']
|
||||||
@ -366,10 +372,15 @@ def deploy_on_biganimal(data):
|
|||||||
_label = data['instance_details']['name']
|
_label = data['instance_details']['name']
|
||||||
_private_network = '1' if str(data['instance_details']['cloud_type']
|
_private_network = '1' if str(data['instance_details']['cloud_type']
|
||||||
) == 'private' else '0'
|
) == 'private' else '0'
|
||||||
_high_availability = '1' if data['db_details']['high_availability']\
|
|
||||||
else '0'
|
|
||||||
_instance_size = data['instance_details']['instance_size'].split('||')[1]
|
_instance_size = data['instance_details']['instance_size'].split('||')[1]
|
||||||
|
|
||||||
|
cluster_arch = SINGLE_CLUSTER_ARCH
|
||||||
|
nodes = 1
|
||||||
|
|
||||||
|
if data['db_details']['high_availability']:
|
||||||
|
cluster_arch = HA_CLUSTER_ARCH
|
||||||
|
nodes = int(data['db_details']['replicas']) + nodes
|
||||||
|
|
||||||
args = [_cmd_script,
|
args = [_cmd_script,
|
||||||
data['cloud'],
|
data['cloud'],
|
||||||
'create-instance',
|
'create-instance',
|
||||||
@ -389,8 +400,10 @@ def deploy_on_biganimal(data):
|
|||||||
str(_instance_size),
|
str(_instance_size),
|
||||||
'--private-network',
|
'--private-network',
|
||||||
_private_network,
|
_private_network,
|
||||||
'--high-availability',
|
'--cluster-arch',
|
||||||
_high_availability
|
cluster_arch,
|
||||||
|
'--nodes',
|
||||||
|
str(nodes)
|
||||||
]
|
]
|
||||||
|
|
||||||
if 'biganimal_public_ip' in data['instance_details']:
|
if 'biganimal_public_ip' in data['instance_details']:
|
||||||
|
@ -188,6 +188,7 @@ export function getBigAnimalSummary(cloud, bigAnimalInstanceData, bigAnimalDatab
|
|||||||
createData('Database Type', bigAnimalDatabaseData.database_type),
|
createData('Database Type', bigAnimalDatabaseData.database_type),
|
||||||
createData('Database Version', bigAnimalDatabaseData.postgres_version),
|
createData('Database Version', bigAnimalDatabaseData.postgres_version),
|
||||||
createData('High Availability', bigAnimalDatabaseData.high_availability),
|
createData('High Availability', bigAnimalDatabaseData.high_availability),
|
||||||
|
createData('No of Standby Replicas', bigAnimalDatabaseData.replicas),
|
||||||
];
|
];
|
||||||
|
|
||||||
return [rows1, rows2, rows3, rows4];
|
return [rows1, rows2, rows3, rows4];
|
||||||
@ -211,6 +212,10 @@ export function validateBigAnimalStep3(cloudDBDetails, nodeInfo) {
|
|||||||
isEmptyString(cloudDBDetails.database_type) || isEmptyString(cloudDBDetails.postgres_version)) {
|
isEmptyString(cloudDBDetails.database_type) || isEmptyString(cloudDBDetails.postgres_version)) {
|
||||||
isError = true;
|
isError = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(cloudDBDetails.high_availability == true && (isEmptyString(cloudDBDetails.replicas) || cloudDBDetails.replicas <= 0)) {
|
||||||
|
isError = true;
|
||||||
|
}
|
||||||
if (isEmptyString(cloudDBDetails.gid)) cloudDBDetails.gid = nodeInfo['server_group']._id;
|
if (isEmptyString(cloudDBDetails.gid)) cloudDBDetails.gid = nodeInfo['server_group']._id;
|
||||||
return isError;
|
return isError;
|
||||||
}
|
}
|
||||||
|
@ -467,6 +467,7 @@ class BigAnimalDatabaseSchema extends BaseUISchema {
|
|||||||
database_type: '',
|
database_type: '',
|
||||||
postgres_version: '',
|
postgres_version: '',
|
||||||
high_availability: false,
|
high_availability: false,
|
||||||
|
replicas: 0,
|
||||||
...initValues
|
...initValues
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -487,7 +488,10 @@ class BigAnimalDatabaseSchema extends BaseUISchema {
|
|||||||
setErrMsg('confirm_password', gettext('Password must be 12 characters or more.'));
|
setErrMsg('confirm_password', gettext('Password must be 12 characters or more.'));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (data.high_availability == true && (isEmptyString(data.replicas) || data.replicas <= 0)) {
|
||||||
|
setErrMsg('replicas', gettext('Please select no. of stand by replicas.'));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -592,6 +596,7 @@ class BigAnimalHighAvailSchema extends BaseUISchema {
|
|||||||
super({
|
super({
|
||||||
oid: undefined,
|
oid: undefined,
|
||||||
high_availability: false,
|
high_availability: false,
|
||||||
|
replicas: 0,
|
||||||
...initValues
|
...initValues
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -610,13 +615,25 @@ class BigAnimalHighAvailSchema extends BaseUISchema {
|
|||||||
{
|
{
|
||||||
id: 'high_availability_note', type: 'note',
|
id: 'high_availability_note', type: 'note',
|
||||||
mode: ['create'],
|
mode: ['create'],
|
||||||
text: gettext('High availability clusters are configured with one primary and two '
|
text: gettext('High availability clusters are configured with one primary and up to two '
|
||||||
+ 'replicas with synchronous streaming replication. Clusters are configured across availability zones in regions with availability zones.'),
|
+ 'stand by replicas. Clusters are configured across availability zones in regions with availability zones.'),
|
||||||
},{
|
},{
|
||||||
id: 'high_availability', label: gettext('High Availability'), type: 'switch',
|
id: 'high_availability', label: gettext('High availability'), type: 'switch',
|
||||||
mode: ['create'],
|
mode: ['create']
|
||||||
helpMessage: gettext('Turning on high availability means your number of CPUs will triple, as will your cost.'),
|
},{
|
||||||
|
id: 'replicas', label: gettext('Number of standby replicas'), type: 'select',
|
||||||
|
mode: ['create'], deps: ['high_availability'],
|
||||||
|
controlProps: { allowClear: false },
|
||||||
|
helpMessage: gettext('Adding standby replicas will increase your number of CPUs, as well as your cost.'),
|
||||||
|
options: [
|
||||||
|
{'label': gettext('1'), 'value': 1},
|
||||||
|
{'label': gettext('2'), 'value': 2},
|
||||||
|
], noEmpty: true,
|
||||||
|
disabled: (state) => {
|
||||||
|
if (state.high_availability == true) return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|