Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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
Member

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
Member

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
Member

asim commented Aug 8, 2022

@agus7fauzi
Copy link
Author

ok thanks, i will try again

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

No branches or pull requests

2 participants