Add hostname to TriggerEvent

TriggerEvents are going to need to store information to fully-qualify
projects.  Yet, most of their use is within the context of a driver, so
make sure that we can easily access both the fully-qualifed and
unqualified project name.

Change-Id: I06c6fbe361c23b0d6fb3dda3344fc58339bafefb
Story: 2000953
diff --git a/zuul/driver/gerrit/gerritconnection.py b/zuul/driver/gerrit/gerritconnection.py
index 3113184..f266f2a 100644
--- a/zuul/driver/gerrit/gerritconnection.py
+++ b/zuul/driver/gerrit/gerritconnection.py
@@ -76,6 +76,7 @@
         event.type = data.get('type')
         event.trigger_name = 'gerrit'
         change = data.get('change')
+        event.project_hostname = self.connection.canonical_hostname
         if change:
             event.project_name = change.get('project')
             event.branch = change.get('branch')
diff --git a/zuul/driver/timer/__init__.py b/zuul/driver/timer/__init__.py
index 3ce0b8d..7ad8756 100644
--- a/zuul/driver/timer/__init__.py
+++ b/zuul/driver/timer/__init__.py
@@ -80,6 +80,8 @@
             event.type = 'timer'
             event.timespec = timespec
             event.forced_pipeline = pipeline_name
+            # TODOv3(jeblair): add project hostname in future change
+            event.project_hostname = ''
             event.project_name = project_name
             self.log.debug("Adding event %s" % event)
             self.sched.addEvent(event)
diff --git a/zuul/driver/zuul/__init__.py b/zuul/driver/zuul/__init__.py
index 47ccec0..8c9d795 100644
--- a/zuul/driver/zuul/__init__.py
+++ b/zuul/driver/zuul/__init__.py
@@ -76,6 +76,7 @@
         event = TriggerEvent()
         event.type = PROJECT_CHANGE_MERGED
         event.trigger_name = self.name
+        event.project_hostname = change.project.canonical_hostname
         event.project_name = change.project.name
         event.change_number = change.number
         event.branch = change.branch
@@ -97,6 +98,7 @@
         event.type = PARENT_CHANGE_ENQUEUED
         event.trigger_name = self.name
         event.pipeline_name = pipeline.name
+        event.project_hostname = change.project.canonical_hostname
         event.project_name = change.project.name
         event.change_number = change.number
         event.branch = change.branch
diff --git a/zuul/model.py b/zuul/model.py
index 64d1593..77c5990 100644
--- a/zuul/model.py
+++ b/zuul/model.py
@@ -1813,6 +1813,7 @@
         self.type = None
         # For management events (eg: enqueue / promote)
         self.tenant_name = None
+        self.project_hostname = None
         self.project_name = None
         self.trigger_name = None
         # Representation of the user account that performed the event.
@@ -1837,6 +1838,10 @@
         # an admin command, etc):
         self.forced_pipeline = None
 
+    @property
+    def canonical_project_name(self):
+        return self.project_hostname + '/' + self.project_name
+
     def __repr__(self):
         ret = '<TriggerEvent %s %s' % (self.type, self.project_name)
 
diff --git a/zuul/rpclistener.py b/zuul/rpclistener.py
index 0fb557c..e7e7dae 100644
--- a/zuul/rpclistener.py
+++ b/zuul/rpclistener.py
@@ -98,9 +98,10 @@
         if tenant:
             event.tenant_name = args['tenant']
 
-            project = tenant.layout.project_configs.get(args['project'])
+            (trusted, project) = tenant.getProject(args['project'])
             if project:
-                event.project_name = args['project']
+                event.project_hostname = project.canonical_hostname
+                event.project_name = project.name
             else:
                 errors += 'Invalid project: %s\n' % (args['project'],)