mz_catalog/durable/upgrade/
v76_to_v77.rs1use crate::durable::traits::UpgradeFrom;
11use crate::durable::upgrade::MigrationAction;
12use crate::durable::upgrade::{objects_v76 as v76, objects_v77 as v77};
13use crate::wire_compatible;
14
15wire_compatible!(v76::RoleKey with v77::RoleKey);
16wire_compatible!(v76::RoleValue with v77::RoleValue);
17wire_compatible!(v76::RoleVars with v77::RoleVars);
18wire_compatible!(v76::RoleMembership with v77::RoleMembership);
19wire_compatible!(v76::role_membership::Entry with v77::role_membership::Entry);
20wire_compatible!(v76::role_vars::Entry with v77::role_vars::Entry);
21wire_compatible!(v76::role_vars::SqlSet with v77::role_vars::SqlSet);
22wire_compatible!(v76::RoleAttributes with v77::RoleAttributes);
23wire_compatible!(v76::RoleId with v77::RoleId);
24
25pub fn upgrade(
27 snapshot: Vec<v76::StateUpdateKind>,
28) -> Vec<MigrationAction<v76::StateUpdateKind, v77::StateUpdateKind>> {
29 let mut migrations = Vec::new();
30 for update in snapshot {
31 match update.kind {
32 Some(v76::state_update_kind::Kind::Role(old_role)) => {
33 let new_role = v77::state_update_kind::Role::upgrade_from(old_role.clone());
34 let old_role = v76::StateUpdateKind {
35 kind: Some(v76::state_update_kind::Kind::Role(old_role)),
36 };
37 let new_role = v77::StateUpdateKind {
38 kind: Some(v77::state_update_kind::Kind::Role(new_role)),
39 };
40 let migration = MigrationAction::Update(old_role, new_role);
41 migrations.push(migration);
42 }
43 _ => {}
44 }
45 }
46 migrations
47}
48
49impl UpgradeFrom<v76::state_update_kind::Role> for v77::state_update_kind::Role {
50 fn upgrade_from(value: v76::state_update_kind::Role) -> Self {
51 let new_key = value.key.map(|key| v77::RoleKey {
52 id: key.id.map(v77::RoleId::upgrade_from),
53 });
54
55 let is_mz_system = value
56 .value
57 .as_ref()
58 .map_or(false, |v| v.name == "mz_system");
59
60 let mut new_value = value.value.map(|value| v77::RoleValue {
61 name: value.name,
62 oid: value.oid,
63 attributes: value.attributes.map(v77::RoleAttributes::upgrade_from),
64 membership: value.membership.map(v77::RoleMembership::upgrade_from),
65 vars: value.vars.map(v77::RoleVars::upgrade_from),
66 });
67
68 if is_mz_system {
69 if let Some(ref mut value) = new_value {
70 if let Some(ref mut attrs) = value.attributes {
71 attrs.login = Some(true);
72 }
73 }
74 }
75
76 v77::state_update_kind::Role {
77 key: new_key,
78 value: new_value,
79 }
80 }
81}
82
83impl UpgradeFrom<v76::RoleVars> for v77::RoleVars {
84 fn upgrade_from(value: v76::RoleVars) -> Self {
85 v77::RoleVars {
86 entries: value
87 .entries
88 .iter()
89 .map(|val| v77::role_vars::Entry::upgrade_from(val.clone()))
90 .collect(),
91 }
92 }
93}
94
95impl UpgradeFrom<v76::RoleMembership> for v77::RoleMembership {
96 fn upgrade_from(value: v76::RoleMembership) -> Self {
97 v77::RoleMembership {
98 map: value
99 .map
100 .iter()
101 .map(|val| v77::role_membership::Entry::upgrade_from(*val))
102 .collect(),
103 }
104 }
105}
106
107impl UpgradeFrom<v76::role_membership::Entry> for v77::role_membership::Entry {
108 fn upgrade_from(value: v76::role_membership::Entry) -> Self {
109 v77::role_membership::Entry {
110 key: value.key.map(v77::RoleId::upgrade_from),
111 value: value.value.map(v77::RoleId::upgrade_from),
112 }
113 }
114}
115
116impl UpgradeFrom<v76::role_vars::Entry> for v77::role_vars::Entry {
117 fn upgrade_from(value: v76::role_vars::Entry) -> Self {
118 v77::role_vars::Entry {
119 key: value.key,
120 val: value.val.map(v77::role_vars::entry::Val::upgrade_from),
121 }
122 }
123}
124
125impl UpgradeFrom<v76::role_vars::entry::Val> for v77::role_vars::entry::Val {
126 fn upgrade_from(value: v76::role_vars::entry::Val) -> Self {
127 match value {
128 v76::role_vars::entry::Val::Flat(x) => v77::role_vars::entry::Val::Flat(x),
129 v76::role_vars::entry::Val::SqlSet(x) => {
130 v77::role_vars::entry::Val::SqlSet(v77::role_vars::SqlSet::upgrade_from(x))
131 }
132 }
133 }
134}
135
136impl UpgradeFrom<v76::role_vars::SqlSet> for v77::role_vars::SqlSet {
137 fn upgrade_from(value: v76::role_vars::SqlSet) -> Self {
138 v77::role_vars::SqlSet {
139 entries: value.entries,
140 }
141 }
142}
143
144impl UpgradeFrom<v76::RoleAttributes> for v77::RoleAttributes {
145 fn upgrade_from(value: v76::RoleAttributes) -> Self {
146 v77::RoleAttributes {
147 inherit: value.inherit,
148 ..Default::default()
149 }
150 }
151}
152
153impl UpgradeFrom<v76::RoleId> for v77::RoleId {
154 fn upgrade_from(value: v76::RoleId) -> Self {
155 let value = match value.value {
156 Some(v76::role_id::Value::System(x)) => Some(v77::role_id::Value::System(x)),
157 Some(v76::role_id::Value::User(x)) => Some(v77::role_id::Value::User(x)),
158 Some(v76::role_id::Value::Public(_)) => {
159 Some(v77::role_id::Value::Public(v77::Empty {}))
160 }
161 Some(v76::role_id::Value::Predefined(x)) => Some(v77::role_id::Value::Predefined(x)),
162 None => None,
163 };
164 v77::RoleId { value }
165 }
166}
167
168impl UpgradeFrom<v76::RoleKey> for v77::RoleKey {
169 fn upgrade_from(value: v76::RoleKey) -> Self {
170 Self {
171 id: value.id.map(v77::RoleId::upgrade_from),
172 }
173 }
174}