blob: 943f20382d87bda25bfe339f9bbcc34e482ca728 [file] [log] [blame]
Hendrik Hofstadt0d7c91e2019-10-23 21:44:47 +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 api
18
19import (
20 "context"
21 "errors"
22 "fmt"
23 schema "git.monogon.dev/source/nexantic.git/core/generated/api"
24)
25
26const (
27 MinNameLength = 3
28)
29
30var (
31 ErrInvalidProvisioningToken = errors.New("invalid provisioning token")
32 ErrInvalidNameLength = fmt.Errorf("name must be at least %d characters long", MinNameLength)
33)
34
35func (s *Server) Setup(c context.Context, r *schema.SetupRequest) (*schema.SetupResponse, error) {
36
37 switch r.Request.(type) {
38 case *schema.SetupRequest_JoinCluster:
39 token, err := s.enterJoinCluster(r.GetJoinCluster())
40 if err != nil {
41 return nil, err
42 }
43
44 return &schema.SetupResponse{
45 Response: &schema.SetupResponse_JoinCluster{
46 JoinCluster: &schema.JoinClusterResponse{
47 ProvisioningToken: token,
48 },
49 },
50 }, nil
51
52 case *schema.SetupRequest_NewCluster:
53 return &schema.SetupResponse{
54 Response: &schema.SetupResponse_NewCluster{
55 NewCluster: &schema.NewClusterResponse{},
56 },
57 }, s.setupNewCluster(r.GetNewCluster())
58 }
59
60 return &schema.SetupResponse{}, nil
61}
62
63func (s *Server) enterJoinCluster(r *schema.JoinClusterRequest) (string, error) {
64 err := s.setupService.EnterJoinClusterMode()
65 if err != nil {
66 return "", err
67 }
68
69 return s.setupService.GetJoinClusterToken(), nil
70}
71
72func (s *Server) setupNewCluster(r *schema.NewClusterRequest) error {
73 if len(r.NodeName) < MinNameLength {
74 return ErrInvalidNameLength
75 }
76 return s.setupService.SetupNewCluster(r.NodeName, r.ExternalHost)
77}
78
79func (s *Server) ProvisionCluster(ctx context.Context, req *schema.ProvisionClusterRequest) (*schema.ProvisionClusterResponse, error) {
80 if len(req.NodeName) < MinNameLength {
81 return nil, ErrInvalidNameLength
82 }
83
84 // Verify provisioning token
85 if s.setupService.GetJoinClusterToken() != req.ProvisioningToken {
86 return nil, ErrInvalidProvisioningToken
87 }
88
89 // Join cluster
90 err := s.setupService.JoinCluster(req.NodeName, req.InitialCluster, req.ExternalHost)
91 if err != nil {
92 return nil, err
93 }
94
95 return &schema.ProvisionClusterResponse{}, nil
96}
97
98func (s *Server) Attest(c context.Context, r *schema.AttestRequest) (*schema.AttestResponse, error) {
99 // TODO implement
100 return &schema.AttestResponse{
101 Response: r.Challenge,
102 }, nil
103}