...

Source file src/edge-infra.dev/pkg/edge/api/services/capability_service.go

Documentation: edge-infra.dev/pkg/edge/api/services

     1  package services
     2  
     3  import (
     4  	"context"
     5  	"database/sql"
     6  	"encoding/json"
     7  
     8  	sqlerr "edge-infra.dev/pkg/edge/api/apierror/sql"
     9  	"edge-infra.dev/pkg/edge/api/graph/model"
    10  	sqlquery "edge-infra.dev/pkg/edge/api/sql"
    11  	"edge-infra.dev/pkg/edge/api/utils"
    12  	chariotClientApi "edge-infra.dev/pkg/edge/chariot/client"
    13  )
    14  
    15  type CapabilityService interface {
    16  	// only used by edge platform components / infra
    17  	CreateCapability(ctx context.Context, capability model.CapabilityInput) (*model.Capability, error)
    18  	UpdateCapability(ctx context.Context, capability *model.CapabilityUpdateInput) error
    19  
    20  	// used by users
    21  	AddCapability(ctx context.Context, capMapping *model.CapabilityBannerMappingInput) error
    22  	RemoveCapability(ctx context.Context, capMapping *model.CapabilityBannerMappingInput) error
    23  	ListCapabilities(ctx context.Context) ([]*model.Capability, error)
    24  	// todo switch to return list of capabilities
    25  	ListCapabilitiesByBanner(ctx context.Context, bannerID *string) ([]*model.Capability, error)
    26  }
    27  
    28  type capabilityService struct {
    29  	SQLDB          *sql.DB
    30  	BannerService  BannerService
    31  	ChariotService ChariotService
    32  	ForemanID      string
    33  }
    34  
    35  func (s *capabilityService) CreateCapability(ctx context.Context, capability model.CapabilityInput) (*model.Capability, error) {
    36  	if _, err := s.SQLDB.ExecContext(ctx, sqlquery.CapabilityInsertQuery, capability.Name, capability.Description); err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	var capa model.Capability
    41  	row := s.SQLDB.QueryRowContext(ctx, sqlquery.CapabilitytGetByNameQuery, capability.Name)
    42  	if err := row.Scan(&capa.UUID, &capa.Name, &capa.Description); err != nil {
    43  		return nil, err
    44  	}
    45  	return &capa, nil
    46  }
    47  
    48  func (s *capabilityService) UpdateCapability(ctx context.Context, capability *model.CapabilityUpdateInput) error {
    49  	_, err := s.SQLDB.ExecContext(ctx, sqlquery.CapabilityUpdateQuery, capability.Name, capability.Description)
    50  	if err != nil {
    51  		return err
    52  	}
    53  	return nil
    54  }
    55  
    56  // TODO return capability to get uuid
    57  func (s *capabilityService) AddCapability(ctx context.Context, mapping *model.CapabilityBannerMappingInput) error {
    58  	// add sql entry for mapping
    59  	if _, err := s.SQLDB.ExecContext(ctx, sqlquery.AddCapabilityMappyingQuery, mapping.Capabilityid, mapping.BannerEdgeID); err != nil {
    60  		return err
    61  	}
    62  
    63  	// update banner cr
    64  	// should probably do this from a common place so that other updates don't accidentally remove the capabilities
    65  	banner, err := s.BannerService.GetBannerCRByID(ctx, mapping.BannerEdgeID)
    66  	if err != nil {
    67  		return err
    68  	}
    69  	path, err := s.BannerService.GetBannerInfraBucketPath(ctx)
    70  	if err != nil {
    71  		return err
    72  	}
    73  	// todo - code taken from s.BannerService.CreateBannerCr, need to do some refactoring
    74  	bannerRequestByte, errs := json.Marshal(banner)
    75  	if errs != nil {
    76  		return errs
    77  	}
    78  	bannerRequestBase64 := utils.ToBase64(bannerRequestByte)
    79  
    80  	msg := chariotClientApi.
    81  		NewChariotMessage().
    82  		SetOperation(chariotClientApi.Create).
    83  		SetOwner(ComponentOwner).
    84  		SetBanner(s.ForemanID).
    85  		SetCluster(path).
    86  		AddObject(bannerRequestBase64)
    87  	attrs := make(map[string]string)
    88  
    89  	return s.ChariotService.InvokeChariotPubsub(ctx, msg, attrs)
    90  }
    91  
    92  func (s *capabilityService) RemoveCapability(ctx context.Context, mapping *model.CapabilityBannerMappingInput) error {
    93  	if _, err := s.SQLDB.ExecContext(ctx, sqlquery.RemoveCapabilityMappingQuery, mapping.Capabilityid, mapping.BannerEdgeID); err != nil {
    94  		return err
    95  	}
    96  	return nil
    97  }
    98  
    99  func (s *capabilityService) ListCapabilities(ctx context.Context) ([]*model.Capability, error) {
   100  	rows, err := s.SQLDB.QueryContext(ctx, sqlquery.ListCapabilitiesQuery)
   101  	if err != nil {
   102  		return nil, err
   103  	}
   104  	capabilities := []*model.Capability{}
   105  	defer rows.Close()
   106  	for rows.Next() {
   107  		var capability model.Capability
   108  		if err = rows.Scan(&capability.UUID, &capability.Name, &capability.Description); err != nil {
   109  			return nil, err
   110  		}
   111  		capabilities = append(capabilities, &capability)
   112  	}
   113  	if err := rows.Err(); err != nil {
   114  		return nil, sqlerr.Wrap(err)
   115  	}
   116  	return capabilities, nil
   117  }
   118  
   119  func (s *capabilityService) ListCapabilitiesByBanner(ctx context.Context, bannerID *string) ([]*model.Capability, error) {
   120  	rows, err := s.SQLDB.QueryContext(ctx, sqlquery.ListCapabilitiesByBannerQuery, bannerID)
   121  	if err != nil {
   122  		return nil, err
   123  	}
   124  	capabilities := []*model.Capability{}
   125  	defer rows.Close()
   126  	for rows.Next() {
   127  		var capability model.Capability
   128  		if err = rows.Scan(&capability.UUID, &capability.Name, &capability.Description); err != nil {
   129  			return nil, err
   130  		}
   131  		capabilities = append(capabilities, &capability)
   132  	}
   133  	if err := rows.Err(); err != nil {
   134  		return nil, sqlerr.Wrap(err)
   135  	}
   136  	return capabilities, nil
   137  }
   138  
   139  func NewCapabilityService(sqlDB *sql.DB, bannerService BannerService, chariotService ChariotService, foremanID string) CapabilityService {
   140  	return &capabilityService{
   141  		SQLDB:          sqlDB,
   142  		BannerService:  bannerService,
   143  		ChariotService: chariotService,
   144  		ForemanID:      foremanID,
   145  	}
   146  }
   147  

View as plain text