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  }