Skip to content
This repository has been archived by the owner on Jul 4, 2024. It is now read-only.

Kubernetes Integration #1

Open
agus7fauzi opened this issue Aug 5, 2022 · 6 comments
Open

Kubernetes Integration #1

agus7fauzi opened this issue Aug 5, 2022 · 6 comments

Comments

@agus7fauzi
Copy link

how to use this api gateway with kubernetes registry? thanks

@asim
Copy link
Contributor

asim commented Aug 5, 2022

Look at how the CLI integrates plugins and do the same. Effectively fork/PR the importing of the plugin and potentially setting via flag or env var.

@agus7fauzi
Copy link
Author

now I can integrate it, but for now the problem is the api gateway checks service.Endpoint.Metadata to determine whether the route exists or not. because all existing services have empty service.Endpoint.Metadata so the api gateway responds to no route. I don't know which one to adjust the api gateway code or the go micro service configuration to.
API Gateway code checking Metadata:

`// store local endpoint cache
func (r *registryRouter) store(services []*registry.Service) {
// endpoints
eps := map[string]*router.Route{}

// services
names := map[string]bool{}

// create a new endpoint mapping
for _, service := range services {
	// set names we need later
	names[service.Name] = true

	// map per endpoint
	for _, sep := range service.Endpoints {
		// create a key service:endpoint_name
		key := fmt.Sprintf("%s.%s", service.Name, sep.Name)

		// decode endpoint
		end := router.Decode(sep.Metadata)

		// if we got nothing skip
		if err := router.Validate(end); err != nil {
			if logger.V(logger.TraceLevel, logger.DefaultLogger) {
				logger.Tracef("endpoint validation failed: %v", err)
			}
			continue
		}

		// try get endpoint
		ep, ok := eps[key]
		if !ok {
			ep = &router.Route{Service: service.Name}
		}

		// overwrite the endpoint
		ep.Endpoint = end
		// append services
		ep.Versions = append(ep.Versions, service)
		// store it
		eps[key] = ep
	}
}

r.Lock()
defer r.Unlock()

// delete any existing eps for services we know
for key, route := range r.eps {
	// skip what we don't care about
	if !names[route.Service] {
		continue
	}

	// ok we know this thing
	// delete delete delete
	delete(r.eps, key)
}

// now set the eps we have
for name, ep := range eps {
	r.eps[name] = ep
	cep := &endpoint{}

	for _, h := range ep.Endpoint.Host {
		if h == "" || h == "*" {
			continue
		}
		hostreg, err := regexp.CompilePOSIX(h)
		if err != nil {
			if logger.V(logger.TraceLevel, logger.DefaultLogger) {
				logger.Tracef("endpoint have invalid host regexp: %v", err)
			}
			continue
		}
		cep.hostregs = append(cep.hostregs, hostreg)
	}

	for _, p := range ep.Endpoint.Path {
		var pcreok bool

		if p[0] == '^' && p[len(p)-1] == '$' {
			pcrereg, err := regexp.CompilePOSIX(p)
			if err == nil {
				cep.pcreregs = append(cep.pcreregs, pcrereg)
				pcreok = true
			}
		}

		rule, err := util.Parse(p)
		if err != nil && !pcreok {
			if logger.V(logger.TraceLevel, logger.DefaultLogger) {
				logger.Tracef("endpoint have invalid path pattern: %v", err)
			}
			continue
		} else if err != nil && pcreok {
			continue
		}

		tpl := rule.Compile()
		pathreg, err := util.NewPattern(tpl.Version, tpl.OpCodes, tpl.Pool, "")
		if err != nil {
			if logger.V(logger.TraceLevel, logger.DefaultLogger) {
				logger.Tracef("endpoint have invalid path pattern: %v", err)
			}
			continue
		}
		cep.pathregs = append(cep.pathregs, pathreg)
	}

	r.ceps[name] = cep
}

}`

@asim
Copy link
Contributor

asim commented Aug 8, 2022

Just copy/replace the router with a new one called kubernetes and strip that info. It's going to be easier than trying to hack at it.

@agus7fauzi
Copy link
Author

may I know the code in which repo and which file?

@asim
Copy link
Contributor

asim commented Aug 8, 2022

@agus7fauzi
Copy link
Author

ok thanks, i will try again

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants