func (c *InCommand) Run(input concourse.InRequest) (concourse.InResponse, error) { productSlug := input.Source.ProductSlug version, fingerprint, err := versions.SplitIntoVersionAndFingerprint(input.Version.ProductVersion) if err != nil { c.logger.Info("Parsing of fingerprint failed; continuing without it") version = input.Version.ProductVersion fingerprint = "" } c.logger.Info(fmt.Sprintf( "Getting release for product slug: '%s' and product version: '%s'", productSlug, version, )) release, err := c.pivnetClient.GetRelease(productSlug, version) if err != nil { return concourse.InResponse{}, err } if fingerprint != "" { actualFingerprint := release.UpdatedAt if actualFingerprint != fingerprint { return concourse.InResponse{}, fmt.Errorf( "provided fingerprint: '%s' does not match actual fingerprint (from pivnet): '%s' - %s", fingerprint, actualFingerprint, "pivnet does not support downloading old versions of a release", ) } } c.logger.Info(fmt.Sprintf("Accepting EULA for release with ID: %d", release.ID)) err = c.pivnetClient.AcceptEULA(productSlug, release.ID) if err != nil { return concourse.InResponse{}, err } c.logger.Info("Getting product files") releaseProductFiles, err := c.pivnetClient.ProductFilesForRelease(productSlug, release.ID) if err != nil { return concourse.InResponse{}, err } c.logger.Info("Getting file groups") fileGroups, err := c.pivnetClient.FileGroupsForRelease(productSlug, release.ID) if err != nil { return concourse.InResponse{}, err } allProductFiles := releaseProductFiles for _, fg := range fileGroups { allProductFiles = append(allProductFiles, fg.ProductFiles...) } // Get individual product files to obtain metadata that isn't found // in the endpoint for all product files. for i, p := range allProductFiles { allProductFiles[i], err = c.pivnetClient.ProductFileForRelease( productSlug, release.ID, p.ID, ) if err != nil { return concourse.InResponse{}, err } } c.logger.Info("Getting release dependencies") releaseDependencies, err := c.pivnetClient.ReleaseDependencies(productSlug, release.ID) if err != nil { return concourse.InResponse{}, err } c.logger.Info("Getting release upgrade paths") releaseUpgradePaths, err := c.pivnetClient.ReleaseUpgradePaths(productSlug, release.ID) if err != nil { return concourse.InResponse{}, err } c.logger.Info("Downloading files") err = c.downloadFiles(input.Params.Globs, allProductFiles, productSlug, release.ID) if err != nil { return concourse.InResponse{}, err } c.logger.Info("Creating metadata") versionWithFingerprint, err := versions.CombineVersionAndFingerprint(version, fingerprint) mdata := metadata.Metadata{ Release: &metadata.Release{ ID: release.ID, Version: release.Version, ReleaseType: string(release.ReleaseType), ReleaseDate: release.ReleaseDate, Description: release.Description, ReleaseNotesURL: release.ReleaseNotesURL, Availability: release.Availability, Controlled: release.Controlled, ECCN: release.ECCN, LicenseException: release.LicenseException, EndOfSupportDate: release.EndOfSupportDate, EndOfGuidanceDate: release.EndOfGuidanceDate, EndOfAvailabilityDate: release.EndOfAvailabilityDate, }, } if release.EULA != nil { mdata.Release.EULASlug = release.EULA.Slug } for _, pf := range releaseProductFiles { mdata.Release.ProductFiles = append(mdata.Release.ProductFiles, metadata.ReleaseProductFile{ ID: pf.ID, }) } for _, pf := range allProductFiles { mdata.ProductFiles = append(mdata.ProductFiles, metadata.ProductFile{ ID: pf.ID, File: pf.Name, Description: pf.Description, AWSObjectKey: pf.AWSObjectKey, FileType: pf.FileType, FileVersion: pf.FileVersion, MD5: pf.MD5, }) } for _, d := range releaseDependencies { mdata.Dependencies = append(mdata.Dependencies, metadata.Dependency{ Release: metadata.DependentRelease{ ID: d.Release.ID, Version: d.Release.Version, Product: metadata.Product{ ID: d.Release.Product.ID, Name: d.Release.Product.Name, }, }, }) } for _, d := range releaseUpgradePaths { mdata.UpgradePaths = append(mdata.UpgradePaths, metadata.UpgradePath{ ID: d.Release.ID, Version: d.Release.Version, }) } for _, fg := range fileGroups { mfg := metadata.FileGroup{ ID: fg.ID, Name: fg.Name, } for _, pf := range fg.ProductFiles { mfg.ProductFiles = append(mfg.ProductFiles, metadata.FileGroupProductFile{ ID: pf.ID, }) } mdata.FileGroups = append(mdata.FileGroups, mfg) } c.logger.Info("Writing metadata files") err = c.fileWriter.WriteVersionFile(versionWithFingerprint) if err != nil { return concourse.InResponse{}, err } err = c.fileWriter.WriteMetadataYAMLFile(mdata) if err != nil { return concourse.InResponse{}, err } err = c.fileWriter.WriteMetadataJSONFile(mdata) if err != nil { return concourse.InResponse{}, err } concourseMetadata := c.addReleaseMetadata([]concourse.Metadata{}, release) out := concourse.InResponse{ Version: concourse.Version{ ProductVersion: versionWithFingerprint, }, Metadata: concourseMetadata, } return out, nil }
Expect(err).NotTo(HaveOccurred()) Expect(versions).To(Equal([]string{"v200", "v120", "v178", "v201"})) }) }) Describe("SplitIntoVersionAndFingerprint", func() { var ( input string ) BeforeEach(func() { input = "some.version#my-fingerprint" }) It("splits without error", func() { version, fingerprint, err := versions.SplitIntoVersionAndFingerprint(input) Expect(err).NotTo(HaveOccurred()) Expect(version).To(Equal("some.version")) Expect(fingerprint).To(Equal("my-fingerprint")) }) Context("when the input does not contain enough delimiters", func() { BeforeEach(func() { input = "some.version" }) It("returns error", func() { _, _, err := versions.SplitIntoVersionAndFingerprint(input) Expect(err).To(HaveOccurred()) })