aboutsummaryrefslogtreecommitdiff
path: root/bbot/bootstrap-manifest
blob: 6007c6e5fd572d290f9d5d176d81c4eb9a93abca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// file      : bbot/bootstrap-manifest -*- C++ -*-
// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#ifndef BBOT_BOOTSTRAP_MANIFEST
#define BBOT_BOOTSTRAP_MANIFEST

#include <map>

#include <butl/manifest-forward>

#include <bbot/types>
#include <bbot/utility>

#include <bbot/manifest> // machine_manifest

namespace bbot
{
  // Toolchain manifest.
  //
  class toolchain_manifest
  {
  public:

    // Toolchain id (SHAXXX).
    //
    string id;

    explicit
    toolchain_manifest (string i): id (i) {}

  public:
    toolchain_manifest () = default; // VC export.
    toolchain_manifest (butl::manifest_parser&, bool ignore_unknown = false);
    toolchain_manifest (butl::manifest_parser&,
                        butl::manifest_name_value start,
                        bool ignore_unknown = false);

    void
    serialize (butl::manifest_serializer&) const;
  };

  // Bootstrap result manifest. Uploaded by the worker to the agent's TFTP
  // server.
  //
  class bootstrap_manifest
  {
  public:

    // Map of packages to their (numeric) versions that were used inside the
    // bootstrapped machine. Used to make sure bbot agent/worker use the same
    // versions. For example:
    //
    // libbbot-version: 1010100  # 1.1.1
    // bbot-version:    1010200  # 1.1.2
    //
    using versions_type = std::map<string, uint64_t>;
    versions_type versions;

    explicit
    bootstrap_manifest (versions_type v)
        : versions (move (v)) {}

  public:
    bootstrap_manifest () = default; // VC export.
    bootstrap_manifest (butl::manifest_parser&, bool ignore_unknown = false);
    bootstrap_manifest (butl::manifest_parser&,
                        butl::manifest_name_value start,
                        bool ignore_unknown = false);

    void
    serialize (butl::manifest_serializer&) const;
  };

  // The manifest stored in <name>-<toolchain>/ consists of the machine
  // manifest (original), toolchain manifest, and bootstrap manifest.
  //
  class bootstrapped_machine_manifest
  {
  public:
    machine_manifest   machine;
    toolchain_manifest toolchain;
    bootstrap_manifest bootstrap;

    bootstrapped_machine_manifest (machine_manifest m,
                                   toolchain_manifest t,
                                   bootstrap_manifest b)
        : machine (move (m)), toolchain (move (t)), bootstrap (move (b)) {}

  public:
    bootstrapped_machine_manifest () = default; // VC export.
    bootstrapped_machine_manifest (butl::manifest_parser&,
                                   bool ignore_unknown = false);

    void
    serialize (butl::manifest_serializer&) const;
  };
}

#endif // BBOT_BOOTSTRAP_MANIFEST