From 534f7f630f12c04de72deb0945c98d67123b9fe2 Mon Sep 17 00:00:00 2001
From: Olgun Cengiz <olgun.cengiz@vereign.com>
Date: Mon, 26 Oct 2020 15:51:12 +0300
Subject: [PATCH] fixed comments

---
 config/configs.go | 109 ++++++++++++++++++++--------------------------
 main.go           |  10 +----
 2 files changed, 49 insertions(+), 70 deletions(-)

diff --git a/config/configs.go b/config/configs.go
index 39302db..0080afc 100644
--- a/config/configs.go
+++ b/config/configs.go
@@ -6,10 +6,10 @@ import (
 	"io/ioutil"
 	"os"
 	"path/filepath"
-	"reflect"
 	"strings"
 
 	"code.vereign.com/code/viam-apis/clientutils"
+	"code.vereign.com/code/viam-apis/config"
 	"code.vereign.com/code/viam-apis/errors"
 
 	"code.vereign.com/code/viam-apis/log"
@@ -25,47 +25,60 @@ var SystemAuth = &authentication.Authentication{
 	Session: "undefined",
 }
 
-const tagValidation = "validation"
-
 type Configuration struct {
-	ListenAddress        string `validation:"optional" yaml:"listenAddress"`
-	GrpcListenAddress    string `validation:"optional" yaml:"grpcListenAddress"`
+	ListenAddress        string `required:"false" yaml:"listenAddress"`
+	GrpcListenAddress    string `required:"false" yaml:"grpcListenAddress"`
 	SystemAuthentication struct {
-		UUID    string `validation:"optional" yaml:"viamUUID"`
-		Session string `validation:"optional" yaml:"viamSession"`
-	} `validation:"optional" yaml:"systemAuthentication"`
-	DataStorageAgentURL        string `validation:"optional" yaml:"dataStorageAgentURL"`
-	EntitiesManagementAgentURL string `validation:"optional" yaml:"entitiesManagementAgentURL"`
-	MaxMessageSize             int    `validation:"optional" yaml:"maxMessageSize"`
+		UUID    string `required:"false" yaml:"viamUUID"`
+		Session string `required:"false" yaml:"viamSession"`
+	} `required:"false" yaml:"systemAuthentication"`
+	DataStorageAgentURL        string `required:"false" yaml:"dataStorageAgentURL"`
+	EntitiesManagementAgentURL string `required:"false" yaml:"entitiesManagementAgentURL"`
+	MaxMessageSize             int    `required:"false" yaml:"maxMessageSize"`
 	Certification              struct {
-		Path                      string              `validation:"required" yaml:"path"`
-		CertificateFile           string              `validation:"required" yaml:"certificateFile"`
-		CertificatePEM            []byte              `validation:"calculated" yaml:"certificatePEM"`
-		PrivateKeyFile            string              `validation:"required" yaml:"privateKeyFile"`
-		PrivateKeyPEM             []byte              `validation:"calculated" yaml:"privateKeyPEM"`
-		CaCertificateFile         string              `validation:"required" yaml:"caCertificateFile"`
-		CaCertificatePEM          []byte              `validation:"calculated" yaml:"caCertificatePEM"`
-		EncryptionCertificateFile string              `validation:"required" yaml:"encryptionCertificateFile"`
-		EncryptionCertificatePEM  []byte              `validation:"calculated" yaml:"encryptionCertificatePEM"`
-		EncryptionCertificate     []*x509.Certificate `validation:"calculated" yaml:"encryptionCertificate"`
-		EncryptionPrivateKeyFile  string              `validation:"required" yaml:"encryptionPrivateKeyFile"`
-		EncryptionPrivateKeyPEM   []byte              `validation:"calculated" yaml:"encryptionPrivateKeyPEM"`
-		EncryptionPrivateKey      crypto.Signer       `validation:"calculated" yaml:"encryptionPrivateKey"`
-		VereignCertificateFile    string              `validation:"required" yaml:"vereignCertificateFile"`
-		VereignCertificatePEM     []byte              `validation:"calculated" yaml:"vereignCertificatePEM"`
-	} `validation:"required" yaml:"certification"`
-	PrometeusListenAddress  string `validation:"optional" yaml:"prometeusListenAddress"`
-	MetricEnvironmentPrefix string `validation:"optional" yaml:"metricEnvironmentPrefix"`
-	ReplaceKey              bool   `validation:"optional" yaml:"replaceKey"`
-	GlobalLogLevel          string `validation:"optional" yaml:"globalLogLevel"`
+		Path                      string              `required:"true" yaml:"path"`
+		CertificateFile           string              `required:"true" yaml:"certificateFile"`
+		CertificatePEM            []byte              `required:"true"`
+		PrivateKeyFile            string              `required:"true" yaml:"privateKeyFile"`
+		PrivateKeyPEM             []byte              `required:"true"`
+		CaCertificateFile         string              `required:"true" yaml:"caCertificateFile"`
+		CaCertificatePEM          []byte              `required:"true"`
+		EncryptionCertificateFile string              `required:"true" yaml:"encryptionCertificateFile"`
+		EncryptionCertificatePEM  []byte              `required:"true"`
+		EncryptionCertificate     []*x509.Certificate `required:"true"`
+		EncryptionPrivateKeyFile  string              `required:"true" yaml:"encryptionPrivateKeyFile"`
+		EncryptionPrivateKeyPEM   []byte              `required:"true"`
+		EncryptionPrivateKey      crypto.Signer       `required:"true"`
+		VereignCertificateFile    string              `required:"true" yaml:"vereignCertificateFile"`
+		VereignCertificatePEM     []byte              `required:"true"`
+	} `required:"true" yaml:"certification"`
+	PrometeusListenAddress  string `required:"false" yaml:"prometeusListenAddress"`
+	MetricEnvironmentPrefix string `required:"false" yaml:"metricEnvironmentPrefix"`
+	ReplaceKey              bool   `required:"false" yaml:"replaceKey"`
+	GlobalLogLevel          string `required:"false" yaml:"globalLogLevel"`
 }
 
 var Config Configuration
 
