Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package skupper for openSUSE:Factory checked in at 2024-11-05 15:40:55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/skupper (Old) and /work/SRC/openSUSE:Factory/.skupper.new.2020 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "skupper" Tue Nov 5 15:40:55 2024 rev:3 rq:1221248 version:1.8.2 Changes: -------- --- /work/SRC/openSUSE:Factory/skupper/skupper.changes 2024-09-16 17:41:37.861473520 +0200 +++ /work/SRC/openSUSE:Factory/.skupper.new.2020/skupper.changes 2024-11-05 15:41:19.394835615 +0100 @@ -1,0 +2,13 @@ +Mon Nov 04 19:49:49 UTC 2024 - opensuse_buildserv...@ojkastl.de + +- Update to version 1.8.2: + * update for 1.8.2 + * refine peer link deletion (#1726) + * Fixed version in update test (#1711) + * Cleanup old link records. When incoming link is deleted, + remove corresponding outgoing link. (#1699) + * add v2 section (#1687) + * Update link cost when receiving a flow record (#1695) + * Podman sites update issue (#1675) + +------------------------------------------------------------------- Old: ---- skupper-1.8.1.obscpio New: ---- skupper-1.8.2.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ skupper.spec ++++++ --- /var/tmp/diff_new_pack.GR7KP8/_old 2024-11-05 15:41:20.454880058 +0100 +++ /var/tmp/diff_new_pack.GR7KP8/_new 2024-11-05 15:41:20.454880058 +0100 @@ -19,7 +19,7 @@ %define __arch_install_post export NO_BRP_STRIP_DEBUG=true Name: skupper -Version: 1.8.1 +Version: 1.8.2 Release: 0 Summary: Virtual Application Network, enabling rich hybrid cloud communication License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.GR7KP8/_old 2024-11-05 15:41:20.510882406 +0100 +++ /var/tmp/diff_new_pack.GR7KP8/_new 2024-11-05 15:41:20.510882406 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/skupperproject/skupper</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">1.8.1</param> + <param name="revision">1.8.2</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> </service> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.GR7KP8/_old 2024-11-05 15:41:20.534883412 +0100 +++ /var/tmp/diff_new_pack.GR7KP8/_new 2024-11-05 15:41:20.534883412 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/skupperproject/skupper</param> - <param name="changesrevision">b44bc8ab3469fb3c02a0df7ac8334452bc391654</param></service></servicedata> + <param name="changesrevision">149f4a5588c532d6ab1fc489b19ca24633e521e7</param></service></servicedata> (No newline at EOF) ++++++ generated.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/client/generated/libpod/client/containers/container_restore_libpod_parameters.go new/client/generated/libpod/client/containers/container_restore_libpod_parameters.go --- old/client/generated/libpod/client/containers/container_restore_libpod_parameters.go 2024-09-14 10:24:44.838237417 +0200 +++ new/client/generated/libpod/client/containers/container_restore_libpod_parameters.go 2024-11-04 21:06:39.874846900 +0100 @@ -100,15 +100,15 @@ /* Name. - the name or id of the container + the name of the container when restored from a tar. can only be used with import */ - PathName string + QueryName *string /* Name. - the name of the container when restored from a tar. can only be used with import + the name or id of the container */ - QueryName *string + PathName string /* PrintStats. @@ -241,17 +241,6 @@ o.LeaveRunning = leaveRunning } -// WithPathName adds the name to the container restore libpod params -func (o *ContainerRestoreLibpodParams) WithPathName(name string) *ContainerRestoreLibpodParams { - o.SetPathName(name) - return o -} - -// SetPathName adds the name to the container restore libpod params -func (o *ContainerRestoreLibpodParams) SetPathName(name string) { - o.PathName = name -} - // WithQueryName adds the name to the container restore libpod params func (o *ContainerRestoreLibpodParams) WithQueryName(name *string) *ContainerRestoreLibpodParams { o.SetQueryName(name) @@ -263,6 +252,17 @@ o.QueryName = name } +// WithPathName adds the name to the container restore libpod params +func (o *ContainerRestoreLibpodParams) WithPathName(name string) *ContainerRestoreLibpodParams { + o.SetPathName(name) + return o +} + +// SetPathName adds the name to the container restore libpod params +func (o *ContainerRestoreLibpodParams) SetPathName(name string) { + o.PathName = name +} + // WithPrintStats adds the printStats to the container restore libpod params func (o *ContainerRestoreLibpodParams) WithPrintStats(printStats *bool) *ContainerRestoreLibpodParams { o.SetPrintStats(printStats) @@ -395,11 +395,6 @@ } } - // path param name - if err := r.SetPathParam("name", o.PathName); err != nil { - return err - } - if o.QueryName != nil { // query param name @@ -417,6 +412,11 @@ } } + // path param name + if err := r.SetPathParam("name", o.PathName); err != nil { + return err + } + if o.PrintStats != nil { // query param printStats diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/client/generated/libpod/client/containers_compat/container_rename_parameters.go new/client/generated/libpod/client/containers_compat/container_rename_parameters.go --- old/client/generated/libpod/client/containers_compat/container_rename_parameters.go 2024-09-14 10:24:46.834873372 +0200 +++ new/client/generated/libpod/client/containers_compat/container_rename_parameters.go 2024-11-04 21:06:53.817982497 +0100 @@ -63,15 +63,15 @@ /* Name. - Full or partial ID or full name of the container to rename + New name for the container */ - PathName string + QueryName string /* Name. - New name for the container + Full or partial ID or full name of the container to rename */ - QueryName string + PathName string timeout time.Duration Context context.Context @@ -126,17 +126,6 @@ o.HTTPClient = client } -// WithPathName adds the name to the container rename params -func (o *ContainerRenameParams) WithPathName(name string) *ContainerRenameParams { - o.SetPathName(name) - return o -} - -// SetPathName adds the name to the container rename params -func (o *ContainerRenameParams) SetPathName(name string) { - o.PathName = name -} - // WithQueryName adds the name to the container rename params func (o *ContainerRenameParams) WithQueryName(name string) *ContainerRenameParams { o.SetQueryName(name) @@ -148,6 +137,17 @@ o.QueryName = name } +// WithPathName adds the name to the container rename params +func (o *ContainerRenameParams) WithPathName(name string) *ContainerRenameParams { + o.SetPathName(name) + return o +} + +// SetPathName adds the name to the container rename params +func (o *ContainerRenameParams) SetPathName(name string) { + o.PathName = name +} + // WriteToRequest writes these params to a swagger request func (o *ContainerRenameParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { @@ -156,11 +156,6 @@ } var res []error - // path param name - if err := r.SetPathParam("name", o.PathName); err != nil { - return err - } - // query param name qrName := o.QueryName qName := qrName @@ -171,6 +166,11 @@ } } + // path param name + if err := r.SetPathParam("name", o.PathName); err != nil { + return err + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/client/generated/libpod/models/network_connect_options.go new/client/generated/libpod/models/network_connect_options.go --- old/client/generated/libpod/models/network_connect_options.go 2024-09-14 10:24:33.608410155 +0200 +++ new/client/generated/libpod/models/network_connect_options.go 2024-11-04 21:05:48.138913933 +0100 @@ -49,10 +49,6 @@ res = append(res, err) } - if err := m.validateStaticMac(formats); err != nil { - res = append(res, err) - } - if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -80,23 +76,6 @@ return nil } -func (m *NetworkConnectOptions) validateStaticMac(formats strfmt.Registry) error { - if swag.IsZero(m.StaticMac) { // not required - return nil - } - - if err := m.StaticMac.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("static_mac") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("static_mac") - } - return err - } - - return nil -} - // ContextValidate validate this network connect options based on the context it is used func (m *NetworkConnectOptions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error @@ -105,10 +84,6 @@ res = append(res, err) } - if err := m.contextValidateStaticMac(ctx, formats); err != nil { - res = append(res, err) - } - if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -131,20 +106,6 @@ } return nil -} - -func (m *NetworkConnectOptions) contextValidateStaticMac(ctx context.Context, formats strfmt.Registry) error { - - if err := m.StaticMac.ContextValidate(ctx, formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("static_mac") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("static_mac") - } - return err - } - - return nil } // MarshalBinary interface implementation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/client/generated/libpod/models/swag_network_connect_request.go new/client/generated/libpod/models/swag_network_connect_request.go --- old/client/generated/libpod/models/swag_network_connect_request.go 2024-09-14 10:24:43.148263413 +0200 +++ new/client/generated/libpod/models/swag_network_connect_request.go 2024-11-04 21:06:31.384967300 +0100 @@ -48,10 +48,6 @@ res = append(res, err) } - if err := m.validateStaticMac(formats); err != nil { - res = append(res, err) - } - if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -79,23 +75,6 @@ return nil } -func (m *SwagNetworkConnectRequest) validateStaticMac(formats strfmt.Registry) error { - if swag.IsZero(m.StaticMac) { // not required - return nil - } - - if err := m.StaticMac.Validate(formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("static_mac") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("static_mac") - } - return err - } - - return nil -} - // ContextValidate validate this swag network connect request based on the context it is used func (m *SwagNetworkConnectRequest) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error @@ -104,10 +83,6 @@ res = append(res, err) } - if err := m.contextValidateStaticMac(ctx, formats); err != nil { - res = append(res, err) - } - if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -130,20 +105,6 @@ } return nil -} - -func (m *SwagNetworkConnectRequest) contextValidateStaticMac(ctx context.Context, formats strfmt.Registry) error { - - if err := m.StaticMac.ContextValidate(ctx, formats); err != nil { - if ve, ok := err.(*errors.Validation); ok { - return ve.ValidateName("static_mac") - } else if ce, ok := err.(*errors.CompositeError); ok { - return ce.ValidateName("static_mac") - } - return err - } - - return nil } // MarshalBinary interface implementation ++++++ skupper-1.8.1.obscpio -> skupper-1.8.2.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/README.md new/skupper-1.8.2/README.md --- old/skupper-1.8.1/README.md 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/README.md 2024-11-04 12:08:20.000000000 +0100 @@ -33,5 +33,10 @@ * [CLI](cmd/skupper/README.md) (This replaces the [Skupper CLI repo](https://github.com/skupperproject/skupper-cli)) * [Console (Preview)](https://github.com/skupperproject/skupper-console) +# Skupper Major Release (Version 2) + +The [v2 Branch](https://github.com/skupperproject/skupper/tree/v2) focuses on the development of +the upcoming major release of the Skupper poject. + # Licensing Skupper uses the [Skupper Router](https://github.com/skupperproject/skupper-router) project and is released under the same [Apache License 2.0](https://github.com/skupperproject/skupper/blob/main/LICENSE). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/cmd/flow-collector/deploy.yaml new/skupper-1.8.2/cmd/flow-collector/deploy.yaml --- old/skupper-1.8.1/cmd/flow-collector/deploy.yaml 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/cmd/flow-collector/deploy.yaml 2024-11-04 12:08:20.000000000 +0100 @@ -66,7 +66,7 @@ #type: RuntimeDefault containers: - name: skupper-flow-collector - image: quay.io/skupper/flow-collector:1.8.1 + image: quay.io/skupper/flow-collector:1.8.2 imagePullPolicy: Always securityContext: capabilities: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/cmd/site-controller/deploy-watch-all-ns.yaml new/skupper-1.8.2/cmd/site-controller/deploy-watch-all-ns.yaml --- old/skupper-1.8.1/cmd/site-controller/deploy-watch-all-ns.yaml 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/cmd/site-controller/deploy-watch-all-ns.yaml 2024-11-04 12:08:20.000000000 +0100 @@ -194,7 +194,7 @@ type: RuntimeDefault containers: - name: site-controller - image: quay.io/skupper/site-controller:1.8.1 + image: quay.io/skupper/site-controller:1.8.2 securityContext: capabilities: drop: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/cmd/site-controller/deploy-watch-current-ns.yaml new/skupper-1.8.2/cmd/site-controller/deploy-watch-current-ns.yaml --- old/skupper-1.8.1/cmd/site-controller/deploy-watch-current-ns.yaml 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/cmd/site-controller/deploy-watch-current-ns.yaml 2024-11-04 12:08:20.000000000 +0100 @@ -137,7 +137,7 @@ type: RuntimeDefault containers: - name: site-controller - image: quay.io/skupper/site-controller:1.8.1 + image: quay.io/skupper/site-controller:1.8.2 securityContext: capabilities: drop: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/domain/podman/update_v1_5_4.go new/skupper-1.8.2/pkg/domain/podman/update_v1_5_4.go --- old/skupper-1.8.1/pkg/domain/podman/update_v1_5_4.go 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/pkg/domain/podman/update_v1_5_4.go 1970-01-01 01:00:00.000000000 +0100 @@ -1,68 +0,0 @@ -package podman - -import ( - "context" - "fmt" - - "github.com/skupperproject/skupper/api/types" - "github.com/skupperproject/skupper/client/container" - clientpodman "github.com/skupperproject/skupper/client/podman" - "github.com/skupperproject/skupper/pkg/domain" - "github.com/skupperproject/skupper/pkg/utils" -) - -type SkupperNetworkStatusVolume struct { - cli *clientpodman.PodmanRestClient -} - -func (m *SkupperNetworkStatusVolume) WithCli(cli *clientpodman.PodmanRestClient) *SkupperNetworkStatusVolume { - m.cli = cli - return m -} - -func (m *SkupperNetworkStatusVolume) Info() string { - return "Create and mount the skupper-network-status volume" -} - -func (m *SkupperNetworkStatusVolume) AppliesTo(siteVersion string) bool { - curVersion := utils.ParseVersion(siteVersion) - return !(&curVersion).IsUndefined() && utils.LessRecentThanVersion(siteVersion, m.Version()) -} - -func (m *SkupperNetworkStatusVolume) Version() string { - return "1.5.4" -} - -func (m *SkupperNetworkStatusVolume) Priority() domain.UpdatePriority { - return domain.PriorityNormal -} - -func (m *SkupperNetworkStatusVolume) Run(ctx context.Context) *domain.UpdateResult { - volumeName := types.NetworkStatusConfigMapName - containerName := types.ControllerPodmanContainerName - var result = &domain.UpdateResult{} - - _, err := m.cli.ContainerUpdate(containerName, func(newContainer *container.Container) { - for _, mount := range newContainer.Mounts { - if mount.Name == volumeName { - return - } - } - // volume not mounted, creating and mounting - volume, err := m.cli.VolumeCreate(&container.Volume{Name: volumeName}) - if err != nil && volume == nil { - result.AddErrors(fmt.Errorf("error creating volume %s: %s", volumeName, err)) - } else if volume == nil { - result.AddChange(fmt.Sprintf("Volume has been created: %s", volumeName)) - } - newContainer.Mounts = append(newContainer.Mounts, container.Volume{ - Name: volumeName, - Destination: "/etc/skupper-network-status", - }) - result.AddChange(fmt.Sprintf("Mounted volume %s into %s", volumeName, containerName)) - }) - if err != nil { - result.AddErrors(fmt.Errorf("error updating container %s: %s", containerName, err)) - } - return result -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/domain/podman/update_v1_5_4_test.go new/skupper-1.8.2/pkg/domain/podman/update_v1_5_4_test.go --- old/skupper-1.8.1/pkg/domain/podman/update_v1_5_4_test.go 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/pkg/domain/podman/update_v1_5_4_test.go 1970-01-01 01:00:00.000000000 +0100 @@ -1,107 +0,0 @@ -//go:build podman -// +build podman - -package podman - -import ( - "context" - "testing" - - "github.com/skupperproject/skupper/api/types" - clientpodman "github.com/skupperproject/skupper/client/podman" - "gotest.tools/assert" -) - -func TestSkupperNetworkStatusVolumeUpdate(t *testing.T) { - cli := clientpodman.NewPodmanClientMock(mockContainers()) - mock := cli.RestClient.(*clientpodman.RestClientMock) - localMockVolumes, localMockVolumeFiles := mockVolumes() - // removing new volume to enforce update task to run - delete(localMockVolumes, "skupper-network-status") - assert.Assert(t, mock.MockVolumeFiles(localMockVolumes, localMockVolumeFiles)) - defer func() { - _ = mock.CleanupMockVolumeDir() - }() - ch := NewRouterConfigHandlerPodman(cli) - - updateSkupperNetworkVolumeTask := new(SkupperNetworkStatusVolume).WithCli(cli) - - tests := []struct { - name string - curVersion string - version string - applies bool - changed bool - }{ - { - name: "newer-version", - curVersion: "1.5.3", - version: "1.5.4", - applies: true, - changed: true, - }, - { - name: "newer-version-volume-exists", - curVersion: "1.5.3", - version: "1.5.4", - applies: true, - changed: false, - }, - { - name: "older-version", - curVersion: "1.5.4", - version: "1.5.3", - applies: false, - }, - { - name: "invalid-old-version", - curVersion: "invalid-old-version", - version: "1.5.4", - applies: false, - }, - { - name: "invalid-versions", - curVersion: "invalid-old-version", - version: "invalid-new-version", - applies: false, - }, - } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - cfg, err := ch.GetRouterConfig() - assert.Assert(t, err) - siteMeta := cfg.GetSiteMetadata() - siteMeta.Version = test.curVersion - cfg.SetSiteMetadata(&siteMeta) - assert.Assert(t, ch.SaveRouterConfig(cfg)) - // simulating new version - t.Logf("New version: %s - current mock site version: %s", test.version, test.curVersion) - - // validating if task has to be executed or not - assert.Assert(t, updateSkupperNetworkVolumeTask.AppliesTo(test.curVersion) == test.applies) - - // mocking task execution - if test.applies { - res := updateSkupperNetworkVolumeTask.Run(context.Background()) - assert.Assert(t, len(res.Errors) == 0) - assert.Assert(t, res.Changed() == test.changed) - if test.changed { - assert.Assert(t, 1 == len(res.GetChanges())) - // removing mounted volume from controller container - volumeMounted := false - for _, c := range mock.Containers { - if c.Name != types.ControllerPodmanContainerName { - continue - } - for _, m := range c.Mounts { - if m.Name == types.NetworkStatusConfigMapName { - volumeMounted = true - } - } - } - assert.Assert(t, volumeMounted) - } - } - }) - } -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/domain/podman/update_v1_6_0.go new/skupper-1.8.2/pkg/domain/podman/update_v1_6_0.go --- old/skupper-1.8.1/pkg/domain/podman/update_v1_6_0.go 1970-01-01 01:00:00.000000000 +0100 +++ new/skupper-1.8.2/pkg/domain/podman/update_v1_6_0.go 2024-11-04 12:08:20.000000000 +0100 @@ -0,0 +1,68 @@ +package podman + +import ( + "context" + "fmt" + + "github.com/skupperproject/skupper/api/types" + "github.com/skupperproject/skupper/client/container" + clientpodman "github.com/skupperproject/skupper/client/podman" + "github.com/skupperproject/skupper/pkg/domain" + "github.com/skupperproject/skupper/pkg/utils" +) + +type SkupperNetworkStatusVolume struct { + cli *clientpodman.PodmanRestClient +} + +func (m *SkupperNetworkStatusVolume) WithCli(cli *clientpodman.PodmanRestClient) *SkupperNetworkStatusVolume { + m.cli = cli + return m +} + +func (m *SkupperNetworkStatusVolume) Info() string { + return "Create and mount the skupper-network-status volume" +} + +func (m *SkupperNetworkStatusVolume) AppliesTo(siteVersion string) bool { + curVersion := utils.ParseVersion(siteVersion) + return !(&curVersion).IsUndefined() && utils.LessRecentThanVersion(siteVersion, m.Version()) +} + +func (m *SkupperNetworkStatusVolume) Version() string { + return "1.6.0" +} + +func (m *SkupperNetworkStatusVolume) Priority() domain.UpdatePriority { + return domain.PriorityNormal +} + +func (m *SkupperNetworkStatusVolume) Run(ctx context.Context) *domain.UpdateResult { + volumeName := types.NetworkStatusConfigMapName + containerName := types.ControllerPodmanContainerName + var result = &domain.UpdateResult{} + + _, err := m.cli.ContainerUpdate(containerName, func(newContainer *container.Container) { + for _, mount := range newContainer.Mounts { + if mount.Name == volumeName { + return + } + } + // volume not mounted, creating and mounting + volume, err := m.cli.VolumeCreate(&container.Volume{Name: volumeName}) + if err != nil && volume == nil { + result.AddErrors(fmt.Errorf("error creating volume %s: %s", volumeName, err)) + } else if volume == nil { + result.AddChange(fmt.Sprintf("Volume has been created: %s", volumeName)) + } + newContainer.Mounts = append(newContainer.Mounts, container.Volume{ + Name: volumeName, + Destination: "/etc/skupper-network-status", + }) + result.AddChange(fmt.Sprintf("Mounted volume %s into %s", volumeName, containerName)) + }) + if err != nil { + result.AddErrors(fmt.Errorf("error updating container %s: %s", containerName, err)) + } + return result +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/domain/podman/update_v1_6_0_test.go new/skupper-1.8.2/pkg/domain/podman/update_v1_6_0_test.go --- old/skupper-1.8.1/pkg/domain/podman/update_v1_6_0_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/skupper-1.8.2/pkg/domain/podman/update_v1_6_0_test.go 2024-11-04 12:08:20.000000000 +0100 @@ -0,0 +1,107 @@ +//go:build podman +// +build podman + +package podman + +import ( + "context" + "testing" + + "github.com/skupperproject/skupper/api/types" + clientpodman "github.com/skupperproject/skupper/client/podman" + "gotest.tools/assert" +) + +func TestSkupperNetworkStatusVolumeUpdate(t *testing.T) { + cli := clientpodman.NewPodmanClientMock(mockContainers()) + mock := cli.RestClient.(*clientpodman.RestClientMock) + localMockVolumes, localMockVolumeFiles := mockVolumes() + // removing new volume to enforce update task to run + delete(localMockVolumes, "skupper-network-status") + assert.Assert(t, mock.MockVolumeFiles(localMockVolumes, localMockVolumeFiles)) + defer func() { + _ = mock.CleanupMockVolumeDir() + }() + ch := NewRouterConfigHandlerPodman(cli) + + updateSkupperNetworkVolumeTask := new(SkupperNetworkStatusVolume).WithCli(cli) + + tests := []struct { + name string + curVersion string + version string + applies bool + changed bool + }{ + { + name: "newer-version", + curVersion: "1.5.3", + version: "1.6.0", + applies: true, + changed: true, + }, + { + name: "newer-version-volume-exists", + curVersion: "1.5.3", + version: "1.6.0", + applies: true, + changed: false, + }, + { + name: "older-version", + curVersion: "1.6.0", + version: "1.5.3", + applies: false, + }, + { + name: "invalid-old-version", + curVersion: "invalid-old-version", + version: "1.6.0", + applies: false, + }, + { + name: "invalid-versions", + curVersion: "invalid-old-version", + version: "invalid-new-version", + applies: false, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + cfg, err := ch.GetRouterConfig() + assert.Assert(t, err) + siteMeta := cfg.GetSiteMetadata() + siteMeta.Version = test.curVersion + cfg.SetSiteMetadata(&siteMeta) + assert.Assert(t, ch.SaveRouterConfig(cfg)) + // simulating new version + t.Logf("New version: %s - current mock site version: %s", test.version, test.curVersion) + + // validating if task has to be executed or not + assert.Assert(t, updateSkupperNetworkVolumeTask.AppliesTo(test.curVersion) == test.applies) + + // mocking task execution + if test.applies { + res := updateSkupperNetworkVolumeTask.Run(context.Background()) + assert.Assert(t, len(res.Errors) == 0) + assert.Assert(t, res.Changed() == test.changed) + if test.changed { + assert.Assert(t, 1 == len(res.GetChanges())) + // removing mounted volume from controller container + volumeMounted := false + for _, c := range mock.Containers { + if c.Name != types.ControllerPodmanContainerName { + continue + } + for _, m := range c.Mounts { + if m.Name == types.NetworkStatusConfigMapName { + volumeMounted = true + } + } + } + assert.Assert(t, volumeMounted) + } + } + }) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/flow/flow_mem_driver.go new/skupper-1.8.2/pkg/flow/flow_mem_driver.go --- old/skupper-1.8.1/pkg/flow/flow_mem_driver.go 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/pkg/flow/flow_mem_driver.go 2024-11-04 12:08:20.000000000 +0100 @@ -809,8 +809,38 @@ } } else { if link.EndTime > 0 { + // find and delete the corresponding link for the peer router + if currentParentRouter, ok := fc.Routers[current.Parent]; ok { + if current.Direction != nil && current.Name != nil && currentParentRouter.Name != nil { + var peerRouterId string + peerDirection := Outgoing + if *current.Direction == Outgoing { + peerDirection = Incoming + } + for _, router := range fc.Routers { + if router.Name != nil && *current.Name == normalizeRouterName(*router.Name) { + peerRouterId = router.Identity + break + } + } + for _, eLink := range fc.Links { + if eLink.Direction != nil && *eLink.Direction == peerDirection && eLink.Parent == peerRouterId && eLink.Name != nil && *eLink.Name == normalizeRouterName(*currentParentRouter.Name) { + eLink.EndTime = link.EndTime + fc.deleteRecord(eLink) + break + } + } + } + } current.EndTime = link.EndTime fc.deleteRecord(current) + } else { + if current.LinkCost == nil && link.LinkCost != nil { + current.LinkCost = link.LinkCost + if fc.mode == RecordStatus { + fc.updateNetworkStatus() + } + } } } fc.updateLastHeard(link.Source) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/flow/flow_mem_driver_test.go new/skupper-1.8.2/pkg/flow/flow_mem_driver_test.go --- old/skupper-1.8.1/pkg/flow/flow_mem_driver_test.go 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/pkg/flow/flow_mem_driver_test.go 2024-11-04 12:08:20.000000000 +0100 @@ -1623,3 +1623,96 @@ }) } } + +func TestLinkOutgoingDelete(t *testing.T) { + name1 := "east-skupper-router-1111-router1" + name2 := "west-skupper-router-1111-router0" + + links := []LinkRecord{ + { + Base: Base{ + RecType: recordNames[Link], + Identity: "link:0", + Parent: "router0:0", + StartTime: uint64(time.Now().UnixNano()) / uint64(time.Microsecond), + }, + Name: &name1, + Direction: &Incoming, + }, + { + Base: Base{ + RecType: recordNames[Link], + Identity: "link:1", + Parent: "router1:0", + StartTime: uint64(time.Now().UnixNano()) / uint64(time.Microsecond), + }, + Name: &name2, + Direction: &Outgoing, + }, + } + + routers := []RouterRecord{ + { + Base: Base{ + RecType: recordNames[Router], + Identity: "router0:0", + Parent: "site:0", + StartTime: uint64(time.Now().UnixNano()) / uint64(time.Microsecond), + }, + Name: &name2, + }, + { + Base: Base{ + RecType: recordNames[Router], + Identity: "router1:0", + Parent: "site:0", + StartTime: uint64(time.Now().UnixNano()) / uint64(time.Microsecond), + }, + Name: &name1, + }, + } + + u, _ := time.ParseDuration("5m") + client := fake.NewSimpleClientset() + configMapClient := client.CoreV1().ConfigMaps("default") + _, err := configMapClient.Create( + context.Background(), + &v1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Name: types.NetworkStatusConfigMapName}}, + metav1.CreateOptions{}, + ) + if err != nil { + t.Fatalf("kube client setup failed: %v", err) + } + fc := NewFlowCollector(FlowCollectorSpec{ + Mode: RecordStatus, + Namespace: "default", + Origin: "origin", + PromReg: nil, + ConnectionFactory: nil, + FlowRecordTtl: u, + NetworkStatusClient: client, + }) + + for _, r := range routers { + err := fc.updateRecord(r) + assert.Assert(t, err) + } + + for _, l := range links { + err := fc.updateRecord(l) + assert.Assert(t, err) + } + + assert.Equal(t, len(fc.Links), 2) + assert.Equal(t, len(fc.Routers), 2) + + endTime := uint64(time.Now().UnixNano()) / uint64(time.Microsecond) + + links[0].EndTime = endTime + err = fc.updateRecord(links[0]) + assert.Assert(t, err) + + // expect code to remove both incoming and corresponding outgoing links + assert.Equal(t, len(fc.Links), 0) + +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/skupper-1.8.1/pkg/images/images.go new/skupper-1.8.2/pkg/images/images.go --- old/skupper-1.8.1/pkg/images/images.go 2024-09-09 12:34:02.000000000 +0200 +++ new/skupper-1.8.2/pkg/images/images.go 2024-11-04 12:08:20.000000000 +0100 @@ -2,12 +2,12 @@ const ( DefaultImageRegistry string = "quay.io/skupper" - RouterImageName string = "skupper-router:2.7.1" - ServiceControllerImageName string = "service-controller:1.8.1" - ControllerPodmanImageName string = "controller-podman:1.8.1" - ConfigSyncImageName string = "config-sync:1.8.1" - FlowCollectorImageName string = "flow-collector:1.8.1" - SiteControllerImageName string = "site-controller:1.8.1" + RouterImageName string = "skupper-router:2.7.2" + ServiceControllerImageName string = "service-controller:1.8.2" + ControllerPodmanImageName string = "controller-podman:1.8.2" + ConfigSyncImageName string = "config-sync:1.8.2" + FlowCollectorImageName string = "flow-collector:1.8.2" + SiteControllerImageName string = "site-controller:1.8.2" PrometheusImageRegistry string = "quay.io/prometheus" PrometheusServerImageName string = "prometheus:v2.42.0" OauthProxyImageRegistry string = "quay.io/openshift" ++++++ skupper.obsinfo ++++++ --- /var/tmp/diff_new_pack.GR7KP8/_old 2024-11-05 15:41:21.058905382 +0100 +++ /var/tmp/diff_new_pack.GR7KP8/_new 2024-11-05 15:41:21.062905550 +0100 @@ -1,5 +1,5 @@ name: skupper -version: 1.8.1 -mtime: 1725878042 -commit: b44bc8ab3469fb3c02a0df7ac8334452bc391654 +version: 1.8.2 +mtime: 1730718500 +commit: 149f4a5588c532d6ab1fc489b19ca24633e521e7 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/skupper/vendor.tar.gz /work/SRC/openSUSE:Factory/.skupper.new.2020/vendor.tar.gz differ: char 12, line 1