blob: d06743814369a509a058658d4210951fab1b5ebb [file] [log] [blame]
Serge Bazanskie50ec392020-06-30 21:41:39 +02001// Copyright 2020 The Monogon Project Authors.
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
17package localstorage
18
Serge Bazanski216fe7b2021-05-21 18:36:16 +020019// Localstorage is a replacement for the old 'storage' internal library. It is
20// currently unused, but will become so as the node code gets rewritten.
Serge Bazanskie50ec392020-06-30 21:41:39 +020021
Serge Bazanski216fe7b2021-05-21 18:36:16 +020022// The library is centered around the idea of a declarative filesystem tree
23// defined as mutually recursive Go structs. This structure is then Placed
24// onto an abstract real filesystem (eg. a local POSIX filesystem at /), and a
25// handle to that placed filesystem is then used by the consumers of this
26// library to refer to subsets of the tree (that now correspond to locations on
27// a filesystem).
Serge Bazanskie50ec392020-06-30 21:41:39 +020028//
Serge Bazanski216fe7b2021-05-21 18:36:16 +020029// Every member of the storage hierarchy must either be, or inherit from
30// Directory or File. In order to be placed correctly, Directory embedding
31// structures must use `dir:` or `file:` tags for child Directories and files
32// respectively. The content of the tag specifies the path part that this
33// element will be placed at.
Serge Bazanskie50ec392020-06-30 21:41:39 +020034//
Serge Bazanski216fe7b2021-05-21 18:36:16 +020035// Full placement path(available via FullPath()) format is placement
36// implementation-specific. However, they're always strings.
Serge Bazanskie50ec392020-06-30 21:41:39 +020037
38import (
39 "sync"
40
Serge Bazanski31370b02021-01-07 16:31:14 +010041 "source.monogon.dev/metropolis/node/core/localstorage/declarative"
Serge Bazanskie50ec392020-06-30 21:41:39 +020042)
43
44type Root struct {
45 declarative.Directory
Serge Bazanskic2c7ad92020-07-13 17:20:09 +020046 // UEFI ESP partition, mounted from plaintext storage.
47 ESP ESPDirectory `dir:"esp"`
48 // Persistent Data partition, mounted from encrypted and authenticated storage.
49 Data DataDirectory `dir:"data"`
Serge Bazanski216fe7b2021-05-21 18:36:16 +020050 // FHS-standard /etc directory, containes /etc/hosts, /etc/machine-id, and
51 // other compatibility files.
Serge Bazanskic2c7ad92020-07-13 17:20:09 +020052 Etc EtcDirectory `dir:"etc"`
Serge Bazanski216fe7b2021-05-21 18:36:16 +020053 // Ephemeral data, used by runtime, stored in tmpfs. Things like sockets,
54 // temporary config files, etc.
Serge Bazanskicb883e22020-07-06 17:47:55 +020055 Ephemeral EphemeralDirectory `dir:"ephemeral"`
Lorenz Brun764a2de2021-11-22 16:26:36 +010056 // FHS-standard /tmp directory, used by os.MkdirTemp.
Serge Bazanskic2c7ad92020-07-13 17:20:09 +020057 Tmp TmpDirectory `dir:"tmp"`
Lorenz Brun74e8e5c2021-01-26 14:00:50 +010058 // FHS-standard /run directory. Used by various services.
59 Run RunDirectory `dir:"run"`
Serge Bazanskie50ec392020-06-30 21:41:39 +020060}
61
62type PKIDirectory struct {
63 declarative.Directory
64 CACertificate declarative.File `file:"ca.pem"`
65 Certificate declarative.File `file:"cert.pem"`
66 Key declarative.File `file:"cert-key.pem"`
67}
68
Serge Bazanski216fe7b2021-05-21 18:36:16 +020069// DataDirectory is an xfs partition mounted via cryptsetup/LUKS, with a key
70// derived from {global,local}Unlock keys.
Serge Bazanskie50ec392020-06-30 21:41:39 +020071type DataDirectory struct {
72 declarative.Directory
73
74 // flagLock locks canMount and mounted.
75 flagLock sync.Mutex
Serge Bazanski216fe7b2021-05-21 18:36:16 +020076 // canMount is set by Root when it is initialized. It is required to be set
77 // for mounting the data directory.
Serge Bazanskie50ec392020-06-30 21:41:39 +020078 canMount bool
Serge Bazanski216fe7b2021-05-21 18:36:16 +020079 // mounted is set by DataDirectory when it is mounted. It ensures it's only
80 // mounted once.
Serge Bazanskie50ec392020-06-30 21:41:39 +020081 mounted bool
82
Serge Bazanskic2c7ad92020-07-13 17:20:09 +020083 Containerd declarative.Directory `dir:"containerd"`
84 Etcd DataEtcdDirectory `dir:"etcd"`
85 Kubernetes DataKubernetesDirectory `dir:"kubernetes"`
Serge Bazanski42e61c62021-03-18 15:07:18 +010086 Node DataNodeDirectory `dir:"node"`
Serge Bazanskic2c7ad92020-07-13 17:20:09 +020087 Volumes DataVolumesDirectory `dir:"volumes"`
Serge Bazanskie50ec392020-06-30 21:41:39 +020088}
89
Serge Bazanski42e61c62021-03-18 15:07:18 +010090type DataNodeDirectory struct {
91 declarative.Directory
92 Credentials PKIDirectory `dir:"credentials"`
93}
94
Serge Bazanskicb883e22020-07-06 17:47:55 +020095type DataEtcdDirectory struct {
96 declarative.Directory
97 PeerPKI PKIDirectory `dir:"peer_pki"`
98 PeerCRL declarative.File `file:"peer_crl"`
99 Data declarative.Directory `dir:"data"`
100}
101
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200102type DataKubernetesDirectory struct {
103 declarative.Directory
104 ClusterNetworking DataKubernetesClusterNetworkingDirectory `dir:"clusternet"`
105 Kubelet DataKubernetesKubeletDirectory `dir:"kubelet"`
106}
107
108type DataKubernetesClusterNetworkingDirectory struct {
109 declarative.Directory
110 Key declarative.File `file:"private.key"`
111}
112
113type DataKubernetesKubeletDirectory struct {
114 declarative.Directory
115 Kubeconfig declarative.File `file:"kubeconfig"`
116 PKI PKIDirectory `dir:"pki"`
117
Lorenz Brun842536b2021-01-26 13:54:57 +0100118 DevicePlugins struct {
119 declarative.Directory
Serge Bazanski216fe7b2021-05-21 18:36:16 +0200120 // Used by Kubelet, hardcoded relative to
121 // DataKubernetesKubeletDirectory
Lorenz Brun842536b2021-01-26 13:54:57 +0100122 Kubelet declarative.File `file:"kubelet.sock"`
123 } `dir:"device-plugins"`
124
Serge Bazanski216fe7b2021-05-21 18:36:16 +0200125 // Pod logs, hardcoded to /data/kubelet/logs in
126 // @com_github_kubernetes//pkg/kubelet/kuberuntime:kuberuntime_manager.go
Lorenz Brun842536b2021-01-26 13:54:57 +0100127 Logs declarative.Directory `dir:"logs"`
128
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200129 Plugins struct {
130 declarative.Directory
Serge Bazanski662b5b32020-12-21 13:49:00 +0100131 VFS declarative.File `file:"dev.monogon.metropolis.vfs.sock"`
Lorenz Brun4e090352021-03-17 17:44:41 +0100132 KVM declarative.File `file:"devices.monogon.dev_kvm.sock"`
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200133 } `dir:"plugins"`
134
135 PluginsRegistry struct {
136 declarative.Directory
Serge Bazanski662b5b32020-12-21 13:49:00 +0100137 VFSReg declarative.File `file:"dev.monogon.metropolis.vfs-reg.sock"`
Lorenz Brun4e090352021-03-17 17:44:41 +0100138 KVMReg declarative.File `file:"devices.monogon.dev_kvm-reg.sock"`
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200139 } `dir:"plugins_registry"`
140}
141
142type DataVolumesDirectory struct {
143 declarative.Directory
144}
145
Serge Bazanskie50ec392020-06-30 21:41:39 +0200146type EtcDirectory struct {
147 declarative.Directory
Serge Bazanski216fe7b2021-05-21 18:36:16 +0200148 // Symlinked to /ephemeral/hosts, baked into the erofs system image
149 Hosts declarative.File `file:"hosts"`
150 // Symlinked to /ephemeral/machine-id, baked into the erofs system image
151 MachineID declarative.File `file:"machine-id"`
Serge Bazanskie50ec392020-06-30 21:41:39 +0200152}
Serge Bazanskicb883e22020-07-06 17:47:55 +0200153
154type EphemeralDirectory struct {
155 declarative.Directory
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200156 Consensus EphemeralConsensusDirectory `dir:"consensus"`
Serge Bazanski7f17d9b2021-06-17 16:11:40 +0200157 Curator EphemeralCuratorDirectory `dir:"curator"`
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200158 Containerd EphemeralContainerdDirectory `dir:"containerd"`
159 FlexvolumePlugins declarative.Directory `dir:"flexvolume_plugins"`
Lorenz Brun3a99c592021-01-26 19:57:21 +0100160 Hosts declarative.File `file:"hosts"`
161 MachineID declarative.File `file:"machine-id"`
Serge Bazanskicb883e22020-07-06 17:47:55 +0200162}
163
164type EphemeralConsensusDirectory struct {
165 declarative.Directory
Serge Bazanski50009e02021-07-07 14:35:27 +0200166 ClientSocket declarative.File `file:"client.sock"`
167 ServerLogsFIFO declarative.File `file:"server-logs.fifo"`
Serge Bazanskicb883e22020-07-06 17:47:55 +0200168}
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200169
Serge Bazanski7f17d9b2021-06-17 16:11:40 +0200170type EphemeralCuratorDirectory struct {
171 declarative.Directory
172 // Curator ephemeral socket, dialed by local curator clients.
173 // See: //metropolis/node/core/curator.
174 ClientSocket declarative.File `file:"client.sock"`
175}
176
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200177type EphemeralContainerdDirectory struct {
178 declarative.Directory
179 ClientSocket declarative.File `file:"client.sock"`
180 RunSCLogsFIFO declarative.File `file:"runsc-logs.fifo"`
181 Tmp declarative.Directory `dir:"tmp"`
182 RunSC declarative.Directory `dir:"runsc"`
183 IPAM declarative.Directory `dir:"ipam"`
Lorenz Brun74e8e5c2021-01-26 14:00:50 +0100184 CNI declarative.Directory `dir:"cni"`
185 CNICache declarative.Directory `dir:"cni-cache"` // Hardcoded @com_github_containernetworking_cni via patch
Serge Bazanskic2c7ad92020-07-13 17:20:09 +0200186}
187
188type TmpDirectory struct {
189 declarative.Directory
190}
Lorenz Brun74e8e5c2021-01-26 14:00:50 +0100191
192type RunDirectory struct {
193 declarative.Directory
194 // Hardcoded in @com_github_containerd_containerd//pkg/process:utils.go and
195 // @com_github_containerd_containerd//runtime/v2/shim:util_unix.go
196 Containerd declarative.Directory `dir:"containerd"`
197}