2019-02-06 14:52:09 +02:00
package main
import (
2019-03-04 20:40:02 +02:00
"flag"
2019-02-21 20:31:18 +02:00
2019-05-31 17:59:36 -07:00
"github.com/golang/glog"
2019-07-17 17:53:13 -07:00
"github.com/nirmata/kyverno/pkg/annotations"
2019-05-31 17:59:36 -07:00
"github.com/nirmata/kyverno/pkg/config"
2019-05-21 11:00:09 -07:00
controller "github.com/nirmata/kyverno/pkg/controller"
2019-05-29 14:12:09 -07:00
client "github.com/nirmata/kyverno/pkg/dclient"
2019-05-21 11:00:09 -07:00
event "github.com/nirmata/kyverno/pkg/event"
2019-07-03 10:25:00 -07:00
gencontroller "github.com/nirmata/kyverno/pkg/gencontroller"
2019-05-21 11:00:09 -07:00
"github.com/nirmata/kyverno/pkg/sharedinformer"
2019-07-03 10:25:00 -07:00
"github.com/nirmata/kyverno/pkg/utils"
2019-05-21 11:00:09 -07:00
"github.com/nirmata/kyverno/pkg/violation"
"github.com/nirmata/kyverno/pkg/webhooks"
2019-05-10 00:05:21 -07:00
"k8s.io/sample-controller/pkg/signals"
2019-02-11 19:49:27 +02:00
)
var (
2019-06-17 23:41:18 -07:00
kubeconfig string
serverIP string
2019-06-18 11:47:45 -07:00
filterK8Kinds webhooks . ArrayFlags
2019-02-06 14:52:09 +02:00
)
2019-03-15 19:03:55 +02:00
func main ( ) {
2019-05-31 17:59:36 -07:00
defer glog . Flush ( )
printVersionInfo ( )
2019-03-15 19:03:55 +02:00
clientConfig , err := createClientConfig ( kubeconfig )
2019-03-04 20:40:02 +02:00
if err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Error building kubeconfig: %v\n" , err )
2019-03-04 20:40:02 +02:00
}
2019-05-31 17:59:36 -07:00
client , err := client . NewClient ( clientConfig )
2019-03-04 20:40:02 +02:00
if err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Error creating client: %v\n" , err )
2019-03-04 20:40:02 +02:00
}
2019-05-15 12:29:09 -07:00
policyInformerFactory , err := sharedinformer . NewSharedInformerFactory ( clientConfig )
2019-03-04 20:40:02 +02:00
if err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Error creating policy sharedinformer: %v\n" , err )
2019-03-04 20:40:02 +02:00
}
2019-07-03 10:25:00 -07:00
kubeInformer := utils . NewKubeInformerFactory ( clientConfig )
2019-05-31 17:59:36 -07:00
eventController := event . NewEventController ( client , policyInformerFactory )
violationBuilder := violation . NewPolicyViolationBuilder ( client , policyInformerFactory , eventController )
2019-07-17 17:53:13 -07:00
annotationsController := annotations . NewAnnotationControler ( client )
2019-05-15 11:24:27 -07:00
policyController := controller . NewPolicyController (
2019-05-15 07:30:22 -07:00
client ,
2019-05-15 12:29:09 -07:00
policyInformerFactory ,
2019-05-10 00:05:21 -07:00
violationBuilder ,
2019-07-17 17:53:13 -07:00
eventController ,
annotationsController )
2019-03-15 19:03:55 +02:00
2019-07-03 10:25:00 -07:00
genControler := gencontroller . NewGenController ( client , eventController , policyInformerFactory , violationBuilder , kubeInformer . Core ( ) . V1 ( ) . Namespaces ( ) )
2019-06-05 17:43:59 -07:00
tlsPair , err := initTLSPemPair ( clientConfig , client )
2019-03-22 22:11:55 +02:00
if err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Failed to initialize TLS key/certificate pair: %v\n" , err )
2019-03-04 20:40:02 +02:00
}
2019-07-17 17:53:13 -07:00
server , err := webhooks . NewWebhookServer ( client , tlsPair , policyInformerFactory , eventController , violationBuilder , annotationsController , filterK8Kinds )
2019-03-15 19:03:55 +02:00
if err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Unable to create webhook server: %v\n" , err )
2019-03-15 19:03:55 +02:00
}
2019-05-14 18:10:25 +03:00
2019-06-10 18:10:51 -07:00
webhookRegistrationClient , err := webhooks . NewWebhookRegistrationClient ( clientConfig , client , serverIP )
2019-05-14 18:10:25 +03:00
if err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Unable to register admission webhooks on cluster: %v\n" , err )
2019-05-14 18:10:25 +03:00
}
2019-03-04 20:40:02 +02:00
stopCh := signals . SetupSignalHandler ( )
2019-05-14 18:10:25 +03:00
2019-07-19 16:17:10 -07:00
if err = webhookRegistrationClient . Register ( ) ; err != nil {
glog . Fatalf ( "Failed registering Admission Webhooks: %v\n" , err )
}
2019-05-15 12:29:09 -07:00
policyInformerFactory . Run ( stopCh )
2019-07-03 10:25:00 -07:00
kubeInformer . Start ( stopCh )
2019-05-14 18:10:25 +03:00
eventController . Run ( stopCh )
2019-07-03 10:25:00 -07:00
genControler . Run ( stopCh )
2019-07-17 17:53:13 -07:00
annotationsController . Run ( stopCh )
2019-05-10 00:05:21 -07:00
if err = policyController . Run ( stopCh ) ; err != nil {
2019-05-31 17:59:36 -07:00
glog . Fatalf ( "Error running PolicyController: %v\n" , err )
2019-03-04 20:40:02 +02:00
}
2019-03-22 22:11:55 +02:00
2019-05-14 18:10:25 +03:00
server . RunAsync ( )
2019-03-04 20:40:02 +02:00
<- stopCh
2019-03-25 15:44:53 +02:00
server . Stop ( )
2019-07-03 10:25:00 -07:00
genControler . Stop ( )
2019-06-20 16:50:54 -07:00
eventController . Stop ( )
2019-07-17 17:53:13 -07:00
annotationsController . Stop ( )
2019-05-15 07:30:22 -07:00
policyController . Stop ( )
2019-02-11 19:49:27 +02:00
}
func init ( ) {
2019-03-04 20:40:02 +02:00
flag . StringVar ( & kubeconfig , "kubeconfig" , "" , "Path to a kubeconfig. Only required if out-of-cluster." )
2019-06-10 18:10:51 -07:00
flag . StringVar ( & serverIP , "serverIP" , "" , "IP address where Kyverno controller runs. Only required if out-of-cluster." )
2019-06-18 11:47:45 -07:00
flag . Var ( & filterK8Kinds , "filterKind" , "k8 kind where policy is not evaluated by the admission webhook. example --filterKind \"Event\" --filterKind \"TokenReview,ClusterRole\"" )
2019-05-31 17:59:36 -07:00
config . LogDefaultFlags ( )
2019-03-15 19:03:55 +02:00
flag . Parse ( )
2019-06-05 17:43:59 -07:00
}