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