// // Copyright (C) 2019 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include #include #include #include #include "credential_source.h" #include "curl_wrapper.h" namespace cuttlefish { class Artifact { std::string name; size_t size; unsigned long last_modified_time; std::string md5; std::string content_type; std::string revision; unsigned long creation_time; unsigned int crc32; public: Artifact(const Json::Value&); Artifact(const std::string& name) : name(name) {} const std::string& Name() const { return name; } size_t Size() const { return size; } unsigned long LastModifiedTime() const { return last_modified_time; } const std::string& Md5() const { return md5; } const std::string& ContentType() const { return content_type; } const std::string& Revision() const { return revision; } unsigned long CreationTime() const { return creation_time; } unsigned int Crc32() const { return crc32; } }; struct DeviceBuild { DeviceBuild(const std::string& id, const std::string& target) { this->id = id; this->target = target; } std::string id; std::string target; std::string product; }; std::ostream& operator<<(std::ostream&, const DeviceBuild&); struct DirectoryBuild { // TODO(schuffelen): Support local builds other than "eng" DirectoryBuild(const std::vector& paths, const std::string& target); std::vector paths; std::string target; std::string id; std::string product; }; std::ostream& operator<<(std::ostream&, const DirectoryBuild&); using Build = std::variant; std::ostream& operator<<(std::ostream&, const Build&); class BuildApi { CurlWrapper curl; std::unique_ptr credential_source; std::vector Headers(); public: BuildApi(std::unique_ptr credential_source); ~BuildApi() = default; std::string LatestBuildId(const std::string& branch, const std::string& target); std::string BuildStatus(const DeviceBuild&); std::string ProductName(const DeviceBuild&); std::vector Artifacts(const DeviceBuild&); bool ArtifactToFile(const DeviceBuild& build, const std::string& artifact, const std::string& path); std::vector Artifacts(const DirectoryBuild&); bool ArtifactToFile(const DirectoryBuild& build, const std::string& artifact, const std::string& path); std::vector Artifacts(const Build& build) { return std::visit([this](auto&& arg) { return Artifacts(arg); }, build); } bool ArtifactToFile(const Build& build, const std::string& artifact, const std::string& path) { return std::visit([this, &artifact, &path](auto&& arg) { return ArtifactToFile(arg, artifact, path); }, build); } }; Build ArgumentToBuild(BuildApi* api, const std::string& arg, const std::string& default_build_target, const std::chrono::seconds& retry_period); } // namespace cuttlefish