package classify import "tea.karlcom.de/karl/bucketeer/internal/model" func azure(service model.Service, resource, region string) model.Match { return model.Match{ Provider: model.ProviderAzure, Service: service, ResourceSpecific: true, Region: region, Resource: resource, } } // classifyAzureCore handles *.blob|dfs|file|queue|table|web.core.windows.net. func classifyAzureCore(s *scanner) (model.Match, bool) { n := s.n if n < 5 || s.label(n-1) != "net" || s.label(n-2) != "windows" || s.label(n-3) != "core" { return model.Match{}, false } svc := s.label(n - 4) resource := s.label(0) if resource == "" { return model.Match{}, false } switch svc { case "blob", "dfs": return azure(model.ServiceBlobStorage, resource, ""), true case "file": return azure(model.ServiceFileStorage, resource, ""), true case "queue": return azure(model.ServiceQueue, resource, ""), true case "table": return azure(model.ServiceTableStorage, resource, ""), true case "web": return azure(model.ServiceWebApp, resource, ""), true } return model.Match{}, false } // classifyAzureDatabase handles .database.windows.net. func classifyAzureDatabase(s *scanner) (model.Match, bool) { n := s.n if n < 4 || s.label(n-1) != "net" || s.label(n-2) != "windows" || s.label(n-3) != "database" { return model.Match{}, false } return azure(model.ServiceDatabase, s.label(0), ""), true } // classifyAzureFlexibleServer handles .{postgres,mysql}.database.azure.com. func classifyAzureFlexibleServer(s *scanner) (model.Match, bool) { n := s.n if n < 5 || s.label(n-1) != "com" || s.label(n-2) != "azure" || s.label(n-3) != "database" { return model.Match{}, false } switch s.label(n - 4) { case "postgres": return azure(model.ServicePostgres, s.label(0), ""), true case "mysql": return azure(model.ServiceMySQL, s.label(0), ""), true } return model.Match{}, false } // classifyAzureDocuments handles .documents.azure.com (Cosmos DB). func classifyAzureDocuments(s *scanner) (model.Match, bool) { n := s.n if n < 4 || s.label(n-1) != "com" || s.label(n-2) != "azure" || s.label(n-3) != "documents" { return model.Match{}, false } return azure(model.ServiceCosmosDB, s.label(0), ""), true } // classifyAzureCosmos handles .{mongo,cassandra,gremlin}.cosmos.azure.com. func classifyAzureCosmos(s *scanner) (model.Match, bool) { n := s.n if n < 5 || s.label(n-1) != "com" || s.label(n-2) != "azure" || s.label(n-3) != "cosmos" { return model.Match{}, false } switch s.label(n - 4) { case "mongo", "cassandra", "gremlin": return azure(model.ServiceCosmosDB, s.label(0), ""), true } return model.Match{}, false } // classifyAzureRedis handles .redis.cache.windows.net. func classifyAzureRedis(s *scanner) (model.Match, bool) { n := s.n if n < 5 || s.label(n-1) != "net" || s.label(n-2) != "windows" || s.label(n-3) != "cache" || s.label(n-4) != "redis" { return model.Match{}, false } return azure(model.ServiceRedis, s.label(0), ""), true } // classifyAzureManagedRedis handles .redis.azure.net. func classifyAzureManagedRedis(s *scanner) (model.Match, bool) { n := s.n if n < 4 || s.label(n-1) != "net" || s.label(n-2) != "azure" || s.label(n-3) != "redis" { return model.Match{}, false } return azure(model.ServiceRedis, s.label(0), ""), true } // classifyAzureSearch handles .search.windows.net. func classifyAzureSearch(s *scanner) (model.Match, bool) { n := s.n if n < 4 || s.label(n-1) != "net" || s.label(n-2) != "windows" || s.label(n-3) != "search" { return model.Match{}, false } return azure(model.ServiceSearch, s.label(0), ""), true }