blob: 7494f7a14c6a60fe331e49a173adb884c4812b4c [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 node
18
19import (
20 "flag"
21 "git.monogon.dev/source/nexantic.git/core/internal/api"
22 "git.monogon.dev/source/nexantic.git/core/internal/common"
23 "git.monogon.dev/source/nexantic.git/core/internal/consensus"
24 "git.monogon.dev/source/nexantic.git/core/internal/storage"
25
26 "github.com/casbin/casbin"
27 "github.com/google/uuid"
28 "go.uber.org/zap"
29)
30
31type (
32 SmalltownNode struct {
33 Api *api.Server
34 Consensus *consensus.Service
35 Storage *storage.Manager
36
37 logger *zap.Logger
38 ruleEnforcer *casbin.Enforcer
39 state common.SmalltownState
40 joinToken string
41 }
42)
43
44func NewSmalltownNode(logger *zap.Logger, apiPort, consensusPort uint16) (*SmalltownNode, error) {
45 flag.Parse()
46 logger.Info("Creating Smalltown node")
47
48 storageManager, err := storage.Initialize(logger.With(zap.String("component", "storage")))
49 if err != nil {
50 logger.Error("Failed to initialize storage manager", zap.Error(err))
51 return nil, err
52 }
53
54 consensusService, err := consensus.NewConsensusService(consensus.Config{
55 Name: "test",
56 ExternalHost: "0.0.0.0",
57 ListenPort: consensusPort,
58 ListenHost: "0.0.0.0",
59 }, logger.With(zap.String("module", "consensus")))
60 if err != nil {
61 return nil, err
62 }
63
64 s := &SmalltownNode{
65 Consensus: consensusService,
66 logger: logger,
67 Storage: storageManager,
68 }
69
70 apiService, err := api.NewApiServer(&api.Config{
71 Port: apiPort,
72 }, logger.With(zap.String("module", "api")), s, s.Consensus)
73 if err != nil {
74 return nil, err
75 }
76
77 s.Api = apiService
78
79 logger.Info("Created SmalltownNode")
80
81 return s, nil
82}
83
84func (s *SmalltownNode) Start() error {
85 s.logger.Info("Starting Smalltown node")
86
87 if s.Consensus.IsProvisioned() {
88 s.logger.Info("Consensus is provisioned")
89 err := s.startFull()
90 if err != nil {
91 return err
92 }
93 } else {
94 s.logger.Info("Consensus is not provisioned")
95 err := s.startForSetup()
96 if err != nil {
97 return err
98 }
99 }
100
101 return nil
102}
103
104func (s *SmalltownNode) startForSetup() error {
105 s.logger.Info("Initializing subsystems for setup mode")
106 s.state = common.StateSetupMode
107 s.joinToken = uuid.New().String()
108
109 err := s.Api.Start()
110 if err != nil {
111 s.logger.Error("Failed to start the API service", zap.Error(err))
112 return err
113 }
114
115 return nil
116}
117
118func (s *SmalltownNode) startFull() error {
119 s.logger.Info("Initializing subsystems for production")
120 s.state = common.StateConfigured
121
122 err := s.SetupBackend()
123 if err != nil {
124 return err
125 }
126
127 err = s.Consensus.Start()
128 if err != nil {
129 return err
130 }
131
132 err = s.Api.Start()
133 if err != nil {
134 s.logger.Error("Failed to start the API service", zap.Error(err))
135 return err
136 }
137
138 return nil
139}
140
141func (s *SmalltownNode) Stop() error {
142 s.logger.Info("Stopping Smalltown node")
143 return nil
144}
145
146func (s *SmalltownNode) SetupBackend() error {
147 s.logger.Debug("Creating trust backend")
148
149 return nil
150}