Delete server config state and service

This commit is contained in:
Chris Roberts 2022-09-16 17:15:24 -07:00
parent 24acecdae1
commit 788c5be03a
5 changed files with 0 additions and 301 deletions

View File

@ -1,35 +0,0 @@
package ptypes
import (
"github.com/go-ozzo/ozzo-validation/v4"
"github.com/imdario/mergo"
"github.com/mitchellh/go-testing-interface"
"github.com/stretchr/testify/require"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
)
func TestServerConfig(t testing.T, src *vagrant_server.ServerConfig) *vagrant_server.ServerConfig {
t.Helper()
if src == nil {
src = &vagrant_server.ServerConfig{}
}
require.NoError(t, mergo.Merge(src, &vagrant_server.ServerConfig{
AdvertiseAddrs: []*vagrant_server.ServerConfig_AdvertiseAddr{
{
Addr: "127.0.0.1",
},
},
}))
return src
}
// ValidateServerConfig validates the server config structure.
func ValidateServerConfig(c *vagrant_server.ServerConfig) error {
return validation.ValidateStruct(c,
validation.Field(&c.AdvertiseAddrs, validation.Required, validation.Length(1, 1)),
)
}

View File

@ -1,43 +0,0 @@
package singleprocess
import (
"context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
serverptypes "github.com/hashicorp/vagrant/internal/server/ptypes"
)
type Targeter interface {
ServerTarget() string
}
func (s *service) SetServerConfig(
ctx context.Context,
req *vagrant_server.SetServerConfigRequest,
) (*emptypb.Empty, error) {
if err := serverptypes.ValidateServerConfig(req.Config); err != nil {
return nil, status.Errorf(codes.FailedPrecondition, err.Error())
}
if err := s.state.ServerConfigSet(req.Config); err != nil {
return nil, err
}
return &emptypb.Empty{}, nil
}
func (s *service) GetServerConfig(
ctx context.Context,
req *emptypb.Empty,
) (*vagrant_server.GetServerConfigResponse, error) {
cfg, err := s.state.ServerConfigGet()
if err != nil {
return nil, err
}
return &vagrant_server.GetServerConfigResponse{Config: cfg}, nil
}

View File

@ -1,38 +0,0 @@
package singleprocess
import (
"context"
"testing"
"github.com/hashicorp/vagrant/internal/server"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/emptypb"
)
func TestServiceServerConfig(t *testing.T) {
ctx := context.Background()
t.Run("set and get", func(t *testing.T) {
require := require.New(t)
db := testDB(t)
impl, err := New(WithDB(db))
require.NoError(err)
client := server.TestServer(t, impl)
resp, err := client.SetServerConfig(ctx, &vagrant_server.SetServerConfigRequest{
Config: &vagrant_server.ServerConfig{
AdvertiseAddrs: []*vagrant_server.ServerConfig_AdvertiseAddr{
{Addr: "1.2.3.4"},
},
},
})
require.NoError(err)
require.NotNil(resp)
getResp, err := client.GetServerConfig(ctx, &emptypb.Empty{})
require.NoError(err)
require.NotNil(getResp)
require.Equal("1.2.3.4", getResp.Config.AdvertiseAddrs[0].Addr)
})
}

View File

