github.com/aiven/aiven-go-client@v1.36.0/kafka_schemas.go (about)

     1  package aiven
     2  
     3  import (
     4  	"errors"
     5  	"strconv"
     6  )
     7  
     8  type (
     9  	// KafkaSubjectSchemasHandler is the client which interacts with the Kafka Schema endpoints on Aiven
    10  	KafkaSubjectSchemasHandler struct {
    11  		client *Client
    12  	}
    13  
    14  	// KafkaGlobalSchemaConfigHandler is the client which interacts with the Kafka Schema endpoints on Aiven
    15  	KafkaGlobalSchemaConfigHandler struct {
    16  		client *Client
    17  	}
    18  
    19  	// KafkaSchemaConfig represents Aiven Kafka Schema Configuration options
    20  	KafkaSchemaConfig struct {
    21  		CompatibilityLevel string `json:"compatibility"`
    22  	}
    23  
    24  	// KafkaSchemaConfigUpdateResponse represents the PUT method response from Aiven Kafka Schema Configuration endpoint
    25  	KafkaSchemaConfigUpdateResponse struct {
    26  		APIResponse
    27  		KafkaSchemaConfig
    28  	}
    29  
    30  	// KafkaSchemaConfigResponse represents the response from Aiven Kafka Schema Configuration endpoint
    31  	KafkaSchemaConfigResponse struct {
    32  		APIResponse
    33  		CompatibilityLevel string `json:"compatibilityLevel"`
    34  	}
    35  
    36  	// KafkaSchemaSubjects represents a list of Aiven Kafka Schema subjects
    37  	KafkaSchemaSubjects struct {
    38  		Subjects []string `json:"subjects"`
    39  	}
    40  
    41  	// KafkaSchemaSubjectsResponse represents the response from Aiven Kafka Schema Subjects endpoint
    42  	KafkaSchemaSubjectsResponse struct {
    43  		APIResponse
    44  		KafkaSchemaSubjects
    45  	}
    46  
    47  	// KafkaSchemaSubjectVersions represents a list of versions
    48  	KafkaSchemaSubjectVersions struct {
    49  		Versions []int `json:"versions"`
    50  	}
    51  
    52  	// KafkaSchemaSubjectVersionsResponse represents the response from Aiven Kafka Schema Subject versions endpoint
    53  	KafkaSchemaSubjectVersionsResponse struct {
    54  		APIResponse
    55  		KafkaSchemaSubjectVersions
    56  	}
    57  
    58  	// KafkaSchemaSubject Kafka SchemaS Subject representation
    59  	KafkaSchemaSubject struct {
    60  		Schema     string `json:"schema"`
    61  		SchemaType string `json:"schemaType,omitempty"`
    62  	}
    63  
    64  	// KafkaSchemaSubjectResponse Kafka Schemas Subject API endpoint response representation
    65  	KafkaSchemaSubjectResponse struct {
    66  		APIResponse
    67  		Id int `json:"id"`
    68  	}
    69  
    70  	// KafkaSchemaSubjectVersion Kafka Schema Subject Version representation
    71  	KafkaSchemaSubjectVersion struct {
    72  		Id         int    `json:"id"`
    73  		Schema     string `json:"schema"`
    74  		Subject    string `json:"subject"`
    75  		Version    int    `json:"version"`
    76  		SchemaType string `json:"schemaType"`
    77  	}
    78  
    79  	// KafkaSchemaSubjectVersionResponse Kafka Schemas Subject Version API endpoint response representation
    80  	KafkaSchemaSubjectVersionResponse struct {
    81  		APIResponse
    82  		Version KafkaSchemaSubjectVersion `json:"version"`
    83  	}
    84  
    85  	// KafkaSchemaValidateResponse Kafka Schemas Subject validation API endpoint response representation
    86  	KafkaSchemaValidateResponse struct {
    87  		APIResponse
    88  		IsCompatible bool `json:"is_compatible"`
    89  	}
    90  )
    91  
    92  // Update updates new Kafka Schema config entry
    93  func (h *KafkaGlobalSchemaConfigHandler) Update(project, service string, c KafkaSchemaConfig) (*KafkaSchemaConfigUpdateResponse, error) {
    94  	path := buildPath("project", project, "service", service, "kafka", "schema", "config")
    95  	bts, err := h.client.doPutRequest(path, c)
    96  	if err != nil {
    97  		return nil, err
    98  	}
    99  
   100  	var r KafkaSchemaConfigUpdateResponse
   101  	errR := checkAPIResponse(bts, &r)
   102  
   103  	return &r, errR
   104  }
   105  
   106  // Get gets a Kafka Schema configuration
   107  func (h *KafkaGlobalSchemaConfigHandler) Get(project, service string) (*KafkaSchemaConfigResponse, error) {
   108  	path := buildPath("project", project, "service", service, "kafka", "schema", "config")
   109  	bts, err := h.client.doGetRequest(path, nil)
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  
   114  	var r KafkaSchemaConfigResponse
   115  	errR := checkAPIResponse(bts, &r)
   116  
   117  	return &r, errR
   118  }
   119  
   120  // List gets a list of Kafka Schema Subjects configuration
   121  func (h *KafkaSubjectSchemasHandler) List(project, service string) (*KafkaSchemaSubjectsResponse, error) {
   122  	path := buildPath("project", project, "service", service, "kafka", "schema", "subjects")
   123  	bts, err := h.client.doGetRequest(path, nil)
   124  	if err != nil {
   125  		return nil, err
   126  	}
   127  
   128  	var r KafkaSchemaSubjectsResponse
   129  	errR := checkAPIResponse(bts, &r)
   130  
   131  	return &r, errR
   132  }
   133  
   134  // GetVersions gets a Kafka Schema Subject versions
   135  func (h *KafkaSubjectSchemasHandler) GetVersions(project, service, name string) (*KafkaSchemaSubjectVersionsResponse, error) {
   136  	path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions")
   137  	bts, err := h.client.doGetRequest(path, nil)
   138  	if err != nil {
   139  		return nil, err
   140  	}
   141  
   142  	var r KafkaSchemaSubjectVersionsResponse
   143  	errR := checkAPIResponse(bts, &r)
   144  
   145  	return &r, errR
   146  }
   147  
   148  // Delete delete a Kafka Schema Subject versions, of versions parameter is empty it delete all existing versions
   149  func (h *KafkaSubjectSchemasHandler) Delete(project, service, name string, versions ...int) error {
   150  	if len(versions) == 0 {
   151  		path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name)
   152  		bts, err := h.client.doDeleteRequest(path, nil)
   153  		if err != nil {
   154  			return err
   155  		}
   156  
   157  		if errR := checkAPIResponse(bts, nil); errR != nil {
   158  			return errR
   159  		}
   160  	}
   161  
   162  	for _, version := range versions {
   163  		path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions", strconv.Itoa(version))
   164  		bts, err := h.client.doDeleteRequest(path, nil)
   165  		if err != nil {
   166  			return err
   167  		}
   168  
   169  		if errR := checkAPIResponse(bts, nil); errR != nil {
   170  			return errR
   171  		}
   172  	}
   173  
   174  	return nil
   175  }
   176  
   177  // Get gets a Kafka Schema Subject
   178  func (h *KafkaSubjectSchemasHandler) Get(project, service, name string, version int) (*KafkaSchemaSubjectVersionResponse, error) {
   179  	path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions", strconv.Itoa(version))
   180  	bts, err := h.client.doGetRequest(path, nil)
   181  	if err != nil {
   182  		return nil, err
   183  	}
   184  
   185  	var r KafkaSchemaSubjectVersionResponse
   186  	errR := checkAPIResponse(bts, &r)
   187  
   188  	return &r, errR
   189  }
   190  
   191  // Validate validates Kafka Schema
   192  func (h *KafkaSubjectSchemasHandler) Validate(
   193  	project, service, name string,
   194  	version int,
   195  	subject KafkaSchemaSubject) (bool, error) {
   196  	path := buildPath("project", project, "service", service, "kafka", "schema", "compatibility", "subjects", name, "versions", strconv.Itoa(version))
   197  
   198  	bts, err := h.client.doPostRequest(path, subject)
   199  	if err != nil {
   200  		return false, err
   201  	}
   202  
   203  	var r KafkaSchemaValidateResponse
   204  	errR := checkAPIResponse(bts, &r)
   205  
   206  	return r.IsCompatible, errR
   207  }
   208  
   209  // Add adds a new kafka Schema
   210  func (h *KafkaSubjectSchemasHandler) Add(project, service, name string, subject KafkaSchemaSubject) (*KafkaSchemaSubjectResponse, error) {
   211  	vR, err := h.GetVersions(project, service, name)
   212  	if err != nil && !IsNotFound(err) {
   213  		return nil, err
   214  	}
   215  
   216  	// GetVersions latest version
   217  	if vR != nil {
   218  		if len(vR.Versions) != 0 {
   219  			hVersion := 0
   220  			for _, v := range vR.Versions {
   221  				if hVersion < v {
   222  					hVersion = v
   223  				}
   224  			}
   225  
   226  			// Validate Kafka schema against the latest existing version
   227  			isValid, err := h.Validate(project, service, name, hVersion, subject)
   228  			if err != nil {
   229  				return nil, err
   230  			}
   231  
   232  			if !isValid {
   233  				return nil, errors.New("kafka schema is not compatible with version :" + strconv.Itoa(hVersion))
   234  			}
   235  		}
   236  	}
   237  
   238  	path := buildPath("project", project, "service", service, "kafka", "schema", "subjects", name, "versions")
   239  	bts, err := h.client.doPostRequest(path, subject)
   240  	if err != nil {
   241  		return nil, err
   242  	}
   243  
   244  	var r KafkaSchemaSubjectResponse
   245  	errR := checkAPIResponse(bts, &r)
   246  
   247  	return &r, errR
   248  }
   249  
   250  // UpdateConfiguration updates configuration for Schema Registry subject
   251  func (h *KafkaSubjectSchemasHandler) UpdateConfiguration(project, service, subjectName, compatibility string) (
   252  	*KafkaSchemaConfigUpdateResponse, error) {
   253  	path := buildPath("project", project, "service", service, "kafka", "schema", "config", subjectName)
   254  
   255  	bts, err := h.client.doPutRequest(path, KafkaSchemaConfig{
   256  		CompatibilityLevel: compatibility,
   257  	})
   258  	if err != nil {
   259  		return nil, err
   260  	}
   261  
   262  	var r KafkaSchemaConfigUpdateResponse
   263  	errR := checkAPIResponse(bts, &r)
   264  
   265  	return &r, errR
   266  }
   267  
   268  func (h *KafkaSubjectSchemasHandler) GetConfiguration(project, service, subjectName string) (
   269  	*KafkaSchemaConfigResponse, error) {
   270  	path := buildPath("project", project, "service", service, "kafka", "schema", "config", subjectName)
   271  
   272  	bts, err := h.client.doGetRequest(path+"?global_default_fallback=false", nil)
   273  	if err != nil {
   274  		return nil, err
   275  	}
   276  
   277  	var r KafkaSchemaConfigResponse
   278  	errR := checkAPIResponse(bts, &r)
   279  
   280  	return &r, errR
   281  }