mirror of https://github.com/harness/drone.git
feat: [CDE-126]: Addressing review comments. (#2171)
* feat: [CDE-126]: Addressing review comments. * feat: [CDE-126]: Addressing review comments. * feat: [CDE-126]: Addressing review comments. * feat: [CDE-126]: Addressing review comments.unified-ui
parent
3acded8ed8
commit
3ccd39df01
|
@ -0,0 +1,20 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package events
|
||||||
|
|
||||||
|
const (
|
||||||
|
// category defines the event category used for this package.
|
||||||
|
category = "gitspace"
|
||||||
|
)
|
|
@ -0,0 +1,60 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package events
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
"github.com/harness/gitness/types/enum"
|
||||||
|
|
||||||
|
"github.com/rs/zerolog/log"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// List all Gitspace events below.
|
||||||
|
|
||||||
|
GitspaceEvent events.EventType = "gitspace_event"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
GitspaceEventPayload struct {
|
||||||
|
EntityID int64 `json:"entity_id,omitempty"`
|
||||||
|
EntityIdentifier string `json:"entity_identifier,omitempty"`
|
||||||
|
EntityType enum.GitspaceEntityType `json:"entity_type,omitempty"`
|
||||||
|
EventType enum.GitspaceEventType `json:"event_type,omitempty"`
|
||||||
|
Created int64 `json:"created,omitempty"`
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (r *Reporter) EmitGitspaceEvent(ctx context.Context, event events.EventType, payload *GitspaceEventPayload) {
|
||||||
|
if payload == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
eventID, err := events.ReporterSendEvent(r.innerReporter, ctx, event, payload)
|
||||||
|
if err != nil {
|
||||||
|
log.Ctx(ctx).Err(err).Msgf("failed to send %v event", event)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Ctx(ctx).Debug().Msgf("reported %v event with id '%s'", event, eventID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Reader) RegisterGitspaceEvent(
|
||||||
|
fn events.HandlerFunc[*GitspaceEventPayload],
|
||||||
|
opts ...events.HandlerOption,
|
||||||
|
) error {
|
||||||
|
return events.ReaderRegisterEvent(r.innerReader, GitspaceEvent, fn, opts...)
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package events
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewReaderFactory(eventsSystem *events.System) (*events.ReaderFactory[*Reader], error) {
|
||||||
|
readerFactoryFunc := func(innerReader *events.GenericReader) (*Reader, error) {
|
||||||
|
return &Reader{
|
||||||
|
innerReader: innerReader,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return events.NewReaderFactory(eventsSystem, category, readerFactoryFunc)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reader is the event reader for this package.
|
||||||
|
type Reader struct {
|
||||||
|
innerReader *events.GenericReader
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Reader) Configure(opts ...events.ReaderOption) {
|
||||||
|
r.innerReader.Configure(opts...)
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package events
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reporter is the event reporter for this package.
|
||||||
|
type Reporter struct {
|
||||||
|
innerReporter *events.GenericReporter
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewReporter(eventsSystem *events.System) (*Reporter, error) {
|
||||||
|
innerReporter, err := events.NewReporter(eventsSystem, category)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("failed to create new GenericReporter from event system")
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Reporter{
|
||||||
|
innerReporter: innerReporter,
|
||||||
|
}, nil
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package events
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
|
||||||
|
"github.com/google/wire"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WireSet provides a wire set for this package.
|
||||||
|
var WireSet = wire.NewSet(
|
||||||
|
ProvideReaderFactory,
|
||||||
|
ProvideReporter,
|
||||||
|
)
|
||||||
|
|
||||||
|
func ProvideReaderFactory(eventsSystem *events.System) (*events.ReaderFactory[*Reader], error) {
|
||||||
|
return NewReaderFactory(eventsSystem)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProvideReporter(eventsSystem *events.System) (*Reporter, error) {
|
||||||
|
return NewReporter(eventsSystem)
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package gitspaceevent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
gitspaceevents "github.com/harness/gitness/app/events/gitspace"
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
"github.com/harness/gitness/types"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Service) handleGitspaceEvent(
|
||||||
|
ctx context.Context,
|
||||||
|
event *events.Event[*gitspaceevents.GitspaceEventPayload],
|
||||||
|
) error {
|
||||||
|
gitspaceEvent := &types.GitspaceEvent{
|
||||||
|
Event: event.Payload.EventType,
|
||||||
|
EntityID: event.Payload.EntityID,
|
||||||
|
EntityIdentifier: event.Payload.EntityIdentifier,
|
||||||
|
EntityType: event.Payload.EntityType,
|
||||||
|
Created: event.Payload.Created,
|
||||||
|
}
|
||||||
|
|
||||||
|
err := s.gitspaceEventStore.Create(ctx, gitspaceEvent)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to create gitspace event: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package gitspaceevent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
gitspaceevents "github.com/harness/gitness/app/events/gitspace"
|
||||||
|
"github.com/harness/gitness/app/store"
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
"github.com/harness/gitness/stream"
|
||||||
|
)
|
||||||
|
|
||||||
|
const groupGitspaceEvents = "gitness:gitspace"
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
EventReaderName string
|
||||||
|
Concurrency int
|
||||||
|
MaxRetries int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) Sanitize() error {
|
||||||
|
if c == nil {
|
||||||
|
return errors.New("config is required")
|
||||||
|
}
|
||||||
|
if c.EventReaderName == "" {
|
||||||
|
return errors.New("config.EventReaderName is required")
|
||||||
|
}
|
||||||
|
if c.Concurrency < 1 {
|
||||||
|
return errors.New("config.Concurrency has to be a positive number")
|
||||||
|
}
|
||||||
|
if c.MaxRetries < 0 {
|
||||||
|
return errors.New("config.MaxRetries can't be negative")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
config Config
|
||||||
|
gitspaceEventStore store.GitspaceEventStore
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewService(
|
||||||
|
ctx context.Context,
|
||||||
|
config Config,
|
||||||
|
gitspaceEventReaderFactory *events.ReaderFactory[*gitspaceevents.Reader],
|
||||||
|
gitspaceEventStore store.GitspaceEventStore,
|
||||||
|
) (*Service, error) {
|
||||||
|
if err := config.Sanitize(); err != nil {
|
||||||
|
return nil, fmt.Errorf("provided gitspace event service config is invalid: %w", err)
|
||||||
|
}
|
||||||
|
service := &Service{
|
||||||
|
config: config,
|
||||||
|
gitspaceEventStore: gitspaceEventStore,
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := gitspaceEventReaderFactory.Launch(ctx, groupGitspaceEvents, config.EventReaderName,
|
||||||
|
func(r *gitspaceevents.Reader) error {
|
||||||
|
const idleTimeout = 1 * time.Minute
|
||||||
|
r.Configure(
|
||||||
|
stream.WithConcurrency(config.Concurrency),
|
||||||
|
stream.WithHandlerOptions(
|
||||||
|
stream.WithIdleTimeout(idleTimeout),
|
||||||
|
stream.WithMaxRetries(config.MaxRetries),
|
||||||
|
))
|
||||||
|
|
||||||
|
// register gitspace config events
|
||||||
|
_ = r.RegisterGitspaceEvent(service.handleGitspaceEvent)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to launch gitspace event reader: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return service, nil
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package gitspaceevent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
gitspaceevents "github.com/harness/gitness/app/events/gitspace"
|
||||||
|
"github.com/harness/gitness/app/store"
|
||||||
|
"github.com/harness/gitness/events"
|
||||||
|
|
||||||
|
"github.com/google/wire"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WireSet provides a wire set for this package.
|
||||||
|
var WireSet = wire.NewSet(
|
||||||
|
ProvideService,
|
||||||
|
)
|
||||||
|
|
||||||
|
func ProvideService(ctx context.Context,
|
||||||
|
config Config,
|
||||||
|
gitspaceEventReaderFactory *events.ReaderFactory[*gitspaceevents.Reader],
|
||||||
|
gitspaceEventStore store.GitspaceEventStore,
|
||||||
|
) (*Service, error) {
|
||||||
|
return NewService(
|
||||||
|
ctx,
|
||||||
|
config,
|
||||||
|
gitspaceEventReaderFactory,
|
||||||
|
gitspaceEventStore,
|
||||||
|
)
|
||||||
|
}
|
|
@ -832,4 +832,18 @@ type (
|
||||||
// ListByFingerprint returns public keys given a fingerprint and key usage.
|
// ListByFingerprint returns public keys given a fingerprint and key usage.
|
||||||
ListByFingerprint(ctx context.Context, fingerprint string) ([]types.PublicKey, error)
|
ListByFingerprint(ctx context.Context, fingerprint string) ([]types.PublicKey, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GitspaceEventStore interface {
|
||||||
|
// Create creates a new record for the given gitspace event.
|
||||||
|
Create(ctx context.Context, gitspaceEvent *types.GitspaceEvent) error
|
||||||
|
// List returns all events for the given query filter.
|
||||||
|
List(ctx context.Context, filter *types.GitspaceEventFilter) ([]*types.GitspaceEvent, error)
|
||||||
|
// FindLatestByTypeAndGitspaceConfigID returns the latest gitspace event for the given config ID and event type
|
||||||
|
// where the entity type is gitspace config.
|
||||||
|
FindLatestByTypeAndGitspaceConfigID(
|
||||||
|
ctx context.Context,
|
||||||
|
eventType enum.GitspaceEventType,
|
||||||
|
gitspaceConfigID int64,
|
||||||
|
) (*types.GitspaceEvent, error)
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package database
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/harness/gitness/app/store"
|
||||||
|
"github.com/harness/gitness/store/database"
|
||||||
|
"github.com/harness/gitness/store/database/dbtx"
|
||||||
|
"github.com/harness/gitness/types"
|
||||||
|
"github.com/harness/gitness/types/enum"
|
||||||
|
|
||||||
|
"github.com/jmoiron/sqlx"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ store.GitspaceEventStore = (*gitspaceEventStore)(nil)
|
||||||
|
|
||||||
|
const (
|
||||||
|
gitspaceEventIDColumn = `geven_id`
|
||||||
|
gitspaceEventsColumns = `
|
||||||
|
geven_event,
|
||||||
|
geven_created,
|
||||||
|
geven_entity_type,
|
||||||
|
geven_entity_uid,
|
||||||
|
geven_entity_id
|
||||||
|
`
|
||||||
|
gitspaceEventsColumnsWithID = gitspaceEventIDColumn + `,
|
||||||
|
` + gitspaceEventsColumns
|
||||||
|
gitspaceEventsTable = `gitspace_events`
|
||||||
|
)
|
||||||
|
|
||||||
|
type gitspaceEventStore struct {
|
||||||
|
db *sqlx.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
type gitspaceEvent struct {
|
||||||
|
ID int64 `db:"geven_id"`
|
||||||
|
Event enum.GitspaceEventType `db:"geven_event"`
|
||||||
|
Created int64 `db:"geven_created"`
|
||||||
|
EntityType enum.GitspaceEntityType `db:"geven_entity_type"`
|
||||||
|
EntityIdentifier string `db:"geven_entity_uid"`
|
||||||
|
EntityID int64 `db:"geven_entity_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGitspaceEventStore(db *sqlx.DB) store.GitspaceEventStore {
|
||||||
|
return &gitspaceEventStore{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g gitspaceEventStore) FindLatestByTypeAndGitspaceConfigID(
|
||||||
|
ctx context.Context,
|
||||||
|
eventType enum.GitspaceEventType,
|
||||||
|
gitspaceConfigID int64,
|
||||||
|
) (*types.GitspaceEvent, error) {
|
||||||
|
stmt := database.Builder.
|
||||||
|
Select(gitspaceEventsColumnsWithID).
|
||||||
|
From(gitspaceEventsTable).
|
||||||
|
Where("geven_event = $1", eventType).
|
||||||
|
Where("geven_entity_id = $2", gitspaceConfigID).
|
||||||
|
OrderBy("geven_created DESC")
|
||||||
|
sql, args, err := stmt.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to convert squirrel builder to sql: %w", err)
|
||||||
|
}
|
||||||
|
db := dbtx.GetAccessor(ctx, g.db)
|
||||||
|
gitspaceEventEntity := new(gitspaceEvent)
|
||||||
|
if err = db.GetContext(ctx, gitspaceEventEntity, sql, args...); err != nil {
|
||||||
|
return nil, database.ProcessSQLErrorf(ctx, err, "Failed to find gitspaceEvent")
|
||||||
|
}
|
||||||
|
return g.mapGitspaceEvent(gitspaceEventEntity), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g gitspaceEventStore) Create(ctx context.Context, gitspaceEvent *types.GitspaceEvent) error {
|
||||||
|
stmt := database.Builder.
|
||||||
|
Insert(gitspaceEventsTable).
|
||||||
|
Columns(gitspaceEventsColumns).
|
||||||
|
Values(
|
||||||
|
gitspaceEvent.Event,
|
||||||
|
gitspaceEvent.Created,
|
||||||
|
gitspaceEvent.EntityType,
|
||||||
|
gitspaceEvent.EntityIdentifier,
|
||||||
|
gitspaceEvent.EntityID,
|
||||||
|
).
|
||||||
|
Suffix("RETURNING " + gitspaceEventIDColumn)
|
||||||
|
db := dbtx.GetAccessor(ctx, g.db)
|
||||||
|
sql, args, err := stmt.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to convert squirrel builder to sql: %w", err)
|
||||||
|
}
|
||||||
|
if err = db.QueryRowContext(ctx, sql, args...).Scan(&gitspaceEvent.ID); err != nil {
|
||||||
|
return database.ProcessSQLErrorf(ctx, err, "%s query failed", gitspaceEventsTable)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g gitspaceEventStore) List(
|
||||||
|
ctx context.Context,
|
||||||
|
filter *types.GitspaceEventFilter,
|
||||||
|
) ([]*types.GitspaceEvent, error) {
|
||||||
|
stmt := database.Builder.
|
||||||
|
Select(gitspaceEventsColumnsWithID).
|
||||||
|
From(gitspaceEventsTable).
|
||||||
|
Where("geven_entity_id = $1", filter.EntityID).
|
||||||
|
Where("geven_entity_type = $2", filter.EntityType)
|
||||||
|
sql, args, err := stmt.ToSql()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to convert squirrel builder to sql: %w", err)
|
||||||
|
}
|
||||||
|
db := dbtx.GetAccessor(ctx, g.db)
|
||||||
|
gitspaceEventEntities := make([]*gitspaceEvent, 0)
|
||||||
|
if err = db.SelectContext(ctx, gitspaceEventEntities, sql, args...); err != nil {
|
||||||
|
return nil, database.ProcessSQLErrorf(ctx, err, "Failed to find gitspaceEvent")
|
||||||
|
}
|
||||||
|
gitspaceEvents := g.mapGitspaceEvents(gitspaceEventEntities)
|
||||||
|
return gitspaceEvents, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g gitspaceEventStore) mapGitspaceEvents(gitspaceEventEntities []*gitspaceEvent) []*types.GitspaceEvent {
|
||||||
|
gitspaceEvents := make([]*types.GitspaceEvent, len(gitspaceEventEntities))
|
||||||
|
for index, gitspaceEventEntity := range gitspaceEventEntities {
|
||||||
|
currentEntity := gitspaceEventEntity
|
||||||
|
gitspaceEvents[index] = g.mapGitspaceEvent(currentEntity)
|
||||||
|
}
|
||||||
|
return gitspaceEvents
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g gitspaceEventStore) mapGitspaceEvent(event *gitspaceEvent) *types.GitspaceEvent {
|
||||||
|
return &types.GitspaceEvent{
|
||||||
|
Event: event.Event,
|
||||||
|
Created: event.Created,
|
||||||
|
EntityType: event.EntityType,
|
||||||
|
EntityIdentifier: event.EntityIdentifier,
|
||||||
|
EntityID: event.EntityID,
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"github.com/harness/gitness/app/gitspace/orchestrator/container"
|
"github.com/harness/gitness/app/gitspace/orchestrator/container"
|
||||||
"github.com/harness/gitness/app/services/cleanup"
|
"github.com/harness/gitness/app/services/cleanup"
|
||||||
"github.com/harness/gitness/app/services/codeowners"
|
"github.com/harness/gitness/app/services/codeowners"
|
||||||
|
"github.com/harness/gitness/app/services/gitspaceevent"
|
||||||
"github.com/harness/gitness/app/services/keywordsearch"
|
"github.com/harness/gitness/app/services/keywordsearch"
|
||||||
"github.com/harness/gitness/app/services/notification"
|
"github.com/harness/gitness/app/services/notification"
|
||||||
"github.com/harness/gitness/app/services/trigger"
|
"github.com/harness/gitness/app/services/trigger"
|
||||||
|
@ -415,3 +416,12 @@ func ProvideGitspaceContainerOrchestratorConfig(config *types.Config) (*containe
|
||||||
DefaultBindMountSourceBasePath: bindMountSourceBasePath,
|
DefaultBindMountSourceBasePath: bindMountSourceBasePath,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ProvideGitspaceEventConfig loads the gitspace event service config from the main config.
|
||||||
|
func ProvideGitspaceEventConfig(config *types.Config) gitspaceevent.Config {
|
||||||
|
return gitspaceevent.Config{
|
||||||
|
EventReaderName: config.InstanceID,
|
||||||
|
Concurrency: config.Gitspace.Events.Concurrency,
|
||||||
|
MaxRetries: config.Gitspace.Events.MaxRetries,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -403,5 +403,10 @@ type Config struct {
|
||||||
// Sub-directories will be created from this eg <DefaultBindMountSourceBasePath>/gitspace/space1/space2/config1
|
// Sub-directories will be created from this eg <DefaultBindMountSourceBasePath>/gitspace/space1/space2/config1
|
||||||
// If left blank, it will be set to $HOME/.gitness
|
// If left blank, it will be set to $HOME/.gitness
|
||||||
DefaultBindMountSourceBasePath string `envconfig:"GITNESS_GITSPACE_DEFAULT_BIND_MOUNT_SOURCE_BASE_PATH"`
|
DefaultBindMountSourceBasePath string `envconfig:"GITNESS_GITSPACE_DEFAULT_BIND_MOUNT_SOURCE_BASE_PATH"`
|
||||||
|
|
||||||
|
Events struct {
|
||||||
|
Concurrency int `envconfig:"GITNESS_GITSPACE_EVENTS_CONCURRENCY" default:"4"`
|
||||||
|
MaxRetries int `envconfig:"GITNESS_GITSPACE_EVENTS_MAX_RETRIES" default:"3"`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package enum
|
||||||
|
|
||||||
|
type GitspaceEntityType string
|
||||||
|
|
||||||
|
func (GitspaceEntityType) Enum() []interface{} { return toInterfaceSlice(gitspaceEntityTypes) }
|
||||||
|
|
||||||
|
var gitspaceEntityTypes = []GitspaceEntityType{
|
||||||
|
GitspaceEntityTypeGitspaceConfig, GitspaceEntityTypeGitspaceInstance,
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
GitspaceEntityTypeGitspaceConfig GitspaceEntityType = "gitspace_config"
|
||||||
|
GitspaceEntityTypeGitspaceInstance GitspaceEntityType = "gitspace_instance"
|
||||||
|
)
|
|
@ -0,0 +1,133 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package enum
|
||||||
|
|
||||||
|
type GitspaceEventType string
|
||||||
|
|
||||||
|
func (GitspaceEventType) Enum() []interface{} {
|
||||||
|
return toInterfaceSlice(gitspaceEventTypes)
|
||||||
|
}
|
||||||
|
|
||||||
|
var gitspaceEventTypes = []GitspaceEventType{
|
||||||
|
GitspaceEventTypeGitspaceActionStart,
|
||||||
|
GitspaceEventTypeGitspaceActionStartCompleted,
|
||||||
|
GitspaceEventTypeGitspaceActionStartFailed,
|
||||||
|
|
||||||
|
GitspaceEventTypeGitspaceActionStop,
|
||||||
|
GitspaceEventTypeGitspaceActionStopCompleted,
|
||||||
|
GitspaceEventTypeGitspaceActionStopFailed,
|
||||||
|
|
||||||
|
GitspaceEventTypeInfraProvisioningStart,
|
||||||
|
GitspaceEventTypeInfraProvisioningCompleted,
|
||||||
|
GitspaceEventTypeInfraProvisioningFailed,
|
||||||
|
|
||||||
|
GitspaceEventTypeInfraUnprovisioningStart,
|
||||||
|
GitspaceEventTypeInfraUnprovisioningCompleted,
|
||||||
|
GitspaceEventTypeInfraUnprovisioningFailed,
|
||||||
|
|
||||||
|
GitspaceEventTypeAgentConnectStart,
|
||||||
|
GitspaceEventTypeAgentConnectCompleted,
|
||||||
|
GitspaceEventTypeAgentConnectFailed,
|
||||||
|
|
||||||
|
GitspaceEventTypeAgentGitspaceCreationStart,
|
||||||
|
GitspaceEventTypeAgentGitspaceCreationCompleted,
|
||||||
|
GitspaceEventTypeAgentGitspaceCreationFailed,
|
||||||
|
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportRunning,
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportError,
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportStopped,
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportUnknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
var eventsMessageMap = eventsMessageMapping()
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Start action events.
|
||||||
|
GitspaceEventTypeGitspaceActionStart GitspaceEventType = "gitspace_action_start"
|
||||||
|
GitspaceEventTypeGitspaceActionStartCompleted GitspaceEventType = "gitspace_action_start_completed"
|
||||||
|
GitspaceEventTypeGitspaceActionStartFailed GitspaceEventType = "gitspace_action_start_failed"
|
||||||
|
|
||||||
|
// Stop action events.
|
||||||
|
GitspaceEventTypeGitspaceActionStop GitspaceEventType = "gitspace_action_stop"
|
||||||
|
GitspaceEventTypeGitspaceActionStopCompleted GitspaceEventType = "gitspace_action_stop_completed"
|
||||||
|
GitspaceEventTypeGitspaceActionStopFailed GitspaceEventType = "gitspace_action_stop_failed"
|
||||||
|
|
||||||
|
// Infra provisioning events.
|
||||||
|
GitspaceEventTypeInfraProvisioningStart GitspaceEventType = "infra_provisioning_start"
|
||||||
|
GitspaceEventTypeInfraProvisioningCompleted GitspaceEventType = "infra_provisioning_completed"
|
||||||
|
GitspaceEventTypeInfraProvisioningFailed GitspaceEventType = "infra_provisioning_failed"
|
||||||
|
|
||||||
|
// Infra unprovisioning events.
|
||||||
|
GitspaceEventTypeInfraUnprovisioningStart GitspaceEventType = "infra_unprovisioning_start"
|
||||||
|
GitspaceEventTypeInfraUnprovisioningCompleted GitspaceEventType = "infra_unprovisioning_completed"
|
||||||
|
GitspaceEventTypeInfraUnprovisioningFailed GitspaceEventType = "infra_unprovisioning_failed"
|
||||||
|
|
||||||
|
// Agent connection events.
|
||||||
|
GitspaceEventTypeAgentConnectStart GitspaceEventType = "agent_connect_start"
|
||||||
|
GitspaceEventTypeAgentConnectCompleted GitspaceEventType = "agent_connect_completed"
|
||||||
|
GitspaceEventTypeAgentConnectFailed GitspaceEventType = "agent_connect_failed"
|
||||||
|
|
||||||
|
// Gitspace creation events.
|
||||||
|
GitspaceEventTypeAgentGitspaceCreationStart GitspaceEventType = "agent_gitspace_creation_start"
|
||||||
|
GitspaceEventTypeAgentGitspaceCreationCompleted GitspaceEventType = "agent_gitspace_creation_completed"
|
||||||
|
GitspaceEventTypeAgentGitspaceCreationFailed GitspaceEventType = "agent_gitspace_creation_failed"
|
||||||
|
|
||||||
|
// Gitspace state events.
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportRunning GitspaceEventType = "agent_gitspace_state_report_running"
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportError GitspaceEventType = "agent_gitspace_state_report_error"
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportStopped GitspaceEventType = "agent_gitspace_state_report_stopped"
|
||||||
|
GitspaceEventTypeAgentGitspaceStateReportUnknown GitspaceEventType = "agent_gitspace_state_report_unknown"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (e GitspaceEventType) GetValue() string {
|
||||||
|
return eventsMessageMap[e]
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Move eventsMessageMapping() to controller.
|
||||||
|
|
||||||
|
func eventsMessageMapping() map[GitspaceEventType]string {
|
||||||
|
var gitspaceConfigsMap = make(map[GitspaceEventType]string)
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeGitspaceActionStart] = "Starting Gitspace..."
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeGitspaceActionStartCompleted] = "Started Gitspace"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeGitspaceActionStartFailed] = "Starting Gitspace Failed"
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeGitspaceActionStop] = "Stopping Gitspace"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeGitspaceActionStopCompleted] = "Stopped Gitspace"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeGitspaceActionStopFailed] = "Stopping Gitspace Failed"
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeInfraProvisioningStart] = "Provisioning Infrastructure..."
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeInfraProvisioningCompleted] = "Provisioning Infrastructure Completed"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeInfraProvisioningFailed] = "Provisioning Infrastructure Failed"
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeInfraUnprovisioningStart] = "Unprovisioning Infrastructure..."
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeInfraUnprovisioningCompleted] = "Unprovisioning Infrastructure Completed"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeInfraUnprovisioningFailed] = "Unprovisioning Infrastructure Failed"
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentConnectStart] = "Connecting to the gitspace agent..."
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentConnectCompleted] = "Connected to the gitspace agent"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentConnectFailed] = "Failed connecting to the gitspace agent"
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceCreationStart] = "Setting up the gitspace..."
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceCreationCompleted] = "Successfully setup the gitspace"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceCreationFailed] = "Failed to setup the gitspace"
|
||||||
|
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceStateReportRunning] = "Gitspace is running"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceStateReportStopped] = "Gitspace is stopped"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceStateReportUnknown] = "Gitspace is in unknown state"
|
||||||
|
gitspaceConfigsMap[GitspaceEventTypeAgentGitspaceStateReportError] = "Gitspace has an error"
|
||||||
|
|
||||||
|
return gitspaceConfigsMap
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
// Copyright 2023 Harness, Inc.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import "github.com/harness/gitness/types/enum"
|
||||||
|
|
||||||
|
type GitspaceEvent struct {
|
||||||
|
ID int64 `json:"-"`
|
||||||
|
Event enum.GitspaceEventType `json:"event,omitempty"`
|
||||||
|
EntityID int64 `json:"-"`
|
||||||
|
EntityIdentifier string `json:"entity_identifier,omitempty"`
|
||||||
|
EntityType enum.GitspaceEntityType `json:"entity_type,omitempty"`
|
||||||
|
Created int64 `json:"timestamp,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GitspaceEventResponse struct {
|
||||||
|
GitspaceEvent
|
||||||
|
EventTime string `json:"event_time,omitempty"`
|
||||||
|
Message string `json:"message,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GitspaceEventFilter struct {
|
||||||
|
EntityID int64
|
||||||
|
EntityType enum.GitspaceEntityType
|
||||||
|
}
|
Loading…
Reference in New Issue