@ -1,143 +0,0 @@
package state
import (
"google.golang.org/protobuf/proto"
"github.com/hashicorp/go-memdb"
bolt "go.etcd.io/bbolt"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
)
var (
serverConfigBucket = []byte("server-config")
serverConfigId = []byte("1")
)
func init() {
dbBuckets = append(dbBuckets, serverConfigBucket)
dbIndexers = append(dbIndexers, (*State).serverConfigIndexInit)
schemas = append(schemas, serverConfigIndexSchema)
}
// ServerConfigSet writes the server configuration.
func (s *State) ServerConfigSet(c *vagrant_server.ServerConfig) error {
memTxn := s.inmem.Txn(true)
defer memTxn.Abort()
err := s.db.Update(func(dbTxn *bolt.Tx) error {
return s.serverConfigSet(dbTxn, memTxn, c)
})
if err == nil {
memTxn.Commit()
}
return err
}
// ServerConfigGet gets the server configuration.
func (s *State) ServerConfigGet() (*vagrant_server.ServerConfig, error) {
memTxn := s.inmem.Txn(false)
defer memTxn.Abort()
v, err := memTxn.First(
serverConfigIndexTableName,
serverConfigIndexIdIndexName,
string(serverConfigId),
)
if err != nil {
return nil, err
}
if v == nil {
return &vagrant_server.ServerConfig{}, nil
}
return v.(*serverConfigIndexRecord).Config, nil
}
func (s *State) serverConfigSet(
dbTxn *bolt.Tx,
memTxn *memdb.Txn,
value *vagrant_server.ServerConfig,
) error {
id := serverConfigId
// Get the global bucket and write the value to it.
b := dbTxn.Bucket(serverConfigBucket)
if value == nil {
if err := b.Delete(id); err != nil {
return err
}
} else {
if err := dbPut(b, id, value); err != nil {
return err
}
}
// Create our index value and write that.
return s.serverConfigIndexSet(memTxn, id, value)
}
// serverConfigIndexSet writes an index record for the server config.
func (s *State) serverConfigIndexSet(txn *memdb.Txn, id []byte, value *vagrant_server.ServerConfig) error {
record := &serverConfigIndexRecord{
Id: string(id),
Config: value,
}
// If we have no value, we delete from the memdb index
if value == nil {
return txn.Delete(serverConfigIndexTableName, record)
}
// Insert the index
return txn.Insert(serverConfigIndexTableName, record)
}
// serverConfigIndexInit initializes the server config index from persisted data.
func (s *State) serverConfigIndexInit(dbTxn *bolt.Tx, memTxn *memdb.Txn) error {
bucket := dbTxn.Bucket(serverConfigBucket)
data := bucket.Get(serverConfigId)
if data == nil {
return nil
}
var value vagrant_server.ServerConfig
if err := proto.Unmarshal(data, &value); err != nil {
return err
}
if err := s.serverConfigIndexSet(memTxn, serverConfigId, &value); err != nil {
return err
}
return nil
}
func serverConfigIndexSchema() *memdb.TableSchema {
return &memdb.TableSchema{
Name: serverConfigIndexTableName,
Indexes: map[string]*memdb.IndexSchema{
serverConfigIndexIdIndexName: {
Name: serverConfigIndexIdIndexName,
AllowMissing: false,
Unique: true,
Indexer: &memdb.StringFieldIndex{
Field: "Id",
Lowercase: true,
},
},
},
}
}
const (
serverConfigIndexTableName = "server-config-index"
serverConfigIndexIdIndexName = "id"
)
// Our record for the server config index. We will only have at most one
// of these because server config is a singleton.
type serverConfigIndexRecord struct {
Id string
Config *vagrant_server.ServerConfig
}

View File

@ -1,42 +0,0 @@
package state
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
)
func TestServerConfig(t *testing.T) {
t.Run("basic put and get", func(t *testing.T) {
require := require.New(t)
s := TestState(t)
defer s.Close()
// Set
require.NoError(s.ServerConfigSet(&vagrant_server.ServerConfig{
AdvertiseAddrs: []*vagrant_server.ServerConfig_AdvertiseAddr{},
}))
{
// Get
cfg, err := s.ServerConfigGet()
require.NoError(err)
require.NotNil(cfg)
require.NotNil(cfg.AdvertiseAddrs)
}
// Unset
require.NoError(s.ServerConfigSet(nil))
{
// Get
cfg, err := s.ServerConfigGet()
require.NoError(err)
require.NotNil(cfg)
require.Nil(cfg.AdvertiseAddrs)
}
})
}