Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 50 additions & 13 deletions cmd/topology/topology_inspect.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ func RunInspectCommand(
)

request := stackstate_api.NewViewSnapshotRequest(
"SnapshotRequest",
Comment thread
deontaljaard marked this conversation as resolved.
query,
"0.0.1",
*metadata,
Expand Down Expand Up @@ -160,7 +159,7 @@ type Component struct {
}

type ComponentMetadata struct {
ComponentTypes map[int64]string
ComponentTypes map[string]string
Layers map[int64]string
Domains map[int64]string
Environments map[int64]string
Expand Down Expand Up @@ -256,19 +255,28 @@ func parseSnapshotResponse(
// all metadata categories in a single loop.
var metadataFieldMapping = []struct {
field string
setter func(*ComponentMetadata) *map[int64]string
setter func(*ComponentMetadata, interface{}) error
}{
{"componentTypes", func(m *ComponentMetadata) *map[int64]string { return &m.ComponentTypes }},
{"layers", func(m *ComponentMetadata) *map[int64]string { return &m.Layers }},
{"domains", func(m *ComponentMetadata) *map[int64]string { return &m.Domains }},
{"environments", func(m *ComponentMetadata) *map[int64]string { return &m.Environments }},
{"componentTypes", parseComponentTypesField},
{"layers", func(m *ComponentMetadata, val interface{}) error {
Comment thread
fvlankvelt marked this conversation as resolved.
Outdated
m.Layers = parseMetadataField(val)
return nil
}},
{"domains", func(m *ComponentMetadata, val interface{}) error {
m.Domains = parseMetadataField(val)
return nil
}},
{"environments", func(m *ComponentMetadata, val interface{}) error {
m.Environments = parseMetadataField(val)
return nil
}},
}

// parseMetadata extracts component type, layer, domain, and environment metadata
// from the opaque Snapshot response using a table-driven approach.
func parseMetadata(respMap map[string]interface{}) ComponentMetadata {
metadata := ComponentMetadata{
ComponentTypes: make(map[int64]string),
ComponentTypes: make(map[string]string),
Layers: make(map[int64]string),
Domains: make(map[int64]string),
Environments: make(map[int64]string),
Expand All @@ -281,13 +289,42 @@ func parseMetadata(respMap map[string]interface{}) ComponentMetadata {

for _, mapping := range metadataFieldMapping {
if fieldValue, ok := metadataMap[mapping.field]; ok {
*mapping.setter(&metadata) = parseMetadataField(fieldValue)
mapping.setter(&metadata, fieldValue) //nolint:errcheck
}
}

return metadata
}

// parseComponentTypesField extracts component types from metadata, using identifier as key
func parseComponentTypesField(m *ComponentMetadata, metadataValue interface{}) error {
if metadataValue == nil {
return nil
}

items, ok := metadataValue.([]interface{})
if !ok {
return nil
}

for _, item := range items {
if itemMap, ok := item.(map[string]interface{}); ok {
var key string
if identifier, ok := itemMap["identifier"].(string); ok {
key = identifier
} else {
continue
}

if name, ok := itemMap["name"].(string); ok {
m.ComponentTypes[key] = name
}
}
}

return nil
}

// parseMetadataField extracts id/name pairs from a metadata field.
// Each item in the slice should have "id" and "name" fields.
func parseMetadataField(metadataValue interface{}) map[int64]string {
Expand Down Expand Up @@ -331,12 +368,12 @@ func parseComponentFromMap(compMap map[string]interface{}, metadata ComponentMet
comp.Name = name
}

// Parse type (first id and then lookup from component type metadata)
if typeID, ok := compMap["type"].(float64); ok {
if typeName, found := metadata.ComponentTypes[int64(typeID)]; found {
// Parse type from typeIdentifier and lookup from component type metadata
if typeIdentifier, ok := compMap["typeIdentifier"].(string); ok {
Comment thread
fvlankvelt marked this conversation as resolved.
if typeName, found := metadata.ComponentTypes[typeIdentifier]; found {
comp.Type = typeName
} else {
comp.Type = fmt.Sprintf("Unknown (%d)", int64(typeID))
comp.Type = "Unknown" //nolint:goconst
}
}

Expand Down
9 changes: 4 additions & 5 deletions cmd/topology/topology_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ func RunStateCommand(
)

request := stackstate_api.NewViewSnapshotRequest(
"SnapshotRequest",
Comment thread
deontaljaard marked this conversation as resolved.
query,
"0.0.1",
*metadata,
Expand Down Expand Up @@ -174,12 +173,12 @@ func parseComponentStateFromMap(compMap map[string]interface{}, metadata Compone
cs.Name = name
}

// Parse type
if typeID, ok := compMap["type"].(float64); ok {
if typeName, found := metadata.ComponentTypes[int64(typeID)]; found {
// Parse type from typeIdentifier and lookup from component type metadata
if typeIdentifier, ok := compMap["typeIdentifier"].(string); ok {
if typeName, found := metadata.ComponentTypes[typeIdentifier]; found {
cs.Type = typeName
} else {
cs.Type = fmt.Sprintf("Unknown (%d)", int64(typeID))
cs.Type = "Unknown"
}
}

Expand Down
18 changes: 9 additions & 9 deletions cmd/topology/topology_test_helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ func mockSnapshotResponse() sts.QuerySnapshotResult {
"_type": "ViewSnapshot",
"components": []interface{}{
map[string]interface{}{
"id": float64(229404307680647),
"name": "test-component",
"type": float64(239975151751041),
"layer": float64(186771622698247),
"domain": float64(209616858431909),
"identifiers": []interface{}{"urn:test:component:1"},
"tags": []interface{}{"service.namespace:test"},
"id": float64(229404307680647),
"name": "test-component",
"typeIdentifier": "urn:test:component-type:test",
"layer": float64(186771622698247),
"domain": float64(209616858431909),
"identifiers": []interface{}{"urn:test:component:1"},
"tags": []interface{}{"service.namespace:test"},
"state": map[string]interface{}{
"healthState": "CRITICAL",
},
Expand All @@ -27,8 +27,8 @@ func mockSnapshotResponse() sts.QuerySnapshotResult {
"metadata": map[string]interface{}{
"componentTypes": []interface{}{
map[string]interface{}{
"id": float64(239975151751041),
"name": "test type",
"identifier": "urn:test:component-type:test",
"name": "test type",
},
},
"layers": []interface{}{
Expand Down
Loading
Loading