server/cmd/client/start.go (213 lines of code) (raw):

package main import ( "context" "io" "os" "time" "dev.azure.com/service-hub-flg/service_hub_validation/_git/service_hub_validation_service.git/mygreeterv3/api/v1/client" "dev.azure.com/service-hub-flg/service_hub_validation/_git/service_hub_validation_service.git/mygreeterv3/server/internal/logattrs" "strconv" pb "dev.azure.com/service-hub-flg/service_hub_validation/_git/service_hub_validation_service.git/mygreeterv3/api/v1" "dev.azure.com/service-hub-flg/service_hub_validation/_git/service_hub_validation_service.git/mygreeterv3/api/v1/restsdk" "github.com/Azure/aks-middleware/grpc/interceptor" "github.com/Azure/aks-middleware/http/client/direct/restlogger" "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" "strings" log "log/slog" "github.com/spf13/cobra" ) var startCmd = &cobra.Command{ Use: "hello", Short: "Call SayHello", Run: hello, } var output io.Writer = os.Stdout type Options struct { RemoteAddr string HttpAddr string JsonLog bool Name string Age int32 Email string Address string IntervalMilliSec int64 RgName string RgRegion string CallAllRGOps bool } var options = newOptions() func init() { rootCmd.AddCommand(startCmd) startCmd.Flags().StringVar(&options.RemoteAddr, "remote-addr", options.RemoteAddr, "the remote server's addr for this client to connect to") startCmd.Flags().StringVar(&options.HttpAddr, "http-addr", options.HttpAddr, "the remote http gateway addr") startCmd.Flags().BoolVar(&options.JsonLog, "json-log", options.JsonLog, "The format of the log is json or user friendly key-value pairs") startCmd.Flags().StringVar(&options.Name, "name", options.Name, "The name to send in Hello request") startCmd.Flags().Int32Var(&options.Age, "age", options.Age, "The age to send in Hello request") startCmd.Flags().StringVar(&options.Email, "email", options.Email, "The email to send in Hello request") startCmd.Flags().StringVar(&options.Address, "address", options.Address, "The address to send in Hello request") startCmd.Flags().Int64Var(&options.IntervalMilliSec, "interval-milli-sec", options.IntervalMilliSec, "The interval between two requests. Negative numbers mean sending one request.") startCmd.Flags().StringVar(&options.RgName, "rg-name", options.RgName, "The name of the resource group") startCmd.Flags().StringVar(&options.RgRegion, "rg-region", options.RgRegion, "The region of the resource group") startCmd.Flags().BoolVar(&options.CallAllRGOps, "call-all-rg-ops", options.CallAllRGOps, "Call all resource group operations") } func newOptions() Options { return Options{ RemoteAddr: "localhost:50051", HttpAddr: "http://localhost:50061", JsonLog: false, Name: "MyName", Age: 53, Email: "test@test.com", Address: "123 Main St, Seattle, WA 98101", IntervalMilliSec: -1, RgName: "MyGreeter-resource-group", RgRegion: "eastus", CallAllRGOps: true, } } func SetOutput(out io.Writer) { output = out } func hello(cmd *cobra.Command, args []string) { logger := log.New(log.NewTextHandler(output, nil).WithAttrs(logattrs.GetAttrs())) if options.JsonLog { logger = log.New(log.NewJSONHandler(output, nil).WithAttrs(logattrs.GetAttrs())) } log.SetDefault(logger) client, err := client.NewClient(options.RemoteAddr, interceptor.GetClientInterceptorLogOptions(logger, logattrs.GetAttrs())) // logging the error for transparency, retry interceptor will handle it if err != nil { log.Error("did not connect: " + err.Error()) } if options.IntervalMilliSec < 0 { SayHello(client, options.Name, options.Age, options.Email, options.Address, logger) return } for { SayHello(client, options.Name, options.Age, options.Email, options.Address, logger) time.Sleep(time.Duration(options.IntervalMilliSec) * time.Millisecond) } } func SayHello(client pb.MyGreeterClient, name string, age int32, email string, address string, logger *log.Logger) { ctx := context.Background() addressParts := strings.Split(address, ",") street := addressParts[0] city := addressParts[1] stateAndZip := strings.Split(addressParts[2], " ") state := stateAndZip[1] parseZipcode, _ := strconv.ParseInt(stateAndZip[2], 10, 32) zipcode := int32(parseZipcode) addr := &pb.Address{ Street: street, City: city, State: state, Zipcode: zipcode, } r, err := client.SayHello(ctx, &pb.HelloRequest{Name: name, Age: age, Email: email, Address: addr}) if err != nil { log.Info("SayHello error: " + err.Error()) } else { log.Info("Response message: " + r.GetMessage()) } tags := map[string]string{ "tag1": "value1", "tag2": "value2", } // Create a new Configuration instance cfg := &restsdk.Configuration{ BasePath: options.HttpAddr, DefaultHeader: make(map[string]string), UserAgent: "Swagger-Codegen/1.0.0/go", HTTPClient: restlogger.NewLoggingClient(logger), } apiClient := restsdk.NewAPIClient(cfg) service := apiClient.MyGreeterApi // Only update resource groups and perform storage account CRUDL ops // in int and stg environments due to current MSI role if !options.CallAllRGOps { _, err = client.UpdateResourceGroup(ctx, &pb.UpdateResourceGroupRequest{Name: options.RgName, Tags: tags}) if err != nil { log.Error("Error calling UpdateResourceGroup: " + err.Error()) } _, _, err = service.MyGreeterUpdateResourceGroup(context.Background(), tags, options.RgName) if err != nil { log.Error("Error calling MyGreeterUpdateResourceGroup: " + err.Error()) } resp, createSAErr := client.CreateStorageAccount(ctx, &pb.CreateStorageAccountRequest{RgName: options.RgName, Region: options.RgRegion}) if createSAErr != nil { log.Error("Error calling CreateStorageAccount: " + err.Error()) } storageAccountName := resp.Name _, err = client.ReadStorageAccount(ctx, &pb.ReadStorageAccountRequest{RgName: options.RgName, SaName: storageAccountName}) if err != nil { log.Error("Error calling ReadStorageAccount: " + err.Error()) } _, err = client.UpdateStorageAccount(ctx, &pb.UpdateStorageAccountRequest{RgName: options.RgName, SaName: storageAccountName, Tags: tags}) if err != nil { log.Error("Error calling UpdateStorageAccount: " + err.Error()) } _, err = client.ListStorageAccounts(ctx, &pb.ListStorageAccountRequest{RgName: options.RgName}) if err != nil { log.Error("Error calling ListStorageAccounts: " + err.Error()) } _, err = client.DeleteStorageAccount(ctx, &pb.DeleteStorageAccountRequest{RgName: options.RgName, SaName: storageAccountName}) if err != nil { log.Error("Error calling DeleteStorageAccount: " + err.Error()) } } else { _, err = client.CreateResourceGroup(ctx, &pb.CreateResourceGroupRequest{Name: options.RgName, Region: options.RgRegion}) if err != nil { log.Error("Error calling CreateResourceGroup: " + err.Error()) } _, err = client.ReadResourceGroup(ctx, &pb.ReadResourceGroupRequest{Name: options.RgName}) if err != nil { log.Error("Error calling ReadResourceGroup: " + err.Error()) } _, err = client.UpdateResourceGroup(ctx, &pb.UpdateResourceGroupRequest{Name: options.RgName, Tags: tags}) if err != nil { log.Error("Error calling UpdateResourceGroup: " + err.Error()) } _, err = client.ListResourceGroups(ctx, &emptypb.Empty{}) if err != nil { log.Error("Error calling ListResourceGroup: " + err.Error()) } _, err = client.DeleteResourceGroup(ctx, &pb.DeleteResourceGroupRequest{Name: options.RgName}) if err != nil { log.Error("Error calling DeleteResourceGroup: " + err.Error()) } createRequestBody := restsdk.CreateResourceGroupRequest{ Name: options.RgName, Region: options.RgRegion, } _, _, err = service.MyGreeterCreateResourceGroup(context.Background(), createRequestBody) if err != nil { log.Error("Error calling MyGreeterCreateResourceGroup: " + err.Error()) } _, _, err = service.MyGreeterReadResourceGroup(context.Background(), options.RgName) if err != nil { log.Error("Error calling MyGreeterReadResourceGroup: " + err.Error()) } _, _, err = service.MyGreeterUpdateResourceGroup(context.Background(), tags, options.RgName) if err != nil { log.Error("Error calling MyGreeterUpdateResourceGroup: " + err.Error()) } _, _, err = service.MyGreeterListResourceGroups(context.Background()) if err != nil { log.Error("Error calling MyGreeterListResourceGroups: " + err.Error()) } _, _, err = service.MyGreeterDeleteResourceGroup(context.Background(), options.RgName) if err != nil { log.Error("Error calling MyGreeterDeleteResourceGroup: " + err.Error()) } } protoExpirationTime := timestamppb.New(time.Now().Add(1 * time.Hour)) startOperationRequest := &pb.StartLongRunningOperationRequest{ EntityId: "20", EntityType: "Cluster", ExpirationTimestamp: protoExpirationTime, } startOperationResponse, err := client.StartLongRunningOperation(ctx, startOperationRequest) if err != nil { log.Error("Error calling StartOperation: " + err.Error()) } else { log.Info("Started operation with operationId: " + startOperationResponse.GetOperationId()) } }