dev/import-beats/policy_templates.go (153 lines of code) (raw):

// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one // or more contributor license agreements. Licensed under the Elastic License; // you may not use this file except in compliance with the Elastic License. package main import ( "fmt" "sort" "strings" "github.com/elastic/package-registry/packages" ) type policyTemplateContent struct { moduleName string moduleTitle string inputs map[string]policyTemplateInput // map[inputType].. } type policyTemplateInput struct { dataStreamNames []string packageType string inputType string vars []packages.Variable } func (ptc policyTemplateContent) toMetadataPolicyTemplates() []packages.PolicyTemplate { var inputTypes []string var packageTypes []string for k, input := range ptc.inputs { inputTypes = append(inputTypes, k) packageTypes = append(packageTypes, input.packageType) } packageTypes = uniqueStringValues(packageTypes) sort.Strings(packageTypes) var title, description string if len(packageTypes) == 2 { title = toPolicyTemplateTitleForTwoTypes(ptc.moduleTitle, packageTypes[0], packageTypes[1]) description = toPolicyTemplateDescriptionForTwoTypes(ptc.moduleTitle, packageTypes[0], packageTypes[1]) } else { title = toPolicyTemplateTitle(ptc.moduleTitle, packageTypes[0]) description = toPolicyTemplateDescription(ptc.moduleTitle, packageTypes[0]) } var inputs []packages.Input for _, packageType := range packageTypes { for inputType, input := range ptc.inputs { if input.packageType == packageType { inputs = append(inputs, packages.Input{ Type: input.inputType, Title: toPolicyTemplateInputTitle(ptc.moduleTitle, packageType, ptc.inputs[inputType].dataStreamNames, inputType), Description: toPolicyTemplateInputDescription(ptc.moduleTitle, packageType, ptc.inputs[inputType].dataStreamNames, inputType), Vars: input.vars, }) } } } return []packages.PolicyTemplate{ { Name: ptc.moduleName, Title: title, Description: description, Inputs: inputs, }, } } type updatePolicyTemplateParameters struct { moduleName string moduleTitle string packageType string dataStreams dataStreamContentArray inputVars map[string][]packages.Variable } func updatePolicyTemplate(dsc policyTemplateContent, params updatePolicyTemplateParameters) (policyTemplateContent, error) { dsc.moduleName = params.moduleName dsc.moduleTitle = params.moduleTitle if dsc.inputs == nil { dsc.inputs = map[string]policyTemplateInput{} } for _, dataStream := range params.dataStreams { for _, stream := range dataStream.manifest.Streams { inputType := stream.Input v, ok := dsc.inputs[inputType] if !ok { v = policyTemplateInput{ packageType: params.packageType, inputType: inputType, vars: params.inputVars[inputType], } } v.dataStreamNames = append(v.dataStreamNames, dataStream.name) dsc.inputs[inputType] = v } } return dsc, nil } func toPolicyTemplateTitle(moduleTitle, packageType string) string { return fmt.Sprintf("%s %s", moduleTitle, packageType) } func toPolicyTemplateDescription(moduleTitle, packageType string) string { return fmt.Sprintf("Collect %s from %s instances", packageType, moduleTitle) } func toPolicyTemplateTitleForTwoTypes(moduleTitle, firstPackageType, secondPackageType string) string { return fmt.Sprintf("%s %s and %s", moduleTitle, firstPackageType, secondPackageType) } func toPolicyTemplateDescriptionForTwoTypes(moduleTitle, firstPackageType, secondPackageType string) string { return fmt.Sprintf("Collect %s and %s from %s instances", firstPackageType, secondPackageType, moduleTitle) } func toPolicyTemplateInputTitle(moduleTitle, packageType string, dataStreams []string, inputType string) string { dataStreams = adjustDataStreamNamesForInputDescription(dataStreams) firstPart := dataStreams[:len(dataStreams)-1] secondPart := dataStreams[len(dataStreams)-1:] var description strings.Builder description.WriteString("Collect ") description.WriteString(moduleTitle) description.WriteString(" ") if len(firstPart) > 0 { fp := strings.Join(firstPart, ", ") description.WriteString(fp) description.WriteString(" and ") } description.WriteString(secondPart[0]) description.WriteString(" ") description.WriteString(packageType) if packageType == "logs" && inputType != "logs" { description.WriteString(fmt.Sprintf(" (input: %s)", inputType)) } return description.String() } func toPolicyTemplateInputDescription(moduleTitle, packageType string, dataStreams []string, inputType string) string { dataStreams = adjustDataStreamNamesForInputDescription(dataStreams) firstPart := dataStreams[:len(dataStreams)-1] secondPart := dataStreams[len(dataStreams)-1:] var description strings.Builder description.WriteString("Collecting ") if len(firstPart) > 0 { fp := strings.Join(firstPart, ", ") description.WriteString(fp) description.WriteString(" and ") } description.WriteString(secondPart[0]) description.WriteString(" ") description.WriteString(packageType) description.WriteString(" from ") description.WriteString(moduleTitle) description.WriteString(" instances") if packageType == "logs" && inputType != "logs" { description.WriteString(fmt.Sprintf(" (input: %s)", inputType)) } return description.String() } func adjustDataStreamNamesForInputDescription(names []string) []string { var adjusted []string for _, name := range names { if name == "log" { adjusted = append(adjusted, "application") continue } adjusted = append(adjusted, name) } return adjusted }