github.com/chipaca/snappy@v0.0.0-20210104084008-1f06296fe8ad/daemon/api_debug_seeding_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2020 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package daemon 21 22 import ( 23 "net/http" 24 "time" 25 26 . "gopkg.in/check.v1" 27 28 "github.com/snapcore/snapd/overlord/state" 29 ) 30 31 var _ = Suite(&seedingDebugSuite{}) 32 33 type seedingDebugSuite struct { 34 APIBaseSuite 35 } 36 37 func (s *seedingDebugSuite) SetUpTest(c *C) { 38 s.APIBaseSuite.SetUpTest(c) 39 s.daemonWithOverlordMock(c) 40 } 41 42 func (s *seedingDebugSuite) getSeedingDebug(c *C) interface{} { 43 req, err := http.NewRequest("GET", "/v2/debug?aspect=seeding", nil) 44 c.Assert(err, IsNil) 45 46 rsp := getDebug(debugCmd, req, nil).(*resp) 47 c.Assert(rsp.Type, Equals, ResponseTypeSync) 48 return rsp.Result 49 } 50 51 func (s *seedingDebugSuite) TestNoData(c *C) { 52 data := s.getSeedingDebug(c) 53 c.Check(data, NotNil) 54 c.Check(data, DeepEquals, &seedingInfo{}) 55 } 56 57 func (s *seedingDebugSuite) TestSeedingDebug(c *C) { 58 seeded := true 59 preseeded := true 60 key1 := "foo" 61 key2 := "bar" 62 63 preseedStartTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:00Z") 64 c.Assert(err, IsNil) 65 preseedTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:01Z") 66 c.Assert(err, IsNil) 67 seedRestartTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:03Z") 68 c.Assert(err, IsNil) 69 seedTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:07Z") 70 c.Assert(err, IsNil) 71 72 st := s.d.overlord.State() 73 st.Lock() 74 75 st.Set("preseeded", preseeded) 76 st.Set("seeded", seeded) 77 78 st.Set("preseed-system-key", key1) 79 st.Set("seed-restart-system-key", key2) 80 81 st.Set("preseed-start-time", preseedStartTime) 82 st.Set("seed-restart-time", seedRestartTime) 83 84 st.Set("preseed-time", preseedTime) 85 st.Set("seed-time", seedTime) 86 87 st.Unlock() 88 89 data := s.getSeedingDebug(c) 90 c.Check(data, DeepEquals, &seedingInfo{ 91 Seeded: true, 92 Preseeded: true, 93 PreseedSystemKey: "foo", 94 SeedRestartSystemKey: "bar", 95 PreseedStartTime: &preseedStartTime, 96 PreseedTime: &preseedTime, 97 SeedRestartTime: &seedRestartTime, 98 SeedTime: &seedTime, 99 }) 100 } 101 102 func (s *seedingDebugSuite) TestSeedingDebugSeededNoTimes(c *C) { 103 seedTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:07Z") 104 c.Assert(err, IsNil) 105 106 st := s.d.overlord.State() 107 st.Lock() 108 109 // only set seed-time and seeded 110 st.Set("seed-time", seedTime) 111 st.Set("seeded", true) 112 113 st.Unlock() 114 115 data := s.getSeedingDebug(c) 116 c.Check(data, DeepEquals, &seedingInfo{ 117 Seeded: true, 118 SeedTime: &seedTime, 119 }) 120 } 121 122 func (s *seedingDebugSuite) TestSeedingDebugPreseededStillSeeding(c *C) { 123 preseedStartTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:00Z") 124 c.Assert(err, IsNil) 125 preseedTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:01Z") 126 c.Assert(err, IsNil) 127 seedRestartTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:03Z") 128 c.Assert(err, IsNil) 129 130 st := s.d.overlord.State() 131 st.Lock() 132 133 st.Set("preseeded", true) 134 st.Set("seeded", false) 135 136 st.Set("preseed-system-key", "foo") 137 st.Set("seed-restart-system-key", "bar") 138 139 st.Set("preseed-start-time", preseedStartTime) 140 st.Set("seed-restart-time", seedRestartTime) 141 142 st.Set("preseed-time", preseedTime) 143 144 st.Unlock() 145 146 data := s.getSeedingDebug(c) 147 c.Check(data, DeepEquals, &seedingInfo{ 148 Seeded: false, 149 Preseeded: true, 150 PreseedSystemKey: "foo", 151 SeedRestartSystemKey: "bar", 152 PreseedStartTime: &preseedStartTime, 153 PreseedTime: &preseedTime, 154 SeedRestartTime: &seedRestartTime, 155 }) 156 } 157 158 func (s *seedingDebugSuite) TestSeedingDebugPreseededSeedError(c *C) { 159 preseedStartTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:00Z") 160 c.Assert(err, IsNil) 161 preseedTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:01Z") 162 c.Assert(err, IsNil) 163 seedRestartTime, err := time.Parse(time.RFC3339, "2020-01-01T10:00:03Z") 164 c.Assert(err, IsNil) 165 166 st := s.d.overlord.State() 167 st.Lock() 168 169 st.Set("preseeded", true) 170 st.Set("seeded", false) 171 172 st.Set("preseed-system-key", "foo") 173 st.Set("seed-restart-system-key", "bar") 174 175 st.Set("preseed-start-time", preseedStartTime) 176 st.Set("seed-restart-time", seedRestartTime) 177 178 st.Set("preseed-time", preseedTime) 179 180 chg1 := st.NewChange("seed", "tentative 1") 181 t11 := st.NewTask("seed task", "t11") 182 t12 := st.NewTask("seed task", "t12") 183 chg1.AddTask(t11) 184 chg1.AddTask(t12) 185 t11.SetStatus(state.UndoneStatus) 186 t11.Errorf("t11: undone") 187 t12.SetStatus(state.ErrorStatus) 188 t12.Errorf("t12: fail") 189 190 // ensure different spawn time 191 time.Sleep(50 * time.Millisecond) 192 chg2 := st.NewChange("seed", "tentative 2") 193 t21 := st.NewTask("seed task", "t21") 194 chg2.AddTask(t21) 195 t21.SetStatus(state.ErrorStatus) 196 t21.Errorf("t21: error") 197 198 chg3 := st.NewChange("seed", "tentative 3") 199 t31 := st.NewTask("seed task", "t31") 200 chg3.AddTask(t31) 201 t31.SetStatus(state.DoingStatus) 202 203 st.Unlock() 204 205 data := s.getSeedingDebug(c) 206 c.Check(data, DeepEquals, &seedingInfo{ 207 Seeded: false, 208 Preseeded: true, 209 PreseedSystemKey: "foo", 210 SeedRestartSystemKey: "bar", 211 PreseedStartTime: &preseedStartTime, 212 PreseedTime: &preseedTime, 213 SeedRestartTime: &seedRestartTime, 214 SeedError: `cannot perform the following tasks: 215 - t12 (t12: fail)`, 216 }) 217 }