func()

in dev/import-beats/packages.go [258:432]


func (r *packageRepository) save(outputDir string) error {
	for packageName, content := range r.packages {
		manifest := content.manifest

		log.Printf("%s/%s write package content\n", packageName, manifest.Version)

		packagePath := filepath.Join(outputDir, packageName)
		err := os.MkdirAll(packagePath, 0755)
		if err != nil {
			return errors.Wrapf(err, "cannot make directory for module: '%s'", packagePath)
		}

		m, err := yaml.Marshal(content.manifest)
		if err != nil {
			return errors.Wrapf(err, "marshaling package manifest failed (packageName: %s)", packageName)
		}

		manifestFilePath := filepath.Join(packagePath, "manifest.yml")
		err = ioutil.WriteFile(manifestFilePath, m, 0644)
		if err != nil {
			return errors.Wrapf(err, "writing manifest file failed (path: %s)", manifestFilePath)
		}

		// dataStream
		for _, dataStream := range content.dataStreams {
			dataStreamPath := filepath.Join(packagePath, "data_stream", dataStream.name)
			err := os.MkdirAll(dataStreamPath, 0755)
			if err != nil {
				return errors.Wrapf(err, "cannot make directory for dataStream: '%s'", dataStreamPath)
			}

			// dataStream/manifest.yml
			m, err := yaml.Marshal(dataStream.manifest)
			if err != nil {
				return errors.Wrapf(err, "marshaling data stream manifest failed (dataStreamName: %s)", dataStream.name)
			}

			manifestFilePath := filepath.Join(dataStreamPath, "manifest.yml")
			err = ioutil.WriteFile(manifestFilePath, m, 0644)
			if err != nil {
				return errors.Wrapf(err, "writing data stream manifest file failed (path: %s)", manifestFilePath)
			}

			// dataStream/fields
			if len(dataStream.fields.files) > 0 {
				dataStreamFieldsPath := filepath.Join(dataStreamPath, "fields")
				err := os.MkdirAll(dataStreamFieldsPath, 0755)
				if err != nil {
					return errors.Wrapf(err, "cannot make directory for data stream fields: '%s'", dataStreamPath)
				}

				for fieldsFileName, definitions := range dataStream.fields.files {
					log.Printf("%s: write '%s' file\n", dataStream.name, fieldsFileName)

					fieldsFilePath := filepath.Join(dataStreamFieldsPath, fieldsFileName)
					var fieldsFile []byte

					stripped := definitions.stripped()
					fieldsFile, err := yaml.Marshal(&stripped)
					if err != nil {
						return errors.Wrapf(err, "marshalling fields file failed (path: %s)", fieldsFilePath)
					}
					err = ioutil.WriteFile(fieldsFilePath, fieldsFile, 0644)
					if err != nil {
						return errors.Wrapf(err, "writing fields file failed (path: %s)", fieldsFilePath)
					}
				}
			}

			// dataStream/elasticsearch
			if len(dataStream.elasticsearch.ingestPipelines) > 0 {
				ingestPipelinesPath := filepath.Join(dataStreamPath, "elasticsearch", packages.DirIngestPipeline)
				err := os.MkdirAll(ingestPipelinesPath, 0755)
				if err != nil {
					return errors.Wrapf(err, "cannot make directory for data stream ingest pipelines: '%s'", ingestPipelinesPath)
				}

				for _, ingestPipeline := range dataStream.elasticsearch.ingestPipelines {
					ingestPipelinePath := filepath.Join(ingestPipelinesPath, ingestPipeline.targetFileName)
					log.Printf("write ingest pipeline file '%s'", ingestPipelinePath)

					err := ioutil.WriteFile(ingestPipelinePath, ingestPipeline.body, 0644)
					if err != nil {
						return errors.Wrapf(err, "writing ingest pipeline failed")
					}
				}
			}

			// dataStream/agent/stream
			if len(dataStream.agent.streams) > 0 {
				agentStreamPath := filepath.Join(dataStreamPath, "agent", "stream")
				err := os.MkdirAll(agentStreamPath, 0755)
				if err != nil {
					return errors.Wrapf(err, "cannot make directory for data stream agent stream: '%s'", agentStreamPath)
				}

				for _, agentStream := range dataStream.agent.streams {
					err := ioutil.WriteFile(path.Join(agentStreamPath, agentStream.targetFileName), agentStream.body, 0644)
					if err != nil {
						return errors.Wrapf(err, "writing agent stream file failed")
					}
				}
			}
		}

		// img
		imgDstDir := path.Join(packagePath, "img")
		for _, image := range content.images {
			log.Printf("copy image file '%s' to '%s'", image.source, imgDstDir)
			err := copyFile(image.source, imgDstDir)
			if err != nil {
				return errors.Wrapf(err, "copying file failed")
			}
		}

		// kibana
		if len(content.kibana.files) > 0 {
			kibanaPath := filepath.Join(packagePath, "kibana")

			for objectType, objects := range content.kibana.files {
				resourcePath := filepath.Join(kibanaPath, objectType)

				err := os.MkdirAll(resourcePath, 0755)
				if err != nil {
					return errors.Wrapf(err, "cannot make directory for dashboard files: '%s'", resourcePath)
				}

				for fileName, body := range objects {
					resourceFilePath := filepath.Join(resourcePath, fileName)

					log.Printf("create resource file: %s", resourceFilePath)
					err = ioutil.WriteFile(resourceFilePath, body, 0644)
					if err != nil {
						return errors.Wrapf(err, "writing resource file failed (path: %s)", resourceFilePath)
					}
				}
			}
		}

		// docs
		if len(content.docs) > 0 {
			docsPath := filepath.Join(packagePath, "docs")
			err := os.MkdirAll(docsPath, 0755)
			if err != nil {
				return errors.Wrapf(err, "cannot make directory for docs: '%s'", docsPath)
			}

			for _, doc := range content.docs {
				err = writeDoc(docsPath, doc, content)
				if err != nil {
					return errors.Wrapf(err, "cannot write docs (docsPath: %s, fileName: %s)", docsPath,
						doc.fileName)
				}
			}
		}

		// changelog
		changelog := newChangelog(manifest.Version)

		c, err := yaml.Marshal(changelog)
		if err != nil {
			return errors.Wrap(err, "marshalling changelog failed")
		}

		header := "# newer versions go on top"
		contents := strings.Replace(string(c), "entries:", header, 1) // HACK: cannot marshal sequence at root level!
		c = []byte(contents)

		changelogPath := filepath.Join(packagePath, "changelog.yml")
		if err := ioutil.WriteFile(changelogPath, c, 0644); err != nil {
			return errors.Wrap(err, "writing changelog file failed")
		}
	}
	return nil
}