+// LoadConfigValues loads config values from config file
+func LoadConfigValues(configFile, etcdURL string) error {
+	setConfigValues(configFile, etcdURL)
+
+	calculateConfigValues()
+
+	err := config.CheckConfigValues(Config)
+	if err != nil {
+		log.Fatalf("Exiting due to wrong configuration: %s", err)
+		return err
+	}
+
+	return nil
+}
+
 // SetConfigValues Sets Values For Config Variable
-func SetConfigValues(configFile, etcdURL string) {
+func setConfigValues(configFile, etcdURL string) {
 	// Set default values for configuration variable
-	// NOTE: Only for 'validation:"optional"' fields
+	// NOTE: Only for 'required:"false"' fields
 	Config.ListenAddress = ":7878"
 	Config.GrpcListenAddress = ":7877"
 	Config.SystemAuthentication.UUID = "viam-system"
@@ -122,36 +135,8 @@ func SetConfigValues(configFile, etcdURL string) {
 	}
 }
 
-// CheckConfigValues checks if there is any missing required fields in configuration
-func CheckConfigValues(configs interface{}) error {
-	structIterator := reflect.ValueOf(configs)
-	for i := 0; i < structIterator.NumField(); i++ {
-		field := structIterator.Type().Field(i).Name
-		val := structIterator.Field(i).Interface()
-		tR := structIterator.Type().Field(i).Tag.Get(tagValidation)
-		log.Printf("%v: %v", field, val)
-
-		if tR == "required" {
-			if structIterator.Field(i).Kind() == reflect.Struct {
-				if err := CheckConfigValues(structIterator.Field(i).Interface()); err != nil {
-					return err
-				}
-			}
-
-			if reflect.DeepEqual(val, reflect.Zero(structIterator.Field(i).Type()).Interface()) {
-				// Check if the field is zero-valued, meaning it won't be updated
-				return errors.NewFormat("Empty value for required field: %v", field)
-			}
-		} else if tR != "optional" && tR != "calculated" {
-			return errors.NewFormat("Wrong validation type for field: %v (Must be 'optional', 'required' or 'calculated')", field)
-		}
-	}
-
-	return nil
-}
-
 // CalculateConfigValues calculates config values using provided configuraion
-func CalculateConfigValues() {
+func calculateConfigValues() {
 	SystemAuth.Uuid = Config.SystemAuthentication.UUID
 	SystemAuth.Session = Config.SystemAuthentication.Session
 
diff --git a/main.go b/main.go
index 783a2f2..6bf6456 100644
--- a/main.go
+++ b/main.go
@@ -39,18 +39,12 @@ func main() {
 		return
 	}
 
-	log.Printf("Setting configuration values...")
-	config.SetConfigValues(*configFile, *etcdURL)
-
-	log.Printf("Checking configuration values...")
-	err := config.CheckConfigValues(config.Config)
+	log.Printf("Loading configuration values...")
+	err := config.LoadConfigValues(*configFile, *etcdURL)
 	if err != nil {
 		log.Fatalf("Exiting due to wrong configuration: %s", err)
 	}
 
-	log.Printf("Calculating configuration values...")
-	config.CalculateConfigValues()
-
 	grpcAddress := config.Config.GrpcListenAddress
 	restAddress := config.Config.ListenAddress
 	dataStorageAddress := config.Config.DataStorageAgentURL
-- 
GitLab