Skip to content

Commit 3aba163

Browse files
authored
Merge pull request #111 from yjinjo/master
Modify local environment
2 parents 6f80174 + 24b1280 commit 3aba163

File tree

5 files changed

+125
-6
lines changed

5 files changed

+125
-6
lines changed

cmd/common/api_resources.go

+30-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/spf13/viper"
1818
"google.golang.org/grpc"
1919
"google.golang.org/grpc/credentials"
20+
"google.golang.org/grpc/credentials/insecure"
2021
"google.golang.org/grpc/metadata"
2122
"google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
2223
"gopkg.in/yaml.v3"
@@ -101,6 +102,8 @@ func FetchServiceResources(serviceName, endpoint string, shortNamesMap map[strin
101102
}
102103
creds := credentials.NewTLS(tlsConfig)
103104
opts = append(opts, grpc.WithTransportCredentials(creds))
105+
} else if scheme == "grpc" {
106+
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
104107
} else {
105108
return nil, fmt.Errorf("unsupported scheme: %s", scheme)
106109
}
@@ -150,7 +153,33 @@ func FetchServiceResources(serviceName, endpoint string, shortNamesMap map[strin
150153
if strings.HasPrefix(s, "grpc.reflection.") {
151154
continue
152155
}
153-
if !strings.Contains(s, fmt.Sprintf(".%s.", serviceName)) {
156+
157+
displayServiceName := serviceName
158+
if strings.HasPrefix(endpoint, "grpc://") && (strings.Contains(endpoint, "localhost") || strings.Contains(endpoint, "127.0.0.1")) {
159+
parts := strings.Split(s, ".")
160+
if len(parts) > 2 {
161+
serviceDesc, err := refClient.ResolveService(s)
162+
if err != nil {
163+
log.Printf("Failed to resolve service %s: %v", s, err)
164+
continue
165+
}
166+
167+
resourceName := s[strings.LastIndex(s, ".")+1:]
168+
verbs := []string{}
169+
for _, method := range serviceDesc.GetMethods() {
170+
verbs = append(verbs, method.GetName())
171+
}
172+
173+
sort.Strings(verbs)
174+
data = append(data, []string{
175+
displayServiceName,
176+
strings.Join(verbs, ", "),
177+
resourceName,
178+
"",
179+
})
180+
continue
181+
}
182+
} else if !strings.Contains(s, fmt.Sprintf(".%s.", serviceName)) {
154183
continue
155184
}
156185

cmd/root.go

+77
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"os"
@@ -11,6 +12,9 @@ import (
1112
"github.com/cloudforet-io/cfctl/cmd/common"
1213
"github.com/cloudforet-io/cfctl/pkg/configs"
1314
"github.com/cloudforet-io/cfctl/pkg/transport"
15+
"github.com/jhump/protoreflect/grpcreflect"
16+
"google.golang.org/grpc"
17+
"google.golang.org/grpc/reflection/grpc_reflection_v1alpha"
1418
"gopkg.in/yaml.v3"
1519

1620
"github.com/spf13/viper"
@@ -257,6 +261,79 @@ func addDynamicServiceCommands() error {
257261
endpointName := config.Endpoint
258262
var apiEndpoint string
259263

264+
// For local environment
265+
if strings.HasPrefix(config.Endpoint, "grpc://") {
266+
endpoint := strings.TrimPrefix(config.Endpoint, "grpc://")
267+
268+
conn, err := grpc.Dial(endpoint, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithTimeout(time.Second))
269+
if err != nil {
270+
pterm.DefaultBox.WithTitle("Local gRPC Server Not Found").
271+
WithTitleTopCenter().
272+
WithBoxStyle(pterm.NewStyle(pterm.FgYellow)).
273+
Printfln("Unable to connect to local gRPC server.\nPlease make sure your gRPC server is running on %s", config.Endpoint)
274+
return nil
275+
}
276+
defer func(conn *grpc.ClientConn) {
277+
err := conn.Close()
278+
if err != nil {
279+
280+
}
281+
}(conn)
282+
283+
ctx := context.Background()
284+
refClient := grpcreflect.NewClientV1Alpha(ctx, grpc_reflection_v1alpha.NewServerReflectionClient(conn))
285+
defer refClient.Reset()
286+
287+
services, err := refClient.ListServices()
288+
if err != nil {
289+
return err
290+
}
291+
292+
// Check if plugin service exists
293+
hasPlugin := false
294+
microservices := make(map[string]bool)
295+
296+
for _, service := range services {
297+
// Skip grpc reflection and health check services
298+
if strings.HasPrefix(service, "grpc.") {
299+
continue
300+
}
301+
302+
// Handle plugin service
303+
if strings.Contains(service, ".plugin.") {
304+
hasPlugin = true
305+
continue
306+
}
307+
308+
// Handle SpaceONE microservices
309+
if strings.Contains(service, "spaceone.api.") {
310+
parts := strings.Split(service, ".")
311+
if len(parts) >= 4 {
312+
serviceName := parts[2]
313+
// Skip core service and version prefixes
314+
if serviceName != "core" && !strings.HasPrefix(serviceName, "v") {
315+
microservices[serviceName] = true
316+
}
317+
}
318+
}
319+
}
320+
321+
if hasPlugin {
322+
cmd := createServiceCommand(config.Environment)
323+
cmd.GroupID = "available"
324+
rootCmd.AddCommand(cmd)
325+
}
326+
327+
// Add commands for other microservices
328+
for serviceName := range microservices {
329+
cmd := createServiceCommand(serviceName)
330+
cmd.GroupID = "available"
331+
rootCmd.AddCommand(cmd)
332+
}
333+
334+
return nil
335+
}
336+
260337
if strings.HasPrefix(endpointName, "grpc+ssl://") {
261338
apiEndpoint = endpointName
262339
} else if strings.HasPrefix(endpointName, "http://") || strings.HasPrefix(endpointName, "https://") {

pkg/configs/endpoint.go

+12
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ func GetServiceEndpoint(config *Setting, serviceName string) (string, error) {
132132
return "", fmt.Errorf("endpoint not found in environment config")
133133
}
134134

135+
if strings.HasPrefix(envConfig.Endpoint, "grpc://") {
136+
if strings.Contains(envConfig.Endpoint, "localhost") {
137+
return envConfig.Endpoint, nil
138+
}
139+
}
140+
135141
// Get console API endpoint
136142
apiEndpoint, err := GetAPIEndpoint(envConfig.Endpoint)
137143
if err != nil {
@@ -163,6 +169,12 @@ func GetServiceEndpoint(config *Setting, serviceName string) (string, error) {
163169
}
164170

165171
func FetchEndpointsMap(endpoint string) (map[string]string, error) {
172+
if strings.HasPrefix(endpoint, "grpc://") {
173+
endpointsMap := make(map[string]string)
174+
endpointsMap["local"] = endpoint
175+
return endpointsMap, nil
176+
}
177+
166178
// Get identity service endpoint
167179
identityEndpoint, hasIdentityService, err := GetIdentityEndpoint(endpoint)
168180
listEndpointsUrl := endpoint + "/identity/endpoint/list"

pkg/format/output.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func RenderTable(data [][]string) {
123123
previousService := ""
124124

125125
// Create table with headers
126-
table := pterm.TableData{{"Service", "Verb", "Resource", "Short Names"}}
126+
table := pterm.TableData{{"Service", "Verb", "Resource", "Alias"}}
127127

128128
for _, row := range data {
129129
service := row[0]

pkg/transport/service.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ func FetchService(serviceName string, verb string, resourceName string, options
183183
var apiEndpoint string
184184
var identityEndpoint string
185185
var hasIdentityService bool
186-
if config.Environment == "local" {
186+
if strings.HasPrefix(config.Environments[config.Environment].Endpoint, "grpc://") {
187187
hostPort = strings.TrimPrefix(config.Environments[config.Environment].Endpoint, "grpc://")
188188
} else {
189189
apiEndpoint, err = configs.GetAPIEndpoint(config.Environments[config.Environment].Endpoint)
@@ -768,12 +768,13 @@ func discoverService(refClient *grpcreflect.Client, serviceName string, resource
768768
}
769769

770770
for _, service := range services {
771-
if strings.Contains(service, fmt.Sprintf("spaceone.api.%s", serviceName)) &&
772-
strings.HasSuffix(service, resourceName) {
771+
if strings.Contains(service, ".plugin.") && strings.HasSuffix(service, resourceName) {
773772
return service, nil
774773
}
774+
}
775775

776-
if strings.Contains(service, serviceName) &&
776+
for _, service := range services {
777+
if strings.Contains(service, fmt.Sprintf("spaceone.api.%s", serviceName)) &&
777778
strings.HasSuffix(service, resourceName) {
778779
return service, nil
779780
}

0 commit comments

Comments
 (0)