github.com/cloudwan/edgelq-sdk@v1.15.4/monitoring/access/v4/alert/alert.pb.api_access.go (about)

     1  // Code generated by protoc-gen-goten-access
     2  // Resource: Alert
     3  // DO NOT EDIT!!!
     4  
     5  package alert_access
     6  
     7  import (
     8  	"context"
     9  
    10  	"google.golang.org/grpc"
    11  	"google.golang.org/grpc/codes"
    12  	"google.golang.org/grpc/metadata"
    13  	"google.golang.org/grpc/status"
    14  
    15  	gotenaccess "github.com/cloudwan/goten-sdk/runtime/access"
    16  	gotenresource "github.com/cloudwan/goten-sdk/runtime/resource"
    17  	gotenfilter "github.com/cloudwan/goten-sdk/runtime/resource/filter"
    18  	"github.com/cloudwan/goten-sdk/types/watch_type"
    19  
    20  	alert_client "github.com/cloudwan/edgelq-sdk/monitoring/client/v4/alert"
    21  	alert "github.com/cloudwan/edgelq-sdk/monitoring/resources/v4/alert"
    22  )
    23  
    24  var (
    25  	_ = new(context.Context)
    26  
    27  	_ = metadata.MD{}
    28  	_ = new(grpc.ClientConnInterface)
    29  	_ = codes.NotFound
    30  	_ = status.Status{}
    31  
    32  	_ = new(gotenaccess.Watcher)
    33  	_ = watch_type.WatchType_STATEFUL
    34  	_ = new(gotenresource.ListQuery)
    35  	_ = gotenfilter.Eq
    36  )
    37  
    38  type apiAlertAccess struct {
    39  	client alert_client.AlertServiceClient
    40  }
    41  
    42  func NewApiAlertAccess(client alert_client.AlertServiceClient) alert.AlertAccess {
    43  	return &apiAlertAccess{client: client}
    44  }
    45  
    46  func (a *apiAlertAccess) GetAlert(ctx context.Context, query *alert.GetQuery, opts ...gotenresource.GetOption) (*alert.Alert, error) {
    47  	getOpts := gotenresource.MakeGetOptions(opts)
    48  	callHeaders := metadata.MD{}
    49  	if getOpts.GetSkipCache() {
    50  		callHeaders["cache-control"] = []string{"no-cache"}
    51  	}
    52  	callOpts := []grpc.CallOption{}
    53  	if len(callHeaders) > 0 {
    54  		callOpts = append(callOpts, grpc.Header(&callHeaders))
    55  	}
    56  	if !query.Reference.IsFullyQualified() {
    57  		return nil, status.Errorf(codes.InvalidArgument, "Reference %s is not fully specified", query.Reference)
    58  	}
    59  	request := &alert_client.GetAlertRequest{
    60  		Name:      &query.Reference.Name,
    61  		FieldMask: query.Mask,
    62  	}
    63  	res, err := a.client.GetAlert(ctx, request, callOpts...)
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  	query.Reference.Resolve(res)
    68  	return res, nil
    69  }
    70  
    71  func (a *apiAlertAccess) BatchGetAlerts(ctx context.Context, refs []*alert.Reference, opts ...gotenresource.BatchGetOption) error {
    72  	batchGetOpts := gotenresource.MakeBatchGetOptions(opts)
    73  	callHeaders := metadata.MD{}
    74  	if batchGetOpts.GetSkipCache() {
    75  		callHeaders["cache-control"] = []string{"no-cache"}
    76  	}
    77  	callOpts := []grpc.CallOption{}
    78  	if len(callHeaders) > 0 {
    79  		callOpts = append(callOpts, grpc.Header(&callHeaders))
    80  	}
    81  	asNames := make([]*alert.Name, 0, len(refs))
    82  	for _, ref := range refs {
    83  		if !ref.IsFullyQualified() {
    84  			return status.Errorf(codes.InvalidArgument, "Reference %s is not fully specified", ref)
    85  		}
    86  		asNames = append(asNames, &ref.Name)
    87  	}
    88  	request := &alert_client.BatchGetAlertsRequest{
    89  		Names: asNames,
    90  	}
    91  	fieldMask := batchGetOpts.GetFieldMask(alert.GetDescriptor())
    92  	if fieldMask != nil {
    93  		request.FieldMask = fieldMask.(*alert.Alert_FieldMask)
    94  	}
    95  	resp, err := a.client.BatchGetAlerts(ctx, request, callOpts...)
    96  	if err != nil {
    97  		return err
    98  	}
    99  	resultMap := make(map[alert.Name]*alert.Alert, len(refs))
   100  	for _, resolvedRes := range resp.GetAlerts() {
   101  		resultMap[*resolvedRes.GetName()] = resolvedRes
   102  	}
   103  	for _, ref := range refs {
   104  		resolvedRes := resultMap[ref.Name]
   105  		if resolvedRes != nil {
   106  			ref.Resolve(resolvedRes)
   107  		}
   108  	}
   109  	if batchGetOpts.MustResolveAll() && len(resp.GetMissing()) > 0 {
   110  		return status.Errorf(codes.NotFound, "Number of references not found: %d", len(resp.GetMissing()))
   111  	}
   112  	return nil
   113  }
   114  
   115  func (a *apiAlertAccess) QueryAlerts(ctx context.Context, query *alert.ListQuery, opts ...gotenresource.QueryOption) (*alert.QueryResultSnapshot, error) {
   116  	qOpts := gotenresource.MakeQueryOptions(opts)
   117  	callHeaders := metadata.MD{}
   118  	if qOpts.GetSkipCache() {
   119  		callHeaders["cache-control"] = []string{"no-cache"}
   120  	}
   121  	callOpts := []grpc.CallOption{}
   122  	if len(callHeaders) > 0 {
   123  		callOpts = append(callOpts, grpc.Header(&callHeaders))
   124  	}
   125  	request := &alert_client.ListAlertsRequest{
   126  		Filter:            query.Filter,
   127  		FieldMask:         query.Mask,
   128  		IncludePagingInfo: query.WithPagingInfo,
   129  	}
   130  	if query.Pager != nil {
   131  		request.PageSize = int32(query.Pager.Limit)
   132  		request.OrderBy = query.Pager.OrderBy
   133  		request.PageToken = query.Pager.Cursor
   134  	}
   135  	if query.Filter != nil && query.Filter.GetCondition() != nil {
   136  		request.Filter, request.Parent = getParentAndFilter(query.Filter)
   137  	}
   138  	resp, err := a.client.ListAlerts(ctx, request)
   139  	if err != nil {
   140  		return nil, err
   141  	}
   142  	return &alert.QueryResultSnapshot{
   143  		Alerts:            resp.Alerts,
   144  		NextPageCursor:    resp.NextPageToken,
   145  		PrevPageCursor:    resp.PrevPageToken,
   146  		TotalResultsCount: resp.TotalResultsCount,
   147  		CurrentOffset:     resp.CurrentOffset,
   148  	}, nil
   149  }
   150  
   151  func (a *apiAlertAccess) WatchAlert(ctx context.Context, query *alert.GetQuery, observerCb func(*alert.AlertChange) error) error {
   152  	if !query.Reference.IsFullyQualified() {
   153  		return status.Errorf(codes.InvalidArgument, "Reference %s is not fully specified", query.Reference)
   154  	}
   155  	request := &alert_client.WatchAlertRequest{
   156  		Name:      &query.Reference.Name,
   157  		FieldMask: query.Mask,
   158  	}
   159  	ctx, cancel := context.WithCancel(ctx)
   160  	defer cancel()
   161  
   162  	changesStream, initErr := a.client.WatchAlert(ctx, request)
   163  	if initErr != nil {
   164  		return initErr
   165  	}
   166  	for {
   167  		resp, err := changesStream.Recv()
   168  		if err != nil {
   169  			return status.Errorf(status.Code(err), "watch recv error: %s", err)
   170  		}
   171  		change := resp.GetChange()
   172  		if err := observerCb(change); err != nil {
   173  			return err
   174  		}
   175  	}
   176  }
   177  
   178  func (a *apiAlertAccess) WatchAlerts(ctx context.Context, query *alert.WatchQuery, observerCb func(*alert.QueryResultChange) error) error {
   179  	request := &alert_client.WatchAlertsRequest{
   180  		Filter:       query.Filter,
   181  		FieldMask:    query.Mask,
   182  		MaxChunkSize: int32(query.ChunkSize),
   183  		Type:         query.WatchType,
   184  		ResumeToken:  query.ResumeToken,
   185  		StartingTime: query.StartingTime,
   186  	}
   187  	if query.Pager != nil {
   188  		request.OrderBy = query.Pager.OrderBy
   189  		request.PageSize = int32(query.Pager.Limit)
   190  		request.PageToken = query.Pager.Cursor
   191  	}
   192  	if query.Filter != nil && query.Filter.GetCondition() != nil {
   193  		request.Filter, request.Parent = getParentAndFilter(query.Filter)
   194  	}
   195  	ctx, cancel := context.WithCancel(ctx)
   196  	defer cancel()
   197  
   198  	changesStream, initErr := a.client.WatchAlerts(ctx, request)
   199  	if initErr != nil {
   200  		return initErr
   201  	}
   202  	for {
   203  		respChange, err := changesStream.Recv()
   204  		if err != nil {
   205  			return status.Errorf(status.Code(err), "watch recv error: %s", err)
   206  		}
   207  		changesWithPaging := &alert.QueryResultChange{
   208  			Changes:      respChange.AlertChanges,
   209  			IsCurrent:    respChange.IsCurrent,
   210  			IsHardReset:  respChange.IsHardReset,
   211  			IsSoftReset:  respChange.IsSoftReset,
   212  			ResumeToken:  respChange.ResumeToken,
   213  			SnapshotSize: respChange.SnapshotSize,
   214  		}
   215  		if respChange.PageTokenChange != nil {
   216  			changesWithPaging.PrevPageCursor = respChange.PageTokenChange.PrevPageToken
   217  			changesWithPaging.NextPageCursor = respChange.PageTokenChange.NextPageToken
   218  		}
   219  		if err := observerCb(changesWithPaging); err != nil {
   220  			return err
   221  		}
   222  	}
   223  }
   224  
   225  func (a *apiAlertAccess) SaveAlert(ctx context.Context, res *alert.Alert, opts ...gotenresource.SaveOption) error {
   226  	saveOpts := gotenresource.MakeSaveOptions(opts)
   227  	var resp *alert.Alert
   228  	var err error
   229  	if !saveOpts.OnlyCreate() {
   230  		updateRequest := &alert_client.UpdateAlertRequest{
   231  			Alert: res,
   232  		}
   233  		if updateMask := saveOpts.GetUpdateMask(); updateMask != nil {
   234  			updateRequest.UpdateMask = updateMask.(*alert.Alert_FieldMask)
   235  		}
   236  		if mask, conditionalState := saveOpts.GetCAS(); mask != nil && conditionalState != nil {
   237  			updateRequest.Cas = &alert_client.UpdateAlertRequest_CAS{
   238  				ConditionalState: conditionalState.(*alert.Alert),
   239  				FieldMask:        mask.(*alert.Alert_FieldMask),
   240  			}
   241  		}
   242  		resp, err = a.client.UpdateAlert(ctx, updateRequest)
   243  		if err != nil {
   244  			return err
   245  		}
   246  	} else {
   247  		return status.Errorf(codes.Internal, "create operation on %s does not exist", res.Name.AsReference().String())
   248  	}
   249  	// Ensure object is updated - but in most shallow way possible
   250  	res.MakeDiffFieldMask(resp).Set(res, resp)
   251  	return nil
   252  }
   253  
   254  func (a *apiAlertAccess) DeleteAlert(ctx context.Context, ref *alert.Reference, opts ...gotenresource.DeleteOption) error {
   255  	delOpts := gotenresource.MakeDeleteOptions(opts)
   256  	if !ref.IsFullyQualified() {
   257  		return status.Errorf(codes.InvalidArgument, "Reference %s is not fully specified", ref)
   258  	}
   259  	request := &alert_client.DeleteAlertRequest{
   260  		Name:         &ref.Name,
   261  		AllowMissing: delOpts.AllowMissing(),
   262  	}
   263  	_, err := a.client.DeleteAlert(ctx, request)
   264  	return err
   265  }
   266  func getParentAndFilter(fullFilter *alert.Filter) (*alert.Filter, *alert.ParentName) {
   267  	var withParentExtraction func(cnd alert.FilterCondition) alert.FilterCondition
   268  	var resultParent *alert.ParentName
   269  	var resultFilter *alert.Filter
   270  	withParentExtraction = func(cnd alert.FilterCondition) alert.FilterCondition {
   271  		switch tCnd := cnd.(type) {
   272  		case *alert.FilterConditionComposite:
   273  			if tCnd.GetOperator() == gotenfilter.AND {
   274  				withoutParentCnds := make([]alert.FilterCondition, 0)
   275  				for _, subCnd := range tCnd.Conditions {
   276  					if subCndNoParent := withParentExtraction(subCnd); subCndNoParent != nil {
   277  						withoutParentCnds = append(withoutParentCnds, subCndNoParent)
   278  					}
   279  				}
   280  				if len(withoutParentCnds) == 0 {
   281  					return nil
   282  				}
   283  				if len(withoutParentCnds) == 1 {
   284  					return withoutParentCnds[0]
   285  				}
   286  				return alert.AndFilterConditions(withoutParentCnds...)
   287  			} else {
   288  				return tCnd
   289  			}
   290  		case *alert.FilterConditionCompare:
   291  			if tCnd.GetOperator() == gotenfilter.Eq && tCnd.GetRawFieldPath().String() == "name" {
   292  				nameValue := tCnd.GetRawValue().(*alert.Name)
   293  				if nameValue != nil && nameValue.ParentName.IsSpecified() {
   294  					resultParent = &nameValue.ParentName
   295  					if nameValue.IsFullyQualified() {
   296  						return tCnd
   297  					}
   298  					return nil
   299  				}
   300  			}
   301  			return tCnd
   302  		default:
   303  			return tCnd
   304  		}
   305  	}
   306  	cndWithoutParent := withParentExtraction(fullFilter.GetCondition())
   307  	if cndWithoutParent != nil {
   308  		resultFilter = &alert.Filter{FilterCondition: cndWithoutParent}
   309  	}
   310  	return resultFilter, resultParent
   311  }
   312  
   313  func GetApiAccessBuilder() *gotenaccess.ApiAccessBuilder {
   314  	return gotenaccess.GetRegistry().FindApiAccessBuilder(alert.GetDescriptor())
   315  }
   316  
   317  func init() {
   318  	gotenaccess.GetRegistry().RegisterApiAccessConstructor(alert.GetDescriptor(), func(cc grpc.ClientConnInterface) gotenresource.Access {
   319  		return alert.AsAnyCastAccess(NewApiAlertAccess(alert_client.NewAlertServiceClient(cc)))
   320  	})
   321  }