in resource/resolver/existing_dependency_resolver.go [38:109]
func NewExistingDependencyResolver(workingDirectory string) ExistingDependencyResolver {
azurermDeps := dependency.LoadAzurermDependencies()
azurermTypeAzureResourceTypeMap := make(map[string]string)
for _, dep := range azurermDeps {
azurermTypeAzureResourceTypeMap[dep.ResourceName] = dep.AzureResourceType
}
files, err := os.ReadDir(workingDirectory)
if err != nil {
logrus.Warnf("reading dir %s: %+v", workingDirectory, err)
return ExistingDependencyResolver{}
}
existDeps := make([]dependency.Dependency, 0)
for _, file := range files {
if !strings.HasSuffix(file.Name(), ".tf") {
continue
}
src, err := os.ReadFile(path.Join(workingDirectory, file.Name()))
if err != nil {
logrus.Warnf("reading file %s: %+v", file.Name(), err)
continue
}
f, diag := hclwrite.ParseConfig(src, file.Name(), hcl.InitialPos)
if diag.HasErrors() {
logrus.Warnf("parsing file %s: %+v", file.Name(), diag.Error())
continue
}
if f == nil || f.Body() == nil {
logrus.Debugf("empty file %s", file.Name())
continue
}
for _, block := range f.Body().Blocks() {
labels := block.Labels()
if len(labels) >= 2 {
switch {
case strings.HasPrefix(labels[0], "azapi_"):
typeValue := utils.AttributeValue(block.Body().GetAttribute("type"))
parts := strings.Split(typeValue, "@")
if len(parts) != 2 {
logrus.Warnf("invalid type value %s (labels: %v, filename: %s)", typeValue, labels, file.Name())
continue
}
logrus.Debugf("found existing azapi dependency: %s (labels: %v, filename: %s)", parts[0], labels, file.Name())
existDeps = append(existDeps, dependency.Dependency{
AzureResourceType: parts[0],
ApiVersion: parts[1],
ExampleConfiguration: string(block.BuildTokens(nil).Bytes()),
ResourceKind: block.Type(),
ReferredProperty: "id",
ResourceName: labels[0],
ResourceLabel: labels[1],
})
case strings.HasPrefix(labels[0], "azurerm_"):
azureResourceType := azurermTypeAzureResourceTypeMap[labels[0]]
logrus.Debugf("found existing azurerm dependency: %s (labels: %v, filename: %s)", azureResourceType, labels, file.Name())
existDeps = append(existDeps, dependency.Dependency{
AzureResourceType: azureResourceType,
ApiVersion: "",
ExampleConfiguration: string(block.BuildTokens(nil).Bytes()),
ResourceKind: block.Type(),
ReferredProperty: "id",
ResourceName: labels[0],
ResourceLabel: labels[1],
})
}
}
}
}
logrus.Infof("found %d existing dependencies", len(existDeps))
return ExistingDependencyResolver{
ExistingDependencies: existDeps,
}
}