Delete server config state and service
This commit is contained in:
parent
24acecdae1
commit
788c5be03a
@ -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)),
|
||||
)
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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)
|
||||
})
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user