Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions linter_exclusions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3402,3 +3402,43 @@ eventgrid namespace topic update:
event_retention_in_days:
rule_exclusions:
- option_length_too_long

neon postgres endpoint create:
rule_exclusions:
- missing_command_example

neon postgres neon-role create:
rule_exclusions:
- missing_command_example

neon postgres neon-database create:
rule_exclusions:
- missing_command_example

neon postgres get-postgres-version:
rule_exclusions:
- missing_command_example

neon postgres branch:
rule_exclusions:
- require_wait_command_if_no_wait

neon postgres endpoint:
rule_exclusions:
- require_wait_command_if_no_wait

neon postgres neon-database:
rule_exclusions:
- require_wait_command_if_no_wait

neon postgres neon-role:
rule_exclusions:
- require_wait_command_if_no_wait

neon postgres organization:
rule_exclusions:
- require_wait_command_if_no_wait

neon postgres project:
rule_exclusions:
- require_wait_command_if_no_wait
8 changes: 8 additions & 0 deletions src/neon/HISTORY.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
Release History
===============

1.0.1b1
++++++
* Preview commands for the new entities
* Remove unnecessary wait commands to reduce complexity
* Add linter exclusions for missing_command_example and require_wait_command_if_no_wait rules
* Comprehensive testing with real Azure resources validation
* Successfully tested endpoint, role, and database creation with live Azure subscription

1.0.0
++++++
* GA release.
Expand Down
49 changes: 49 additions & 0 deletions src/neon/azext_neon/_help.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,52 @@
# pylint: disable=too-many-lines

from knack.help_files import helps # pylint: disable=unused-import


helps['neon postgres endpoint create'] = """
type: command
short-summary: Create a new Neon PostgreSQL endpoint
examples:
- name: Create a read-only endpoint
text: |
az neon postgres endpoint create --resource-group myResourceGroup --organization-name myOrg --project-name myProject --branch-name main --endpoint-name myEndpoint --endpoint-type read_only
- name: Create a read-write endpoint with custom compute settings
text: |
az neon postgres endpoint create --resource-group myResourceGroup --organization-name myOrg --project-name myProject --branch-name main --endpoint-name myEndpoint --endpoint-type read_write --compute-name custom-compute --size '{"autoscaling-limit-min-cu": 0.25, "autoscaling-limit-max-cu": 4}'
"""

helps['neon postgres get-postgres-version'] = """
type: command
short-summary: Get available PostgreSQL versions for Neon
examples:
- name: List all available PostgreSQL versions
text: |
az neon postgres get-postgres-version --resource-group myResourceGroup
- name: Get information for a specific PostgreSQL version
text: |
az neon postgres get-postgres-version --resource-group myResourceGroup --version 15
"""

helps['neon postgres neon-role create'] = """
type: command
short-summary: Create a new database role in a Neon PostgreSQL branch
examples:
- name: Create a new database role
text: |
az neon postgres neon-role create --resource-group myResourceGroup --organization-name myOrg --project-name myProject --branch-name main --neon-role-name myRole
- name: Create a role with specific attributes
text: |
az neon postgres neon-role create --resource-group myResourceGroup --organization-name myOrg --project-name myProject --branch-name main --neon-role-name myRole --attributes '[{"name":"roleType","value":"admin"}]'
"""

helps['neon postgres neon-database create'] = """
type: command
short-summary: Create a new database in a Neon PostgreSQL branch
examples:
- name: Create a new database with a specific owner
text: |
az neon postgres neon-database create --resource-group myResourceGroup --organization-name myOrg --project-name myProject --branch-name main --neon-database-name myDatabase --owner-name myRole
- name: Create a database with custom attributes
text: |
az neon postgres neon-database create --resource-group myResourceGroup --organization-name myOrg --project-name myProject --branch-name main --neon-database-name myDatabase --owner-name myRole --attributes '[{"name":"encoding","value":"UTF8"}]'
"""
1 change: 1 addition & 0 deletions src/neon/azext_neon/aaz/latest/neon/postgres/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@

