Skip to content

Commit

Permalink
Add command line flag for customizing provider
Browse files Browse the repository at this point in the history
Signed-off-by: Nicko Guyer <nicko.guyer@kaleido.io>
  • Loading branch information
nguyer committed Aug 11, 2021
1 parent 0cd6d25 commit 253ea11
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 45 deletions.
32 changes: 31 additions & 1 deletion cmd/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import (
)

var initOptions stacks.InitOptions
var databaseSelection string
var blockchainProviderSelection string

var initCmd = &cobra.Command{
Use: "init [stack_name] [member_count]",
Expand All @@ -37,6 +39,13 @@ var initCmd = &cobra.Command{
RunE: func(cmd *cobra.Command, args []string) error {
var stackName string

if err := validateDatabaseProvider(databaseSelection); err != nil {
return err
}
if err := validateBlockchainProvider(blockchainProviderSelection); err != nil {
return err
}

fmt.Println("initializing new FireFly stack...")

if len(args) > 0 {
Expand Down Expand Up @@ -94,10 +103,31 @@ func validateCount(input string) error {
return nil
}

func validateDatabaseProvider(input string) error {
_, err := stacks.DatabaseSelectionFromString(input)
if err != nil {
return err
}
return nil
}

func validateBlockchainProvider(input string) error {
blockchainSelection, err := stacks.BlockchainProviderFromString(input)
if err != nil {
return err
}

if blockchainSelection != stacks.GoEthereum {
return errors.New("geth is currently the only supported blockchain provider - support for other providers is coming soon")
}
return nil
}

func init() {
initCmd.Flags().IntVarP(&initOptions.FireFlyBasePort, "firefly-base-port", "p", 5000, "Mapped port base of FireFly core API (1 added for each member)")
initCmd.Flags().IntVarP(&initOptions.ServicesBasePort, "services-base-port", "s", 5100, "Mapped port base of services (100 added for each member)")
initCmd.Flags().StringVarP(&initOptions.DatabaseSelection, "database", "d", "sqlite3", fmt.Sprintf("Database type to use. Options are: %v", stacks.DBSelectionStrings))
initCmd.Flags().StringVarP(&databaseSelection, "database", "d", "sqlite3", fmt.Sprintf("Database type to use. Options are: %v", stacks.DBSelectionStrings))
initCmd.Flags().StringVarP(&blockchainProviderSelection, "blockchain-provider", "", "geth", fmt.Sprintf("Blockchain provider to use. Options are: %v", stacks.BlockchainProviderStrings))
initCmd.Flags().IntVarP(&initOptions.ExternalProcesses, "external", "e", 0, "Manage a number of FireFly core processes outside of the docker-compose stack - useful for development and debugging")

rootCmd.AddCommand(initCmd)
Expand Down
62 changes: 18 additions & 44 deletions internal/stacks/stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"os/exec"
"path"
"path/filepath"
"strings"
"syscall"
"time"

Expand All @@ -31,34 +30,13 @@ import (
var homeDir, _ = os.UserHomeDir()
var StacksDir = filepath.Join(homeDir, ".firefly", "stacks")

type DatabaseSelection int

const (
PostgreSQL DatabaseSelection = iota
SQLite3
)

var DBSelectionStrings = []string{"postgres", "sqlite3"}

func (db DatabaseSelection) String() string {
return DBSelectionStrings[db]
}

func DatabaseSelectionFromString(s string) (DatabaseSelection, error) {
for i, dbSelection := range DBSelectionStrings {
if strings.ToLower(s) == dbSelection {
return DatabaseSelection(i), nil
}
}
return SQLite3, fmt.Errorf("\"%s\" is not a valid database selection. valid options are: %v", s, DBSelectionStrings)
}

type Stack struct {
Name string `json:"name,omitempty"`
Members []*Member `json:"members,omitempty"`
SwarmKey string `json:"swarmKey,omitempty"`
ExposedGethPort int `json:"exposedGethPort,omitempty"`
Database string `json:"database"`
Name string `json:"name,omitempty"`
Members []*Member `json:"members,omitempty"`
SwarmKey string `json:"swarmKey,omitempty"`
ExposedGethPort int `json:"exposedGethPort,omitempty"`
Database string `json:"database"`
BlockchainProvider string `json:"blockchainProvider"`
}

type Member struct {
Expand All @@ -83,11 +61,12 @@ type StartOptions struct {
}

type InitOptions struct {
FireFlyBasePort int
ServicesBasePort int
DatabaseSelection string
Verbose bool
ExternalProcesses int
FireFlyBasePort int
ServicesBasePort int
DatabaseSelection DatabaseSelection
Verbose bool
ExternalProcesses int
BlockchainProvider BlockchainProvider
}

func ListStacks() ([]string, error) {
Expand All @@ -110,18 +89,13 @@ func ListStacks() ([]string, error) {
}

func InitStack(stackName string, memberCount int, options *InitOptions) error {

dbSelection, err := DatabaseSelectionFromString(options.DatabaseSelection)
if err != nil {
return err
}

stack := &Stack{
Name: stackName,
Members: make([]*Member, memberCount),
SwarmKey: GenerateSwarmKey(),
ExposedGethPort: options.ServicesBasePort,
Database: dbSelection.String(),
Name: stackName,
Members: make([]*Member, memberCount),
SwarmKey: GenerateSwarmKey(),
ExposedGethPort: options.ServicesBasePort,
Database: options.DatabaseSelection.String(),
BlockchainProvider: options.BlockchainProvider.String(),
}

for i := 0; i < memberCount; i++ {
Expand Down
68 changes: 68 additions & 0 deletions internal/stacks/types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// Copyright © 2021 Kaleido, Inc.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package stacks

import (
"fmt"
"strings"
)

type DatabaseSelection int

const (
PostgreSQL DatabaseSelection = iota
SQLite3
)

var DBSelectionStrings = []string{"postgres", "sqlite3"}

func (db DatabaseSelection) String() string {
return DBSelectionStrings[db]
}

func DatabaseSelectionFromString(s string) (DatabaseSelection, error) {
for i, dbSelection := range DBSelectionStrings {
if strings.ToLower(s) == dbSelection {
return DatabaseSelection(i), nil
}
}
return SQLite3, fmt.Errorf("\"%s\" is not a valid database selection. valid options are: %v", s, DBSelectionStrings)
}

type BlockchainProvider int

const (
GoEthereum BlockchainProvider = iota
HyperledgerBesu
HyperledgerFabric
Corda
)

var BlockchainProviderStrings = []string{"geth", "besu", "fabric", "corda"}

func (blockchainProvider BlockchainProvider) String() string {
return BlockchainProviderStrings[blockchainProvider]
}

func BlockchainProviderFromString(s string) (BlockchainProvider, error) {
for i, blockchainProviderSelection := range BlockchainProviderStrings {
if strings.ToLower(s) == blockchainProviderSelection {
return BlockchainProvider(i), nil
}
}
return GoEthereum, fmt.Errorf("\"%s\" is not a valid blockchain provider selection. valid options are: %v", s, BlockchainProviderStrings)
}

0 comments on commit 253ea11

Please sign in to comment.