| /* |
| Copyright The containerd Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package sandbox |
| |
| import ( |
| "context" |
| "fmt" |
| "time" |
| |
| "github.com/containerd/containerd/errdefs" |
| "github.com/containerd/typeurl/v2" |
| ) |
| |
| // Sandbox is an object stored in metadata database |
| type Sandbox struct { |
| // ID uniquely identifies the sandbox in a namespace |
| ID string |
| // Labels provide metadata extension for a sandbox |
| Labels map[string]string |
| // Runtime shim to use for this sandbox |
| Runtime RuntimeOpts |
| // Spec carries the runtime specification used to implement the sandbox |
| Spec typeurl.Any |
| // CreatedAt is the time at which the sandbox was created |
| CreatedAt time.Time |
| // UpdatedAt is the time at which the sandbox was updated |
| UpdatedAt time.Time |
| // Extensions stores client-specified metadata |
| Extensions map[string]typeurl.Any |
| } |
| |
| // RuntimeOpts holds runtime specific information |
| type RuntimeOpts struct { |
| Name string |
| Options typeurl.Any |
| } |
| |
| // Store is a storage interface for sandbox metadata objects |
| type Store interface { |
| // Create a sandbox record in the store |
| Create(ctx context.Context, sandbox Sandbox) (Sandbox, error) |
| |
| // Update the sandbox with the provided sandbox object and fields |
| Update(ctx context.Context, sandbox Sandbox, fieldpaths ...string) (Sandbox, error) |
| |
| // Get sandbox metadata using the id |
| Get(ctx context.Context, id string) (Sandbox, error) |
| |
| // List returns sandboxes that match one or more of the provided filters |
| List(ctx context.Context, filters ...string) ([]Sandbox, error) |
| |
| // Delete a sandbox from metadata store using the id |
| Delete(ctx context.Context, id string) error |
| } |
| |
| // AddExtension is a helper function to add sandbox metadata extension. |
| func (s *Sandbox) AddExtension(name string, obj interface{}) error { |
| if s.Extensions == nil { |
| s.Extensions = map[string]typeurl.Any{} |
| } |
| |
| out, err := typeurl.MarshalAny(obj) |
| if err != nil { |
| return fmt.Errorf("failed to marshal sandbox extension %q: %w", name, err) |
| } |
| |
| s.Extensions[name] = out |
| return nil |
| } |
| |
| // AddLabel adds a label to sandbox's labels. |
| func (s *Sandbox) AddLabel(name string, value string) { |
| if s.Labels == nil { |
| s.Labels = map[string]string{} |
| } |
| |
| s.Labels[name] = value |
| } |
| |
| // GetExtension retrieves a sandbox extension by name. |
| func (s *Sandbox) GetExtension(name string, obj interface{}) error { |
| out, ok := s.Extensions[name] |
| if !ok { |
| return errdefs.ErrNotFound |
| } |
| |
| if err := typeurl.UnmarshalTo(out, obj); err != nil { |
| return fmt.Errorf("failed to unmarshal sandbox extension %q: %w", name, err) |
| } |
| |
| return nil |
| } |
| |
| // GetLabel retrieves a sandbox label by name. |
| func (s *Sandbox) GetLabel(name string) (string, error) { |
| out, ok := s.Labels[name] |
| if !ok { |
| return "", fmt.Errorf("unable to find label %q in sandbox metadata: %w", name, errdefs.ErrNotFound) |
| } |
| |
| return out, nil |
| } |