py-pve-cloud 0.13.5__tar.gz → 0.13.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {py_pve_cloud-0.13.5/src/py_pve_cloud.egg-info → py_pve_cloud-0.13.22}/PKG-INFO +1 -1
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/README.md +1 -1
- py_pve_cloud-0.13.22/src/pve_cloud/_version.py +1 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/cli/pvcli.py +2 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/cli/pvclu.py +7 -22
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/lib/inventory.py +4 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/alchemy.py +7 -19
- py_pve_cloud-0.13.22/src/pve_cloud/orm/migrations/versions/0ad803c51325_machine_type_refactor.py +65 -0
- py_pve_cloud-0.13.22/src/pve_cloud/orm/migrations/versions/e60b9cc63413_ingress_generic.py +33 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22/src/py_pve_cloud.egg-info}/PKG-INFO +1 -1
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/SOURCES.txt +2 -0
- py_pve_cloud-0.13.5/src/pve_cloud/_version.py +0 -1
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/LICENSE.md +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/pyproject.toml +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/setup.cfg +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/lib/validate.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/alembic.ini +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/env.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/04398db10434_external_cp_extra_sans.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/24a548bfce3e_len_rules_enforcements.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/27724e407e2b_proxy_fqdn.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/3c95509a5de9_fix.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/7868bcd05006_migrate_old.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/7dea8c4ee39f_init.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/944a8fd5d5bc_ext_ctrl_plns.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/d9b711555be8_ext_control_plane.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/fdcb5aa33b76_slop_firewall_seperation.py +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/dependency_links.txt +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/entry_points.txt +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/requires.txt +0 -0
- {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/top_level.txt +0 -0
|
@@ -18,4 +18,4 @@ PROXY_IP=$(ssh root@$PVE_HOST_IP cat /etc/pve/cloud/cluster_vars.yaml | yq '.pve
|
|
|
18
18
|
export PG_CONN_STR=postgresql+psycopg2://postgres:$PATRONI_PASS@$PROXY_IP:5000/pve_cloud?sslmode=disable
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
To create a new migration the database needs to be on the latest version, run `alembic upgrade head` to upgrade it.
|
|
21
|
+
To create a new migration the database needs to be on the latest version, run `alembic upgrade head` to upgrade it.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.13.22"
|
|
@@ -83,11 +83,13 @@ def connect_cluster(args):
|
|
|
83
83
|
if node_ip_address is None:
|
|
84
84
|
raise Exception(f"Could not find ip for node {node_name}")
|
|
85
85
|
|
|
86
|
+
print(f"adding {node_name}")
|
|
86
87
|
dynamic_inventory[pve_cloud_domain][cluster_name][node_name] = {
|
|
87
88
|
"ansible_user": "root",
|
|
88
89
|
"ansible_host": node_ip_address
|
|
89
90
|
}
|
|
90
91
|
|
|
92
|
+
print(f"writing dyn inv to {inv_path}")
|
|
91
93
|
with open(inv_path, "w") as file:
|
|
92
94
|
yaml.dump(dynamic_inventory, file)
|
|
93
95
|
|
|
@@ -74,14 +74,14 @@ def get_ssh_master_kubeconfig(cluster_vars, stack_name):
|
|
|
74
74
|
admin_conf["clusters"][0]["name"] = stack_name
|
|
75
75
|
|
|
76
76
|
admin_conf["contexts"][0]["context"]["cluster"] = stack_name
|
|
77
|
-
admin_conf["contexts"][0]["name"] =
|
|
77
|
+
admin_conf["contexts"][0]["name"] = stack_name
|
|
78
78
|
|
|
79
|
-
admin_conf["current-context"] =
|
|
79
|
+
admin_conf["current-context"] = stack_name
|
|
80
80
|
|
|
81
81
|
return yaml.safe_dump(admin_conf)
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
def
|
|
84
|
+
def export_pg_conn_str(args):
|
|
85
85
|
cloud_domain = get_cloud_domain(args.target_pve, suppress_warnings=True)
|
|
86
86
|
pve_inventory = get_pve_inventory(cloud_domain, suppress_warnings=True)
|
|
87
87
|
|
|
@@ -95,24 +95,10 @@ def export_envr(args):
|
|
|
95
95
|
raise RuntimeError(f"Could not find online host for {args.target_pve}!")
|
|
96
96
|
|
|
97
97
|
cluster_vars, patroni_pass, bind_internal_key = get_cloud_env(ansible_host)
|
|
98
|
-
print(f"export PVE_ANSIBLE_HOST='{ansible_host}'")
|
|
99
|
-
print(f"export PVE_CLOUD_DOMAIN='{cloud_domain}'")
|
|
100
98
|
|
|
101
|
-
# tf vars
|
|
102
99
|
print(f"export PG_CONN_STR=\"postgres://postgres:{patroni_pass}@{cluster_vars['pve_haproxy_floating_ip_internal']}:5000/tf_states?sslmode=disable\"")
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
print(f"export TF_VAR_cluster_proxy_ip='{cluster_vars['pve_haproxy_floating_ip_internal']}'")
|
|
106
|
-
print(f"export TF_VAR_pve_cloud_pg_cstr=\"postgresql+psycopg2://postgres:{patroni_pass}@{cluster_vars['pve_haproxy_floating_ip_internal']}:5000/pve_cloud?sslmode=disable\"")
|
|
107
|
-
print(f"export TF_VAR_master_b64_kubeconf='{base64.b64encode(get_ssh_master_kubeconfig(cluster_vars, args.stack_name).encode('utf-8')).decode('utf-8')}'")
|
|
108
|
-
print(f"export TF_VAR_bind_master_ip='{cluster_vars['bind_master_ip']}'")
|
|
109
|
-
print(f"export TF_VAR_bind_internal_key='{bind_internal_key}'")
|
|
110
|
-
|
|
111
|
-
# pve inventory gets converted as b64 yaml string
|
|
112
|
-
pve_64 = yaml.safe_dump(pve_inventory)
|
|
113
|
-
print(f"export TF_VAR_pve_inventory_b64='{base64.b64encode(pve_64.encode('utf-8')).decode('utf-8')}'")
|
|
114
|
-
|
|
115
|
-
|
|
100
|
+
|
|
101
|
+
|
|
116
102
|
def main():
|
|
117
103
|
parser = argparse.ArgumentParser(description="PVE Cloud utility cli. Should be called with bash eval.")
|
|
118
104
|
|
|
@@ -120,10 +106,9 @@ def main():
|
|
|
120
106
|
|
|
121
107
|
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
122
108
|
|
|
123
|
-
export_envr_parser = subparsers.add_parser("export-
|
|
109
|
+
export_envr_parser = subparsers.add_parser("export-psql", help="Export variables for k8s .envrc", parents=[base_parser])
|
|
124
110
|
export_envr_parser.add_argument("--target-pve", type=str, help="The target pve cluster.", required=True)
|
|
125
|
-
export_envr_parser.
|
|
126
|
-
export_envr_parser.set_defaults(func=export_envr)
|
|
111
|
+
export_envr_parser.set_defaults(func=export_pg_conn_str)
|
|
127
112
|
|
|
128
113
|
get_online_pve_host_parser = subparsers.add_parser("get-online-host", help="Gets the ip for the first online proxmox host in the cluster.", parents=[base_parser])
|
|
129
114
|
get_online_pve_host_parser.add_argument("--target-pve", type=str, help="The target pve cluster to get the first online ip of.", required=True)
|
|
@@ -100,6 +100,10 @@ def get_online_pve_host(target_pve, suppress_warnings = False, skip_py_cloud_che
|
|
|
100
100
|
pve_host_ip = pve_inventory[pve_cloud][pve_cluster][pve_host]["ansible_host"]
|
|
101
101
|
try:
|
|
102
102
|
with socket.create_connection((pve_host_ip, 22), timeout=3):
|
|
103
|
+
|
|
104
|
+
if not skip_py_cloud_check:
|
|
105
|
+
raise_on_py_cloud_missmatch(pve_host_ip) # validate that versions of dev machine and running on cluster match
|
|
106
|
+
|
|
103
107
|
return pve_host_ip
|
|
104
108
|
except Exception as e:
|
|
105
109
|
# debug
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from sqlalchemy import Column, Integer, String, Boolean, SmallInteger, Text
|
|
2
|
-
from sqlalchemy.dialects.postgresql import MACADDR, INET, JSONB, insert
|
|
2
|
+
from sqlalchemy.dialects.postgresql import MACADDR, INET, JSONB, insert, ENUM
|
|
3
3
|
from sqlalchemy import create_engine, MetaData, Table, select, delete, update
|
|
4
4
|
from sqlalchemy.orm import declarative_base
|
|
5
5
|
from alembic.config import Config
|
|
@@ -33,6 +33,7 @@ class KeaReservations(Base):
|
|
|
33
33
|
hostname = Column(String(253), nullable=False)
|
|
34
34
|
client_classes = Column(String(1000)) # csv seperated client classes
|
|
35
35
|
stack_fqdn = Column(String(253), nullable=False)
|
|
36
|
+
machine_type = Column(String(50), nullable=False)
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
class KeaClientClassDefs(Base):
|
|
@@ -43,24 +44,7 @@ class KeaClientClassDefs(Base):
|
|
|
43
44
|
class_content = Column(JSONB, nullable=False)
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
__tablename__ = "k8s_workers"
|
|
48
|
-
|
|
49
|
-
ip = Column(INET, primary_key=True)
|
|
50
|
-
hostname = Column(String(253), nullable=False)
|
|
51
|
-
stack_fqdn = Column(String(253), nullable=False)
|
|
52
|
-
proxy_stack_fqdn = Column(String(253), nullable=False)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class K8SMasters(Base):
|
|
56
|
-
__tablename__ = "k8s_masters"
|
|
57
|
-
|
|
58
|
-
ip = Column(INET, primary_key=True)
|
|
59
|
-
hostname = Column(String(253), nullable=False)
|
|
60
|
-
stack_fqdn = Column(String(253), nullable=False)
|
|
61
|
-
proxy_stack_fqdn = Column(String(253), nullable=False)
|
|
62
|
-
|
|
63
|
-
|
|
47
|
+
# todo: rename just ingress rules
|
|
64
48
|
class K8SIngressRules(Base):
|
|
65
49
|
__tablename__ = "k8s_ingress_rules"
|
|
66
50
|
|
|
@@ -70,8 +54,10 @@ class K8SIngressRules(Base):
|
|
|
70
54
|
proxy_stack_fqdn = Column(String(253), nullable=False)
|
|
71
55
|
external = Column(Boolean, default=False)
|
|
72
56
|
rule_len = Column(Integer, nullable=False)
|
|
57
|
+
is_k8s = Column(Boolean, nullable=False)
|
|
73
58
|
|
|
74
59
|
|
|
60
|
+
# todo: rename to just tcp proxies
|
|
75
61
|
class K8STcpProxies(Base):
|
|
76
62
|
__tablename__ = "k8s_tcp_proxies"
|
|
77
63
|
|
|
@@ -79,6 +65,8 @@ class K8STcpProxies(Base):
|
|
|
79
65
|
haproxy_port = Column(SmallInteger, primary_key=True)
|
|
80
66
|
node_port = Column(SmallInteger, nullable=False)
|
|
81
67
|
stack_fqdn = Column(String(253), nullable=False)
|
|
68
|
+
# determines backend routing in haproxy, if false will go
|
|
69
|
+
is_k8s = Column(Boolean, nullable=False)
|
|
82
70
|
proxy_snippet = Column(Text)
|
|
83
71
|
proxy_stack_fqdn = Column(String(253), primary_key=True)
|
|
84
72
|
external = Column(Boolean, default=False)
|
py_pve_cloud-0.13.22/src/pve_cloud/orm/migrations/versions/0ad803c51325_machine_type_refactor.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""machine type refactor
|
|
2
|
+
|
|
3
|
+
Revision ID: 0ad803c51325
|
|
4
|
+
Revises: fdcb5aa33b76
|
|
5
|
+
Create Date: 2025-12-22 13:46:51.857049
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
from sqlalchemy.dialects import postgresql
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = '0ad803c51325'
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = 'fdcb5aa33b76'
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
24
|
+
|
|
25
|
+
op.add_column('k8s_tcp_proxies', sa.Column('is_k8s', sa.Boolean(), nullable=False, server_default='true'))
|
|
26
|
+
op.add_column('kea_reservations', sa.Column('machine_type', sa.String(length=50), nullable=False, server_default='k8s_worker'))
|
|
27
|
+
|
|
28
|
+
# remove defaults
|
|
29
|
+
op.alter_column('k8s_tcp_proxies', 'is_k8s', server_default=None)
|
|
30
|
+
op.alter_column('kea_reservations', 'machine_type', server_default=None)
|
|
31
|
+
|
|
32
|
+
# set master type
|
|
33
|
+
op.execute("""
|
|
34
|
+
UPDATE kea_reservations kr
|
|
35
|
+
SET machine_type = 'k8s_master'
|
|
36
|
+
FROM k8s_masters km
|
|
37
|
+
WHERE kr.ip = km.ip
|
|
38
|
+
""")
|
|
39
|
+
|
|
40
|
+
op.drop_table('k8s_masters')
|
|
41
|
+
op.drop_table('k8s_workers')
|
|
42
|
+
|
|
43
|
+
# ### end Alembic commands ###
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def downgrade() -> None:
|
|
47
|
+
"""Downgrade schema."""
|
|
48
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
49
|
+
op.drop_column('kea_reservations', 'machine_type')
|
|
50
|
+
op.drop_column('k8s_tcp_proxies', 'is_k8s')
|
|
51
|
+
op.create_table('k8s_workers',
|
|
52
|
+
sa.Column('ip', postgresql.INET(), autoincrement=False, nullable=False),
|
|
53
|
+
sa.Column('hostname', sa.VARCHAR(length=253), autoincrement=False, nullable=False),
|
|
54
|
+
sa.Column('stack_fqdn', sa.VARCHAR(length=253), autoincrement=False, nullable=False),
|
|
55
|
+
sa.Column('proxy_stack_fqdn', sa.VARCHAR(length=253), autoincrement=False, nullable=False),
|
|
56
|
+
sa.PrimaryKeyConstraint('ip', name=op.f('k8s_workers_pkey'))
|
|
57
|
+
)
|
|
58
|
+
op.create_table('k8s_masters',
|
|
59
|
+
sa.Column('ip', postgresql.INET(), autoincrement=False, nullable=False),
|
|
60
|
+
sa.Column('hostname', sa.VARCHAR(length=253), autoincrement=False, nullable=False),
|
|
61
|
+
sa.Column('stack_fqdn', sa.VARCHAR(length=253), autoincrement=False, nullable=False),
|
|
62
|
+
sa.Column('proxy_stack_fqdn', sa.VARCHAR(length=253), autoincrement=False, nullable=False),
|
|
63
|
+
sa.PrimaryKeyConstraint('ip', name=op.f('k8s_masters_pkey'))
|
|
64
|
+
)
|
|
65
|
+
# ### end Alembic commands ###
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"""ingress generic
|
|
2
|
+
|
|
3
|
+
Revision ID: e60b9cc63413
|
|
4
|
+
Revises: 0ad803c51325
|
|
5
|
+
Create Date: 2025-12-22 21:29:59.987939
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
from typing import Sequence, Union
|
|
9
|
+
|
|
10
|
+
from alembic import op
|
|
11
|
+
import sqlalchemy as sa
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# revision identifiers, used by Alembic.
|
|
15
|
+
revision: str = 'e60b9cc63413'
|
|
16
|
+
down_revision: Union[str, Sequence[str], None] = '0ad803c51325'
|
|
17
|
+
branch_labels: Union[str, Sequence[str], None] = None
|
|
18
|
+
depends_on: Union[str, Sequence[str], None] = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def upgrade() -> None:
|
|
22
|
+
"""Upgrade schema."""
|
|
23
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
24
|
+
op.add_column('k8s_ingress_rules', sa.Column('is_k8s', sa.Boolean(), nullable=False, server_default='true'))
|
|
25
|
+
op.alter_column('k8s_ingress_rules', 'is_k8s', server_default=None) # default create as true since to this point its only for k8s
|
|
26
|
+
# ### end Alembic commands ###
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def downgrade() -> None:
|
|
30
|
+
"""Downgrade schema."""
|
|
31
|
+
# ### commands auto generated by Alembic - please adjust! ###
|
|
32
|
+
op.drop_column('k8s_ingress_rules', 'is_k8s')
|
|
33
|
+
# ### end Alembic commands ###
|
|
@@ -10,6 +10,7 @@ src/pve_cloud/orm/alchemy.py
|
|
|
10
10
|
src/pve_cloud/orm/alembic.ini
|
|
11
11
|
src/pve_cloud/orm/migrations/env.py
|
|
12
12
|
src/pve_cloud/orm/migrations/versions/04398db10434_external_cp_extra_sans.py
|
|
13
|
+
src/pve_cloud/orm/migrations/versions/0ad803c51325_machine_type_refactor.py
|
|
13
14
|
src/pve_cloud/orm/migrations/versions/24a548bfce3e_len_rules_enforcements.py
|
|
14
15
|
src/pve_cloud/orm/migrations/versions/27724e407e2b_proxy_fqdn.py
|
|
15
16
|
src/pve_cloud/orm/migrations/versions/3c95509a5de9_fix.py
|
|
@@ -17,6 +18,7 @@ src/pve_cloud/orm/migrations/versions/7868bcd05006_migrate_old.py
|
|
|
17
18
|
src/pve_cloud/orm/migrations/versions/7dea8c4ee39f_init.py
|
|
18
19
|
src/pve_cloud/orm/migrations/versions/944a8fd5d5bc_ext_ctrl_plns.py
|
|
19
20
|
src/pve_cloud/orm/migrations/versions/d9b711555be8_ext_control_plane.py
|
|
21
|
+
src/pve_cloud/orm/migrations/versions/e60b9cc63413_ingress_generic.py
|
|
20
22
|
src/pve_cloud/orm/migrations/versions/fdcb5aa33b76_slop_firewall_seperation.py
|
|
21
23
|
src/py_pve_cloud.egg-info/PKG-INFO
|
|
22
24
|
src/py_pve_cloud.egg-info/SOURCES.txt
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.13.5"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|