mz_catalog/durable/upgrade/
v76_to_v77.rs

1// Copyright Materialize, Inc. and contributors. All rights reserved.
2//
3// Use of this software is governed by the Business Source License
4// included in the LICENSE file.
5//
6// As of the Change Date specified in that file, in accordance with
7// the Business Source License, use of this software will be governed
8// by the Apache License, Version 2.0.
9
10use 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
25/// This upgrade doesn't change any protos, simply retroactively marks mz_system as login
26pub 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}