github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/resource_config_check_session_lifecycle_test.go (about)

     1  package db_test
     2  
     3  import (
     4  	"time"
     5  
     6  	sq "github.com/Masterminds/squirrel"
     7  	"github.com/pf-qiu/concourse/v6/atc"
     8  	"github.com/pf-qiu/concourse/v6/atc/db"
     9  	"github.com/pf-qiu/concourse/v6/atc/db/dbtest"
    10  
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  var _ = Describe("ResourceConfigCheckSessionLifecycle", func() {
    16  	var (
    17  		lifecycle db.ResourceConfigCheckSessionLifecycle
    18  		scenario  *dbtest.Scenario
    19  	)
    20  
    21  	BeforeEach(func() {
    22  		lifecycle = db.NewResourceConfigCheckSessionLifecycle(dbConn)
    23  
    24  		scenario = dbtest.Setup(
    25  			builder.WithPipeline(atc.Config{
    26  				Resources: atc.ResourceConfigs{
    27  					{
    28  						Name:   "some-resource",
    29  						Type:   "some-base-resource-type",
    30  						Source: atc.Source{"some": "source"},
    31  					},
    32  				},
    33  				ResourceTypes: atc.ResourceTypes{
    34  					{
    35  						Name: "some-type",
    36  						Type: "some-base-resource-type",
    37  						Source: atc.Source{
    38  							"some-type": "source",
    39  						},
    40  					},
    41  				},
    42  			}),
    43  		)
    44  	})
    45  
    46  	Describe("CleanInactiveResourceConfigCheckSessions", func() {
    47  		expiry := db.ContainerOwnerExpiries{
    48  			Min: 1 * time.Minute,
    49  			Max: 1 * time.Minute,
    50  		}
    51  
    52  		Context("for resources", func() {
    53  			findOrCreateSessionForDefaultResource := func() int {
    54  				scenario.Run(
    55  					builder.WithResourceVersions("some-resource"),
    56  				)
    57  
    58  				resourceConfig, found, err := resourceConfigFactory.FindResourceConfigByID(scenario.Resource("some-resource").ResourceConfigID())
    59  				Expect(err).ToNot(HaveOccurred())
    60  				Expect(found).To(BeTrue())
    61  
    62  				owner := db.NewResourceConfigCheckSessionContainerOwner(
    63  					resourceConfig.ID(),
    64  					resourceConfig.OriginBaseResourceType().ID,
    65  					expiry,
    66  				)
    67  
    68  				var query sq.Eq
    69  				query, found, err = owner.Find(dbConn)
    70  				Expect(err).ToNot(HaveOccurred())
    71  
    72  				if !found {
    73  					tx, err := dbConn.Begin()
    74  					Expect(err).ToNot(HaveOccurred())
    75  
    76  					query, err = owner.Create(tx, defaultWorker.Name())
    77  					Expect(err).ToNot(HaveOccurred())
    78  
    79  					err = tx.Commit()
    80  					Expect(err).ToNot(HaveOccurred())
    81  
    82  					return query["resource_config_check_session_id"].(int)
    83  				} else {
    84  					rccsIDs := query["resource_config_check_session_id"].([]int)
    85  					Expect(rccsIDs).To(HaveLen(1))
    86  					return rccsIDs[0]
    87  				}
    88  			}
    89  
    90  			var oldRccsID int
    91  
    92  			BeforeEach(func() {
    93  				By("creating the session")
    94  				oldRccsID = findOrCreateSessionForDefaultResource()
    95  			})
    96  
    97  			It("keeps check sessions for active resources", func() {
    98  				By("cleaning up inactive sessions")
    99  				Expect(lifecycle.CleanInactiveResourceConfigCheckSessions()).To(Succeed())
   100  
   101  				By("find-or-creating the session again")
   102  				newRccsID := findOrCreateSessionForDefaultResource()
   103  
   104  				By("finding the same rccs as before")
   105  				Expect(oldRccsID).To(Equal(newRccsID))
   106  			})
   107  
   108  			It("removes check sessions for inactive resources", func() {
   109  				By("removing the default resource from the pipeline config")
   110  				scenario.Run(
   111  					builder.WithPipeline(atc.Config{
   112  						Jobs: atc.JobConfigs{
   113  							{
   114  								Name: "some-job",
   115  							},
   116  						},
   117  						Resources: atc.ResourceConfigs{},
   118  						ResourceTypes: atc.ResourceTypes{
   119  							{
   120  								Name: "some-type",
   121  								Type: "some-base-resource-type",
   122  								Source: atc.Source{
   123  									"some-type": "source",
   124  								},
   125  							},
   126  						},
   127  					}),
   128  				)
   129  
   130  				By("cleaning up inactive sessions")
   131  				Expect(lifecycle.CleanInactiveResourceConfigCheckSessions()).To(Succeed())
   132  
   133  				By("find-or-creating the session again")
   134  				scenario.Run(
   135  					builder.WithPipeline(atc.Config{
   136  						Jobs: atc.JobConfigs{
   137  							{
   138  								Name: "some-job",
   139  							},
   140  						},
   141  						Resources: atc.ResourceConfigs{
   142  							{
   143  								Name:   "some-resource",
   144  								Type:   "some-base-resource-type",
   145  								Source: atc.Source{"some": "source"},
   146  							},
   147  						},
   148  						ResourceTypes: atc.ResourceTypes{
   149  							{
   150  								Name: "some-type",
   151  								Type: "some-base-resource-type",
   152  								Source: atc.Source{
   153  									"some-type": "source",
   154  								},
   155  							},
   156  						},
   157  					}),
   158  				)
   159  				rccsID := findOrCreateSessionForDefaultResource()
   160  
   161  				By("having created a new session, as the old one was removed")
   162  				Expect(rccsID).ToNot(Equal(oldRccsID))
   163  			})
   164  
   165  			It("removes check sessions for resources in paused pipelines", func() {
   166  				By("pausing the pipeline")
   167  				Expect(scenario.Pipeline.Pause()).To(Succeed())
   168  
   169  				By("cleaning up inactive sessions")
   170  				Expect(lifecycle.CleanInactiveResourceConfigCheckSessions()).To(Succeed())
   171  
   172  				By("find-or-creating the session again")
   173  				rccsID := findOrCreateSessionForDefaultResource()
   174  
   175  				By("having created a new session, as the old one was removed")
   176  				Expect(rccsID).ToNot(Equal(oldRccsID))
   177  			})
   178  		})
   179  
   180  		Context("for resource types", func() {
   181  			findOrCreateSessionForDefaultResourceType := func() int {
   182  				scenario.Run(
   183  					builder.WithResourceTypeVersions("some-type"),
   184  				)
   185  
   186  				resourceConfig, err := resourceConfigFactory.FindOrCreateResourceConfig(scenario.ResourceType("some-type").Type(), scenario.ResourceType("some-type").Source(), nil)
   187  				Expect(err).ToNot(HaveOccurred())
   188  
   189  				owner := db.NewResourceConfigCheckSessionContainerOwner(
   190  					resourceConfig.ID(),
   191  					resourceConfig.OriginBaseResourceType().ID,
   192  					expiry,
   193  				)
   194  
   195  				var query sq.Eq
   196  				var found bool
   197  				query, found, err = owner.Find(dbConn)
   198  				Expect(err).ToNot(HaveOccurred())
   199  
   200  				if !found {
   201  					tx, err := dbConn.Begin()
   202  					Expect(err).ToNot(HaveOccurred())
   203  
   204  					query, err = owner.Create(tx, defaultWorker.Name())
   205  					Expect(err).ToNot(HaveOccurred())
   206  
   207  					err = tx.Commit()
   208  					Expect(err).ToNot(HaveOccurred())
   209  
   210  					return query["resource_config_check_session_id"].(int)
   211  				} else {
   212  					rccsIDs := query["resource_config_check_session_id"].([]int)
   213  					Expect(rccsIDs).To(HaveLen(1))
   214  					return rccsIDs[0]
   215  				}
   216  			}
   217  
   218  			var oldRccsID int
   219  
   220  			BeforeEach(func() {
   221  				By("creating the session")
   222  				oldRccsID = findOrCreateSessionForDefaultResourceType()
   223  			})
   224  
   225  			It("keeps check sessions for active resource types", func() {
   226  				By("cleaning up inactive sessions")
   227  				Expect(lifecycle.CleanInactiveResourceConfigCheckSessions()).To(Succeed())
   228  
   229  				By("find-or-creating the session again")
   230  				rccsID := findOrCreateSessionForDefaultResourceType()
   231  
   232  				By("finding the same session as before")
   233  				Expect(rccsID).To(Equal(oldRccsID))
   234  			})
   235  
   236  			It("removes check sessions for inactive resource types", func() {
   237  				By("removing the default resource from the pipeline config")
   238  				scenario.Run(
   239  					builder.WithPipeline(atc.Config{
   240  						Jobs: atc.JobConfigs{
   241  							{
   242  								Name: "some-job",
   243  							},
   244  						},
   245  						Resources: atc.ResourceConfigs{
   246  							{
   247  								Name: "some-resource",
   248  								Type: "some-base-resource-type",
   249  								Source: atc.Source{
   250  									"some": "source",
   251  								},
   252  							},
   253  						},
   254  						ResourceTypes: atc.ResourceTypes{},
   255  					}),
   256  				)
   257  
   258  				By("cleaning up inactive sessions")
   259  				Expect(lifecycle.CleanInactiveResourceConfigCheckSessions()).To(Succeed())
   260  
   261  				By("find-or-creating the session again")
   262  				scenario.Run(
   263  					builder.WithPipeline(atc.Config{
   264  						Jobs: atc.JobConfigs{
   265  							{
   266  								Name: "some-job",
   267  							},
   268  						},
   269  						Resources: atc.ResourceConfigs{
   270  							{
   271  								Name: "some-resource",
   272  								Type: "some-base-resource-type",
   273  								Source: atc.Source{
   274  									"some": "source",
   275  								},
   276  							},
   277  						},
   278  						ResourceTypes: atc.ResourceTypes{
   279  							{
   280  								Name: "some-type",
   281  								Type: "some-base-resource-type",
   282  								Source: atc.Source{
   283  									"some-type": "source",
   284  								},
   285  							},
   286  						},
   287  					}),
   288  				)
   289  				rccsID := findOrCreateSessionForDefaultResourceType()
   290  
   291  				By("having created a new session, as the old one was removed")
   292  				Expect(rccsID).ToNot(Equal(oldRccsID))
   293  			})
   294  
   295  			It("removes check sessions for resource types in paused pipelines", func() {
   296  				By("pausing the pipeline")
   297  				Expect(scenario.Pipeline.Pause()).To(Succeed())
   298  
   299  				By("cleaning up inactive sessions")
   300  				Expect(lifecycle.CleanInactiveResourceConfigCheckSessions()).To(Succeed())
   301  
   302  				By("find-or-creating the session again")
   303  				rccsID := findOrCreateSessionForDefaultResourceType()
   304  
   305  				By("having created a new session, as the old one was removed")
   306  				Expect(rccsID).ToNot(Equal(oldRccsID))
   307  			})
   308  		})
   309  	})
   310  })