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.
Files changed (31) hide show
  1. {py_pve_cloud-0.13.5/src/py_pve_cloud.egg-info → py_pve_cloud-0.13.22}/PKG-INFO +1 -1
  2. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/README.md +1 -1
  3. py_pve_cloud-0.13.22/src/pve_cloud/_version.py +1 -0
  4. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/cli/pvcli.py +2 -0
  5. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/cli/pvclu.py +7 -22
  6. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/lib/inventory.py +4 -0
  7. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/alchemy.py +7 -19
  8. py_pve_cloud-0.13.22/src/pve_cloud/orm/migrations/versions/0ad803c51325_machine_type_refactor.py +65 -0
  9. py_pve_cloud-0.13.22/src/pve_cloud/orm/migrations/versions/e60b9cc63413_ingress_generic.py +33 -0
  10. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22/src/py_pve_cloud.egg-info}/PKG-INFO +1 -1
  11. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/SOURCES.txt +2 -0
  12. py_pve_cloud-0.13.5/src/pve_cloud/_version.py +0 -1
  13. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/LICENSE.md +0 -0
  14. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/pyproject.toml +0 -0
  15. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/setup.cfg +0 -0
  16. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/lib/validate.py +0 -0
  17. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/alembic.ini +0 -0
  18. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/env.py +0 -0
  19. {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
  20. {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
  21. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/27724e407e2b_proxy_fqdn.py +0 -0
  22. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/3c95509a5de9_fix.py +0 -0
  23. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/7868bcd05006_migrate_old.py +0 -0
  24. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/pve_cloud/orm/migrations/versions/7dea8c4ee39f_init.py +0 -0
  25. {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
  26. {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
  27. {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
  28. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/dependency_links.txt +0 -0
  29. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/entry_points.txt +0 -0
  30. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/requires.txt +0 -0
  31. {py_pve_cloud-0.13.5 → py_pve_cloud-0.13.22}/src/py_pve_cloud.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-pve-cloud
3
- Version: 0.13.5
3
+ Version: 0.13.22
4
4
  Author-email: Tobias Huebner <tobias.huebner@vmzberlin.com>
5
5
  License-Expression: GPL-3.0-or-later
6
6
  License-File: LICENSE.md
@@ -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"] = f"kubernetes-admin@{stack_name}"
77
+ admin_conf["contexts"][0]["name"] = stack_name
78
78
 
79
- admin_conf["current-context"] = f"kubernetes-admin@{stack_name}"
79
+ admin_conf["current-context"] = stack_name
80
80
 
81
81
  return yaml.safe_dump(admin_conf)
82
82
 
83
83
 
84
- def export_envr(args):
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
- print(f"export TF_VAR_pve_cloud_domain='{cloud_domain}'")
104
- print(f"export TF_VAR_pve_host='{ansible_host}'")
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-envrc", help="Export variables for k8s .envrc", parents=[base_parser])
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.add_argument("--stack-name", type=str, help="Stack name of the deployment.", required=True)
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
- class K8SWorkers(Base):
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)
@@ -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 ###
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: py-pve-cloud
3
- Version: 0.13.5
3
+ Version: 0.13.22
4
4
  Author-email: Tobias Huebner <tobias.huebner@vmzberlin.com>
5
5
  License-Expression: GPL-3.0-or-later
6
6
  License-File: LICENSE.md
@@ -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