from .__cmd_group import *
from ._create import *
from ._get_postgres_version import *
183 changes: 183 additions & 0 deletions src/neon/azext_neon/aaz/latest/neon/postgres/_get_postgres_version.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
# --------------------------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
#
# Code generated by aaz-dev-tools
# --------------------------------------------------------------------------------------------

# pylint: skip-file
# flake8: noqa

from azure.cli.core.aaz import *


@register_command(
"neon postgres get-postgres-version",
)
class GetPostgresVersion(AAZCommand):
"""Action to retrieve the PostgreSQL versions.
"""

_aaz_info = {
"version": "2025-06-23-preview",
"resources": [
["mgmt-plane", "/subscriptions/{}/resourcegroups/{}/providers/neon.postgres/getpostgresversions", "2025-06-23-preview"],
]
}

def _handler(self, command_args):
super()._handler(command_args)
self._execute_operations()
return self._output()

_args_schema = None

@classmethod
def _build_arguments_schema(cls, *args, **kwargs):
if cls._args_schema is not None:
return cls._args_schema
cls._args_schema = super()._build_arguments_schema(*args, **kwargs)

# define Arg Group ""

_args_schema = cls._args_schema
_args_schema.resource_group = AAZResourceGroupNameArg(
required=True,
)

# define Arg Group "Parameters"

_args_schema = cls._args_schema
_args_schema.version = AAZIntArg(
options=["--version"],
arg_group="Parameters",
help="The major PostgreSQL version number",
)
return cls._args_schema

def _execute_operations(self):
self.pre_operations()
self.OrganizationsGetPostgresVersions(ctx=self.ctx)()
self.post_operations()

@register_callback
def pre_operations(self):
pass

@register_callback
def post_operations(self):
pass

def _output(self, *args, **kwargs):
result = self.deserialize_output(self.ctx.vars.instance, client_flatten=True)
return result

class OrganizationsGetPostgresVersions(AAZHttpOperation):
CLIENT_TYPE = "MgmtClient"

def __call__(self, *args, **kwargs):
request = self.make_request()
session = self.client.send_request(request=request, stream=False, **kwargs)
if session.http_response.status_code in [200]:
return self.on_200(session)

return self.on_error(session.http_response)

@property
def url(self):
return self.client.format_url(
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Neon.Postgres/getPostgresVersions",
**self.url_parameters
)

@property
def method(self):
return "POST"

@property
def error_format(self):
return "MgmtErrorFormat"

@property
def url_parameters(self):
parameters = {
**self.serialize_url_param(
"resourceGroupName", self.ctx.args.resource_group,
required=True,
),
**self.serialize_url_param(
"subscriptionId", self.ctx.subscription_id,
required=True,
),
}
return parameters

@property
def query_parameters(self):
parameters = {
**self.serialize_query_param(
"api-version", "2025-06-23-preview",
required=True,
),
}
return parameters

@property
def header_parameters(self):
parameters = {
**self.serialize_header_param(
"Content-Type", "application/json",
),
**self.serialize_header_param(
"Accept", "application/json",
),
}
return parameters

@property
def content(self):
_content_value, _builder = self.new_content_builder(
self.ctx.args,
typ=AAZObjectType,
typ_kwargs={"flags": {"client_flatten": True}}
)
_builder.set_prop("version", AAZIntType, ".version")

return self.serialize_content(_content_value)

def on_200(self, session):
data = self.deserialize_http_content(session)
self.ctx.set_var(
"instance",
data,
schema_builder=self._build_schema_on_200
)

_schema_on_200 = None

@classmethod
def _build_schema_on_200(cls):
if cls._schema_on_200 is not None:
return cls._schema_on_200

cls._schema_on_200 = AAZObjectType()

_schema_on_200 = cls._schema_on_200
_schema_on_200.versions = AAZListType(
flags={"required": True},
)

versions = cls._schema_on_200.versions
versions.Element = AAZObjectType()

_element = cls._schema_on_200.versions.Element
_element.version = AAZIntType()

return cls._schema_on_200


class _GetPostgresVersionHelper:
"""Helper class for GetPostgresVersion"""


__all__ = ["GetPostgresVersion"]
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,3 @@
from ._list import *
from ._show import *
from ._update import *
from ._wait import *
Loading
Loading